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
一场四人周会,转录稿上每句话前都带着"说话人 1 00:00-00:04""说话人 2 00:04-00:11"这样的标记。WhisperLiveKit 的流式 ASR 负责把语音转成文字,Sortformer 模型负责实时说话人区分——判断每句话是谁说的,两者结合就是一份带说话人标签的实时会议纪要。
它能替你做什么
WhisperLiveKit 的 Sortformer 后端把一段连续的语音流切分成带 speaker 标签和时间戳的片段,会议记录不再是一锅粥,每句话都能归属到具体的人。远程访谈时,主持人和问题嘉宾的回答各自成段,统计"谁说了多久"不再需要人工回听。直播字幕场景下,观众看到的不再是纯文字滚动,而是"谁在哪个时间点说了什么"。这三个场景的输出物是同一件东西:说话人编号加起止时间的片段序列,后续统计、检索、对齐都建立在它之上。
背后的"记忆"机制
流式处理有个天然难题:模型一次只能看到一小段音频,靠它凭什么判断"这个人前面也说过话"?Sortformer 的答案是双缓存。spkcache 是长期记忆,从会话开始持续存入各说话人的特征向量,容量有限,满了就滚动替换;FIFO 是短期记忆,一个先进先出队列,保留最近几个块的特征。每个新块进来时,模型同时查这两份记忆,再决定这一帧该标给哪个说话人。
音频块 t ──▶ 特征提取 ├─▶ spkcache 长期:会话开始以来的说话人特征 └─▶ FIFO 短期:最近若干块的特征 └─▶ 本块预测 ──▶ 追加进总预测长期记忆负责"这个人我见过",短期记忆负责"刚才发生了什么",两者配合,说话人编号才能跨块保持稳定,这就是流式实时说话人区分能"记住"人的原因。
从零跑通
先装好带 Sortformer 扩展的依赖:
pip install -e ".[diarization-sortformer]"或者直接用 GPU 镜像,一条命令拉起:
docker compose up --build wlk-gpu-sortformer然后启动带说话人区分的转写服务:
wlk --model medium --diarization --language auto打开浏览器访问http://localhost:8000,对着麦克风说话,每条语音片段会以说话人编号加起止时间标注输出。默认模型最多区分 4 个说话人,覆盖常见会议规模;如果你确定参会人数上限,可以用--sortformer-max-speakers声明。
一段能用的最小实现
想在自己的脚本里拿到带 speaker 标签的片段流,可以直接调用流式后端,下面这段逻辑与whisperlivekit/diarization/sortformer_backend.py的__main__演示一致:
import asyncio from whisperlivekit.diarization.sortformer_backend import ( SortformerDiarization, SortformerDiarizationOnline, ) async def main(): shared = SortformerDiarization() # 加载流式 Sortformer online = SortformerDiarizationOnline(shared_model=shared) chunks = load_audio_chunks() # 每块 0.5 秒的 16kHz 音频 for chunk in chunks: online.insert_audio_chunk(chunk) for seg in await online.diarize(): print(f"说话人 {seg.speaker} {seg.start:.2f}-{seg.end:.2f}s") asyncio.run(main())调参与排障
流式说话人区分不是装上就一劳永逸,下面两个现象最常见。
两位说话人总被归进同一个编号→ 把chunk_left_context从默认 10 调大到 20。它控制每个块推理时向左回溯的特征帧数,调大后模型拿到更长的左侧上下文来比对相似音色。
背景噪音被误判成某位说话人→ 调大spkcache_update_period,降低长期记忆向量的刷新频率。它决定多久用新特征更新 spkcache 里的说话人画像,更新太快时,空调声和键盘声会渗进记忆,之后模型更容易把噪音帧分给真实说话人。
接入你自己的系统
接入 WhisperLiveKit 的实时说话人区分有三种姿势:WebSocket 适合推流式音频、逐片段收结果;REST 适合批量处理已有录音;直接 import Python 包则适合嵌进自有服务。
回到开篇那场四人周会:现在你可以先打开默认端口,看四个说话人的标签如何在对话中被切分出来。标签切得不对时,直接翻 whisperlivekit/diarization/sortformer_backend.py 对照参数默认值,接口细节查 docs/API.md 里的speaker字段说明就够了。
【免费下载链接】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),仅供参考