2017-02-05 20 views
2

Ich habe ein Skript, das die IBM Speech to Text API verwendet, die in der Spracherkennung in Python integriert ist. Es ist sehr langsam. Antwortzeit ist ungefähr 5 Sekunden, um zu mir zurück zu antworten. Ich vermute die while True-Schleife, die die CPU zum verbrennen bringt, aber ich weiß es nicht. HierAntwort der Python-Spracherkennung sehr langsam

ist der Code:

import speech_recognition as sr 
import pyttsx 
import time 
import requests 

engine = pyttsx.init() 

time_check = time.strftime("%H") 
time_check = int(time_check) 

# current weather 

url = "http://api.openweathermap.org/data/2.5/weather?lat=59.13&lon=10.22&APPID=8f605c186309e3d8f60bb7b2f31ba75c&units=metric" \ 
      "" 

r = requests.get(url) 
response_dict = r.json() 

#daily forecast 

url_daily = "http://api.openweathermap.org/data/2.5/forecast/daily?q=Sandefjord&mode=JSON&units=metric&cnt=7&appid=8f605c186309e3d8f60bb7b2f31ba75c" \ 
     "" 

r_daily = requests.get(url_daily) 
response_dict_daily = r_daily.json() 
days = response_dict_daily["list"] 
tomorrow = days[1] 





#weather variables 

main = response_dict["main"] 

wind = response_dict["wind"] 

description = response_dict["weather"] 



url_1 = "https://newsapi.org/v1/articles?source=techcrunch&apiKey=d35bd4b8699b444fbcd3661e39c0bf49" 

f = requests.get(url_1) 
response = f.json() 
articles = response["articles"] 
article_1 = articles[0] 
article_2 = articles[1] 
article_3 = articles[2] 
article_4 = articles[3] 

title_1 = article_1["title"] 
title_2 = article_2["title"] 
title_3 = article_3["title"] 
title_4 = article_4["title"] 





while True: 

    r = sr.Recognizer() 
    with sr.Microphone() as source: 
     print("Say something!") 
     audio = r.listen(source) 

    try: 


     if "hello" in r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD): 
     if time_check < 9: 
      engine.say("Good morning sir, did you sleep well?") 
      engine.runAndWait() 
     elif time_check < 16: 
      engine.say("Good afternoon sir") 
      engine.runAndWait() 

     elif time_check > 16: 
      engine.say("Good evening sir") 
      engine.runAndWait() 

    if "update" in r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD): 
     print("Initializing news listing...") 
     engine.say(title_1) 
     engine.say(title_2) 
     engine.say(title_3) 
     engine.say(title_4) 
     engine.runAndWait() 

    if "time" in r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD): 
     time_say = time.strftime("%H:%M") 
     engine.say(time_say) 
     engine.runAndWait() 

    if "date" in r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD): 
     time_saydate = time.strftime("%B %d") 
     engine.say(time_saydate) 
     engine.runAndWait() 

    if "weather" in r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD): 
     temp = main["temp"] 
     windspeed = wind["speed"] 
     umbrella = description[1] 
     description = description["description"] 
     engine.say("Here is a quick overview of current weather. The temperature is at " + temp + "degrees. The wind speed is at " + windspeed + "meters per second. Overall it is " + description) 

     if umbrella == "Rain": 
      engine.say("I recommend you bring an umbrella sir, it is raining") 


    if "tomorrow" in r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD): 
     temp = tomorrow["temp"] 
     temp_1 = temp["day"] 
     temp_1 = int(temp_1) 
     desc = tomorrow["weather"] 
     desc_1 = desc[0] 
     desc_2 = desc_1["description"] 

     engine.say("The weather for tomorrow is " + str(temp_1) + " degrees. The description is " + desc_2) 
     engine.runAndWait() 

     if desc_2 == "rain": 
      engine.say("It is going to rain, I would recommend bringing an umbrella") 
      engine.runAndWait() 












    print("Watson thinks you said " + r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD)) 
except sr.UnknownValueError: 
    print("IBM Speech to Text could not understand audio") 
    engine.say("Couldnt recognize, please try again sir") 
    engine.runAndWait() 
except sr.RequestError as e: 
    print("Could not request results from IBM Speech to Text service; {0}".format(e)) 

Antwort

2

Es ist ein grundlegend falsch, was Sie Audio aufzeichnen, zuerst und dann an den Server senden. Es braucht Zeit für die Aufzeichnung, und dann braucht es Zeit, um die Daten zu senden und die Antwort zurück zu bekommen.

Wenn Sie eine gute Interaktion wünschen, müssen Sie Audio mit WebSockets zum Server streamen, nicht mit HTTP-Anfragen senden. Wenn die Aufzeichnung beendet ist, sendet der Server ein Decodierungsergebnis zurück.

speak_recognition Bibliothek ist hier nicht gut entworfen, sollten Sie IBM Schnittstellen direkt mit Python Websocket-Modul verwenden. Python Beispiel ist hier:

https://github.com/watson-developer-cloud/speech-to-text-websockets-python

+1

ja das ist genau das, was Sie tun müssen, versuchen Sie bitte den Code in den Link und lassen Sie es uns wissen! Danke Nikolay –