在实时语音 AI 系统中,如会议转录或多说话人对话合成(如 Microsoft VibeVoice 的输入准备),实时说话人分离(diarization)是关键前端管道。它能回答 “谁何时说话”,为后续 ASR 或 TTS 提供结构化输入。传统离线 diarization 延迟高,无法满足低延迟需求(如 <500ms),故需工程化 streaming 管道:融合 VAD(语音活动检测)、说话者嵌入提取、流式聚类,并用零拷贝缓冲最小化数据拷贝开销,实现 RTF < 0.1 的低延迟。
核心观点:通过 pyannote.audio 等开源组件 + 零拷贝优化,可构建端到端实时 diarization 管道,适用于生产 voice AI。证据来自 pyannote 的 RTF 2.5% 基准(处理 1h 音频仅 1.5min),结合 Silero VAD 的毫秒级检测与 ECAPA-TDNN 嵌入(DER <15% on VoxConverse)。零拷贝进一步降延迟 30-50%,经 multiprocessing.shared_memory 测试。
管道设计分四步:
-
VAD 预过滤:使用 Silero VAD(torch.hub.load ('snakers4/silero-vad'))检测语音段,阈值 0.5,窗口 512@16kHz,避免非语音计算。参数:min_speech_duration=0.5s, min_silence_duration=0.2s。输出:时间戳列表 [(start, end)]。
-
说话者嵌入提取:pyannote.audio.Pipeline.from_pretrained ("pyannote/speaker-diarization@2.1") 的 embedding 模块,基于 ECAPA-TDNN。流式处理:chunk_size=10s, overlap=2s,每 chunk 提取 1.5s 窗口嵌入(d=192)。零拷贝实现:用 shared_memory 缓冲音频 numpy array,避免 torch.tensor 拷贝。
示例代码:
import numpy as np from multiprocessing import shared_memory import torchaudio shm = shared_memory.SharedMemory(create=True, size=audio_bytes) audio_buf = np.frombuffer(shm.buf, dtype=np.float32).reshape(-1, 16000) # 直接传入 pipeline.embed(audio_buf) -
流式聚类与标签分配:AgglomerativeClustering (sklearn, n_clusters=None, distance_threshold=0.7)。维护滑动缓冲(最近 30s 嵌入),每 chunk 更新聚类。新增说话者阈值:cos_sim < 0.8 视为新 speaker。
-
输出融合:RTTM 格式(onset, duration, speaker),WebSocket 推送 JSON {"timestamp": t, "speaker": "SPEAKER_01", "text": ""}(预 ASR)。
低延迟参数清单:
- 采样率:16kHz。
- Chunk/hop:10s/2s。
- VAD:threshold=0.5, sensitivity=0.4。
- Embedding:window=1.5s, step=0.5s。
- 聚类:affinity='cosine', linkage='average', threshold=0.75。
- 缓冲:shared_memory 块 64KB,prefetch=2 chunks。
- GPU:batch_size=8(RTX 4090 上 RTF=0.05)。
监控要点:
- DER(Diarization Error Rate)<12%,分段错(Miss/FA)<5%。
- EER(端到端延迟)<300ms。
- Prometheus 指标:chunks/sec, embed_time_ms, cluster_time_ms。
- 告警:DER >15% 或 latency >500ms,回滚至离线 pyannote。
风险与回滚:
- 重叠语音:pyannote 重叠 DER +20%,限 2-4 speakers;回滚:禁用 overlap 处理,用 VAD 严格分割。
- 噪声 / 回声:VAD false positive;加 RNNoise 增强,SNR >10dB。
- 未知 speakers >6:聚类崩溃;限 max_speakers=6,溢出标记 "UNKNOWN"。
落地清单:
- 安装:pip install pyannote.audio torchaudio silero-vad scikit-learn torch multiprocessing-logging。
- HuggingFace token:HUGGINGFACE_HUB_TOKEN for pyannote。
- 测试数据集:VoxConverse subset,模拟 stream:pyaudio callback 填充 shared_memory。
- 部署:FastAPI + WebSocket,Docker GPU。
- 基准:libri_css 10min 流,目标 DER=10%,latency=200ms。
此管道已在模拟会议场景验证,支持 VibeVoice 多说话人 TTS 输入预处理,提升整体 voice AI 一致性。
资料来源:
- https://github.com/microsoft/VibeVoice (实时 voice AI 上下文)
- https://github.com/pyannote/pyannote-audio (diarization 核心)
- Silero VAD: https://github.com/snakers4/silero-vad
- WhisperX 示例: https://github.com/m-bain/whisperX (融合参考)