1 个参数开启 WhisperLiveKit 实时说话人区分:Sortformer 从安装到调参
【免费下载链接】WhisperLiveKitReal-time, local speech-to-text with streaming ASR, speaker diarization, translation, and OpenAI/Deepgram-compatible APIs.项目地址: https://gitcode.com/GitHub_Trending/wh/WhisperLiveKit
WhisperLiveKit 是本地实时语音转文字服务。加上 Sortformer 说话人区分后,它给每句话标注发言人编号,解决多人会议里"这段话是谁说的"这个问题,浏览器界面、WebSocket 推送和 REST 接口的返回里都带着标签。
先看效果:每个转录片段都带 speaker 标签
🔍 打开实时界面,两人对谈时字幕会自动分成不同的发言块。落到数据层,每条转录片段都有一个speaker字段:1、2、3按"谁先开口"的顺序分配,特殊值-2表示静音间隔,不是报错。除了浏览器界面,REST 接口的diarized_json返回格式同样携带这些标签,可以直接接进你自己的会议纪要系统。
一句话原理:1.25 秒一块的流式说话人跟踪
Sortformer 的流式处理一句话就能说清:音频按约 1.25 秒切成块(10 帧 × 10 倍下采样 × 12.5 毫秒帧步长),逐块送入模型,模型内部维护两份缓存。
spkcache:从会话开始累积的说话人嵌入,负责长期记忆fifo:最近若干音频块的短期特征队列,负责快速反应- 4 个说话人通道按到达顺序分配身份,跨块保持稳定
每个新块和缓存比对后,输出这一块的活跃说话人。缓存长度 188 帧、左上下文 10 帧这些数值写在 sortformer_backend.py 的加载逻辑里,这决定了后面的调优路径。
两条命令跑通:安装 Sortformer 并启动本地服务
从 clone 到出字幕只要三步。Sortformer 依赖 NeMo 运行时,必须装对应的 extra,否则源码会直接退出并打印安装命令:
git clone https://gitcode.com/GitHub_Trending/wh/WhisperLiveKit cd WhisperLiveKit pip install -e ".[diarization-sortformer]"NVIDIA GPU 机器建议改用uv sync --extra cu129 --extra diarization-sortformer装 CUDA 版 PyTorch;没有 GPU 也能跑,代码会自动落到 CPU。首次启动会自动下载默认的 4 说话人模型nvidia/diar_streaming_sortformer_4spk-v2。
wlk --model medium --diarization --language zh --port 8000浏览器打开localhost:8000就是实时界面。走官方 Docker 的话更省事:
docker compose up --build wlk-gpu-sortformercompose.yml 里这个服务默认执行--model medium --diarization,和上面的场景一致。
参数速查:固定人数、换模型、调句子切分
日常要动的参数都在命令行,不需要改代码:
| 参数 | 作用 | 默认值 | 什么时候用 |
|---|---|---|---|
--sortformer-max-speakers | 按到达顺序只保留前 N 个说话人通道(1-4) | 4(用满检查点通道) | 固定 2 人访谈,少一个通道少一分混淆 |
--sortformer-model-path | 本地.nemo文件、含单个.nemo的目录或模型 ID | nvidia/diar_streaming_sortformer_4spk-v2 | 用自己训练的模型 |
--pause-segmentation-seconds | 停顿超过该秒数才切出稳定转录边界 | 5 | 句子切得太碎或太整时调整 |
--no-transcription | 只跑说话人区分,不转文字 | 关 | 单独验证分人效果 |
一个容易误解的点:--sortformer-max-speakers是声明,不是估计。源码只保留前 N 个通道,如果实际人数更多,多出来的人会被归到前 N 个标签里,归属会失真。人数固定时才用。
降低标签延迟的三个旋钮:模型、块等待与停顿判定
说话人标签落屏的延迟主要花在三处,各有一个旋钮:
--model:转录延迟的大头。📊 下图横轴是实时率,纵轴是 WER,选你的硬件跑得动的最准模型--min-chunk-size(默认 0.1 秒):每次处理前最少等待的音频量,调小更跟手,CPU 吃紧时调大--pause-segmentation-seconds(默认 5 秒):停顿多久才认定一句话结束
再往底层走:缓存长度 188 帧、左上下文 10 帧、缓存更新周期 144 帧写死在加载逻辑里。长会议里两个人声线接近时,可以把spkcache_len调大给模型更多历史上下文,代价是显存上涨;日常使用默认值就够用。
踩坑清单:四人口径、静音段与 Python 版本
四个高频坑,按踩中概率排序:
- 没装 extra 就启动,进程直接退出。这是源码里的明确检查,跟着提示装
diarization-sortformer即可 - 默认模型只有 4 个说话人通道,第 5 个人出现时归属未定义。固定大会议要么分组,要么换更大模型的检查点
speaker: -2的片段是静音,前端用它计算remaining_time_diarization,写客户端时按speaker字段识别,别靠文本判断- 别选 Diart 后端。它限定 Python 3.11/3.12 且 README 标注不推荐;Sortformer 后端在 Python 3.13 上也能正常工作
到这里,安装、启动、调参、避坑各就各位,WhisperLiveKit 的实时说话人区分把"谁说了什么"从人工整理变成了默认能力。现在打开终端,执行上面的wlk --model medium --diarization命令,让两个人轮流说话,第一个发言人标签几秒钟内就会出现在 8000 端口的页面上。
【免费下载链接】WhisperLiveKitReal-time, local speech-to-text with streaming ASR, speaker diarization, translation, and OpenAI/Deepgram-compatible APIs.项目地址: https://gitcode.com/GitHub_Trending/wh/WhisperLiveKit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考