Web Audio API: как я могу обнаружить речь и записать до тишины, с кнопкой Push-To-Talk или без нее
Я успешно запускаю клиентскую веб-страницу, которая действует как отправитель голосового сообщения, используя MediaRecorder
API:
- когда пользователь нажимает любую клавишу, запускает аудиозапись,
- когда клавиша отпускается, аудиозапись отправляется через soketio на сервер для дальнейшей обработки.
Это своего рода пользовательский интерфейс PTT (Push To Talk), когда пользователю достаточно нажать клавишу (нажать), чтобы активировать запись голоса. А потом он должен отпустить клавишу, чтобы остановить запись, запустив отправку сообщения на сервер.
Вот фрагмент кода 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 = []
})
})
Теперь я хочу активировать / деактивировать запись звука (речи) не только с кнопки / клавиши / касания веб-страницы, но и с внешнего аппаратного микрофона (с кнопкой Push-To-Talk). Точнее, я хочу связать промышленную гарнитуру с кнопкой PTT на куполе уха, см. Фото:
Кстати, PTT
Кнопка - это просто физическая кнопка, которая действует как тумблер короткого замыкания, как на фотографии, в качестве примера:
- По умолчанию микрофон заземлен, а входной сигнал == 0.
- Когда
PTT
кнопка нажата, микроконтроллер активируется и входной сигнал!= 0.
Теперь мой вопрос: как я могу использовать 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
функция должна выполняться для запуска (громкость> ДЕЛЬТА) и остановки (громкость <ДЕЛЬТА) MediaRecorder?
Я предполагаю, что определение объема может быть полезно в двух случаях:
- С участием
PTT
кнопка, где пользователь явно определяет продолжительность речи, нажимая и отпуская кнопку - Без
PTT
кнопку, в этом случае голосовое сообщение создается с так называемымVOX
режим (непрерывная обработка звука)
Любая идея?
1 ответ
Я отвечаю на свой вопрос, просто чтобы поделиться найденным мной решением.
Старый проект @cwilso: volume-meter кажется точной реализацией того, что @scott-stensland заявил в комментарии выше. См. Демонстрацию: https://webaudiodemos.appspot.com/volume-meter/
Для обнаружения тишины мне нужно, я думаю, мне нужно проверить громкость