从麦克风(JS)通过WebSocket到FastAPI python后端扬声器的音频

wnrlj8wa  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(240)

所以,我试图设置一个东西,从网页上收集的麦克风到连接到托管网页的机器的扬声器的实时音频流。为此,我使用JavaScript的MediaRecorder如下所示:

navigator.mediaDevices.getUserMedia({ audio: {sampleRate:44100} }).then((stream) => {
                        sockets[speaker_name][stream_name] = stream;
                        if (turnOn) {
                            if (!MediaRecorder.isTypeSupported('audio/webm'))
                                return alert('Browser not supported');

                            const mediaRecorder = new MediaRecorder(stream, {
                                mimeType: 'audio/webm',
                            })
                            var socket = new WebSocket('ws://127.0.0.1:8000/micstream/');
                            sockets[speaker_name][sname] = socket;
                            sockets[speaker_name][mic] = mediaRecorder;

                            socket.onopen = () => {
                                //z = {"sampleRate": 44100}
                                //stream.getTracks()[0].applyConstraints(z);
                                console.log(stream.getTracks()[0].getConstraints());
                                console.log({ event: 'onopen' });
                                mediaRecorder.addEventListener('dataavailable', async (event) => {
                                    console.log("sending"); 
                                    if (event.data.size > 0 && socket.readyState == 1) {
                                        socket.send(event.data);
                                    }
                                })
                                mediaRecorder.start(250);
                            }

字符串
它从麦克风收集音频数据,并通过WebSocket将其发送到后端,这是一个FastAPI WebSocket。到目前为止,我所尝试的只是使用PyAudio将其写入扬声器,但我似乎得到的只是扬声器发出的短暂的静态脉冲。我已经使两侧的sampleRate相同,但我想有一些音频流的细微差别,我不明白这是造成它的原因。
除了这是静态的,我也想知道关于短脉冲..我希望每250毫秒发送一次会更“连续”,而不是分成几个脉冲,虽然我认为这可能是一个更容易解决的问题,如果音频实际上是正确的第一.也许PyAudio是不是设置为处理音频/webm或什么?
下面是我一直在使用的PyAudio代码,尽管我愿意切换到其他库,只要我可以选择使用什么扬声器:

RATE = 44100
FORMAT = pyaudio.get_format_from_width(1)
CHANNELS = 1
FRAMES_PER_BUFFER = 250
p = pyaudio.PyAudio()
p.open(rate=RATE, format=FORMAT, channels=CHANNELS, input_device_index=speaker, output=True)

syqv5f0l

syqv5f0l1#

您推送到WebSocket的音频有效负载数据流格式为webm/Matroska,并且可能使用opus编解码器进行压缩。但PyAudio消耗简单的音频样本(有时称为未压缩的pulse-code-modulated PCM样本)。因此,扬声器发出的静电脉冲.
而且,压缩后的音频每秒产生的字节数比PCM音频少,所以你的播放器运行时没有声音,因此会有短暂的爆发。
要从python程序中播放数据流,你需要从webm中拆箱音轨并从opus中解码它们。或者你可以使用web audio API代替MediaRecorder,并通过WebSocket推送PCM样本。

相关问题