GUI和AI逻辑流程

时间:2018-09-02 10:11:54

标签: python python-3.x tkinter speech-recognition text-to-speech

我通过对Python的了解和一些研究,开发了一个基本的语音助手,作为一个自学项目。

Link to the code is here

我基本上是在将音频转换为文本,然后将其拆分以查找关键字,然后触发响应或可以说的动作,虽然这不是很聪明,但是暂时是可行的。

我还能如何寻找关键字?是否有比一千行ifs和elifs更好的方法,一种有效的方法?

我遇到的另一个问题是,我为此程序构建了一个GUI界面,因此我可以在单击按钮时与其进行交互,但是问题是,单击按钮后窗口没有响应,事实证明这是已知的问题,我不知道如何解决它,因为我不知道线程,进程和队列的概念。我希望有人可以帮助我解决我的问题。

我想指出的是,如果我必须对此项目进行任何学习,那么我会很感兴趣,因为整个项目背后的想法是学习如何编码或构建AI,这听起来可能很愚蠢< / p>

PS:我通过将功能保持在while循环中来实现了,好吧,总能做到,总是监听功能或保持运行功能。我想找到一种语音语音触发方法,也可以唤醒助手。在这方面的任何帮助将不胜感激。

而且,请帮我给这个助手起个名字,最好是女性。

代码在这里:

import os
import time
import random
import webbrowser
import tkinter as tk
from gtts import gTTS
from mutagen.mp3 import MP3
from PIL import ImageTk, Image
from playsound import playsound
import speech_recognition as sr
from weather import Weather, Unit

def startAssistant():
    keepRunning = 1
    while keepRunning is 1:
        mainFunction()
        if mainFunction() is 0: break

def doNothing(): print("I don't do anything apart from printing this line of course!")

def mainFunction():

    f = open("assistant.txt", "a")

    # Printing what a user is saying for better user experience
    def say(text):
        print(text)
        f.write("\n" + text + "\n")
        return text

    # This function will take inputs to talk back
    def talkBack(text, recordingName):
        # Variable Declaration
        extension = ".mp3"

        # Synthesising the reponse as speech
        tts = gTTS(text=say(text), lang="en-us")

        # Saving the response files
        fileName = recordingName + extension
        audioPath = "audioFiles\\"
        responseFile = audioPath + fileName

        # Checking to see if the file is already created
        if not os.path.exists(responseFile):
            tts.save(responseFile)
        # Playing the audio
        playsound(responseFile)

    # Initialising things here
    recognizer = sr.Recognizer()
    microphone = sr.Microphone()

    # Asking for input and saving that
    with microphone as source:
        print ("Speak:")
        audio = recognizer.listen(source)

    # Converting audio into text
    convertedAudio = recognizer.recognize_google(audio)
    convertedAudioSplit = convertedAudio.split()

    # Printing what was picked up when the user Spoke and also logging it
    print("\n" + convertedAudio + "\n")
    f.write("\n" + convertedAudio + "\n")

    # Start of a conversation
    if "hello" in convertedAudioSplit:
        talkBack("Hi, how are you doing today?", "hello")

    # Wishing people based on the time of the day  
    elif "morning" in convertedAudioSplit:
        talkBack("Good morning! The sun's shining bright, let's head out for a run. We'll get back and make a healthy breakfast for ourselves", "morning")
    elif "afternoon" in convertedAudioSplit:
        talkBack("Good afternoon! You must be hungry right about now, why don't you break for lunch?", "afternoon")
    elif "night" in convertedAudioSplit:
        talkBack("Nighty night sleepy pot! Get a good night's sleep while I learn more to be more helpful to you tomorrow.", "night")

    # Getting her information
    elif "doing" in convertedAudioSplit:
        talkBack("I am doing very good, Thank you for asking!", "doing")

    # Making the assistant open web browser with a URL
    elif "Google" in convertedAudioSplit:
        talkBack("Okay, lets get you to Google.", "google")
        # Opening the browser with the required URL
        webbrowser.open("https://www.google.com/", new = 1)

    # Brings the weather report
    elif "weather" in convertedAudioSplit:
        weatherVariable = Weather(unit=Unit.CELSIUS)
        location = weatherVariable.lookup_by_location('bangalore')
        condition = location.condition.text
        talkBack("It is {0} right now in Bengaluru.".format(condition), "weather")

    # Exiting the program on user's consent
    elif "exit" in convertedAudioSplit:
        talkBack("Sure, if that's what you want! I will miss you, have a good day.", "exit")
        return 0

    # If there is an UnknownValueError, this will kick in
    elif sr.UnknownValueError:
        talkBack("I am sorry, I couldn't quite get what you said. Could you please say that again?", "UnknownValueError")

    # When things go out of the box
    else:
        # Out of scope reply
        talkBack("I am a demo version. When you meet the completed me, you will be surprised.", "somethingElse")
        return 0

root = tk.Tk()

root.title("Voice Assistant")
mainFrame = tk.Frame(root, width = 1024, height = 720, bg = "turquoise", borderwidth = 5)

menu = tk.Menu(root)
root.config(menu=menu)
subMenu = tk.Menu(menu)

startButton = tk.Button(mainFrame, text="Interact", command = startAssistant)
startButton.place(relx = 0.5, rely = 1.0, anchor = tk.S)

menu.add_cascade(label="File", menu=subMenu)

subMenu.add_command(label="Do Nothing", command=doNothing)
subMenu.add_separator()
subMenu.add_command(label="Exit", command=root.quit)

mainFrame.pack()

root.mainloop()

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用更简单的GUI包。 GUI软件包PySimpleGUI可能是合适的。它可以解决您的GUI问题,使您有更多时间从事项目的其他部分。

检出实现聊天前端的Chat Demo。 Therre也是Chatterbot Demo,它实现了Chatterbot项目的前端。

您可以首先复制该代码并对其进行修改。