2017-02-05 36 views
2

Pythonのspeech_recognitionに組み込まれたIBM Speech to Text APIを使用するスクリプトがあります。それは非常に遅いです。応答時間は私に返答する約5秒です。真のループが疑われてCPUが焼損する原因になっていますが、わかりません。Python音声認識応答が非常に遅い

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)) 

答えて

2

は、あなたが最初にオーディオを録音して、それをサーバーに送信根本的に間違っている事があります。ここでは

はコードです。記録に時間がかかり、データを送信して応答を返すのに時間がかかります。

もしあなたが良いやりとりをしたいのであれば、WebSocketを使ってサーバにオーディオをストリーミングし、HTTPリクエストで送る必要はありません。録音が終了するまでにサーバーはデコード結果を送り返します。

speech_recognitionライブラリはここでうまく設計されていません。あなたはpython websocketモジュールと一緒にIBMインターフェイスを直接使用する必要があります。 Pythonの例はここにある:

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

+1

はい、これは正確にあなたが何をする必要があるか、リンク内のコードを試してみてください、私たちに知らせています!ニコライに感謝 –