在PyAIML中使用变量进行输入和输出

0 投票
2 回答
623 浏览
提问于 2025-04-18 11:28

我现在有一个完整的项目,下面是我的代码。到目前为止,我做的事情是创建一个终端界面,我在里面输入一个短语,然后程序会从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

figure 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)

撰写回答