资讯动态

ClearerVoice-Studio 混响加噪训练数据生成指南:RIR 仿真、早期混响目标构建与 SNR 混合全流程

发布时间:2026/10/4 14:26:37 来源:尧图企业网站定制
人工智能语音音频处理深度学习【免费下载链接】ClearerVoice-StudioAn AI-Powered Speech Processing Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Enhancement, Separation, and Target Speaker Extraction, etc.项目地址https://gitcode.com/gh_mirrors/cl/ClearerVoice-Studio点击查看免费下载导读本文基于 generate_reverb_noisy_speech 模块系统讲解 ClearerVoice-Studio 中混响 加噪训练数据的完整生成流程从随机房间声学仿真生成房间冲激响应RIR到卷积生成混响语音、构造带早期混响的目标语音再到按随机 SNR 混合背景噪声。读完本文你将掌握该模块三个脚本的调用关系、config/para.cfg全部参数含义以及如何为自己的语音增强模型如 FRCRN_SE、MossFormer2_SE、MossFormerGAN_SE批量生产可用于重训或微调的高质量reverbnoisy-clean-speech配对数据。一、模块定位为语音增强模型提供配对训练数据在 ClearerVoice-Studio 中train/speech_enhancement 目录负责 FRCRN_SE、MossFormer2_SE、MossFormerGAN_SE 等增强模型的训练而本模块generate_reverb_noisy_speech正是其数据上游通过混响 加噪两条路径把干净的语音语料变换成更贴近真实场景的带噪语音并同时输出对应的干净目标从而构成监督训练所需的(noisy, target)配对样本。文档开篇即说明其用途This script generates training data for speech enhancement models. Once the data generation is complete, you can use the output to retrain or fine-tune your models.整个模块由以下文件组成文件作用run.sh一键串联三步生成流程的入口脚本step1_gen_RIRs.py随机房间声学仿真批量生成 RIR 并落盘为 wavstep2_gen_reverb_speech.py用 RIR 与干净语音卷积生成混响语音与早期混响目标step3_add_noise.py按目标 SNR 将背景噪声叠加到混响语音上audiolib.py音频读写、SNR 混合、弱语音模拟等公共函数库config/para.cfg加噪阶段的全部配置参数INI 格式data/data_scp/speech.scp 与 data/data_scp/noise.scp干净语音与噪声的文件列表示例requirements.txt依赖声明rir_generator二、数据混合流程六步生成 reverb noisy 配对原文档将混合流程归纳为六个步骤下面结合源码逐一展开说明其物理意义与实现细节。1. 房间冲激响应RIR生成随机选择一个房间尺寸在麦克风—声源位置组合下生成 RIR并多次重复该过程。对应 step1_gen_RIRs.py 的实现其随机参数范围如下混响时间 RT从均值为 0、标准差为 0.1 的高斯分布中采样后加 0.6再裁剪到[0.2, 1.0]秒区间保留两位小数即RT round(np.clip(random.gauss(0,0.1)0.6, 0.2, 1.0), 2)房间尺寸长 x 在[7, 11]m、宽 y 在[5, 7]m、高 z 在[3.4, 3.6]m 内均匀随机麦克风位置x/y 在[1, 尺寸-1]m、z 在[2, 3]m 内随机声源位置x/y 在[0.3, 尺寸-0.3]m、z 在[0.8, 1.8]m 内随机。随后调用第三方库rir_generator的rir.generate()完成声学仿真关键参数为声速c340m/s、采样率fs、接收/声源/房间三维坐标、reverberation_timeRT输出样本数取nsampleint(fs * RT)。每个 RIR 以rir_runX_i_RT_X.XX.wav命名保存并同步写入wav.lst清单供第二步读取。注意坐标映射源码中传给r、s、L的分别是[mic_x, mic_z, mic_y]、[src_x, src_z, src_y]、[rm_x, rm_z, rm_y]与常规[x, y, z]顺序不同属于该模块的既有约定。2. 干净语音文件选择每生成一个 RIR可为其挑选多条干净语音用于生成混响语音由step2_gen_reverb_speech.py的--num_wavs_per_RIR默认 3控制即每个 RIR 对应生成num_wavs_per_RIR条混响语音。语音文件从speech.scp中随机抽取源码通过random.randint(0, num_clean_files-1)选索引后按行读取路径。3. SNR 选择为每条混合物在预定范围内随机选择一个信噪比。step3_add_noise.py读取para.cfg中的snr_lower默认 0 dB、snr_upper默认 15 dB与random_snr开关当random_snrTrue时对每条混合在[snr_lower, snr_upper]内均匀随机采样一个 SNR保留两位小数否则按total_snrlevels默认 2在上下界之间线性插值出离散的 SNR 档位为每条混合逐一使用。4. 噪声采样对每条混响语音随机选择一个噪声文件。step3_add_noise.py读取noise_list默认./data/data_scp/noise.scp中的噪声路径列表训练模式下用np.random.randint随机取索引测试模式下testTrue则按固定轮转取噪声保证可复现。读取失败的噪声文件会被跳过并重新采样。5. 长度匹配若噪声信号比干净语音短则拼接额外的噪声片段以匹配时长。step3_add_noise.py的处理逻辑是若噪声长于语音在噪声中随机截取一段与语音等长的片段st np.random.randint(0, len_noise - len_clean)若噪声短于语音循环拼接下一条噪声段间插入silence_length秒默认 0.1 s的静音作为间隔直到总长超过语音长度再随机截取等长片段。拼接过程中还会把用到的噪声文件名记录下来用于命名。6. 目标语音生成早期混响目标这是本模块最有特色的设计。原文档明确建议不要直接用原始干净语音作为目标原因有二其一卷积过程引入时延使混响信号与干净信号不再对齐产生时间偏移其二两者长度也不匹配。为此模块提出保留早期混响early reverberations作为目标——即将 RIR 截断后与干净语音卷积生成只含早期混响的混响语音作为目标早期混响长度可通过--target_rt调整默认 0.1 s100 ms。对应实现位于 step2_gen_reverb_speech.py先计算截断点h_trim_point int(args.sample_rate * args.target_rt)再把 RIR 在该点之后的位置全部置零得到h_trimh_trim_point int(args.sample_rate * args.target_rt) h_trim, fs sf.read(rir_path, always_2dTrue) h_trim[h_trim_point:, :] 0随后分别用完整 RIR 与截断 RIR 与干净语音做scipy.signal.convolve卷积得到混响信号signal_reverb与目标信号signal_target。两者按共同的最大绝对值归一化后统一乘 0.9避免削波的同时保持相对电平一致signal_reverb ss.convolve(h[:, None, :], signal[:, :, None]) signal_target ss.convolve(h_trim[:, None, :], signal[:, :, None]) norm_term max([max(abs(signal_reverb)), max(abs(signal_target))]) signal_reverb signal_reverb / norm_term * 0.9 signal_target signal_target / norm_term * 0.9这样构造的目标与混响语音长度一致、时延一致仅差晚期混响 噪声正好是增强模型应该去抑制的部分训练目标更为合理。三、环境依赖与目录结构模块的依赖极简requirements.txt 仅声明rir_generatorRIR 仿真的核心库。脚本运行还隐式依赖numpy、scipy、soundfile、librosa、yamlargparse、configparser这些在项目根目录 requirements.txt 中均有声明。仓库自带的示例数据布局如下相对仓库根目录train/data_generation/speech_enhancement/generate_reverb_noisy_speech/data/ ├── data_scp/ │ ├── speech.scp # 干净语音路径列表 │ └── noise.scp # 噪声路径列表 ├── noise/ # 示例噪声ch03_sm001.wav 等 6 条 └── speech/ # 示例语音p234_001.wav 等 9 条speech.scp 的格式为每行一个语音文件路径./data/speech/p234_001.wav ./data/speech/p234_002.wav ...noise.scp 的格式为每行一个噪声文件路径同时兼容名称\t路径两列格式见 audiolib.py 中get_filenames_ns对制表符的分割处理。四、使用步骤与一键运行原文档给出三步使用指引下面结合脚本与配置文件给出可落地的完整操作流程。第 1 步准备文件列表按上述格式准备两份列表干净语音列表如speech.scp与噪声列表如noise.scp。可直接修改data/data_scp/下的示例文件或保留示例数据先做小规模冒烟测试。step2通过--speech_scp默认./data/data_scp/speech.scp读取语音列表step3通过para.cfg中的noise_list默认./data/data_scp/noise.scp读取噪声列表。第 2 步配置参数根据需求调整 config/para.cfg 中的加噪参数。完整配置如下含注释说明# Configuration for generating Noisy Speech Dataset # - test: Specify if creating data for test, if False, creating data for training # - audioformat: default is .wav # - min_audio_length: Minimum Length of each audio clip (noisy and clean speech) in seconds # - max_audio_length: Maximum Length of each audio clip (noisy and clean speech) in seconds # - silence_length: Duration of silence introduced between clean speech utterances # - total_hours: Total number of hours of data required. Units are in hours # - snr_lower: Lower bound for SNR required (default: 0 dB) # - snr_upper: Upper bound for SNR required (default: 15 dB) # - random_snr: randomly generate one SNR mixer bounded between snr_lower and snr_upper # - total_snrlevels: Number of SNR levels if random_snr is False (default: 2) # - noise_list: A path to the noise script file # - save_noise: save background noise files, default: False [noisy_speech] test: False audioformat: *.wav min_audio_length: 3 max_audio_length: 25 silence_length: 0.1 total_hours: 0.05 snr_lower: 0 snr_upper: 15 random_snr: True total_snrlevels: 2 noise_list: ./data/data_scp/noise.scp suffix: reverb_noisy_utt_ save_noise: False各参数含义与对生成结果的影响如下参数默认值作用说明testFalseTrue时按固定轮转取噪声并生成带 SNR 标记的测试文件名False时随机取噪声、文件名与语音同名供训练使用audioformat*.wav输出音频格式通配符用于匹配中间产物min_audio_length/max_audio_length3 / 25秒生成的音频片段时长区间step3会将其换算为采样点乘以目标采样率silence_length0.1秒拼接噪声片段时插入的静音间隔时长total_hours0.05小时期望生成的数据总量step3据此换算total_samples total_hours*3600*target_fs作为样本数基准snr_lower/snr_upper0 / 15dBSNR 上下界random_snrTrue时在此区间随机采样random_snrTrue是否随机采样 SNRFalse时按total_snrlevels线性取档total_snrlevels2random_snrFalse时的 SNR 档位数在上下界间np.linspace插值noise_list./data/data_scp/noise.scp噪声文件列表路径suffixreverb_noisy_utt_测试模式输出文件名的前缀save_noiseFalse是否额外保存独立的背景噪声文件第 3 步运行脚本可选循环生成run.sh是入口它串联三个 Python 脚本并共享output_path、run_num、sample_rate三个全局变量。默认内容如下output_path./data # output data to be saved to this dir run_num1 #set 0, 1, 2, ... for different runs num_RIRs10 #number of RIRs to be generated sample_rate48000 ## Step 1: generate room impulse response (RIR) and save to wav files python step1_gen_RIRs.py \ --output_path $output_path \ --run_num $run_num \ --num_RIRs $num_RIRs \ --sample_rate $sample_rate ## Step 2: generate reverberant speech from clean speech by applying RIRs python step2_gen_reverb_speech.py \ --output_path $output_path \ --run_num $run_num \ --sample_rate $sample_rate ## Step3: add background noise to reverberant speech python step3_add_noise.py \ --output_path $output_path \ --run_num $run_num \ --sample_rate $sample_rate运行bash run.sh即可完成演示。若想批量生成多份数据例如为不同 run 生成互不重复的训练集修改run_num为 0、1、2…… 重复执行即可——每个 run 的输出会隔离到独立的runX/子目录下step1也会为每个 run 重新随机生成一批新的 RIR天然实现数据多样化。需要注意run.sh中的run_num默认值为 1非 0而各脚本自身的默认值为0直接以命令行参数覆盖即可。此外可调高num_RIRs默认 10扩大声学场景覆盖面。五、三步生成背后的源码实现Step 1随机声学环境仿真step1_gen_RIRs.py脚本以yamlargparse解析参数支持 YAML/命令行双重配置。核心循环中每次生成一个随机的 (房间尺寸, 混响时间, 麦克风位置, 声源位置) 四元组调用rir.generate得到冲激响应序列h用soundfile写为 wav 并登记到output_RIRs/wav.lst。其中nsampleint(fs*RT)使 RIR 长度随混响时间自适应RT 越大冲激响应越长晚期混响成分越多。Step 2卷积混响与目标截断step2_gen_reverb_speech.py脚本按output_RIRs/wav.lst逐条读取 RIR对每个 RIR 随机抽取num_wavs_per_RIR条干净语音执行双路卷积并归一化详见第二节第 6 点产物写入output_reverb_speech/reverb/混响语音与output_reverb_speech/target/早期混响目标同时生成output_reverb_speech/wav.lst供 Step 3 遍历。此处有两个值得注意的断言语音与 RIR 的采样率必须等于--sample_rate默认 48000否则直接报错——这要求你的干净语料与 RIR 保持同一采样率。Step 3SNR 混合加噪step3_add_noise.py audiolib.pystep3_add_noise.py使用configparser读取para.cfg的[noisy_speech]节遍历 Step 2 产出的混响语音按前述长度匹配逻辑截取噪声再调用 audiolib.py 中的snr_mixer_weak_voice完成混合。该函数与标准snr_mixer的关键差异在于功率估计只用大于均值功率的样本pow_clean[pow_clean avg_pow_clean].mean()等效于以语音活跃段为基准归一化到 -25 dB FS避免静音段拉低 RMS目标信号使用snr50的噪声缩放系数叠加极弱噪声保证目标干净但有微弱底噪内含弱语音模拟当信号长度超过 1 秒且有概率命中时随机选取 0.1~1.0 s 的片段将语音与目标乘上 0.1~0.9 的随机增益、噪声乘上 0.01~0.09 的随机衰减模拟说话人忽远忽近、音量忽大忽小的真实场景提升训练数据的鲁棒性。混合后分别写出noisy混响噪声与target早期混响微噪两个目录并生成output_reverb_noisy_speech/wav.lst记录所有带噪文件。六、输出目录结构与下游衔接一次完整运行run_num1为例的产物组织如下./data/run1/ ├── output_RIRs/ # Step 1随机 RIRwav 与 wav.lst ├── output_reverb_speech/ # Step 2reverb/ 混响语音、target/ 早期混响目标、wav.lst └── output_reverb_noisy_speech/ # Step 3noisy/ 带噪语音、target/ 配对目标、wav.lst训练模式下noisy/与target/下同名文件即为一对(noisy, target)监督样本可直接用于 ClearerVoice-Studio 的语音增强训练。该数据生成模块与训练链路是解耦的生成完成后可参照 train/speech_enhancement 的 train.sh 与 solver.py 等既有流程将产出的列表接入 FRCRN_SE、MossFormer2_SE 或 MossFormerGAN_SE 的数据集配置即可实现重训或微调。七、注意事项小结采样率一致性run.sh的sample_rate默认 48000且step2强制要求干净语音与 RIR 采样率一致不满足会断言失败若语料为 16 kHz 需统一调整sample_rate与语料本身目标构造勿用原始干净语音时延与长度失配会破坏训练对齐务必使用模块默认的早期混响目标--target_rt0.1可按需增大以保留更多早期反射如 0.2 s随机性与可复现testTrue时噪声轮转固定、便于评估对比训练建议保持random_snrTrue以覆盖 0~15 dB 的多样化信噪比时长控制min_audio_length/max_audio_length决定片段长度total_hours控制总量小数据冒烟测试可先用仓库自带的 9 条语音与 6 条噪声跑通全流程再替换为完整语料规模化生成。通过本模块你可以快速、低成本地为语音增强模型构建带房间混响与真实噪声的配对训练集且每个环节房间仿真、混响卷积、早期混响目标、SNR 混合、弱语音模拟均可通过配置文件与命令行参数精细调控。赞分享人工智能语音音频处理深度学习【免费下载链接】ClearerVoice-StudioAn AI-Powered Speech Processing Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Enhancement, Separation, and Target Speaker Extraction, etc.项目地址https://gitcode.com/gh_mirrors/cl/ClearerVoice-Studio点击查看免费下载相关推荐PaddleSpeech PaddleAudio 的 OpenRIRNoise 数据集RIR 混响与噪声数据的加载、切块与特征提取实战PaddleSpeech PaddleAudio 的 OpenRIRNoise 数据集RIR 混响与噪声数据的加载、切块与特征提取实战 本指南以 Paddle人工智能语音音频NLP媒体生成终极MicroPython函数教程Python For Kids教你模块化编程终极MicroPython函数教程Python For Kids教你模块化编程 Python For Kids是一个免费的全面在线Python开发教程专为儿示例工程教育IPC-Bench社区贡献指南如何参与项目开发与性能优化IPC Bench社区贡献指南如何参与项目开发与性能优化 IPC Bench是一个专注于进程间通信IPC技术基准测试的开源项目旨在为开发者提供全面的IP上一篇SteamAutoCrack三分钟掌握自动化游戏破解的终极指南下一篇如何快速批量获取网易云和QQ音乐的LRC歌词163MusicLyrics完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑