2017-10-22 31 views
1

私は、ワトソン音声 - テキスト(STT)APIを呼び出すスクリプトを作成して、 for-wordをリアルタイムで表示します。私はこれがWebsocketバージョンのAPIを使って可能であるべきだと読んでいます。リアルタイム転写のためにWebソケットを使用してWatson Speech-to-Text APIに接続

私は(依存関係がインストールされていると仮定して)Linux上でこれを行うことができるはずPythonスクリプトを持っている、しかし、それは

from ws4py.client.threadedclient import WebSocketClient 
import base64, json, ssl, subprocess, threading, time 

class SpeechToTextClient(WebSocketClient): 
    def __init__(self): 
     ws_url = "wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize" 

     username = "your username" 
     password = "your password" 
     auth_string = "%s:%s" % (username, password) 
     base64string = base64.encodestring(auth_string).replace("\n", "") 

     self.listening = False 

     try: 
      WebSocketClient.__init__(self, ws_url, 
       headers=[("Authorization", "Basic %s" % base64string)]) 
      self.connect() 
     except: print "Failed to open WebSocket." 

    def opened(self): 
     self.send('{"action": "start", "content-type": "audio/l16;rate=16000"}') 
     self.stream_audio_thread = threading.Thread(target=self.stream_audio) 
     self.stream_audio_thread.start() 

    def received_message(self, message): 
     message = json.loads(str(message)) 
     if "state" in message: 
      if message["state"] == "listening": 
       self.listening = True 
     print "Message received: " + str(message) 

    def stream_audio(self): 
     while not self.listening: 
      time.sleep(0.1) 

     reccmd = ["arecord", "-f", "S16_LE", "-r", "16000", "-t", "raw"] 
     p = subprocess.Popen(reccmd, stdout=subprocess.PIPE) 

     while self.listening: 
      data = p.stdout.read(1024) 

      try: self.send(bytearray(data), binary=True) 
      except ssl.SSLError: pass 

     p.kill() 

    def close(self): 
     self.listening = False 
     self.stream_audio_thread.join() 
     WebSocketClient.close(self) 

try: 
    stt_client = SpeechToTextClient() 
    raw_input() 
finally: 
    stt_client.close() 

理想的にはMac OS Xの上では動作しません、私ではありませんPythonではこれをやっていますが、私の母国語であるRは、結果をやはり処理するために転送する必要があります。

ストリーミングされた転写をどのように得ることができるのか、私には誰もが解決策を提供できますか?

答えて

0

この回答が欲しいものかどうかはわかりませんが、パラメータcontinuousの問題のように聞こえます。

ご覧のとおり、Watson-developer-cloud内にlib Python SDKがあります。

あなたはしてインストールすることができます。pip install watson-developer-cloud

import json 
from os.path import join, dirname 
from watson_developer_cloud import SpeechToTextV1 

speech_to_text = SpeechToTextV1(
    username='YOUR SERVICE USERNAME', 
    password='YOUR SERVICE PASSWORD', 
    x_watson_learning_opt_out=False 
) 

print(json.dumps(speech_to_text.models(), indent=2)) 

print(json.dumps(speech_to_text.get_model('en-US_BroadbandModel'), indent=2)) 

with open(join(dirname(__file__), '../resources/speech.wav'), 
      'rb') as audio_file: 
data = json.dumps(speech_to_text.recognize(audio_file, content_type='audio/wav', timestamps=False, word_confidence=False, continuous=True), indent=2) 
print(data) 

OBS:サービスは、発話ごとに1と結果のarrayを返します。ライン#L44

は、あなたが使用することができます paramsを持っているので、連続転写のために、あなたは上記の例のように trueにパラメータ continuousと設定を使用する必要があります。

  • Official Documentation接続を有効に保つためのWebソケットについての説明を参照してください。 (これはあなたが必要とするものかもしれません)。
  • 0

    Rを使用してこれを行う方法のいくつかの良い例については、Ryan Andersonのこれらの素晴らしいブログ記事をご覧ください。

    RyanはRとWatson APIを使用して多くの作業を行っています。彼はblogについて多くの知識を共有しています。

    関連する問題