0

Watsonサーバーのマイクを使ってリアルタイムでテキストを取得できる小さなPythonプログラムを作成しようとしています(here)。PythonのWatsonを使ったテキストへの連続リアルタイム音声

import pyaudio 
import json 
from watson_developer_cloud import SpeechToTextV1 

CHUNK = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 2 
RATE = 44100 
RECORD_SECONDS = 10 

p = pyaudio.PyAudio() 

stream = p.open(format=FORMAT, 
       channels=CHANNELS, 
       rate=RATE, 
       input=True, 
       frames_per_buffer=CHUNK) 
print("* recording") 

frames = [] 

for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
    data = stream.read(CHUNK) 
    frames.append(data) 

print("* done recording") 

stream.stop_stream() 
stream.close() 
p.terminate() 

data_feed = b''.join(frames) 

speech_to_text = SpeechToTextV1(
    username='secret', 
    password='secret too', 
    x_watson_learning_opt_out=False 
) 

result = speech_to_text.recognize(data_feed, 
            content_type="audio/l16;rate=44100;channels=2", 
            word_confidence=True, 
            max_alternatives=4, 
            word_alternatives_threshold=0.5, 
            model="en-US_BroadbandModel", 
            continuous=True) 

j = json.dumps(result, indent=2) 
print(j) 
+0

解決したい問題がありますか?コードを1行ずつ進めてみましたか? – alex

+0

こんにちは@alex、現在のところ、PythonのSDKは、マイク経由で直接オーディオを取得する代わりに、オーディオファイルを使用することに限定されています。私は現在、マイクを使っている間にリアルタイムテキストを得ることを可能にするプロジェクトに取り組んでいます。 – DBeck

+0

私は今、これを行うためにウェブソケットを使用しています、そして、私は明日までに何かを持っているかもしれないと思います。 – DBeck

答えて

0

私は先に行って、WebSocketをを使用して、ワトソンサーバーに接続するためにゼロからプログラムを作成しました:

これは私が思い付いたてきたが、私は録音を終了した後、それがテキストを取得するコードです。それはまだ私が期待するものを正確にやっていないが、それは非常に近い。

リアルタイムでオーディオがサーバーに送信されていますが、録音が完了した後に録音を取得しています。

import asyncio 
import websockets 
import json 
import requests 
import pyaudio 
import time 

# Variables to use for recording audio 
CHUNK = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 2 
RATE = 16000 

p = pyaudio.PyAudio() 

# This is the language model to use to transcribe the audio 
model = "en-US_BroadbandModel" 

# These are the urls we will be using to communicate with Watson 
default_url = "https://stream.watsonplatform.net/speech-to-text/api" 
token_url = "https://stream.watsonplatform.net/authorization/api/v1/token?" \ 
      "url=https://stream.watsonplatform.net/speech-to-text/api" 
url = "wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=en-US_BroadbandModel" 

# BlueMix app credentials 
username = "" # Your Bluemix App username 
password = "" # Your Bluemix App password 

# Send a request to get an authorization key 
r = requests.get(token_url, auth=(username, password)) 
auth_token = r.text 
token_header = {"X-Watson-Authorization-Token": auth_token} 

# Params to use for Watson API 
params = { 
    "word_confidence": True, 
    "content_type": "audio/l16;rate=16000;channels=2", 
    "action": "start", 
    "interim_results": True 
} 

# Opens the stream to start recording from the default microphone 
stream = p.open(format=FORMAT, 
       channels=CHANNELS, 
       rate=RATE, 
       input=True, 
       output=True, 
       frames_per_buffer=CHUNK) 


async def send_audio(ws): 
    # Starts recording of microphone 
    print("* READY *") 

    start = time.time() 
    while True: 
     try: 
      print(".") 
      data = stream.read(CHUNK) 
      await ws.send(data) 
      if time.time() - start > 20: # Records for n seconds 
       await ws.send(json.dumps({'action': 'stop'})) 
       return False 
     except Exception as e: 
      print(e) 
      return False 

    # Stop the stream and terminate the recording 
    stream.stop_stream() 
    stream.close() 
    p.terminate() 


async def speech_to_text(): 
    async with websockets.connect(url, extra_headers=token_header) as conn: 
     # Send request to watson and waits for the listening response 
     send = await conn.send(json.dumps(params)) 
     rec = await conn.recv() 
     print(rec) 
     asyncio.ensure_future(send_audio(conn)) 

     # Keeps receiving transcript until we have the final transcript 
     while True: 
      try: 
       rec = await conn.recv() 
       parsed = json.loads(rec) 
       transcript = parsed["results"][0]["alternatives"][0]["transcript"] 
       print(transcript) 
       #print(parsed) 
       if "results" in parsed: 
        if len(parsed["results"]) > 0: 
         if "final" in parsed["results"][0]: 
          if parsed["results"][0]["final"]: 
           #conn.close() 
           #return False 
           pass 
      except KeyError: 
       conn.close() 
       return False 

# Starts the application loop 
loop = asyncio.get_event_loop() 
loop.run_until_complete(speech_to_text()) 
loop.close() 

私が今マイクを通して録音している間に転写物を取得したいのです。

関連する問題