1

MediaRecorder我正在使用API成功运行充当语音消息发送者的客户端网页:

  • 当用户按任意键时,开始录音,
  • 当按键被释放时,录音会通过 soketio 发送到服务器进行进一步处理。

这是一种PTT(一键通)用户体验,用户只需按下一个键(推)即可激活语音记录。之后他必须松开按键以停止录制,触发消息发送到服务器。

这是我使用的一个javascript代码块:

    navigator.mediaDevices
      .getUserMedia({ audio: true })
        .then(stream => {

          const mediaRecorder = new MediaRecorder(stream)
          var audioChunks = []

          //
          // start and stop recording:
          // keyboard (any key) events
          //
          document
            .addEventListener('keydown', () => mediaRecorder.start())

          document
            .addEventListener('keyup', () => mediaRecorder.stop())

          //
          // add data chunk to mediarecorder
          //
          mediaRecorder
            .addEventListener('dataavailable', event => {
              audioChunks.push(event.data)
            })

          //
          // mediarecorder event stop
          // trigger socketio audio message emission.
          //
          mediaRecorder
            .addEventListener('stop', () => {
               socket.emit('audioMessage', audioChunks)
              audioChunks = []
            })

        })

现在,我想要的是激活/停用音频(语音)录制,不仅可以通过网页按钮/按键/触摸,还可以通过外部硬件麦克风(带有一键通按钮)。更准确地说,我想用耳罩上的 PTT 按钮连接工业耳机,见图:

耳罩上带有 PTT 按钮的工业耳机

顺便说一句,该PTT按钮只是一个物理按钮,用作短路拨动开关,如图所示,仅作为示例: Push To Talk 按钮电路

  • 默认情况下,麦克风接地,输入信号 == 0
  • PTT按下按钮时,微被激活并输入信号!= 0。

现在我的问题是:如何使用 Web Audio API 来检测何时按下 PTT 按钮(因此音频信号 > 0)来执行mediaRecorder.start()

在这里阅读:我想我必须使用返回的流mediaDevices.getUserMedia并创建一个AudioContext()处理器:

  navigator.mediaDevices.getUserMedia({ audio: true, video: false })
      .then(handleSuccess);

  const handleSuccess = function(stream) {
    const context = new AudioContext();
    const source = context.createMediaStreamSource(stream);
    const processor = context.createScriptProcessor(1024, 1, 1);

    source.connect(processor);
    processor.connect(context.destination);

    processor.onaudioprocess = function(e) {
      // Do something with the data, 
      console.log(e.inputBuffer);
    };
  };

但是该processor.onaudioprocess函数必须做什么才能启动(volume > DELTA)和停止(volume < DELTA)MediaRecorder?

我想音量检测可能对两种情况有用:

  • 使用PTT按钮,用户明确决定演讲的持续时间,按下和释放按钮
  • 没有PTT按钮,在这种情况下,语音消息是使用所谓的VOX模式(连续音频处理)创建的

任何想法?

4

1 回答 1

1

我回答我的问题只是为了分享我找到的解决方案。

@cwilso 旧项目:volume-meter似乎是上面评论中@scott-stensland 所述内容的精确实现。查看演示:https ://webaudiodemos.appspot.com/volume-meter/

更新

顺便说一句,使用@cwilso 项目和@scott-stensland 建议,我实施了一个WeBAD 开源项目来解决我原来的问题:

https://github.com/solyarisoftware/WeBAD

于 2020-06-05T10:10:37.223 回答