【问题标题】:how to get the microphone streamed directly to the watson speechToText service如何让麦克风直接流式传输到 watson speechToText 服务
【发布时间】:2018-09-12 03:12:17
【问题描述】:

我们想将麦克风直接连接到waton语音到文本服务,但似乎我们必须先通过.wav ?请查看以下代码,特别是我试图让麦克风直接流式传输到 SpeechToText 服务。我相信这是使用 mic 的最常见方式,而不是将其通过管道传输到 .wav 中,然后将 .wav 文件流式传输到 stt:

var mic;
 var SpeechToTextV1 = require('watson-developer-cloud/speech-to-text/v1');
 var fs = require('fs');
 var watson = require('watson-developer-cloud');
 var cp = require('child_process');
  mic = cp.spawn('arecord', ['--device=plughw:1,0', '--format=S16_LE', '--rate=44100', '--channels=1']); //, '--duration=10'
  mic.stderr.pipe(process.stderr);
  stt();

  function stt() {
     console.log("openCMDS");
         var speech_to_text = new SpeechToTextV1({
         username: '',
         password: ''
         });
     var params = {
     content_type: 'audio/wav',
     model: 'zh-CN_BroadbandModel',
     continuous: true,
     inactivity_timeout: -1
     };
     recognizeStream = speech_to_text.createRecognizeStream(params);
         mic.stdout.pipe(recognizeStream);
         //mic.stdout.pipe(require('fs').createWriteStream('test.wav')); 

         // Pipe in the audio.
         fs.createReadStream('test.wav').pipe(recognizeStream);
         recognizeStream.pipe(fs.createWriteStream('transcription.txt'));
     recognizeStream.setEncoding('utf8'); 
     console.log("start record");
        recognizeStream.on('data', function(event) { onEvent('Data:', event); });
        recognizeStream.on('error', function(event) { onEvent('Error:', event); });
        recognizeStream.on('close', function(event) { onEvent('Close:', event); });
 // Display events on the console.
 function onEvent(name, event) {
     console.log(name, JSON.stringify(event, null, 2));
      }

 }

【问题讨论】:

标签: ibm-watson speech-to-text


【解决方案1】:

Speech to Text 服务需要知道您尝试发送的音频的格式。我看到的 99% 的问题是因为该服务期望的音频格式与用户使用的音频格式不同。

'--format=S16_LE', '--rate=44100', '--channels=1'

这看起来像是 44.1kHz PCM 格式。

在您指定的代码中:

content_type: 'audio/wav'

看看supported audio formats

也许可以试试audio/l16; rate=44100;。您还可以以不同的格式录制音频。

最后,看看javascript-speech-sdk。我们提供了如何从浏览器流式传输麦克风的示例。

更新

const mic = require('mic');
const SpeechToTextV1 = require('watson-developer-cloud/speech-to-text/v1');
const speechToText = new SpeechToTextV1({
  username: 'YOUR USERNAME',
  password: 'YOUR PASSWORD',
  url: 'YOUR SERVICE URL',
  version: 'v1'
});

// 1. Microphone settings
const micInstance = mic({
  rate: 44100,
  channels: 2,
  debug: false,
  exitOnSilence: 6
});



// 2. Service recognize settings
const recognizeStream = speechToText.createRecognizeStream({
  content_type: 'audio/l16; rate=44100; channels=2',
  model: 'zh-CN_BroadbandModel',
  interim_results: true,
})

// 3. Start recording
const micInputStream = micInstance.getAudioStream();
micInstance.start();

console.log('Watson is listening, you may speak now.');

// 4. Pipe audio to service
const textStream = micInputStream.pipe(recognizeStream).setEncoding('utf8');

textStream.on('data', user_speech_text => console.log('Watson hears:', user_speech_text));
textStream.on('error', e => console.log(`error: ${e}`));
textStream.on('close', e => console.log(`close: ${e}`));

【讨论】:

  • 我确实使用以下代码从麦克风录制了我的声音: mic.stdout.pipe(require('fs').createWriteStream('test.wav')) ; audio/l16 没有帮助,我想知道如何修改我的代码以将麦克风直接流式传输到 stt 服务
  • WAVE 格式不是用于流式传输,而是用于基于文件的识别,.wav 文件的标题中包含音频长度。您需要做的是从麦克风捕获音频并一次将其提供给 stt 一个块,所有这些都在同一个识别会话中,为此使用 websockets。 watson-developer-cloud 中有大量示例代码
  • @Daniel Bolanos,感谢您的及时更新,如果您有机会可以更新我的代码以使用 websockets 吗?
  • 我用“websockets”修改了我的代码: var identifyStream = mic.stdout.pipe(speech_to_text.createRecognizeStream(params)).setEncoding('utf8');不幸的是,我的屏幕上没有看到任何文字,请查看我在第 25 行的代码:gist.github.com/vkjuju/8349102e08563f384417ed2f129769c1
  • @JoeYang 这里的问题显然是您如何录制音频并将其发送到 Speech to Text 服务。我的回答中的“音频格式”链接描述了假定的音频格式。不要使用cp.spawn 执行命令,而是尝试找到一个库来帮助您以服务支持的格式录制音频。看看npmjs.com/package/mic GitHub repo中有例子。
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多