Потоковая передача аудиоданных на веб-сокет python с помощью getusermedia - PullRequest
0 голосов
/ 20 марта 2020

Мне нужно отправить аудиопоток с 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 */
            });
    }
...