IBM沃森演讲

我正在通过IBM Watson Speech-to-Text教程,使用WebSocket进行实时转录。 我正在使用Angular。

前25行代码是从API参考中复制的。 此代码成功连接并发起识别请求。 沃森给我发了一条消息{ "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 Watson Speech-to-Text JavaScript教程”是一个8000行的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>

SDK不是必需的,但正如Geman Attanasio所说,它确实让您的生活更轻松。

但是,在你的代码中,这行肯定不会起作用:

websocket.send(mediaStream);

getUserMedia()的mediaStream对象不能直接通过Websocket发送 - 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是开源的:

  • 从mediaStream中提取音频:https://github.com/saebekassebil/microphone-stream/blob/master/microphone-stream.js
  • 转换和缩减采样:https://github.com/watson-developer-cloud/speech-javascript-sdk/blob/master/speech-to-text/webaudio-l16-stream.js
  • 管理WebSocket:https://github.com/watson-developer-cloud/speech-javascript-sdk/blob/master/speech-to-text/recognize-stream.js
  • 在阅读这些文件时,熟悉Node.js Streams标准很有帮助。

    FWIW,如果您使用的是像Browserify或Webpack这样的捆绑系统,您可以只选择您需要的SDK部分并获得更小的文件大小。 您也可以在页面加载和渲染后进行下载,因为SDK不会成为您初始渲染的一部分。

    链接地址: http://www.djcxy.com/p/34463.html

    上一篇: IBM Watson Speech

    下一篇: MediaRecorder working in Firefox, but not in Chrome for Speech