我正在尝试从麦克风输入音频流并将其保存到 blob,以便我可以将其发送到语音识别 API 端点。这在桌面上的 google chrome 上完美运行,但是当我切换到移动设备浏览器(android google chrome)时,我注意到了错误。将音频输出到文件后,我发现在桌面上,文件听起来不错,但在我的手机上,它会完全失真。经过更多研究,似乎 android chrome不支持 Blob;
这个问题有一些解决方法吗?
这就是我将音频添加到 Blob 并将其保存到文件中的方式:
var blob = new Blob([audio], { type: 'audio/wav' });
var reader = new FileReader;
reader.onload = function() {
window.open(this.result.replace(/data:.+?\/[^;]+/, "data:application/octet-stream"));
};
reader.readAsDataURL(blob);
更新:我正在尝试将音频保存到文件中,但 reader.readAsDataURL() 和任何其他阅读器方法(根据此链接)都需要一个 blob 对象。我的音频对象是一种 ArrayBuffer。我的另一个问题是:如何将 ArrayBuffer 输出到文件?
另一个更新:根据这个链接,android chrome应该支持blob。不过,我的音频失真了,也许问题可能出在其他地方?
更新:经过更多研究,我发现我们的音频数组可能没有正确编码。要处理来自麦克风的音频,我们使用的是 ScriptProcessor,但根据此链接,它已被弃用,并且在 android chrome 上不受支持。有关我们如何编码音频输入的参考,您可以查看这个库。我认为这个问题可以通过切换到使用Audio Worklet来解决。这就是我使用脚本处理器节点的方式(您也可以在引用的库中看到):
// Create ScriptProcessorNode
this.scriptProcessorNode = this.options.context.createScriptProcessor(this.options.bufferLen, numChannels, numChannels);
// Connect scriptProcessorNode (Theretically, not required)
this.scriptProcessorNode.connect(this.options.context.destination);
// Create callback to update/analyze floatFrequencyData
var self = this;
this.scriptProcessorNode.onaudioprocess = function (event) {
self.analyser.getFloatFrequencyData(self.floatFrequencyData);
self.update();
self.store(event);
self.monitor();
};
// Connect scriptProcessorNode
this.options.source.connect(this.scriptProcessorNode);