我已经包含了以下来源,这是我目前的完整项目。我到目前为止工作的是一个终端界面,我在其中输入一个短语然后接受响应(来自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
注意:响应 有效;在输出翻译后,它会出现此错误。
答案 0 :(得分:1)
在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)
答案 1 :(得分:1)
当你只是单步执行字符串时,你的代码会单独单步执行每个字符(并且它将返回每个字符)。
Python有点不同,传统的&#34;找到长度,将计数器设置为0,直到count小于长度,由计数器提取&#34; 模式不是必需的。
您还可以稍微优化您的代码:
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)