我使用MediaRecorder API成功地运行了一个充当语音消息发送者的客户端网页:
这是一种PTT (Push To Talk)用户体验,用户只需按一个键(push)就可以激活语音记录。然后,他必须释放密钥来停止录音,触发发送到服务器的消息。
在这里,我使用了一个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按钮时,微控制器被激活并输入信号!= 0。现在我的问题是:如何使用Web来检测何时按下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函数必须做什么才能启动(音量> DELTA)和停止(卷< DELTA) MediaRecorder?
我想体积检测对于两种情况都是有用的:
PTT按钮中,用户显式地决定演讲的持续时间,按下并释放该按钮PTT按钮,在本例中,语音消息是用所谓的VOX模式(连续音频处理)创建的。有什么想法吗?
发布于 2020-06-05 10:10:37
我回答我的问题只是为了分享我找到的解决方案。
@cwilso老项目:体积计似乎是@stensland在上面的评论中所述的精确实现。参见演示:https://webaudiodemos.appspot.com/volume-meter/
更新
顺便说一下,使用@cwilso项目和@stensland建议,我实现了一个WeBAD开源项目来解决我最初的问题:
https://stackoverflow.com/questions/62114251
复制相似问题