IBM Watson语音到文本发送麦克风数据关闭连接

问题描述:

我正在使用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看看那里的例子。 –

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

很高兴听到它! –