Node.js 谷歌语音API使用SOX时语音识别错误

Node.js 谷歌语音API使用SOX时语音识别错误,node.js,audio,voice-recognition,sox,google-speech-api,Node.js,Audio,Voice Recognition,Sox,Google Speech Api,我正在尝试用NodeJS创建非常简单的语音识别软件。我已经连接了谷歌语音API,可以发送正确录制的.wav文件并返回转录,识别效果非常好(用Audacity录制) 但我在“实时”获取语音识别时遇到了一些问题,比如将音频流直接从麦克风发送到Gooegle语音API 这是我记录语音并发送到谷歌的主要方法 function recognize(encoding, sampleRateHertz, languageCode) { const request = { config: {

我正在尝试用NodeJS创建非常简单的语音识别软件。我已经连接了谷歌语音API,可以发送正确录制的.wav文件并返回转录,识别效果非常好(用Audacity录制)

但我在“实时”获取语音识别时遇到了一些问题,比如将音频流直接从麦克风发送到Gooegle语音API

这是我记录语音并发送到谷歌的主要方法

function recognize(encoding, sampleRateHertz, languageCode)
{

  const request = {
    config: {
      encoding: encoding,
      sampleRateHertz: sampleRateHertz,
      languageCode: languageCode
    },
    interimResults: true // If you want interim results, set this to true
  };


  // Imports the Google Cloud client library
  const Speech = require('@google-cloud/speech');

  // Instantiates a client
  const speech = Speech();

  // Create a recognize stream
  const recognizeStream = speech.createRecognizeStream(request)
    .on('error', console.error)
    .on('data', (data) => process.stdout.write(data.results + ', '))


let fs = require('fs');
let Mic = require('node-microphone');
let mic = new Mic({ 'rate': '16000', 'channels': '1', 'debug': true, 'exitOnSilence': 6, 'bitwidth' : '16' });
let micStream = mic.startRecording();

micStream.pipe(recognizeStream);
micStream.pipe(fs.createWriteStream('test.wav') )
setTimeout(() => {
    //logger.info('stopped recording');
    console.log('stopped writing')
    mic.stopRecording();
}, 10000);
mic.on('info', (info) => {
    console.log('INFO ' + info);
});
mic.on('error', (error) => {
    console.log(error);
});
}
以及我传递给方法的配置数据

options({
    encoding: {
      alias: 'e',
      default: 'LINEAR16',
      global: true,
      requiresArg: true,
      type: 'string'
    },
    sampleRateHertz: {
      alias: 'r',
      default: 16000,
      global: true,
      requiresArg: true,
      type: 'number'
    },
    languageCode: {
      alias: 'l',
      default: 'en-US',
      global: true,
      requiresArg: true,
      type: 'string'
    }
  })
所以我使用“节点麦克风”进行录音,我安装了Windows和SOX。通过谷歌发送。我不会出错,但识别能力很差。我会抄写一些非常简单的单词或短语,比如“谁”、“食物”、“电话”。大多数情况下,如果我正常说话,就不会有任何回复

我有一种感觉,encodng有些地方出错了,或者录音速率(比如,录音太快了,谷歌不懂),但我看不出我的错误

我还添加了文件保存。当我打开文件并收听时,听起来很正常。当我把这个文件寄去再确认时,我几乎什么也没得到。因此,音频流的录制方式有问题

编辑:
我几乎可以肯定的是,问题出在SOX身上。使用其他程序录制的所有文件都工作得更好。

共享不起作用的坏记录文件。这里是保存的文件,不起作用:sox返回的文件是32位,google希望是16位。这可能是一个驱动程序问题,它只返回32位到sox。你的sox版本和Windows版本是什么?从命令行运行此命令时会发生什么情况:
sox-b16--endian little-c1-r16000-e有符号整数-t waveaudio default-p>test1.wav
I有64位版本的Windows 10。我从这里下载的SOX是一个32位的软件。我确实测试了这个命令。你是对的,它以32位保存,即使指定为16位,你的sox版本是什么?