首页 > 解决方案 > 我正在尝试制作语音助手来控制我的房间,但响应时间很慢

问题描述

我在互联网上获得了一个基本代码并对其进行了编辑以满足我的要求,在硬件方面我使用了 Arduino uno、继电器和 esp8266 esp01 wifi 模块,并使用 blynk 和 ifttt 控制它

问题是助手很慢,我首先认为可能是谷歌文本到语音的问题,所以我尝试使用 pyttsx3 模块离线执行此操作,但没有帮助。所以我认为 if 语句可能是一个问题,所以我将它们中的每一个都变成了一个函数并尝试了多线程,但这也无济于事......

所以我认为它必须倾听和处理我所说的一切......所以我添加了一个触发词,所以只有在使用触发词之后它才会开始监听命令,

有时它一开始会正常工作然后变慢我不知道还能做什么

这是我正在使用的代码:

import pyttsx3
import speech_recognition as sr 
import datetime
import wikipedia 
import webbrowser
import os
import requests
import time
import smtplib
from goto import goto, label



engine = pyttsx3.init('sapi5')
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)


def speak(audio):
    engine.say(audio)
    engine.runAndWait()


def wishMe():
    
     

    speak("Hello sir ,Assistant booting up")       

def takeCommand():
    

    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        r.pause_threshold = 0.5
        audio = r.listen(source)
        print("saving")

    try:
        print("Recognizing...")    
        query = r.recognize_google(audio, language='en-in')
        print(f"User said: {query}\n")

    except Exception as e:
        print(e)    
        print("Say that again please...")  
        return 
    return query


   


i=0
j=0
if __name__ == "__main__":
    wishMe()
    while True:
        print("iteration jarvis",i)
        i=i+1
        r = sr.Recognizer()
        with sr.Microphone() as source:
            print("waiting...")
            r.pause_threshold = 0.5
            audio = r.listen(source)
        try:    
            query = r.recognize_google(audio, language='en-in')
            print(f"User said: {query}\n")
            if 'Jarvis' in query:
                query=takeCommand().lower()
        except Exception as e:
            print(e)    
            print("jaris not called")
            continue 
        print("iteration command",j)
        j=j+1
        if 'how are you' in query:
            speak("good")
        elif 'open google' in query:
            webbrowser.open("google.com")
            speak("There you go!")
        elif 'lights on' in query:
            requests.post("https://maker.ifttt.com/trigger/light_on/with/key/d*************") 
            speak("ok sure")  
        elif 'lights off' in query:
            requests.post("https://maker.ifttt.com/trigger/lights_off/with/key/d************")  
            speak("with pleasure") 
        elif 'play music' in query:
            music_dir = 'D:\\Non Critical\\songs\\Favorite Songs2'
            songs = os.listdir(music_dir)
            print(songs)    
            os.startfile(os.path.join(music_dir, songs[0]))
        elif 'stop listening' in query:
            speak("going offline")
            exit()
        

标签: python-3.x

解决方案


您可能只想初始化一次识别器。

我也冒昧地清理和重构了代码。

from itertools import count

import pyttsx3
import speech_recognition as sr
import webbrowser
import os
import requests

engine = pyttsx3.init("sapi5")
voices = engine.getProperty("voices")
engine.setProperty("voice", voices[0].id)

recognizer = sr.Recognizer()
recognizer.pause_threshold = 0.5


def speak(audio):
    engine.say(audio)
    engine.runAndWait()


def takeCommand():
    with sr.Microphone() as source:
        print("Listening...")
        audio = recognizer.listen(source)
        print("saving")
    print("Recognizing...")
    query = recognizer.recognize_google(audio, language="en-in")
    print(f"User said: {query}\n")
    return query


def process_query(query):
    if "how are you" in query:
        speak("good")
    elif "open google" in query:
        webbrowser.open("google.com")
        speak("There you go!")
    elif "lights on" in query:
        requests.post("https://maker.ifttt.com/trigger/light_on/with/key/d*************")
        speak("ok sure")
    elif "lights off" in query:
        requests.post("https://maker.ifttt.com/trigger/lights_off/with/key/d************")
        speak("with pleasure")
    elif "play music" in query:
        music_dir = "D:\\Non Critical\\songs\\Favorite Songs2"
        songs = os.listdir(music_dir)
        print(songs)
        os.startfile(os.path.join(music_dir, songs[0]))
    elif "stop listening" in query:
        speak("going offline")
        exit()


def main():
    speak("Hello sir ,Assistant booting up")
    for iteration in count(1):
        print("iteration jarvis", iteration)
        try:
            query = takeCommand()
        except Exception as e:
            print(e)
            speak("Recognition error: {}".format(e))
        else:
            try:
                process_query(query)
            except Exception as e:
                print(e)
                speak("Processing error: {}".format(e))


if __name__ == "__main__":
    main()

推荐阅读