WhisperLiveKit实时说话人区分实操:4个说话人、按秒块出标签
【免费下载链接】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 的实时说话人区分之后,你拿到的是一个实时转录页面:每一行文字前面都有说话人编号和起止时间。两个人围着一台电脑说话,输出大致长这样:
说话人 1 00:00.0–00:04.2:好,我们过一下这周的进度 说话人 2 00:04.2–00:09.8:前端这边做完了,等联调 说话人 1 00:09.8–00:13.5:行,下午我把测试环境拉起来
编号按出现先后排,不是人名。下面直接讲怎么跑起来、怎么判断它在工作、出了问题转哪个旋钮。
能做什么、不能做什么
- 支持 1 到 4 个说话人。默认模型是 4 个说话人通道,
--sortformer-max-speakers可以声明实际人数(1–4)。超过 4 人超出模型设计范围。 - 实时流式,不做离线批处理。服务器按 1 秒一个块消费音频(10 帧 × 10 倍下采样 × 10ms 窗口步进),当前这行的标签天然滞后音频结尾约 1–2 秒,属正常现象。
- 分人端与语言无关,转写端受 ASR 模型限制。说话人模型只看声音特征、不看内容;转写出什么语言由 Whisper 模型和
--language参数决定。 - 输出是"编号"不是"姓名"。没有声纹绑定人名,同一位说话人在新会话里可能拿到新编号。
- 不做说话人数估计。
--sortformer-max-speakers是声明而非检测;声明偏少时,多出来的人会被并入已有标签。 - 首次运行会自动下载默认流式模型(nvidia/diar_streaming_sortformer_4spk-v2),之后走本地缓存。
三种启动方式:pip、Docker 还是本地模型
| 方式 | 一句话说明 | 命令 |
|---|---|---|
| pip + NeMo 扩展 | 在自己的 Python 环境里装,最可控,首跑会拉取默认模型 | pip install "whisperlivekit[diarization-sortformer]" |
| Docker 预构建 | 免装环境,镜像自带 CUDA 与 NeMo,需要 NVIDIA GPU | docker compose up --build wlk-gpu-sortformer |
| 本地模型 | 已有自己准备好的.nemo文件,用参数指过去替换默认模型 | wlk --diarization --sortformer-model-path /path/to/model.nemo |
仓库 compose 文件里的 Docker 配置默认用 medium 模型并开了--pcm-input(浏览器直接送 PCM,绕过 FFmpeg),监听 8000 端口。
最小启动命令与判断正常的三个信号
pip install "whisperlivekit[diarization-sortformer]" wlk --model base --diarization # 启动后浏览器打开 http://localhost:8000判断它工作正常,看三个信号:
- 服务器日志打印
Using CPU for Sortformer model(或Using CUDA ...),随后出现 "SortformerDiarization initialized successfully"。 - 对着麦克风说话,转录行前面开始带说话人编号;标签未定下来时是一个转圈,定下来变成固定数字。
- 找两个人轮流说 5 秒左右:两行编号不同且各对各人,说明生效;整段只有一个编号,先查麦克风是不是只收到一个人的声音。
只想验证分人、不想同时跑 ASR,加--no-transcription,页面就只出说话人时间块。
遇到问题调哪个旋钮
| 现象 | 先试什么 | 再升级什么 |
|---|---|---|
| 两个音色相近的人串号、标签互换 | --sortformer-max-speakers声明真实人数,只保留前 N 个按到达顺序的通道,减少空通道干扰 | 检查两人声音是否被同一支麦克风拾取(串音);或换转写更稳的 ASR 模型(更大规格)稳住边界 |
| 长时间停顿后标签漂移、背景噪音被误判 | 保持 VAD 开启(默认开启);调低--pause-segmentation-seconds(默认 5 秒),让稳定边界切得更早 | 源码提供insert_silence,长静音时插入静音间隔,自己集成流程时可用 |
| 延迟太高跟不上语速 | 换小一号的 ASR 模型(--model tiny/base);说话人标签本身按 1 秒块处理,滞后进阶空间有限 | 上 GPU(Sortformer 自动选 CUDA);或调低--min-chunk-size(默认 0.1 秒)让 ASR 更新更勤 |
# 例:3 人会议,声明 3 个通道,停顿 3 秒就切稳定边界 wlk --model base --diarization --sortformer-max-speakers 3 --pause-segmentation-seconds 3想再进一步:多语言、翻译、API
多语言会议。分人端跟语言无关,转写端用--language auto自动检测,或直接指定语言代码。中英混说也能跑,说话人编号不随语言切换变化。
实时翻译。启动命令加--target-language en,默认 NLLB 后端在进程内做翻译,CPU 也能跑;译文输出保留说话人编号。延迟敏感场景可以把--translation-backend切到 alignatt 或 mlx-llm-mt。
API 集成。实时链路走 WebSocket/asr;录音文件走 REST/v1/audio/transcriptions(OpenAI 风格接口)。公网暴露时用--api-token强制校验令牌。细节见仓库 docs/API.md。
硬件与参数速查
| 场景 | 推荐配置 | 备注 |
|---|---|---|
| 个人使用、小型会议 | 4 核 CPU + 8GB 内存,--model base或更小 | 瓶颈在 ASR,说话人标签开销相对小 |
| 2–4 人会议、低延迟 | NVIDIA GPU(6GB 显存起步,GTX 1060 级别即可) | Sortformer 自动用 CUDA;仓库有预构建 GPU Docker 配置 |
| 长会议、多语言、高要求 | RTX 级 GPU + 16GB 以上内存 | --model medium及以上稳住转写稳定性 |
下图是各 ASR 模型在 LibriSpeech test-clean 上 WER 与实时因子(RTF)的对比,RTF=1.0 的红色虚线是"能否跟上音频播放速度"的分界,评估延迟时就看这条线:
参数速查:
- 说话人通道数:
--sortformer-max-speakers(1–4,默认 4 个通道全用) - 分句边界:
--pause-segmentation-seconds(默认 5 秒,设 0 关闭停顿切分) - ASR 更新节奏:
--min-chunk-size(默认 0.1 秒) - 模型内部:说话人特征靠"长期记忆 + 短期记忆"两段缓存维持,窗口长度目前写死在源码里,没有暴露成 CLI 参数
流程到此为止:选一种启动方式,用三个信号验证,出问题对着表格转对应旋钮。实现细节看 whisperlivekit/diarization/sortformer_backend.py,参数默认值与接口说明看 docs/API.md。
【免费下载链接】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),仅供参考