我正在尝试从麦克风输入音频流并将其保存到Blob,以便可以将其发送到语音识别API端点。这在台式机上的谷歌浏览器上完美运行,但是当我切换到移动设备浏览器(Android谷歌浏览器)时发现错误。将音频输出到文件后,我发现在桌面上该文件听起来不错,但是在我的手机上,它将完全失真。经过更多研究,看来android chrome does not support 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()和任何其他阅读器方法(根据此link)都期望一个blob对象。我的音频对象是一种ArrayBuffer。我的另一个问题是:如何将ArrayBuffer输出到文件?
另一个更新:根据this link,Android chrome应该支持blob。但是,我的音频失真了,也许问题可能出在其他地方?
更新:经过更多研究,我发现我们的音频阵列可能未正确编码。为了处理来自麦克风的音频,我们使用了ScriptProcessor,但是根据this link,它已被弃用,Android chrome不支持。有关我们如何编码音频输入的参考,您可以查看this library。我认为可以通过切换为使用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);