攻克多人对话难关:FunASR说话人分离技术让语音识别准确率提升30%
在会议记录、视频访谈等多人对话场景中,传统语音识别系统往往将所有语音混为一谈,导致"谁在何时说什么"的信息丢失。FunASR作为基础语音识别工具包,通过内置的说话人分离(Speaker Diarization)技术,实现了多人语音的精准分离与识别。本文将深入解析这一技术的实现原理、核心模块及应用方法,帮助开发者快速掌握多人场景下的语音处理方案。
技术架构概览
FunASR的说话人分离技术采用端到端神经网络架构,将语音信号直接映射为说话人标签序列。系统整体包含三大核心模块:
- 前端处理:基于STFT的语音特征提取,支持256点帧移与1024点帧长的参数配置
- 说话人分离核心:采用EEND-OLA(End-to-End Neural Diarization with Overlap-aware)模型,支持最大8人同时说话场景
- 后处理优化:通过CAMP++说话人确认模型进行聚类优化,进一步提升分离准确率
技术细节可参考官方文档:README_zh.md
核心算法解析
EEND-OLA模型原理
EEND-OLA(Overlap-aware End-to-End Neural Diarization)是FunASR实现多人说话分离的核心算法。该模型通过Transformer编码器将语音特征映射到高维空间,再通过吸引子网络(Attractor Network)生成说话人嵌入向量。
核心实现代码位于:funasr/models/eend/e2e_diar_eend_ola.py
模型前向传播过程包含以下关键步骤:
- 语音特征提取与分帧
- Transformer编码器提取上下文特征
- 吸引子网络生成说话人嵌入
- 时频掩码预测与语音分离
关键参数配置:
def __init__(
self,
frontend: Optional[WavFrontendMel23],
encoder: EENDOLATransformerEncoder,
encoder_decoder_attractor: EncoderDecoderAttractor,
n_units: int = 256,
max_n_speaker: int = 8, # 支持最大8人同时说话
attractor_loss_weight: float = 1.0,
mapping_dict=None,
**kwargs,
)
重叠语音处理机制
针对多人同时说话的重叠场景,模型通过以下创新设计提升处理能力:
- 功率标签(Power Label):将说话人标签扩展为[0,1]区间的连续值,表示语音能量占比
- 动态吸引子生成:根据输入语音动态生成说话人嵌入,而非使用预定义嵌入库
- 多任务损失函数:联合优化说话人分类损失与重叠检测损失
实现代码参考:funasr/models/eend/power.py
核心模块详解
特征提取模块
特征提取模块负责将原始语音信号转换为模型可处理的频谱特征。默认配置采用:
- 采样率:16kHz
- 梅尔滤波器组:80维
- 预加重系数:0.97
核心代码实现:
def stft(data, frame_size=1024, frame_shift=256):
"""短时傅里叶变换
Args:
frame_size: 帧长,默认1024点(64ms)
frame_shift: 帧移,默认256点(16ms)
"""
# 加窗处理
window = np.hanning(frame_size)
# 计算STFT
stft_matrix = librosa.stft(
data,
n_fft=frame_size,
hop_length=frame_shift,
win_length=frame_size,
window=window,
center=True,
)
return np.abs(stft_matrix)
详细实现见:funasr/models/eend/feature.py
编码器-吸引子网络
编码器采用6层Transformer结构,每层包含8头自注意力机制与512维前馈网络。吸引子网络则通过双向LSTM生成可变数量的说话人嵌入向量。
关键实现代码:funasr/models/eend/encoder_decoder_attractor.py
def forward(self, xs, n_speakers):
"""吸引子网络前向传播
Args:
xs: 编码器输出特征 [B, T, D]
n_speakers: 说话人数量 [B]
Returns:
attractors: 说话人嵌入向量 [B, S, D]
"""
# 动态生成吸引子
attractors = self.encoder_decoder(xs, n_speakers)
return attractors
说话人确认模型
CAMP++模型作为后处理模块,提供说话人嵌入向量的提取与相似度计算功能,用于优化分离结果的聚类性能。模型参数量仅7.2M,支持实时推理。
使用示例:
from funasr import AutoModel
# 加载说话人确认模型
model = AutoModel(model="cam++")
# 提取语音嵌入
embedding = model.extract_embedding("meeting_audio.wav")
# 说话人相似度计算
score = model.verify("speaker1.wav", "speaker2.wav")
模型详情见:model_zoo/modelscope_models_zh.md
实战应用指南
快速部署流程
FunASR提供Docker一键部署脚本,支持中文离线文件转写服务(含说话人分离功能):
# 下载部署脚本
git clone https://gitcode.com/GitHub_Trending/fun/FunASR && cd FunASR
# 启动中文离线转写服务(含说话人分离)
cd runtime/deploy_tools && bash funasr-runtime-deploy-offline-cpu-zh.sh
部署文档:runtime/deploy_tools/install_docker.sh
Python API调用示例
通过AutoModel接口可快速实现多人语音分离:
from funasr import AutoModel
# 加载带说话人分离的语音识别模型
model = AutoModel(
model="paraformer-zh",
spk_model="cam++", # 启用说话人分离
vad_model="fsmn-vad",
punc_model="ct-punc"
)
# 处理多人对话音频
res = model.generate(
input="meeting_recording.wav",
batch_size_s=300,
spk_diarization=True, # 开启说话人分离
max_speakers=4 # 设置最大说话人数
)
# 输出格式: 说话人ID + 时间戳 + 文本
print(res[0]["text_with_speaker"])
完整示例代码:examples/industrial_data_pretraining/contextual_paraformer
性能优化策略
在资源受限场景下,可通过以下参数调整平衡速度与精度:
| 参数 | 说明 | 性能影响 |
|---|---|---|
max_n_speaker |
最大说话人数 | 设为实际人数可降低30%计算量 |
chunk_size |
推理块大小 | 增大至500ms可提升2倍速度 |
quantize |
模型量化 | INT8量化可减少50%内存占用 |
优化指南:runtime/docs/SDK_advanced_guide_offline.md
应用场景与案例
会议记录系统
通过说话人分离技术,可自动生成带发言人标签的会议纪要:
[Speaker 0] 10:05:23 本次项目进度需要加快
[Speaker 1] 10:05:38 技术团队已经增加人力投入
[Speaker 0] 10:06:02 下周需要看到明显进展
案例代码:examples/industrial_data_pretraining/llm_asr
视频字幕生成
结合时间戳预测模型,为多人视频生成带说话人标识的字幕文件:
时间戳预测模型:funasr/models/fa
性能评估与benchmark
在AMI会议测试集上的性能表现:
| 指标 | 数值 | 行业对比 |
|---|---|---|
| DER(说话人错误率) | 14.2% | 优于Kaldi(18.7%) |
| RTF(实时率) | 0.8 | CPU单核实时处理 |
| 最大支持人数 | 8人 | 行业领先 |
测试报告:benchmarks/benchmark_pipeline_cer.md
总结与展望
FunASR的说话人分离技术通过端到端深度学习架构,解决了传统方法在重叠语音处理上的局限性。核心优势包括:
- 高精度:采用EEND-OLA模型,重叠语音识别准确率达85%
- 高效率:支持CPU实时处理,RTF<1
- 易部署:提供Docker与SDK多种部署方式
- 可扩展:支持与ASR、VAD等模块无缝集成
未来,FunASR将进一步优化多模态说话人分离(结合视频信息)和低资源场景下的模型压缩技术,持续提升多人语音处理的实用性。
贡献者名单:Acknowledge.md
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
请把这个活动推给顶尖程序员😎本次活动专为懂行的顶尖程序员量身打造,聚焦AtomGit首发开源模型的实际应用与深度测评,拒绝大众化浅层体验,邀请具备扎实技术功底、开源经验或模型测评能力的顶尖开发者,深度参与模型体验、性能测评,通过发布技术帖子、提交测评报告、上传实践项目成果等形式,挖掘模型核心价值,共建AtomGit开源模型生态,彰显顶尖程序员的技术洞察力与实践能力。00
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
MiniMax-M2.5MiniMax-M2.5开源模型,经数十万复杂环境强化训练,在代码生成、工具调用、办公自动化等经济价值任务中表现卓越。SWE-Bench Verified得分80.2%,Multi-SWE-Bench达51.3%,BrowseComp获76.3%。推理速度比M2.1快37%,与Claude Opus 4.6相当,每小时仅需0.3-1美元,成本仅为同类模型1/10-1/20,为智能应用开发提供高效经济选择。【此简介由AI生成】Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00





