Blob使Android Chrome上的音频失真

时间:2018-10-30 13:14:24

标签: javascript google-chrome blob speech-recognition android-chrome

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

0 个答案:

没有答案