在PyAIML中使用变量进行输入和输出
我现在有一个完整的项目,下面是我的代码。到目前为止,我做的事情是创建一个终端界面,我在里面输入一个短语,然后程序会从AIML数据库中获取响应,把每个字母逐个播放对应的.mp3声音,像个基础的翻译器(就像R2D2那样)。不过我遇到了一些问题。第一个问题是,当我第一次输入短语时,程序能正常工作,翻译输出也很完美,但之后就出现了索引错误,终端就关闭了。(见图1)我不知道哪里出错了,但我怀疑可能是我的循环有问题。
我还有另一个问题,我打算把这个程序和语音接口结合使用,也就是说我说出一句话,经过一个语音转文本(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
注意:响应是有效的;这个错误是在输出翻译之后出现的。
2 个回答
1
在使用 char = input[n]
之前,先检查一下 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)
1
你的代码是一个一个字符地处理,其实你只需要处理整个字符串,它会自动返回每个字符。
在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)