Blob искажающий звук на Android Chrome - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь ввести аудиопоток с микрофона и сохранить его в 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 () и любые другие методы чтения (согласно этой ссылке ) ожидают большой двоичный объект объект. Мой аудиообъект является типом ArrayBuffer. Другой мой вопрос: как я могу вывести ArrayBuffer в файл?

Другое обновление : Согласно эта ссылка , blob должна поддерживаться Android Chrome. Тем не менее, мой звук искажен, может быть, проблема может быть где-то еще?

Обновление : После дополнительных исследований я обнаружил, что наш аудио массив может быть неправильно закодирован. Для обработки звука с микрофона мы используем 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);
...