本文介绍如何基于 web audio api 和 hark.js 库,从麦克风流中实时检测语音活动(vad),实现“正在说话”与“静音”状态的可视化反馈,适用于麦克风测试、会议应用等场景。
本文介绍如何基于 web audio api 和 hark.js 库,从麦克风流中实时检测语音活动(vad),实现“正在说话”与“静音”状态的可视化反馈,适用于麦克风测试、会议应用等场景。
在 Web 应用中实现麦克风语音活动检测(Voice Activity Detection, VAD),核心在于分析音频流的能量特征(如 RMS 值)或频域能量变化。原生 Web Audio API 可以完成底层处理,但需自行实现阈值判断、去抖动、状态机等逻辑;而 hark.js 是一个轻量、成熟、专为浏览器语音检测设计的开源库,它封装了音频分析、自适应噪声门限、防误触发等关键能力,显著降低开发复杂度。
首先通过 <script> 标签引入 hark(推荐 CDN):
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/hark.min.js"></script>
然后在获取指定设备音频流后,传入 hark() 初始化检测器,并监听事件:
async function startMicDetection(selectedDeviceId) { try { const constraints = { audio: { deviceId: { exact: selectedDeviceId } } }; const stream = await navigator.mediaDevices.getUserMedia(constraints); // 创建 hark 检测实例(支持自定义参数) const speechEvents = hark(stream, { play: false, // 不自动播放音频(仅分析) threshold: -45, // 音量阈值(dB),越小越敏感(默认 -50) interval: 50, // 检测间隔(ms),默认 50 smoothing: 0.3, // 状态平滑系数(0–1),抑制抖动 voiceActivity: true // 启用语音活动模式(推荐) }); // 监听语音状态变化 speechEvents.on('speaking', () => { console.log('✅ 用户正在说话'); document.getElementById('mic-status').textContent = '正在说话'; document.getElementById('mic-status').className = 'status-speaking'; }); speechEvents.on('stopped_speaking', () => { console.log('⏸️ 用户停止说话'); document.getElementById('mic-status').textContent = '安静中'; document.getElementById('mic-status').className = 'status-silent'; }); // 可选:监听音量变化用于调试或 UI 动画 speechEvents.on('volume_change', (volume, threshold) => { const level = Math.max(0, Math.min(100, Math.round((volume - threshold) * 2))); document.getElementById('mic-meter').style.width = `${level}%`; }); } catch (err) { console.error('麦克风访问失败:', err); alert('无法访问麦克风,请检查权限和设备连接'); }}
hark.js 是目前 Web 端语音活动检测最实用的方案:零配置即可开箱即用,API 简洁,事件语义清晰(speaking / stopped_speaking),且内置抗噪与防抖逻辑。搭配 navigator.mediaDevices.enumerateDevices() 获取设备列表,你就能构建出媲美 Google Meet 的专业级麦克风测试界面——让用户清晰感知输入状态,提升交互可信度与体验一致性。
立即学习“Java免费学习笔记(深入)”;