如果您遵循本教程:https://medium.com/ideas-at-igenius/delivering-a-smooth-cross-browser-speech-to-text-experience-b1e1f1f194a2,您将设法创建一个向其添加侦听器的脚本处理器
scriptProcessor = inputPoint.context.createScriptProcessor(bufferSize, in_channels, out_channels)
//...
scriptProcessor.addEventListener('audioprocess', streamAudioData)
在回调中通过调用以下行:callback_param.inputBuffer.getChannelData(0)
收到一个javascript Float32Array,通过查看数据,它似乎包含从-1.0到+1.0的浮点数
因此,将其流式传输到后端,然后将其流式传输到Google Speech-To-Text服务,您一无所获(如预期)
至少在Python中,用于流输入的Google Speech-To-Text服务需要wav格式的字节字符串,其中包含指定频率的声音(即16000Hz)。请注意,如果您在后端流式传输文件,则可以正常工作。
此转换失败:Float32Array-> Int16Array->字节字符串
有人找到适合上述条件的适当转换吗?
或者,您是否知道一种更简单,更健壮的路径:浏览器中的麦克风->通过websocket将数据流传输到后端服务器->将数据流传输到Google Speech-To-Input服务->获得预期的响应?
编辑:为Google Speech API的识别配置添加python代码
config = types.RecognitionConfig(
encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
language_code=self.language_code)
答案 0 :(得分:1)
好吧,做了一些挖掘,发现actual documentation具有正确的信息。
LINEAR16
-未压缩的16位带符号小字节序采样(线性PCM)。
关键部分是:
因此,您需要做的是将浮点值(-1.0 ... 1.0
)缩放为-32786
和32767
之间的整数。
没有任何内置的JavaScript方法可以为您执行此操作。您无法在Float32Array和Int16Array之间进行转换,因为最终只会得到近似于-1
,0
和1
的值。无法使用Int16Array的另一个原因是因为它是endianness is platform dependent!
您需要做的就是熟悉ArrayBuffer,并使用DataView对其进行操作。取每个样本,做一些数学运算,写字节,移到下一个样本。完成后,XHR和Fetch API均支持发送ArrayBuffer作为HTTP请求正文。或者,您可以使用该ArrayBuffer实例化一个新的Blob并对其进行其他操作。