Причина:
Обратите внимание, что вы не создаете MediaRecorder
с audio/wav
mimeType с помощью
new Blob(audioChunks,{type:'audio/wav; codec=audio/pcm; samplerate=16000'})
Это утверждение является только описанием для blob. Я тестирую свой Chrome (v71) с isTypeSupported
:
MediaRecorder.isTypeSupported("audio/wav") // return false
MediaRecorder.isTypeSupported("audio/ogg") // return false
MediaRecorder.isTypeSupported("audio/webm") // return true
Похоже, что MediaRecorder будет записывать звук только в audio/webm
. Кроме того, когда я запускаю следующий код в Chrome, значение по умолчанию rec.mimeType
равно audio/webm;codecs=opus
rec = new MediaRecorder(stream);
В соответствии с требованиями к форматам аудио , audio/webm
пока не поддерживается.
Подход:
Перед вызовом getText()
нам нужно сначала преобразовать webm
в wav
. Есть довольно много библиотек, которые могут помочь нам сделать это. Я просто копирую Jam3-скрипт перед вашим кодом для преобразования webm
в wav
:
// add Jam3's script between Line 2 and Line 94 or import that module as you like
// create a audioContext that helps us decode the webm audio
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
rec = new MediaRecorder(stream,{
mimeType : 'audio/webm',
codecs : "opus",
});
// ...
rec.ondataavailable = e => {
audioChunks.push(e.data);
if (rec.state == "inactive") {
var blob = new Blob(audioChunks, { 'type': 'audio/webm; codecs=opus' });
var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function(event) {
arrayBuffer = event.target.result;
};
fileReader.readAsArrayBuffer(blob);
fileReader.onloadend=function(d){
audioCtx.decodeAudioData(
fileReader.result,
function(buffer) {
var wav = audioBufferToWav(buffer);
setTimeout(() => getText(wav), 1000);
},
function(e){ console.log( e); }
);
};
}
}
И у меня это прекрасно работает:
В качестве дополнительного примечания я предлагаю вам использовать свой бэкэнд для вызова служб преобразования речи в текст . Никогда не вызывайте службу Azure stt
в браузере . Это потому, что выставление ключа подписки на передний конец действительно опасно. Кто угодно может проверить сеть и украсть ваш ключ .