Javascript 向扬声器发送音频缓冲区

Javascript 向扬声器发送音频缓冲区,javascript,websocket,audiocontext,audio-worklet,Javascript,Websocket,Audiocontext,Audio Worklet,以下是我想做的: 将麦克风音频发送至AudioWorketProcessor(works) 使用WebSocket(works)将结果从AudioWorkletProcessor发送到服务器 通过WebSocket接收回数据(works) 将数据发送到计算机的扬声器(如何操作?) 除了我不知道如何实施之外,一切都正常。以下是我所做的,简化了一些事情以保持对问题的关注: //一,。设置音频上下文的代码。将麦克风连接到工作集 const audioContext = new AudioCon

以下是我想做的:

  • 将麦克风音频发送至AudioWorketProcessor(works)
  • 使用WebSocket(works)将结果从AudioWorkletProcessor发送到服务器
  • 通过WebSocket接收回数据(works)
  • 将数据发送到计算机的扬声器(如何操作?)
  • 除了我不知道如何实施之外,一切都正常。以下是我所做的,简化了一些事情以保持对问题的关注:

    //一,。设置音频上下文的代码。将麦克风连接到工作集

        const audioContext = new AudioContext({ sampleRate: 8000 });
        audioContext.audioWorklet.addModule('/common/recorderworkletprocess.js').then(
            function () {
                const recorder = new AudioWorkletNode(audioContext, 'recorder-worklet');
                let constraints = { audio: true };
                navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
                    const microphone = audioContext.createMediaStreamSource(stream);
                    microphone.connect(recorder);
                    recorder.connect(audioContext.destination);
                });
            }
        );
    
    //二,。AudioWorkletProcessor。将音频发送到WebSocket,WebSocket将音频作为二进制文件发送到服务器:

      class RecorderWorkletProcessor extends AudioWorkletProcessor {
         constructor() {
            super();
         }
         process(inputs) {
            const inputChannel = inputs[0][0];  //inputChannel Float32Array(128)
            socket.send(inputChannel);  // sent as byte[512]
            return true;
         }
      }
      registerProcessor('recorder-worklet', RecorderWorkletProcessor);
    
    //3和4。最后,服务器发送回与接收到的数据完全相同的数据。WebSocket将其转换为ArrayBuffer(512)。在这里,我想尽一切努力将其作为音频输出到计算机的扬声器:

    socket.messageReceived = function (evt) {
    // evt.data contains an ArrayBuffer with length of 512
    // I want this to be played on the computer's speakers. How to do this?
      }
    

    任何指导都将不胜感激。

    好的,我相信我能回答我的问题。这是不健全的,但它提供了我需要知道的

      socket.messageReceived = function (evt) {
         // evt.data contains an ArrayBuffer with length of 512
         // I want this to be played on the computer's speakers. How to do this?
         let fArr = new Float32Array(evt.data);
         let.buf = audioContext.createBuffer(1, 128, 8000);
         buf.copyToChannel(fArr, 0);
         let player = audioContext.createBufferSource();
         player.buffer = buf;
         player.connect(audioContext.destination);    
         player.start(0);
      }
    

    嘿,我正试图重现一个类似的情况,但我一直无法访问AudioWorkletProcessor中的WebSocket。在您的代码中有进程(输入){const inputChannel=inputs[0][0];//inputChannel Float32Array(128)socket.send(inputChannel);//作为字节[512]发送返回true;}您是如何访问socket.send的?每当我试图从AudioWorkletProcessor类中启动一个新的WebSocket实例时,我总是遇到一个错误,即WebSocket没有定义。这只是一个标准的WebSocket连接。只需获取一个连接并确保它在范围内。我遇到的问题是获取AudioWorkletProcessor范围内的WebSocket连接。我不断收到WebSocket未在AudioWorkletProcessor.process中定义的错误。如果我尝试在AudioWorkletProcessor类中定义它,或者如果我尝试使用options.processorOptions传递WebSocket连接,它会说它无法克隆。如果你不介意我问你,你能展示一下你用来让websocket在你的AudioWorkletProcessor中工作的代码吗?谢谢。我试过你的例子,我有一个问题。声音是机器人的。你也遇到过这个问题吗?我觉得这和缓冲有关。我试着直接从worklet播放,和从socket播放没有区别。不,我没有经历过。