我正在成功地运行一个客户端网页,作为一个语音信息发送器,使用的是 MediaRecorder
API。
这是一种 一键通 用户体验,用户只需按下一个键(推)就可以激活语音录制,然后他必须松开键才能停止录制,触发信息发送到服务器。之后,他必须释放键来停止录音,触发信息发送到服务器。
这里是我使用的一个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音频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
模式(连续音频处理)有什么办法吗?
我回答我的问题只是为了分享我找到的一个解决方案。
@cwilso的老项目。音量计 似乎是@scott-stensland在上面评论中所说的精确实现。请看演示。https:/webaudiodemos.appspot.comvolume-meter。
对于我需要的静音检测,我想我必须检查音量<thershold。