3

WebSocketを使用してIBM Watson Speech-to-Textのtutorialをリアルタイムで処理しています。私はAngularを使用しています。IBM Watsonスピーチからテキスト送信マイク・データ接続を閉じる

コードの最初の25行はAPI referenceからコピーされます。このコードは正常に接続し、認識要求を開始します。ワトソンは私にメッセージ{ "state": "listening" }を送ります。

接続が終了したときにログに記録するfunction onClose()を書きました。

私はハンドラ$scope.startSpeechRecognitionを実行するボタンを作った。これはgetUserMedia()を使用してマイクからのオーディオをストリーミングし、websocket.send()を使用してデータをワトソンにストリーミングします。これは動作していません。このボタンをクリックすると接続が終了します。私は間違ったタイプのデータを送信していると推定し、Watsonは接続を終了していますか?

websocket.send(blob);onOpenからマイハンドラ$scope.startSpeechRecognitionに移動しました。私はwebsocket.send(blob);websocket.send(mediaStream);に変更しました。私はこれが間違っているかもしれません:'content-type': 'audio/l16;rate=22050'。どのビットレートがマイクロフォンから来るのかをどのように知るのですか?

JavaScriptのチュートリアルはありますか?私がGoogleのトップにある「IBM Watson Speech-to-Text JavaScriptチュートリアル」は8000-line SDKです。 SDKが必要ですか?また、サービスの仕組みを理解するための簡単なプログラムを作成できますか?ここ

'use strict'; 
app.controller('WatsonController', ['$scope', 'watsonToken', function($scope, watsonToken) { 
    console.log("Watson controller."); 

    var token = watsonToken; 
    var wsURI = "wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize" 
    + "?watson-token=" + token + '&model=en-US_BroadbandModel'; 

    var websocket = new WebSocket(wsURI); // opens connection to Watson 
    websocket.onopen = function(evt) { onOpen(evt) }; // executes when a connection opens 
    websocket.onclose = function(evt) { onClose(evt) }; // executes when a connection closes 
    websocket.onmessage = function(evt) { onMessage(evt) }; // logs messages from Watson to the console 
    websocket.onerror = function(evt) { onError(evt) }; // logs errors to the console 

    function onOpen(evt) { 
    var message = { 
     action: 'start', 
     'content-type': 'audio/flac', 
     'interim_results': true, 
     'max-alternatives': 3, 
     keywords: ['colorado', 'tornado', 'tornadoes'], 
     'keywords_threshold': 0.5 
    }; 
    websocket.send(JSON.stringify(message)); 

    // Prepare and send the audio file. 
    // websocket.send(blob); 

    // websocket.send(JSON.stringify({action: 'stop'})); 
    } 

    function onClose() { 
    console.log("Connection closed."); 
    }; 

    function onMessage(evt) { 
    console.log(evt.data); // log the message to the console 
    } 

    $scope.startSpeechRecognition =() => { 
    console.log("Starting speech recognition."); 
    var constraints = { audio: true, video: false }; 
    navigator.mediaDevices.getUserMedia(constraints) 
    .then(function(mediaStream) { 
     console.log("Streaming audio."); 
     websocket.send(mediaStream); 
    }) 
    .catch(function(err) { console.log(err.name + ": " + err.message); }); // log errors 
    }; 

    $scope.stopSpeechRecognition =() => { // handler for button 
    console.log("Stopping speech recognition."); 
    websocket.send(JSON.stringify({action: 'stop'})); 
    }; 

    $scope.closeWatsonSpeechToText =() => { // handler for button 
    console.log("Closing connection to Watson."); 
    websocket.close(); // closes connection to Watson? 
    }; 

}]); 

そして、私のテンプレートです:

は、ここに私のコントローラの

<div class="row"> 
    <div class="col-sm-2 col-md-2 col-lg-2"> 
    <p>Watson test.</p> 
    </div> 
</div> 

<div class="row"> 
    <div class="col-sm-2 col-md-2 col-lg-2"> 
    <button type="button" class="btn btn-primary" ng-click="startSpeechRecognition()">Start</button> 
    </div> 

    <div class="col-sm-2 col-md-2 col-lg-2"> 
    <button type="button" class="btn btn-warning" ng-click="stopSpeechRecognition()">Stop</button> 
    </div> 

    <div class="col-sm-2 col-md-2 col-lg-2"> 
    <button type="button" class="btn btn-danger" ng-click="closeWatsonSpeechToText()">Close</button> 
    </div> 
</div> 
+0

Thomas、あなたの人生を楽にするJavaScriptのSDKがあります:https://github.com/watson-developer-cloud/speech-javascript-sdkそこのサンプルを見てください。 –

答えて

3

The SDKが必要とされていないが、しかしGeman Attanasioが言ったように、それはあなたの生活がより簡単になりません。あなたのコード上へ、

、しかし、この行は間違いなく動作しません:getUserMedia()からmediaStreamオブジェクトを直接WebsSocket上で送信することはできません

websocket.send(mediaStream);

は - WebSocketをのみ、テキストとバイナリを受け入れますデータ(元の例のblob)。あなたは、オーディオを抽出して、それだけを送信する必要があります。

WebAudio APIは、Watson APIがネイティブに理解できる形式ではない32ビット浮動小数点数のオーディオを提供するため、この場合でもこれでは不十分です。 SDKは自動的にそれを抽出してaudio/l16;rate=16000(16ビットint)に変換します。

マイクのビットレートはどのようにしてわかりますか?

それはあなたがscriptProcessorNodeを追加する場合、それはオーディオデータやサンプル・レートが含まAudioBuffersを渡すことができ、AudioContextで利用可能だと。ビットレートを得るために、サンプルレートをチャンネル数(通常は1)で各サンプルのサイズ(l16に変換する前に32ビット、16ビット後)に掛けます。

rate=の後にコンテンツタイプに入れた数字は、ビットレートではなくサンプルレートです。つまり、AudioContextまたはAudioBufferから乗算せずにコピーするだけです。 (SDKのようにオーディオをダウンサンプリングしないと、入力レートではなくターゲットのサンプルレートに設定する必要があります)

このすべての動作を確認したい場合は、 SDKはオープンソースです:MediaStreamのからオーディオを抽出

これらのファイルを読むときには、Node.js Streams standardに精通していると便利です。

FWIWでは、BrowserifyやWebpackのようなバンドルシステムを使用している場合は、必要なSDKの部分だけを選択して選択し、ファイルサイズを大幅に小さくすることができます。また、SDKが初期レンダリングに含まれないため、ページがロードされてレンダリングされた後にダウンロードするように設定することもできます。

+1

ありがとう、私はSDKをダウンロードし、私はちょうど私のブラウザでローカルに実行されている "マイクからトランスクリプト"の例を得た。明日私はAngularプロジェクトからこれをやろうとします。 –

+1

私はSpeech-to-TextをAngularで動作させています。再度、感謝します! –

+0

それを聞いてうれしい! –

関連する問題