Hotdry.
ai-systems

Sherpa-ONNX 中 VAD 与说话人分离集成:边缘设备低延迟多说话人处理

利用 Sherpa-ONNX 的 VAD 和说话人分离功能,在边缘设备上实现实时多说话人识别,提供聚类算法、ONNX 优化和工程参数配置指南。

在边缘计算时代,实时音频处理需求日益增长,特别是多说话人场景下的语音识别和分离。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++ 类似):

  1. 环境准备:安装 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)。

  2. 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)  # segments: list of (start, end) tuples
    

    这步输出语音段列表,避免处理非语音部分。

  3. 说话人分离:对每个 VAD 段应用 diarization:

    from sherpa_onnx import OfflineSpeakerDiarization, OfflineSpeakerDiarizationConfig
    diar_config = OfflineSpeakerDiarizationConfig(
        segmentation=...  # Pyannote config
        embedding=...    # 3D-Speaker config
        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 和增量聚类。

  4. 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 指标。

应用案例与落地清单

在智能家居中,该集成可实时标签家庭成员对话,提升隐私 (全离线)。落地清单:

  1. 硬件:Raspberry Pi 4 (4GB),16kHz 麦克风。

  2. 软件:Sherpa-ONNX 1.10+,Python 3.8+。

  3. 测试:使用 AMI 会议数据集,目标 DER <10%。

  4. 部署:Docker 容器化,systemd 服务启动。

  5. 扩展:结合 ASR 输出带标签转录。

通过上述配置,Sherpa-ONNX 集成 VAD 和 diarization 提供高效边缘解决方案。

资料来源:Sherpa-ONNX GitHub 仓库;官方文档中提到,“Sherpa-ONNX 支持离线说话人分离,使用 Pyannote 模型进行分割。”

查看归档