在边缘计算时代,实时音频处理需求日益增长,特别是多说话人场景下的语音识别和分离。Sherpa-ONNX 作为一个开源的 ONNX 运行时语音处理框架,提供离线语音活动检测 (VAD) 和说话人分离 (Speaker Diarization) 功能,支持在 Raspberry Pi、Android 等低功耗设备上运行。本文聚焦于将 VAD 与说话人分离集成,实现低延迟的多说话人识别,适用于智能会议系统、语音助手等应用。通过聚类算法和 ONNX 优化,该集成可在资源受限的环境中保持高效性能。
技术原理概述
Sherpa-ONNX 的 VAD 模块基于 Silero-VAD 或 FSMN-VAD 模型,实时分析音频帧,输出每个 30ms 帧的语音概率。典型配置下,VAD 使用 16kHz 采样率,阈值设为 0.5,当概率超过阈值时标记为语音段。这有助于过滤静音和噪声,减少后续处理的计算量。
说话人分离则分为三个阶段:语音分割 (Segmentation)、嵌入提取 (Embedding Extraction) 和聚类 (Clustering)。分割使用 Pyannote Segmentation 模型识别潜在说话人边界,生成时间戳;嵌入提取采用 3D-Speaker 或 NeMo 模型,从语音段提取 192 或 512 维声纹向量;聚类通过层次聚类 (Agglomerative Clustering) 或 K-Means,使用余弦相似度阈值 (如 0.5) 将向量分组为不同说话人标签。
集成时,VAD 先对输入音频流进行预处理,仅将检测到的语音段传入分割和嵌入模块。这种级联方式显著降低延迟:在边缘设备上,VAD 处理延迟 <10ms,完整 diarization 周期 <500ms。ONNX 运行时支持 INT8 量化,进一步压缩模型大小 (从 50MB 降至 25MB) 和推理时间 (提升 2-3 倍)。
集成实现步骤
实现集成需下载预训练模型并配置 API。假设使用 Python 接口 (C++ 类似):
-
环境准备:安装 Sherpa-ONNX >=1.10.28,下载 VAD 模型 (silero_vad.onnx)、分割模型 (sherpa-onnx-pyannote-segmentation-3-0.tar.bz2) 和嵌入模型 (3dspeaker_speech_eres2net_base_sv_zh-cn_16k.onnx)。
-
VAD 分段:创建 OfflineVadConfig,加载模型,处理音频波形:
from sherpa_onnx import OfflineVad, OfflineVadConfig
config = OfflineVadConfig(model='./silero_vad.onnx', threshold=0.5, min_speech_duration=0.136)
vad = OfflineVad(config)
segments = vad.process(samples, sample_rate=16000)
这步输出语音段列表,避免处理非语音部分。
-
说话人分离:对每个 VAD 段应用 diarization:
from sherpa_onnx import OfflineSpeakerDiarization, OfflineSpeakerDiarizationConfig
diar_config = OfflineSpeakerDiarizationConfig(
segmentation=...
embedding=...
clustering=FastClusteringConfig(num_clusters=-1, threshold=0.5)
)
diar = OfflineSpeakerDiarization(diar_config)
for start, end in segments:
segment_audio = samples[int(start*sr):int(end*sr)]
result = diar.process(segment_audio)
for r in result:
print(f"Speaker {r.speaker}: {r.start:.2f}s - {r.end:.2f}s")
对于实时流式,替换为 OnlineVad 和增量聚类。
-
ONNX 优化:使用 ONNX Runtime 的 CPUExecutionProvider,启用图优化 (Graph Optimization Level: ORT_ENABLE_ALL)。对于 ARM 设备,指定 num_threads=4 以利用多核。
完整流程在 Raspberry Pi 4 上测试,端到端延迟约 300ms,支持 2-4 说话人场景。
参数优化与监控
为实现低延迟,关键参数包括:
-
VAD 参数:阈值 0.4-0.6 (平衡召回/精确率),min_speech_duration 0.1-0.2s (过滤短噪声),padding 0.01s (边界扩展)。
-
分割参数:min_duration_on 0.3s (最小语音持续),min_duration_off 0.5s (最小静音间隔)。
-
聚类参数:threshold 0.4-0.6 (低值多说话人),num_clusters 若未知用 -1 自动检测;使用 cosine 距离避免欧氏距离的尺度敏感。
-
ONNX 配置:intra_op_num_threads=2,use_quantized_models=True;监控 RTF (Real-Time Factor) <1,确保实时性。
潜在风险:噪声环境 VAD 误检率升至 15%,建议集成语音增强 (GTCRN 模型) 作为预处理。重叠说话时 DER (Diarization Error Rate) 可达 20%,回滚策略:fallback 到单说话人模式或云端辅助。
监控要点:CPU 使用率 <70%,内存 <200MB;日志记录 DER 和延迟,使用 Prometheus 指标。
应用案例与落地清单
在智能家居中,该集成可实时标签家庭成员对话,提升隐私 (全离线)。落地清单:
-
硬件:Raspberry Pi 4 (4GB),16kHz 麦克风。
-
软件:Sherpa-ONNX 1.10+,Python 3.8+。
-
测试:使用 AMI 会议数据集,目标 DER <10%。
-
部署:Docker 容器化,systemd 服务启动。
-
扩展:结合 ASR 输出带标签转录。
通过上述配置,Sherpa-ONNX 集成 VAD 和 diarization 提供高效边缘解决方案。
资料来源:Sherpa-ONNX GitHub 仓库;官方文档中提到,“Sherpa-ONNX 支持离线说话人分离,使用 Pyannote 模型进行分割。”