将变量用于输入和输出PyAIML

2024-05-18 23:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经包括以下来源,这是我目前的完整项目。到目前为止,我所做的是一个终端接口,我在这里输入一个短语,然后接收响应(来自AIML数据库),获取每个字母,然后逐个播放该字母的.mp3声音,从而构成一个基本的翻译程序(这里是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 注意:响应确实起作用;在输出被翻译后,它会出现这个错误。在


Tags: the字符串import终端inputtimeos错误
2条回答

检查char = input[n]之前的n,因为n大于{}的长度

或者改变

n = n + 1
char = input[n]

进入

^{pr2}$

编辑:

我不知道你想做什么,除了这个

^{3}$

可以这样做

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)

您的代码是逐个遍历每个字符,而您只需单步执行字符串(它将返回每个字符)。在

Python有点不同,传统的“查找长度,将计数器设置为0,直到count小于长度时,不需要使用计数器获取”模式。在

您还可以稍微优化一下代码:

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)

相关问题 更多 >

    热门问题