【问题标题】:Use variables for input and output PyAIML使用变量进行输入和输出 PyAIML
【发布时间】:2014-06-29 04:03:52
【问题描述】:

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

注意:响应确实有效; 输出被翻译后,它会出现这个错误。

【问题讨论】:

    标签: python aiml


    【解决方案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)
    

    【讨论】:

    • 这让翻译功能变得魅力无穷!唯一的问题是我看不到输入本身就是一个变量。我需要这种情况的原因是我需要测试输入是否是某事(比如什么时间),它运行一个函数而不是将输入提供给 AIML 聊天机器人。
    • 抱歉这么愚蠢,但只是确认这意味着如果我执行“if text == 'hello': functionA(), else: for char....”?
    • 是的,就像那样,但你可能想做text.strip().lower() == 'hello',因为用户可能会输入`HeLLo`作为输入。
    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2021-07-25
      • 2020-06-03
      • 1970-01-01
      • 2011-11-05
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多