Javascript 如何将本地html5录制音频的float32Array格式转换为适合Google语音到文本服务的字节?

Javascript 如何将本地html5录制音频的float32Array格式转换为适合Google语音到文本服务的字节?,javascript,python,websocket,audio-streaming,google-speech-api,Javascript,Python,Websocket,Audio Streaming,Google Speech Api,如果您遵循本教程:您将设法创建一个脚本处理器,向其中添加一个侦听器 scriptProcessor = inputPoint.context.createScriptProcessor(bufferSize, in_channels, out_channels) //... scriptProcessor.addEventListener('audioprocess', streamAudioData) 通过调用此行在回调内部:callback\u param.inputBuffer.getC

如果您遵循本教程:您将设法创建一个脚本处理器,向其中添加一个侦听器

scriptProcessor = inputPoint.context.createScriptProcessor(bufferSize, in_channels, out_channels)
//...
scriptProcessor.addEventListener('audioprocess', streamAudioData)
通过调用此行在回调内部:
callback\u param.inputBuffer.getChannelData(0)
one接收一个javascript Float32Array,通过查看数据,该数组似乎包含从-1.0到+1.0的浮点数

因此,将其流式传输到后端,而后端又将其流式传输到谷歌语音文本服务,您将一无所获(如预期的那样)

用于流式输入的谷歌语音到文本服务(至少在Python中)需要一个wav格式的字节字符串,其中包含指定速率(即16000Hz)的声音。请注意,如果在后端将其流式处理为一个文件,则可以正常工作

此转换失败:Float32Array->Int16Array->字节字符串

有没有人找到什么是适当的转换为上述工作

或者,您是否知道一个更简单、更健壮的路径:浏览器中的麦克风->通过websocket将数据流到后端服务器->将数据流到Google语音输入服务->按预期获得响应


编辑:为Google语音api的识别配置添加python代码

config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code=self.language_code)

好的,做了一些挖掘,找到了正确的信息

LINEAR16
-未压缩的16位有符号小端采样(线性PCM)

关键部分包括:

  • 每个样本16位
  • 签名
  • 小恩迪亚
因此,您需要做的是将浮点值(
-1.0…1.0
)缩放为介于
-32786
32767
之间的整数

没有任何内置JavaScript方法可以为您执行此操作。Float32Array和Int16Array之间的转换不起作用,因为最终的值接近于
-1
0
1
。不能使用Int16Array的另一个原因是因为它是


你需要做的是与ArrayBuffers相处融洽,然后用鼠标操纵它们。取每个样本,做一些数学运算,写下字节,移动到下一个样本。完成后,XHR和Fetch API都支持发送ArrayBuffer作为HTTP请求主体。或者,你可以用ArrayBuffer实例化一个新的Blob,并用它做其他事情。

谷歌期望的确切格式是什么?每个样本16位,16 kHz采样率?另外请注意,如果您希望正确地重新采样,您需要知道原始采样率是多少。嗨@Brad谢谢您的回复。请看我问题中的一个编辑,其中我解释了Google speech客户端的配置。您知道预期的端点吗?(可能是小endian,但只是检查一下。)嗨@Brad谢谢你的提示。是的,我已经考虑了little endian和big endian。小“声音”更好,这意味着我们更接近最终的声音文件。目前我还在考虑python如何处理数字。。。在python中,将范围-32768…32767或范围0…65535转换为short以保持其二进制表示是否有意义