3

我正在使用IBM Watson語音到文本的tutorial,使用WebSocket進行實時轉錄。我正在使用Angular。IBM Watson語音到文本發送麥克風數據關閉連接

前25行代碼從API reference複製而來。此代碼成功連接並啓動識別請求。沃森給我發消息{ "state": "listening" }

我寫了function onClose(),記錄連接關閉時的日誌。

我做了一個運行處理程序$scope.startSpeechRecognition的按鈕。這使用getUserMedia()來傳輸來自麥克風的音頻和websocket.send()以將數據流式傳輸到Watson。這不起作用。點擊此按鈕關閉連接。我假設我發送了錯誤的數據類型,Watson正在關閉連接?

我將websocket.send(blob);onOpen移至我的處理程序$scope.startSpeechRecognition。我將websocket.send(blob);更改爲websocket.send(mediaStream);。我可能有這個錯誤:'content-type': 'audio/l16;rate=22050'。如何知道麥克風的比特率?

是否有JavaScript教程?當我在頂部的谷歌「IBM沃森語音對文本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

托馬斯,有一個javascript sdk,將使您的生活更輕鬆:https://github.com/watson-developer-cloud/speech-javascript-sdk看看那裏的例子。 –

回答

3

The SDK不是必需的,但作爲格曼Attanasio說,它使你的生活變得更輕鬆。

到您的代碼,但是,這條線肯定是行不通的:

websocket.send(mediaStream);

getUserMedia()mediaStream對象不能超過WebsSocket直接發送 - 的WebSockets只接受文本和二進制數據(原始示例中的blob)。你必須提取音頻,然後只發送它。

但在這種情況下,這還不夠,因爲WebAudio API提供32位浮點數的音頻,這不是Watson API本身可以理解的格式。 SDK自動提取並將其轉換爲audio/l16;rate=16000(16位整數)。

如何知道麥克風的比特率?

它可在AudioContext,如果你添加一個scriptProcessorNode,它可以傳遞AudioBuffers包括音頻數據和採樣率。將採樣率乘以每個採樣的大小(轉換爲16之前的32位,之後16位)乘以通道數量(通常爲1)以獲得比特率。

但請注意,您在rate=之後放入內容類型的數字是採樣率,而不是比特率。所以你可以從AudioContext或AudioBuffer中複製它而不需要乘法。 (除非您像SDK那樣對音頻進行縮減採樣,那麼它應該設置爲目標採樣率,而不是輸入速率。)

如果您想了解所有這些工作原理, SDK是開源:

閱讀這些文件時,熟悉Node.js Streams standard會很有幫助。

FWIW,如果您使用的是像Browserify或Webpack這樣的捆綁系統,您可以只選擇您需要的SDK部分並獲得更小的文件大小。您也可以在頁面加載和渲染後進行下載,因爲SDK不會成爲您初始渲染的一部分。

+1

謝謝,我下載了SDK,剛剛在我的瀏覽器中運行本地運行的「Microphone Transcribe」示例。明天我會嘗試從我的Angular項目中做到這一點。 –

+1

我在Angular中使用Speech-to-Text工作。再次感謝! –

+0

很高興聽到它! –