Я пытаюсь ввести аудиопоток с микрофона и сохранить его в 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);