网络音频API:我如何检测语音并记录直到沉默,有或没有一键通按钮。

问题描述 投票:0回答:1

我正在成功地运行一个客户端网页,作为一个语音信息发送器,使用的是 MediaRecorder API。

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

这是一种 一键通 用户体验,用户只需按下一个键(推)就可以激活语音录制,然后他必须松开键才能停止录制,触发信息发送到服务器。之后,他必须释放键来停止录音,触发信息发送到服务器。

这里是我使用的一个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按钮来连接一个工业耳机的耳罩,见图。

industrial headset with PTT button on the ear dome

顺便说一下,这个... PTT 按钮只是一个物理按钮,作为短路切换开关,如图所示,只是一个例子。Push To Talk button circuit

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

现在我的问题是:我如何使用Web音频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 模式(连续音频处理)

有什么办法吗?

javascript audio web-audio-api web-mediarecorder voice-detection
1个回答
0
投票

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

@cwilso的老项目。音量计 似乎是@scott-stensland在上面评论中所说的精确实现。请看演示。https:/webaudiodemos.appspot.comvolume-meter。

对于我需要的静音检测,我想我必须检查音量<thershold。

© www.soinside.com 2019 - 2024. All rights reserved.