Мне нужно отправить аудиопоток с Javascript с помощью getusermedia и отправить его на python через веб-сокет для речи в текст.
Может кто-нибудь, пожалуйста, помогите мне с кодом. Я реализовал, используя блоб. Но это требует много вызовов API и много времени для преобразования речи в текст.
Я проверяю пробел 4 se c и использую mediarecorder.stop для отправки захвата аудиоданных и конвертации в wav и отправки. Может кто-нибудь помочь в изменении приведенного ниже скрипта захватить непрерывный поток и отправить в python API, используя Webscoket
navigator.mediaDevices.getUserMedia({ audio: true })
.then(function (stream) {
audioContext = new AudioContext({ sampleRate: 16000 });
getSessionID();
analyser = audioContext.createAnalyser();
microphone = audioContext.createMediaStreamSource(stream);
javascriptNode = audioContext.createScriptProcessor(2048, 1, 1);
analyser.smoothingTimeConstant = 0.8;
analyser.fftSize = 1024;
mediaRecorder = new MediaRecorder(stream);
setInterval(readstreamdata,1000);
mediaRecorder.ondataavailable = function (e) {
if (e.data.length <= 0)
return
chunks.push(e.data);
sendstreamdata(chunks)
//return
if (isTextResponseGenerating == true)
return;
//console.log(typeof e.data)
sendstreamdata(stream);
return
var blob = new Blob(chunks, { 'type': 'audio/webm; codecs=opus' });
var fileReader = new FileReader();
fileReader.onload = function (event) {
arrayBuffer = event.target.result;
};
fileReader.readAsArrayBuffer(blob);
fileReader.onloadend = function (d) {
audioContext.decodeAudioData(
fileReader.result,
function (buffer) {
var wav = audioBufferToWav(buffer);
sendstreamdata(new Blob([new Uint8Array(wav)]));
//sendstreamdata(chunks);
//sendstreamdata(blob);
},
function (e) { console.log(e); }
);
};
}
microphone.connect(analyser);
analyser.connect(javascriptNode);
javascriptNode.connect(audioContext.destination);
javascriptNode.onaudioprocess = function (e) {
if (started == true && isTextResponseGenerating == false) {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var values = 0;
var length = array.length;
for (var i = 0; i < length; i++) {
values += (array[i]);
}
var average = values / length;
//console.log(Math.round(average));
if (silenceStart > 0) {
time = new Date();
silenceend = time.getTime()
if (Math.abs(silenceStart - silenceend) / 1000 >= 4) {
if (isspeechToTextProcessingCnt <= 0) {
isTextResponseGenerating = true;
silenceStart = 0;
if (mediaRecorder.state != 'inactive') {
mediaRecorder.stop();
}
playAudio();
}
return;
}
}
if (Math.round(average) > 20 && start == 0) {
isValidByteStream = true;
time = new Date();
start = time.getTime()
silenceStart = 0;
}
else if (start > 0 && Math.round(average) <= 5) {
isValidByteStream = false;
if (mediaRecorder.state == "inactive") {
return;
}
time = new Date();
end = time.getTime()
//console.log(start, end, (Math.abs((start - end)) / 1000))
//if ((Math.abs((start - end)) / 1000) > 1) {
++isspeechToTextProcessingCnt;
start = 0;
silenceStart = end;
end = 0
console.log('inside')
//if (mediaRecorder.state == "inactive") {
// --isspeechToTextProcessingCnt;
// return;
//}
mediaRecorder.stop();
mediaRecorder.start();
//}
}
}
}
})
.catch(function (err) {
/* handle the error */
});
}