0

我已经包含了以下源代码,这是我目前的完整项目。到目前为止,我所做的是一个终端界面,我在其中输入一个短语,然后接收响应(来自 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

图1 注意:响应确实有效;翻译输出出现此错误。

4

2 回答 2

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)
于 2014-06-29T04:22:41.993 回答
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)
于 2014-06-29T10:17:06.430 回答