首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >网络音频API:我如何检测语音和记录,直到沉默,有或没有按下通话按钮。

网络音频API:我如何检测语音和记录,直到沉默,有或没有按下通话按钮。
EN

Stack Overflow用户
提问于 2020-05-31 09:39:20
回答 1查看 2.7K关注 0票数 1

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

  • 当用户按任意键时,启动录音,
  • 当密钥被释放时,音频记录通过soketio发送到服务器进行进一步处理。

这是一种PTT (Push To Talk)用户体验,用户只需按一个键(push)就可以激活语音记录。然后,他必须释放密钥来停止录音,触发发送到服务器的消息。

在这里,我使用了一个javascript代码块:

代码语言: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按钮只是一个物理按钮,用作短路切换开关,如照片中所示,举个例子:

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

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

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

代码语言:javascript
运行
复制
  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函数必须做什么才能启动(音量> DELTA)和停止(卷< DELTA) MediaRecorder?

我想体积检测对于两种情况都是有用的:

  • PTT按钮中,用户显式地决定演讲的持续时间,按下并释放该按钮
  • 没有PTT按钮,在本例中,语音消息是用所谓的VOX模式(连续音频处理)创建的。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-06-05 10:10:37

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

@cwilso老项目:体积计似乎是@stensland在上面的评论中所述的精确实现。参见演示:https://webaudiodemos.appspot.com/volume-meter/

更新

顺便说一下,使用@cwilso项目和@stensland建议,我实现了一个WeBAD开源项目来解决我最初的问题:

https://github.com/solyarisoftware/WeBAD

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62114251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档