WhisperLiveKit 实时说话人区分指南:一条命令分清会议里谁说了什么
【免费下载链接】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 的实时说话人区分(speaker diarization)功能,基于流式 Sortformer 模型,只需在启动命令后加一个--diarization开关,就能在直播字幕、会议记录场景下实时给前 4 位发言者打标签。这篇文章从一条命令讲起:装好依赖、跑起服务,再解释标签是怎么稳定产生、哪些参数值得调。
为什么实时场景必须用"流式"区分
先把概念说清楚:转录回答"说了什么",说话人区分回答"谁在说"。很多人习惯的思路是把整段录音跑完再事后分析,但这只适用于会后整理。直播字幕、在线会议这类场景里,字幕出来的那一刻就必须带上人名,等不到整段结束。
流式方案的核心是"边听边记"。WhisperLiveKit 采用的 Sortformer 每收到约 1 秒的音频就做一次推理,同时维护两份记忆:一份是从会话开始累积的长期说话人特征,一份是最近几个音频块的短期队列。正因为有长期记忆,同一个人中途再次开口时,标签不会从 Speaker 1 跳成 Speaker 2——这是流式模型比"每帧独立判断"稳定得多的原因。
安装依赖并启动服务
Sortformer 依赖 NVIDIA NeMo,它被放在 WhisperLiveKit 的可选依赖组里,和主包一起安装:
pip install "whisperlivekit[diarization-sortformer]"如果仓库里用 uv 管理环境,GPU 场景对应的是:
uv sync --extra cu129 --extra diarization-sortformer不想配置本地环境也可以直接用仓库里的 Compose 服务,它已经把模型和开关都配好了:
docker compose up wlk-gpu-sortformer本地启动则是一条命令的事,以中文会议为例:
wlk --model medium --diarization --language zh模型会自动选设备:有 CUDA 就用 GPU,否则落到 CPU 上跑。
看效果:标签直接长在转录行上
服务起来后,打开终端提示的地址进入实时转录界面,两人对话时每一行文本前都会带上发言者和起止时间,类似:
Speaker 0 00:02.0 – 00:07.4 第一阶段的数据已经跑完了 Speaker 1 00:07.6 – 00:12.1 那我们下午三点同步一下三个观察体验时值得注意的选项:
- 只想看谁在什么时候说话、不关心文字内容,加
--no-transcription,界面只显示说话人回合; - 1 对 1 的访谈可以用
--sortformer-max-speakers 2声明"最多两个人",标签只会落在前两个通道上,避免多余通道参与归属; - 该参数取值是 1–4,它是你对会议的声明而不是模型的估计——如果实际人数超出声明,多出来的话会归并到保留的标签上,所以拿不准就别加。
标签在背后是怎么算出来的
把 Sortformer 后端源码 读一遍,流程其实不复杂:
- 音频以 1 秒为一个块送入,先转成梅尔频谱图;
forward_streaming_step做一次流式推理,更新内部状态并输出当前块每一帧的说话人概率;- 连续属于同一说话人的帧被合并成
SpeakerSegment(speaker / start / end 三个字段),发给前端渲染。
默认加载的权重是nvidia/diar_streaming_sortformer_4spk-v2,有 4 条说话人通道,按"谁先开口"的顺序固定命名 Speaker 0 到 3,之后整场会话不变。状态里的两块缓存各司其职:长期缓存(spkcache)存从会话开始到现在的特征,短期队列(fifo)存最近的块,缓存按固定周期刷新,从而既记得住"张三的音色",又能跟上"第四个人刚进门"这种变化。
另外源码里有一个insert_silence(silence_duration)接口:检测到长时间静音时把它记进全局时间轴,时间戳不会漂,静音也不会污染说话人特征。自己写客户端接入时,静音检测部分可以照这个思路对接。
参数速查
| 参数 | 作用 | 备注 |
|---|---|---|
--diarization | 打开说话人区分总开关 | 默认关闭 |
--diarization-backend | 选择区分后端,可选sortformer或diart | 默认sortformer;Diart 依赖 pyannote 模型且需要额外授权,官方标注不推荐 |
--sortformer-model-path | 指向本地.nemo文件、只含一个.nemo的目录,或模型 ID | 不填则用默认 4 说话人模型 |
--sortformer-max-speakers | 声明会话最多 N 人(1–4) | 见上文,是声明不是估计 |
--no-transcription | 只显示区分结果,不做转录 | 适合只关心回合的场景 |
--language | 转录语言,auto自动检测 | 与区分功能互相独立 |
想改推理侧的参数(缓存长度、更新周期等),它们都写在SortformerDiarization的初始化里,例如 spkcache 与 fifo 的长度、缓存刷新周期,按部署环境调整即可。
硬件与延迟预期
没有 NVIDIA GPU 也能跑,CPU 上能完成实时区分,只是留给转录的余量变小。有 GPU 时 Sortformer 会自动切到 CUDA。仓库基准数据里有一张 Apple M5 与 NVIDIA H100 的对比图,转录部分在 GPU 上的速度优势非常明显;说话人区分这块模型本身不大,多数消费级 GPU 都够,瓶颈通常先出现在 ASR 一侧。
部署细节可以对照 Docker 与部署文档,里面覆盖了带区分功能的镜像构建参数和wlk-gpu-sortformer服务的启动方式。
收尾提醒
上手路径就三件事:装diarization-sortformer依赖组、启动命令加--diarization、按实际人数决定要不要声明--sortformer-max-speakers。之后如果标签仍然偶尔串人,优先检查拾音质量——两个人离同一支麦克风远近差异太大时,再好的流式模型也只能给出它"听"到的结果。
【免费下载链接】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),仅供参考