4

我正在尝试从麦克风输入音频流并将其保存到 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);
4

0 回答 0