人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本文是 PaddleSpeech 开源语音工具包中examples/ami示例的完整技术指南围绕 AMI 会议语料库上的说话人日志Speaker Diarization任务展开以预训练 ECAPA-TDNN x-vector 提取说话人嵌入再通过 AHC / 谱聚类Spectral Clustering完成谁在何时说话的自动标注并以 Diarization Error RateDER作为统一评测指标。读完本文你将掌握从 AMI 数据下载、标注解析、子段切分、嵌入提取、聚类后端选择到 DER 评测的完整流水线并能直接复现该示例在 HeadsetMix 录音下的最优结果。一、任务与数据集背景1.1 说话人日志任务是什么说话人日志Speaker Diarization要解决的核心问题是给定一段包含多人对话的录音自动回答谁在什么时间段说话。它与说话人识别Speaker Verification不同——后者假设说话人已知前者需要在不知道说话人身份的情况下把音频按说话人切分成不同片段并归簇。该任务广泛应用于会议纪要、客服质检、影视字幕、语音检索等场景。在 PaddleSpeech 中该任务由examples/ami/sd0示例完整承载。主 READMEexamples/ami/README.md对其定位只有一句话sd0 - speaker diarization by AHC, SC base on embeddings即基于嵌入向量embeddings的说话人日志聚类后端支持 AHC凝聚层次聚类与 SC谱聚类两种方案。1.2 AMI 会议语料库简介AMIAugmented Multi-party Interaction会议语料库由爱丁堡大学等机构采集是说话人日志领域最经典的评测基准之一。官方对其的描述是包含100 小时的会议录音录音使用多种信号源并同步到统一时间轴包括近讲麦克风close-talking与远场麦克风far-field、单人与全景摄像机、幻灯片投影仪与电子白板的输出会议期间与会者还使用未同步的笔记录书写内容会议用英语录制分别在声学特性不同的三个房间完成参与者大多为非英语母语者。在本示例中仅使用其中一种麦克风信号Headset mix头戴式麦克风混音。全部数据下载约需要10GB磁盘空间。说明本文以下内容均基于 PaddleSpeech 仓库中examples/ami/sd0目录下的实际脚本与配置文件展开读者可按 examples/ami/sd0/README.md 中的说明逐步复现。二、整体架构一条从音频到 DER 的完整流水线从脚本结构与源码调用链看sd0示例的说话人日志流水线可划分为四个阶段AMI 原始数据 人工标注(XML) │ ▼ [阶段0] 数据准备 ami_prepare.py │ 解析 segments/*.xml → 参考 RTTM │ 合并/切分 → 子段 JSON 元数据 ▼ [阶段1] 嵌入提取 compute_embdding.py │ ECAPA-TDNN 前向 → 每个子段 192 维 x-vector │ 按录音保存为 *.emb_stat.pkl ▼ [阶段2] 聚类 超参调优 experiment.py │ dev 集调 p-value / 阈值 / n_neighbors │ 用最优超参在 dev eval 上聚类 → 系统 RTTM ▼ [阶段3] DER 评测 utils/DER.py 参考 RTTM vs 系统 RTTM → DER入口脚本 run.sh 只做两件事下载预训练模型stage 1、调用local/process.shstage 2执行完整的处理与评测流程。三个 Python 脚本分别对应阶段 0~2。三、数据准备从 AMI 官网到本地目录3.1 下载标注文件与音频信号按照 examples/ami/sd0/README.md 的说明需要准备两份数据1人工标注Annotations包含会议的分段segmentsXML 标注用于生成参考 RTTMOracle 标注。下载命令## download annotations wget http://groups.inf.ed.ac.uk/ami/AMICorpusAnnotations/ami_public_manual_1.6.2.zip unzip ami_public_manual_1.6.2.zip解压后得到ami_public_manual_1.6.2目录其中segments/下每个录音对应若干*.segments.xml文件每个说话人一个。2音频信号Signals需要按 AMI 官网下载指引使用 chooser 逐项选择选择一个或多个 AMI 会议会议 ID 请参照 local/ami_splits.py 中定义的 dev/eval 会议集合媒体流只需选择Headset mix。3.2 目录约定与一键启动准备好数据后直接运行./run.sh --data_folder ./amicorpus --manual_annot_folder ./ami_public_manual_1.6.2其中./amicorpus为音频数据根目录amicorpus/下按会议 ID 组织如ES2002/audio/ES2002.Mix-Headset.wav./ami_public_manual_1.6.2为标注根目录。也可直接修改 run.sh 顶部的默认变量TARGET_DIR/home/dataset/AMI data_folder${TARGET_DIR}/amicorpus manual_annot_folder${TARGET_DIR}/ami_public_manual_1.6.2 save_folder./save pretraind_model_dir${save_folder}/sv0_ecapa_tdnn_voxceleb12_ckpt_0_1_1/model conf_pathconf/ecapa_tdnn.yaml devicegpu3.3 分两个 stage 执行run.sh 通过--stage控制执行粒度默认从 stage 0 开始stage 1下载并解压预训练说话人嵌入模型sv0_ecapa_tdnn_voxceleb12_ckpt_0_1_1.tar.gz到save/目录stage 2调用bash ./local/process.sh data_folder manual_annot_folder save_folder pretraind_model_dir conf_path device依次执行数据准备、嵌入提取与聚类评测。path.sh 负责初始化环境将仓库根目录MAIN_ROOT及utils加入PATH设置PYTHONPATH、LC_ALLC与 UTF-8 编码保证脚本在各环境下可复现。四、阶段 0数据准备源码剖析ami_prepare.pylocal/ami_prepare.py 完成两件事生成参考 RTTM、生成子段sub-segmentJSON 元数据。4.1 从 XML 标注生成参考 RTTMRTTMRich Transcription Time Markup是说话人日志的标准标注格式每行形如SPEAKER ES2008c 0 37.880 0.590 NA NA ES2008c.A_PM NA NA SPKR-INFO ES2008c 0 NA NA NA unknown ES2008c.A_PM NA NASPEAKER行记录说话区间录音 ID、起始时间、时长、说话人 IDSPKR-INFO行记录录音中出现的说话人列表供 Oracle 说话人数统计使用。prepare_segs_for_RTTM遍历segments/rec_id.*.segments.xml解析 XML 中每个segment元素的transcriber_start/transcriber_end属性结合说话人字母A/B/C…拼出rec_id.speaker形式的说话人 ID按开始时间排序后由get_RTTM_per_rec写出。该函数还会过滤掉transcriber_start transcriber_end的错误标注行。最终每个 split 生成一个汇总参考文件例如fullref_ami_dev.rttm。4.2 段合并与子段切分说话人日志需要以固定粒度的子段为单位提取嵌入因此prepare_metadata对每个录音的说话区间做两步处理merge_rttm_intervals把时间上重叠的相邻说话区间合并为一个区间重叠部分标记为overlapget_subsegments将时长大于max_subseg_dur默认 3.0 秒的长段按shift max_subseg_dur - overlap默认 1.5 秒重叠滑动切分为约 3 秒的子段不足 3 秒的段保持原样。每个子段被记录为rec_id_start_end形式的子段 ID并计算起止采样点SAMPLERATE 16000写入 JSON{ ES2008c_37.88_38.42: { wav: { file: /path/to/amicorpus/ES2008c/audio/ES2008c.Mix-Headset.wav, duration: 0.54, start: 606080, stop: 614720 } } }注当mic_type为Array18 麦阵列时JSON 中改用files键存放 8 个通道的文件路径列表。最终输出三份 JSONami_train.Mix-Headset.subsegs.json、ami_dev.Mix-Headset.subsegs.json、ami_eval.Mix-Headset.subsegs.json。skip()函数通过检查三个 JSON 与选项文件opt_ami_prepare.mic.pkl是否已存在且一致实现阶段跳过的幂等性。4.3 数据集划分ami_splits.pylocal/ami_splits.py 提供三种官方划分配置项split_type决定使用哪种split_type含义会议数train/dev/testscenario_only仅场景化会议ES/IS/TS25 / 5 / 5full_corpus全部会议41 / 11 / 6full_corpus_asr默认与 ASR 一致的全量划分dev 中剔除与 train 说话人重叠的会议45 / 9 / 4同时skip_TNOTrue会跳过 TNOTS 开头会议——它们属于非场景化录制说话人数量波动更大3~5 人。五、阶段 1ECAPA-TDNN 嵌入提取compute_embdding.pylocal/compute_embdding.py 负责为 dev / eval 每个录音的每个子段提取 192 维说话人嵌入。5.1 模型加载与推理代码调用链如下通过paddle.set_device(args.device)设置 GPU/CPU构建 ECAPA-TDNN 骨干网络EcapaTdnn(**config.model)定义在 paddlespeech/vector/models/ecapa_tdnn.py用SpeakerIdetification包装成说话人识别模型加载预训练权重paddle.load(os.path.join(args.load_checkpoint, model.pdparams))后model.set_state_dict(state_dict)model.eval()进入推理模式前向model.backbone(feats, lengths)得到(N, emb_size)的嵌入。5.2 逐录音提取与保存对每个录音从全量 JSON 中切出该录音的子集元数据prepare_subset_json用JSONDataset加载 mel 频谱特征80 维 fbank、25ms 窗、10ms 帧移DataLoader按batch_size16批量推理collate 时做均值归一化batch_feature_normalizemean_normTrue, std_normFalse将嵌入与子段 ID 组装成EmbeddingMetasegsetstats对象序列化为rec_id.Mix-Headset.emb_stat.pkl若该文件已存在则跳过幂等。嵌入文件路径约定为save_folder/emb/AMI_dev|eval/rec_id.Mix-Headset.emb_stat.pkl与配置中的embedding_dir: emb对应。六、配置文件全解ecapa_tdnn.yamlconf/ecapa_tdnn.yaml 是本次实验唯一的配置文件yacs CfgNode 解析按功能分为五个区块逐项说明如下。6.1 数据准备设置配置项默认值说明split_typefull_corpus_asr数据集划分方式可选scenario_only/full_corpus/full_corpus_asrskip_TNOTrue是否跳过 TNO 会议mic_typeMix-Headset麦克风类型可选Mix-Lapel、Mix-Headset、Array1、Array1-01、BeamformItvad_typeoracleVAD 类型当前仅使用标注的 Oracle VAD为后续 VAD 预留max_subseg_dur3.0子段最大时长秒overlap1.5相邻子段重叠时长秒embedding_diremb嵌入保存目录相对save_foldermeta_data_dirmetadataJSON 元数据目录ref_rttm_dirref_rttms参考 RTTM 目录sys_rttm_dirsys_rttms系统输出 RTTM 目录der_dirDERDER 结果目录6.2 特征提取设置sr: 16000 # 采样率 n_mels: 80 # mel 滤波器个数 window_size: 400 # 25ms25 * 16000 / 1000 400 hop_size: 160 # 10ms10 * 16000 / 1000 160注释明确说明当前仅支持 fbank 特征left_frames、right_frames、deltas等项被注释掉为后续扩展预留。6.3 模型设置seed: 1234 emb_dim: 192 # 输出嵌入维度 batch_size: 16 model: input_size: 80 channels: [1024, 1024, 1024, 1024, 3072] kernel_sizes: [5, 3, 3, 3, 1] dilations: [1, 2, 3, 4, 1] attention_channels: 128 lin_neurons: 192这些参数直接对应EcapaTdnn构造函数的字段channels为各层卷积通道数四层 SE-Res2Block 加一层 bottleneckkernel_sizes与dilations为各层卷积核尺寸与空洞率attention_channels为 SE 注意力模块的中间通道数lin_neurons为最终线性层输出维度emb_dim。配置文件会自动下载 ECAPA-TDNN 预训练模型best即run.shstage 1 中下载的sv0_ecapa_tdnn_voxceleb12_ckpt_0_1_1基于 VoxCeleb1/2 训练。6.4 谱聚类设置backend: SC # 可选 SC / AHC / kmeans affinity: cos # 相似度矩阵类型可选 cos / nn max_num_spkrs: 10 # 每段录音最大说话人数 oracle_n_spkrs: True # 是否使用标注中的真实说话人数关键约束配置注释中已说明kmeans后端只能配合cosaffinity 使用oracle_n_spkrsTrue时说话人数来自参考 RTTM 的SPKR-INFO行否则需要估计。6.5 DER 评测设置ignore_overlap: True # 评测时是否忽略重叠说话区间 forgiveness_collar: 0.25 # 容忍误差collar单位秒这两项与 utils/DER.py 的评测逻辑直接对应。七、阶段 2聚类与超参调优experiment.py diarization.py7.1 在 dev 集上调优超参local/experiment.py 遵循dev 集调参、dev/eval 双集评测的标准实验范式按后端/相似度类型选择不同的调优策略组合调优对象搜索范围cosaffinity SC/kmeansp-value保留每行前 p% 的相似度值np.arange(0.002, 0.015, 0.001)AHC后端距离阈值p_val 即阈值np.arange(0.0, 1.0, 0.1)nnaffinityn_neighbors 近邻数range(5, 15)固定 oracle 说话人数调优逻辑dev_pval_tuner等对每个候选值在完整 dev 集上跑一遍聚类 → 生成系统 RTTM → 调用DER()计算 DER → 取 DER 最小的候选值。对kmeans oracle 说话人数场景p-value 搜索会提前终止break因为 kmeans 不需要剪枝。7.2 最终聚类与评测得到最优超参后对 dev 和 eval 分别执行diarize_dataset按oracle_n_spkrs决定说话人数来源True时通过get_oracle_num_spkrs从SPKR-INFO读取False且cosaffinity 时置None由谱聚类用**最大特征间隙max eigen gap**自动估计说话人数依据backend分发到 paddlespeech/vector/cluster/diarization.py 中的聚类函数逐录音生成sys_rttms/mic/AMI_split/tag/rec_id.rttm并拼接为sys_output.rttm用DER()计算总体 DER并调用write_ders_file把逐录音 DER 写入DER/split_DER_tag文件。7.3 三个聚类后端的实现细节从diarization.py源码看谱聚类 SCcos affinitydo_spec_clustering使用SpecClustUnormmin_num_spkrs2、max_num_spkrs10内部基于 p-value 剪枝后的 cos 相似度矩阵通过最大特征间隙估计簇数kNone 时谱聚类 SCnn affinity使用SpecClustern_clustersk、affinitynearest_neighbors、assign_labelskmeans、random_state1234AHCdo_AHC基于 sklearn 的AgglomerativeClusteringaffinitycosine、linkageaverage已知说话人数时直接指定n_clusters未知时用distance_thresholdp_val自动确定簇数。聚类完成后统一经过两步后处理merge_ssegs_same_speaker合并相邻、属于同一说话人的子段与distribute_overlap对属于不同说话人的重叠子段取中点切分时长最终write_rttm输出 RTTM。diarization.py的注释也坦诚指出AHC 在未知说话人数时仅作为实验更推荐使用谱聚类。八、阶段 3DER 评测指标解读8.1 DER 的构成Diarization Error Rate 是说话人日志的国际通用评测指标由三部分构成DER Missed Speech(MS) False Alarm(FA) Speaker Error Rate(SER)Missed Speech参考标注有人说话、系统判定无人说话的时间比例False Alarm系统判定有人说话、参考标注无人说话的时间比例Speaker Error说话人标签归属错误的时间比例。评测参数ignore_overlapTrue忽略重叠说话区间forgiveness_collar0.25允许边界有 0.25 秒误差这些与 utils/DER.py 的DER()函数签名DER(ref_rttm, sys_rttm, ignore_overlap, forgiveness_collar)一一对应。8.2 本示例报告的最优结果examples/ami/sd0/README.md 给出了 **ECAPA-TDNN SC谱聚类**在 HeadsetMix 上的最优 DERSystemMic.Orcl. (Dev)Orcl. (Eval)Est. (Dev)Est. (Eval)ECAPA-TDNN SCHeadsetMix1.54%3.07%1.56%3.28%Orcl.Oracle使用标注中的真实说话人数Est.Estimated使用最大特征间隙自动估计说话人数。可以看到在 oracle 说话人数下 dev 集 DER 仅 1.54%即使改用估计说话人数性能也几乎不损失1.56%说明 cos 相似度下的特征间隙估计在 AMI 上非常可靠。运行结束后脚本会打印Final Diarization Error Rate (%) on AMI corpus: Dev 1.54 % | Eval 3.07 %九、快速上手清单与复现要点环境准备安装 PaddleSpeech 及其依赖sklearn、yacs、tqdm 等确保MAIN_ROOT环境变量可用由path.sh自动设置。数据下载标注包ami_public_manual_1.6.2.zip约几十 MB 音频 SignalsHeadset mix约 10GB。会议 ID 以 local/ami_splits.py 为准。一键运行./run.sh --data_folder ./amicorpus --manual_annot_folder ./ami_public_manual_1.6.2在examples/ami/sd0目录下或分 stage 执行。修改实验想换聚类后端修改conf/ecapa_tdnn.yaml的backendSC/AHC/kmeans与affinitycos/nn想评估麦克风差异修改mic_type想验证自动估计说话人数将oracle_n_spkrs设为False。结果产物参考 RTTM 位于save/ref_rttms/系统 RTTM 位于save/sys_rttms/逐录音 DER 位于save/DER/。十、延伸阅读流水线核心聚类实现paddlespeech/vector/cluster/diarization.pydo_spec_clustering/do_AHC/read_rttm/write_ders_file嵌入提取模型paddlespeech/vector/models/ecapa_tdnn.pyEcapaTdnn网络定义评测脚本utils/DER.py数据划分local/ami_splits.py数据准备local/ami_prepare.py配置模板conf/ecapa_tdnn.yaml通过以上步骤你可以在自己的机器上完整复现 AMI 说话人日志实验并将这套嵌入提取 聚类 DER 评测的流水线迁移到其他会议或电话对话数据集上。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐SpeechBrain 实战基于 ECAPA-TDNN 深度嵌入与谱聚类的 AMI 说话人日志Speaker Diarization完整指南SpeechBrain 实战基于 ECAPA TDNN 深度嵌入与谱聚类的 AMI 说话人日志Speaker Diarization完整指南 说话人日志人工智能深度学习语音音频NLP预训练NeMo 说话人日志Speaker Diarization实战指南从聚类式推理到端到端 Sortformer 流式方案NeMo 说话人日志Speaker Diarization实战指南从聚类式推理到端到端 Sortformer 流式方案 导读 本文以 NeMo本项目为开发工具代码质量静态分析NeMo 说话人任务实战说话人识别Speaker Recognition与说话人日志Speaker Diarization完整指南NeMo 说话人任务实战说话人识别Speaker Recognition与说话人日志Speaker Diarization完整指南 导读 本文围绕 N前端CMS上一篇WVP-GB28181-Pro如何构建企业级国标视频监控统一平台下一篇rough-notation性能预算设置控制资源使用上限创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
