又名 “语音活性检测”

概述

新开发的教育应用需要做语音化交互,基于目前机器学习发展,期望有一个部署在用户本地端上性能兼具效果都不错的方案来做语音活动识别。

本文主要收集整理了目前VAD技术的评价标准、可用的部署方案。

语音活动识别主要目的是以静音端作为分割点,得到有效的语音片段。本文不讨论多人语音的情况,即一个片段包含不同的声纹,那是需要进一步处理的技术部分。



关注指标

  1. 准确率:

    • 正确检测出语音段的比例(命中率/精确率)

    • 正确检测为非语音段的比例(漏检率/召回率)

    • 总体的F1-score或准确率等综合指标

  2. 噪音抑制能力:

  3. 响应速度:

    • 检测延迟时间

    • 从语音开始到检测到的时间差

    • 能否实时进行检测

  4. 计算复杂度:

    • CPU/内存占用情况

    • 是否适合嵌入式设备等受限环境

  5. 适应性和可配置性:

    • 是否支持动态调整参数和阈值

    • 能否适应不同应用场景的需求

  6. 实际应用效果:

    • 在真实应用中的最终效果如何

    • 对上层应用(如语音识别)的影响



方案

  1. 基于能量检测:

    • 主要通过检测语音信号的短时能量来判断是否存在语音活动。

    • 通常会设置一个能量阈值,超过该阈值则认为是语音段。

    • 优点是实现简单,计算量小;缺点是在噪音环境下容易出错。

  2. 基于频域特征:

    • 利用语音和非语音在频谱上的差异来判断。

    • 常用特征包括过零率、谱熵、谱质心等。

    • 可以更好地区分语音和背景噪音,适用于复杂噪音环境。

  3. 基于统计模型:

    • 构建语音和非语音的概率密度模型,如高斯混合模型(GMM)。

    • 根据输入信号属于哪种模型的后验概率来判断是否为语音。

    • 可以自适应地更新模型参数,适应不同的噪音环境。

  4. 基于深度学习 ⭐:

    • 利用深度神经网络对语音和非语音的特征进行学习和建模。

    • 可以自动学习特征,无需手工设计,性能优于传统方法。

    • 需要大量的训练数据,计算复杂度较高。

  5. 混合方案 ⭐:

    • 结合以上多种方法,利用各自的优势。

    • 如先用简单的能量检测,再辅以频域特征和统计模型判断。

    • 可以在准确性和计算复杂度之间达到平衡。



端上方案/可部署方案

Google WebRTC VAD

优势

  • 算法复杂度相对较低,适合嵌入式设备应用

  • 能较好地抑制背景噪音的影响

  • 自适应能力强,可以适应不同环境

  • 已经过大规模实际应用验证,具有较高的可靠性

原理

  • WebRTC VAD 采用了基于统计模型的方法,主要使用高斯混合模型(GMM)来建模语音和非语音信号。

  • 通过计算输入信号属于语音/非语音的后验概率, 包括频谱熵、过零率等,这些特征能较好地区分语音和背景噪音。

H5 javascript 测试示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 创建音频上下文和分析器
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const analyser = audioContext.createAnalyser();
analyser.fftSize = 1024;

// 创建VAD处理器
const vadProcessor = audioContext.createScriptProcessor(512, 1, 1);

// 设置VAD参数
const VAD_THRESHOLD = -50; // 声音阈值,可以根据需要调整
let isSpeaking = false;

// 获取麦克风输入
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
const source = audioContext.createMediaStreamSource(stream);
source.connect(analyser);
analyser.connect(vadProcessor);
vadProcessor.connect(audioContext.destination);

vadProcessor.onaudioprocess = function(event) {
const input = event.inputBuffer.getChannelData(0);
const sum = input.reduce((acc, val) => acc + Math.abs(val), 0);
const average = sum / input.length;
const decibels = 20 * Math.log10(average);

if (decibels > VAD_THRESHOLD) {
if (!isSpeaking) {
isSpeaking = true;
console.log("Speech started");
// 在这里添加语音开始的处理逻辑
}
} else {
if (isSpeaking) {
isSpeaking = false;
console.log("Speech ended");
// 在这里添加语音结束的处理逻辑
}
}
};
})
.catch(error => {
console.error('Error accessing microphone:', error);
});


VAD_THRESHOLD(语音活动检测阈值)的调整是一个重要的参数设置,它直接影响到语音检测的灵敏度和准确性。关于这个阈值,有以下几点需要理解:

  1. 数值含义:
    VAD_THRESHOLD 通常以分贝(dB)为单位。

    这个值越大(越接近 0),意味着检测语音所需的音量越大;值越小(越接近负无穷),则意味着检测语音所需的音量越小。

  2. 数值范围:
    通常,VAD_THRESHOLD 的值会在 -60 dB 到 -20 dB 之间。但这个范围可能会根据具体的应用场景和环境而有所不同。

  3. 调整原则:

    • 如果阈值设置得太高,可能会错过一些较轻的语音。

    • 如果阈值设置得太低,可能会将背景噪音误判为语音。

  4. 参考标准:
    虽然没有一个统一的标准值,但以下可以作为参考:

    • 安静环境:-50 dB 到 -40 dB

    • 普通办公环境:-40 dB 到 -30 dB

    • 嘈杂环境:-30 dB 到 -20 dB

在一些高级实现中,可能会使用动态阈值。这意味着系统会根据环境噪音水平自动调整阈值,以适应不同的环境条件。

  1. 其他考虑因素:
  • 麦克风质量和位置

  • 房间声学特性

  • 说话者的音量和距离



Pyannote VAD

https://huggingface.co/pyannote/voice-activity-detection

优势

  • 无需人工设计特征,模型可以自动学习语音的特征表示

  • 在复杂噪音环境下表现更优秀

  • 通过大规模数据训练,具有更好的泛化性能

  • 基于端到端深度学习的语音活动检测

  • pyannote VAD 可以应用于语音交互、音频分析等场景,提供实时的语音活动检测。

原理

  • pyannote VAD 采用了基于卷积神经网络(CNN)和循环神经网络(RNN)的端到端深度学习模型,这种模型能够自动学习语音和非语音的特征表示。

  • pyannote VAD 是在大规模的语音数据集上进行训练的,包括多种语言和复杂噪音条件。

  • pyannote VAD 输出每一时刻的语音活动概率,用于判断语音的起始和结束时间。

Python示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import io
from pyannote.audio import Pipeline

def process_audio(self, audio_file):
# 使用 pyannote.audio 的 Pipeline 进行 VAD
pipeline = Pipeline.from_pretrained("pyannote/voice-activity-detection")

# 将 BytesIO 对象转换为文件路径
with open("temp.wav", "wb") as f:
f.write(audio_file.read())

# 使用 pipeline 进行 VAD
vad_result = pipeline("temp.wav")

# 解析 VAD 结果
result_str = ""
for speech in vad_result.get_timeline():
result_str += f"Speech from {speech.start:.1f}s to {speech.end:.1f}s\n"

return result_str



FSMN-Monophone VAD (推荐)

https://modelscope.cn/models/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch/

优势

  • 基于FSMN的架构的深度学习,参数量较少,计算复杂度相对较低。

  • 经过大规模语音数据预训练,具有较强的泛化性和健壮性。

原理

  • FSMN-Monophone VAD 的核心在于 FSMN 网络结构。FSMN 是一种特殊的循环神经网络,它通过引入有监督的记忆网络单元,能够有效捕捉时间序列数据中的长距离依赖关系。

Python 示例

1
2
3
4
5
6
7
8
from funasr import AutoModel

model = AutoModel(model="fsmn-vad", model_revision="v2.0.4")

wav_file = f"{model.model_path}/example/asr_example.wav"
res = model.generate(input=wav_file)
print(res)

VAD常用参数调整说明(参考:vad.yaml文件):

  • 取值越趋于 -1,噪音被误判定为语音的概率越大,FA 越高

  • 取值越趋于 +1,语音被误判定为噪音的概率越大,Pmiss 越高

  • 通常情况下,该值会根据当前模型在长语音测试集上的效果取最佳平衡

  • max_end_silence_time:尾部连续检测到多长时间静音进行尾点判停,参数范围500𝑚,6000𝑚𝑠500m,6000ms,默认值 800ms,该值过低容易出现语音提前截断的情况。

  • speech_noise_thres:speech 与 noise 偏差数值大于此值则判断为 speech,参数范围:(-1,1)