Используйте переменные для ввода и вывода PyAIML

Я включил приведенный ниже источник, который на данный момент является моим полным проектом. До сих пор я работал над терминальным интерфейсом, в который я ввожу фразу, а затем беру ответ (из базы данных AIML), беру каждую букву и по очереди проигрываю звук .mp3 для этой буквы, чтобы сделать BASIC-переводчик. (R2D2 здесь). Есть пара проблем. Во-первых, он отлично работает в первый раз, когда я ввожу фразу (в том смысле, что он отлично переводит вывод), но затем обнаруживает ошибку индекса, и терминал закрывается. (см. рисунок 1) Я не знаю, что с ним не так, но подозреваю, что это может быть что-то не так с моим циклом while.

Другая проблема, которая у меня есть, заключается в том, что я планирую использовать это с речевым интерфейсом, поэтому я что-то говорю, он проходит через механизм STT, который затем выводит то, что я сказал, в виде строки. Я хочу, чтобы эта строка была передана в качестве входных данных для PyAIML, чтобы затем получить ответ и перевести ее, как это делается в этой программе. Проблема, с которой я столкнулся, заключается в том, как создать переменную, которую затем можно использовать в качестве входных данных для PyAIML. Любые идеи, как я это сделаю?

import aiml
import os
import time

def translate():
    if char == 'a':
        os.system("start a.mp3")
    elif char == 'b':
        os.system("start b.mp3")
    #This continues for all the letters of the alphabet - you get the idea
    else:
        time.sleep(0.1),


k = aiml.Kernel()
k.learn("std-startup.xml")
k.respond("load aiml b")
while True: 
    string = k.respond(raw_input("> "))
    input = string.lower()
    numChar = len(input)
    n = 0
    m = 0
    char = input[n]
    while m < numChar:
        translate()
        time.sleep(0.25),
        n = n + 1
        char = input[n]
        m = m + 1

figure 1Примечание: ответ работает; появляется эта ошибка после перевода вывода.


person Often Right    schedule 29.06.2014    source источник


Ответы (2)


Ваш код проходит через каждый символ индивидуально, когда вы должны просто пройти через строку (и он вернет каждый символ).

Python немного отличается тем, что традиционный шаблон "найти длину, установить счетчик на 0, пока счетчик не станет меньше длины, получить по счетчику" не требуется.

Вы также можете немного оптимизировать свой код:

import aiml
import os
import time

character_mappings = {'a': 'a.mp3', 'b': 'b.mp3'}

def speak(char):
    out = character_mappings.get(char)
    if out:
         os.system('start {}'.format(out))
    else:
         time.sleep(0.1)

k = aiml.Kernel()
k.learn("std-startup.xml")
k.respond("load aiml b")
while True: 
    text = k.respond(raw_input("> ")) # "string" is a built-in
    for char in text.lower():
        speak(char) # translate is also a built-in
        time.sleep(0.25)
person Burhan Khalid    schedule 29.06.2014
comment
Это заставляет функцию переводчика работать прелестно! Единственная проблема в том, что я не вижу, что ввод сам по себе является переменной. Причина, по которой мне это нужно, заключается в том, что мне нужно проверить, является ли ввод чем-то (скажем, сколько времени), он запускает функцию, а не передает ввод в чат-бот AIML. - person Often Right; 30.06.2014
comment
Извините, что я такой глупый, но просто подтверждаю, что это означает, если я делаю if text == 'hello': functionA(), else: for char.... ? - person Often Right; 30.06.2014
comment
Да, именно так, но вы можете захотеть сделать text.strip().lower() == 'hello', потому что пользователь может ввести `HeLLo` в качестве ввода. - person Burhan Khalid; 30.06.2014

Проверьте n перед char = input[n], потому что n больше, чем длина input

--

Или изменить

n = n + 1
char = input[n]

в

char = input[n]
n = n + 1

ИЗМЕНИТЬ:

Я не знаю, что ты пытаешься сделать, но это

numChar = len(input)
n = 0
m = 0
char = input[n]
while m < numChar:
    translate()
    time.sleep(0.25),
    n = n + 1
    char = input[n]
    m = m + 1

можно сделать так

for char in input:
    translate()
    time.sleep(0.25)

но я бы сделал это

def translate(letter):
    if letter == 'a':
        os.system("start a.mp3")
    if letter == 'b':
        os.system("start b.mp3")
    # rest of code
    else:
        time.sleep(0.1)

for char in input:
    translate(char)
    time.sleep(0.25)

или даже это

def translate(letter):
    if letter in 'abcde': # all accepted letters
        os.system("start "+letter+".mp3")
    else:
        time.sleep(0.1)
person furas    schedule 29.06.2014