人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载本指南以 ESPnet 仓库中egs2/librimix/tse1目标说话人提取Target Speaker Extraction, TSErecipe 为核心完整讲解从 LibriMix 数据仿真、注册enrollment信号构建、TD-SpeakerBeam 模型配置到训练、推理与多指标评估的端到端流程并结合源码与评测结果表格帮助读者掌握在 ESPnet2 框架下复现双说话人 TSE 任务的完整方案与指标解读方法。一、任务背景什么是目标说话人提取TSE目标说话人提取TSE与传统的语音分离SS不同分离模型只需把混合信号中的多个说话人各自还原出来而 TSE 要求根据一段目标说话人的注册enrollment语音或说话人嵌入从混合信号中提取出该特定说话人的语音。因此 TSE 天然适合鸡尾酒会问题中面向指定说话人的场景例如智能音箱、会议系统、助听器中的特定人声提取。egs2/librimix/tse1正是 ESPnet 中面向 TSE 任务的标准 recipe其对应数据集为LibriMix采用TD-SpeakerBeamTime-Domain SpeakerBeam模型。该 recipe 的核心入口文件是 egs2/librimix/tse1/run.sh模型与训练配置为 egs2/librimix/tse1/conf/train.yaml实验评测结果记录在 egs2/librimix/tse1/README.md。二、Recipe 全景与运行入口2.1 目录结构egs2/librimix/tse1/ ├── run.sh # 顶层入口脚本 ├── enh.sh # 增强/TSE 通用训练与评估主流程 ├── cmd.sh / path.sh / db.sh # 环境、路径与数据位置配置 ├── conf/ │ ├── train.yaml # 默认训练配置 │ └── tuning/ │ └── train_enh_tse_td_speakerbeam_16k.yaml # 16kHz 调优配置 ├── local/ │ ├── data.sh # 数据准备总脚本含 4 个 stage │ ├── librimix_data.sh # LibriMix 数据仿真 │ ├── prepare_spk2enroll_librispeech.py # 生成 spk2enroll.json │ └── prepare_librimix_enroll.py # 由 spk2enroll.json 生成 enroll_spk?.scp └── scripts / steps / utils / pyscripts # 公共工具2.2 运行入口run.shrun.sh 内容非常精简它定义了几个关键参数后将所有工作委托给通用的enh.shsample_rate16k # 8k or 16k min_or_maxmin # min or max。决定混合信号的生成方式见 local/data.sh train_settrain valid_setdev test_setstest ./enh.sh \ --is_tse_task true \ --train_set ${train_set} \ --valid_set ${valid_set} \ --test_sets ${test_sets} \ --fs ${sample_rate} \ --ref_num 2 \ --local_data_opts --sample_rate ${sample_rate} --min_or_max ${min_or_max} \ --lang en \ --ngpu 4 \ --enh_config ./conf/train.yaml \ $这里几个关键参数的含义--is_tse_task true告诉enh.sh这是目标说话人提取任务而非普通增强/分离后续会切换训练与推理模块详见第四章--ref_num 2参考reference数量在有监督分离/TSE 中等价于说话人数量即 Libri2Mix 的双说话人配置--fs 16k采样率可选8k或16k--min_or_max min选择 LibriMix 的min版本各源信号截断到最短长度还是max版本--enh_config ./conf/train.yaml模型与训练配置--ngpu 4使用 4 块 GPU 训练。三、数据准备LibriMix 仿真与注册信号构建数据准备逻辑集中在 local/data.sh共 4 个 stage。脚本开头会对参数做合法性检查min_or_max只能是min/maxsample_rate只能是16k/8knum_spk只能是2/3。Stage 0LibriMix 数据仿真调用local/librimix_data.sh --min_or_max ${min_or_max} --sample_rate ${sample_rate} --num_spk ${num_spk}完成 LibriMix 混合音频的生成Libri2Mix 或 Libri3Mix。这一步依赖 db.sh 中的LIBRIMIX变量定位语料位置当LIBRIMIXdownloads时由脚本自动下载。Stage 1由 CSV 元数据构建 Kaldi 风格数据目录LibriMix 会输出mixture_train-*_mix_both.csv、mixture_dev_mix_both.csv、mixture_test_mix_both.csv等元数据文件。脚本读取这些 CSV 并生成data/{train,dev,test}下的标准文件awk -F , {print $1, $2} ${tmpdir}/${dset}.csv data/${dset}/wav.scp awk -F , {print $1, $1} ${tmpdir}/${dset}.csv data/${dset}/utt2spk cp data/${dset}/utt2spk data/${dset}/spk2utt # num_spk2 时 awk -F , {print $1, $3} ${tmpdir}/${dset}.csv data/${dset}/spk1.scp awk -F , {print $1, $4} ${tmpdir}/${dset}.csv data/${dset}/spk2.scp awk -F , {print $1, $5} ${tmpdir}/${dset}.csv data/${dset}/noise1.scp即wav.scp对应混合信号spk1.scp/spk2.scp对应两路干净参考语音noise1.scp对应噪声。num_spk3时还会生成spk3.scp。Stage 2构建 TSE 注册enrollment信号TSE 任务的核心是给每个混合样本关联一段目标说话人的注册语音。该 stage 分三步生成spk2enroll.json调用 prepare_spk2enroll_librispeech.pypython local/prepare_spk2enroll_librispeech.py \ ${librimix}/wav${sample_rate}/${min_or_max}/train-100 \ ${librimix}/wav${sample_rate}/${min_or_max}/train-360 \ --is_librimix True \ --outfile data/train/spk2enroll.json \ --audio_format wav该脚本通过get_spk2utt_librimix()扫描 LibriMix 目录下的s1/、s2/、s3/子目录从干净源文件名的mix_uid中解析出说话人 IDuid mix_uid.split(_)[spk_idx]从而建立说话人 → 可用注册语音列表的映射。--is_librimix False时则直接使用 LibriSpeech 原始目录构建映射。下载mixture2enrollment映射从 SpeakerBeam 官方 recipe 获取 dev/test 集上混合样本 → 注册语音的固定映射保证评测与公开结果可比wget -O data/dev/mixture2enrollment https://raw.githubusercontent.com/BUTSpeechFIT/speakerbeam/main/egs/libri2mix/data/wav8k/min/dev/map_mixture2enrollment生成enroll_spk?.scp调用 prepare_librimix_enroll.py。训练集--train True采用随机采样注册语音以增强多样性--seed 1固定随机种子dev/test 集则严格使用mixture2enrollment指定的注册语音保证评测口径一致。Stage 3划分 train-100 与 train-360训练数据进一步划分为data/train-100与data/train-360对应 LibriSpeech 的 100h / 360h 子集grep -e ${subset} data/train/wav.scp data/${subset}/wav.scp for f in data/train/*.scp; do [ $f data/train/wav.scp ] || utils/filter_scp.pl data/${subset}/wav.scp $f data/${subset}/$(basename $f) done ln -s ../../data/train/spk2enroll.json data/${subset}/spk2enroll.json其中spk2enroll.json通过软链接共享而 conf/train.yaml 中train_spk2enroll: data/train-100/spk2enroll.json指定实际用于训练的注册映射。四、模型与训练配置详解conf/train.yamlconf/train.yaml与conf/tuning/train_enh_tse_td_speakerbeam_16k.yaml内容一致是理解本 recipe 的关键。下面按模块拆解。4.1 优化与调度optim: adam max_epoch: 100 batch_type: folded batch_size: 16 iterator_type: chunk chunk_length: 48000 chunk_excluded_key_prefixes: - enroll_ref num_workers: 4 optim_conf: lr: 1.0e-03 eps: 1.0e-08 weight_decay: 0 unused_parameters: true patience: 20 accum_grad: 1 grad_clip: 5.0 scheduler: reducelronplateau scheduler_conf: mode: min factor: 0.7 patience: 3优化器为 Adam初始学习率1e-3采用 ReduceLROnPlateau 调度验证 loss 连续 3 个 epoch 不降时学习率乘以0.7batch_type: foldedbatch_size: 16表示按 fold 长度折叠后每批 16 个样本iterator_type: chunkchunk_length: 48000按 48000 个采样点16kHz 下即 3 秒切块训练chunk_excluded_key_prefixes: [enroll_ref]非常重要注册语音enroll_ref1、enroll_ref2等字段被排除在ChunkIterFactory的长度一致性检查之外——因为注册语音可以独立于混合信号长度随机切段enroll_segment: 48000不应与主信号共享相同的长度约束。4.2 模型选择与 TSE 预处理参数model_conf: num_spk: 2 share_encoder: true # preprocessor-related arguments # 对应 TSEPreprocessorespnet2/train/preprocessor.py 中实现 train_spk2enroll: data/train-100/spk2enroll.json enroll_segment: 48000 load_spk_embedding: false load_all_speakers: true num_skp: 2 encoder: conv encoder_conf: channel: 256 kernel_size: 32 stride: 16 decoder: conv decoder_conf: channel: 256 kernel_size: 32 stride: 16model_conf.num_spk: 2输出两路分离信号share_encoder: true共享编码器多说话人共用同一特征编码编码器/解码器均为卷积结构256 通道、卷积核 32、步长 16与 Conv-TasNet 风格的时域编解码一致预处理参数中的train_spk2enroll、enroll_segment、load_spk_embedding: false此处用注册音频而非说话人嵌入、load_all_speakers: true加载全部说话人的注册语音均由TSEPreprocessor定义于 espnet2/train/preprocessor.py消费。num_skp: 2出现在预处理器参数区与说话人数量相关。4.3 核心模型TD-SpeakerBeam 抽取器extractor: td_speakerbeam extractor_conf: layer: 8 stack: 4 bottleneck_dim: 256 hidden_dim: 512 skip_dim: 256 kernel: 3 causal: False norm_type: gLN pre_nonlinear: prelu nonlinear: relu # enrollment related i_adapt_layer: 7 adapt_layer_type: mul adapt_enroll_dim: 256 use_spk_emb: falseextractor: td_speakerbeam对应源码类TDSpeakerBeamExtractor实现于 espnet2/enh/extractor/td_speakerbeam_extractor.py。从源码看该抽取器基于TemporalConvNetInformed构建即带条件informed机制的时域卷积网络以编码器输出的混合特征为输入同时注入注册说话人信息来引导掩码估计。关键源码参数与配置对照__init__签名见 td_speakerbeam_extractor.py配置项默认值本 recipe 取值源码含义layer88每个 stack 内的层数stack34stack 数量bottleneck_dim128256瓶颈维度 Bhidden_dim512512卷积通道数 Hskip_dim128256跳连接通道数 Sckernel33卷积核大小causalFalseFalse是否因果非因果可看到全序列性能更优norm_typegLNgLN归一化BN / gLN / cLNpre_nonlinearpreluprelu掩码估计前的激活nonlinearrelurelu掩码估计的非线性函数i_adapt_layer77注入注册信息的适配层索引adapt_layer_typemulmul适配层类型如乘法调制adapt_enroll_dim128256说话人嵌入的维度use_spk_embFalseFalse是否使用说话人嵌入作为注册False 即使用注册音频经编码得到嵌入从实现可以推断注册信号路径为——注册音频经共享/独立编码得到注册嵌入然后在第i_adapt_layer层通过adapt_layer_type: mul的乘法适配层调制 TCN 中间特征从而告知网络要提取哪位说话人use_spk_emb: false表明本实验没有直接喂入预训练说话人嵌入而是从注册语音中学习表征。4.4 损失函数criterions: - name: snr conf: eps: 1.0e-7 wrapper: fixed_order wrapper_conf: weight: 1.0采用单一 SNR 损失尺度不变 SNR 类目标eps: 1e-7防止除零wrapper: fixed_order表示分离输出与参考按固定顺序一一对应有监督分离的常规做法权重 1.0。多任务学习时总损失为各子损失加权和loss weight_1 * loss_1 ... weight_N * loss_N。另外val_scheduler_criterion与best_model_criterion分别指定调度依据valid loss与模型选择依据——按valid/snr最大化与valid/loss最小化双准则选择最佳模型keep_nbest_models: 1只保留最优权重。五、训练、推理与评分流程enh.sh所有 stage 的实际执行都在 enh.sh 中。由于--is_tse_task true脚本会施加 TSE 任务约束并切换专用模块5.1 TSE 任务约束if $is_tse_task; then if $use_noise_ref; then log --use_noise_ref must be false ...; exit 1; fi if $use_dereverb_ref; then log --use_dereverb_ref must be false ...; exit 1; fi if [ -n $inf_num ] [ $inf_num ! $ref_num ]; then log The value of --inf_num must be equal to that of --ref_num ...; exit 1 fi fi即 TSE 场景不允许使用噪声参考/去混响参考且输出数必须等于说话人参考数。5.2 数据路径命名与模块切换训练阶段Stage 5/6传入的数据路径类型非常关键--train_data_path_and_name_and_type ${_enh_train_dir}/wav.scp,speech_mix,sound --train_data_path_and_name_and_type ${_enh_train_dir}/spk1.scp,speech_ref1,sound --train_data_path_and_name_and_type ${_enh_train_dir}/enroll_spk1.scp,enroll_ref1,textspeech_mix混合输入speech_ref1/2两路干净参考监督信号enroll_ref1/2注册语音类型标记为text因其enroll_spk?.scp可能是MIXTURE_UID *UID SPEAKER_ID特殊格式或嵌入文件跳过常规 wav 格式化见 enh.sh 中audio_path:0:1 *或.npy后缀的判断。训练模块在 TSE 任务下为espnet2.bin.enh_tse_train普通增强为espnet2.bin.enh_train推理模块对应espnet2.bin.enh_tse_inference。评分时enh_scoring会传入--is_tse true。5.3 主要 stage 一览Stage内容1local/data.sh数据准备前述 4 个 stage2速度扰动本 recipe 未启用speed_perturb_factors3format_wav_scp.sh统一音频格式与采样率到dump/raw4去除过短/过长样本min_wav_duration0.1max_wav_duration205收集统计信息collect stats6模型训练launchenh_tse_train支持多卡7推理增强enh_tse_inference8多指标评分enh_scoring并生成 RESULTS.md9-10可选ASR 解码与 WER/CER 打分11打包模型pack12上传 HuggingFace需设置hf_repo其中 Stage 8 会分别对观察信号observation即原始混合与增强信号enhanced打分最后通过scripts/utils/show_enh_score.sh汇总生成RESULTS.md——这正是 README.md 的来源。六、评测结果与指标解读6.1 运行环境README.md 记录该次实验的运行环境日期Mon Jun 5 22:42:07 CST 2023Python 版本3.8.16ESPnet 版本espnet 202301PyTorch 版本2.0.1实验配置为conf/train.yaml即enh_train_raw实验使用的预训练模型为Wangyou_Zhang_librimix_train_enh_tse_td_speakerbeam_raw可通过 Model Zoo 下载复现espnet_model_zoo_download机制见 enh.sh 中download_model逻辑。6.2 评测指标表原文档完整内容datasetPESQ_WBSTOISARSDRSIRSI_SNROVRLSIGBAKP808_MOSdev_min_16k1.0864.437.18-1.710.08-1.811.602.261.622.68test_min_16k1.0864.566.90-1.830.09-1.931.632.331.662.71enhanced_dev_min_16k1.7386.5012.5011.4024.8310.582.953.243.923.23enhanced_test_min_16k1.7387.3612.3411.4724.5110.742.993.293.913.256.3 指标含义与结果解读数据集命名规则dev_min_16k/test_min_16k表示 LibriMix 的min版本、16kHz 采样率的原始混合观察信号enhanced_*表示经 TD-SpeakerBeam 提取后的增强信号。各指标含义PESQ_WB宽带 PESQ 语音质量评分范围约 -0.5~4.5越高越好STOI短时客观可懂度%衡量语音可懂性越高越好SAR / SDR / SIR信号伪影比、信号失真比、信号干扰比dBSDR 是分离质量的综合指标SI_SNR尺度不变信噪比dBOVRL / SIG / BAKPESQ 衍生主观维度——总体、语音质量、背景噪声抑制越高越好P808_MOSITU-T P.808 非侵入式 MOS 预测。结果解读要点初始混合本身极难分离原始min版本混合的 SDR 为负约 -1.7~-1.8 dBSTOI 仅约 64%属于典型的高难度双说话人重叠场景min模式下两说话人时长完全对齐混合干扰最大提取效果显著增强后 SDR 从 -1.7 dB 提升至约 11.4~11.5 dB提升约 13 dBSTOI 提升到 86.5%~87.4%SI_SNR 从约 -1.8 dB 提升到约 10.6~10.7 dB干扰抑制出色SIR 从约 0.08 dB 提升至约 24.5~24.8 dB说明 TD-SpeakerBeam 对另一说话人的抑制非常充分主观维度全面改善PESQ_WB 从 1.08 提升到 1.73P808_MOS 从 2.68 提升到 3.23~3.25OVRL/SIG/BAK 均有明显提升dev/test 表现一致两组数据各指标非常接近说明模型泛化稳定。6.4 复现路径复现该结果有两种方式从零训练在egs2/librimix/tse1/目录下直接执行./run.sh需先按 db.sh 配置 LibriMix 语料路径或保持LIBRIMIXdownloads自动下载再按需用--stage/--stop_stage控制流程例如./run.sh --stage 6 --stop_stage 8仅训练与评分加载预训练模型设置--download_model espnet/Wangyou_Zhang_librimix_train_enh_tse_td_speakerbeam_raw直接进入推理与评分阶段enh.sh 会通过espnet_model_zoo_download --unpack true下载并软链模型与训练配置随后执行enh_tse_inference与enh_scoring最终由show_enh_score.sh重新生成RESULTS.md。如需调整数据难度或说话人数量可修改 run.sh 顶部的sample_rate、min_or_max与--ref_num注意local/data.sh仅支持num_spk为 2 或 3并配套选择conf/tuning/下的对应配置。七、小结egs2/librimix/tse1完整展示了 ESPnet2 中目标说话人提取任务的工程范式run.sh负责参数封装enh.sh提供从数据准备、统计收集、分布式训练、推理到多指标评分的全流程编排TSEPreprocessor与TDSpeakerBeamExtractortd_speakerbeam_extractor.py则从源码层面支撑了注册语音 → 说话人嵌入 → 乘法适配层调制时域卷积网络的提取机制。README 中记录的结果显示在 Libri2Mixmin、16k这一高难度配置下TD-SpeakerBeam 可将混合信号的 SDR 从约 -1.8 dB 提升至约 11.5 dB、STOI 从约 64% 提升至约 87%并显著改善 PESQ/MOS 等主观指标是复现与对比 TSE 方法的可靠基线。赞分享人工智能语音音频深度学习NLP【免费下载链接】espnetEnd-to-End Speech Processing Toolkit项目地址https://gitcode.com/gh_mirrors/es/espnet点击查看免费下载相关推荐ESPnet2 说话人验证实战RATS 数据集上的 SKA-TDNN 模型训练与 EER/minDCF 评估ESPnet2 说话人验证实战RATS 数据集上的 SKA TDNN 模型训练与 EER/minDCF 评估 本文以 ESPnet egs2/rats/sp人工智能语音音频深度学习NLPESPnet Librimix 多说话人 ASR 实战Transformer multispkr 与 PIT 训练全解析ESPnet Librimix 多说话人 ASR 实战Transformer multispkr 与 PIT 训练全解析 本文围绕 ESPnet 中 egs2人工智能语音音频深度学习NLPESPnet2 多说话人 TTS 实战基于 HiFiTTS 语料库训练 22.05 kHz 多说话人 VITS 模型指南ESPnet2 多说话人 TTS 实战基于 HiFiTTS 语料库训练 22.05 kHz 多说话人 VITS 模型指南 本文是 ESPnet2 中 HiFi人工智能语音音频深度学习NLP上一篇如何使用ast-grep实现高效代码结构分析与重构完整指南下一篇重构英语学习系统从认知科学到技术实践的效率革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考