攻克多人对话难关: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
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00





