如何高效构建纯净语音数据集?FRCRN语音降噪-单麦-16k镜像一键推理方案
1. 引言:构建高质量语音数据集的挑战与需求
在语音合成、声纹识别和语音识别等AI任务中,高质量、纯净的语音数据集是模型性能的关键基础。然而,现实中的原始音频往往包含背景噪声、多人语音干扰、非目标说话人片段等问题,严重影响后续建模效果。
传统手动清洗方式效率低下,难以满足大规模训练需求。为此,我们引入FRCRN语音降噪-单麦-16k 镜像,结合达摩院ModelScope平台的一系列预训练模型,提供一套从降噪 → 切分 → 去除非目标说话人 → 自动标注的全流程自动化解决方案。
本文将详细介绍如何利用该镜像实现“一键推理”,快速构建可用于TTS(如Bert-VITS2)或其他语音任务的标准化语音数据集。
2. 方案概览:端到端语音数据处理流程
2.1 整体架构设计
本方案采用模块化设计,涵盖以下五个核心步骤:
- 原始音频采集与格式转换
- 基于FRCRN的深度语音降噪
- VAD驱动的语音切片
- 基于声纹验证的说话人过滤
- ASR自动标注生成文本标签
整个流程可完全脚本化运行,支持批量处理,显著提升数据准备效率。
2.2 技术栈选型说明
| 模块 | 模型名称 | 功能 |
|---|---|---|
| 降噪 | damo/speech_frcrn_ans_cirm_16k | 单通道语音去噪,保留人声清晰度 |
| VAD | damo/speech_fsmn_vad_zh-cn-16k-common-pytorch | 中文语音活动检测,精准切分语句边界 |
| 声纹比对 | damo/speech_eres2net_base_250k_sv_zh-cn_16k-common | 同一说话人判别,剔除污染样本 |
| 语音识别 | damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch | 自动生成文本标注 |
所有模型均来自ModelScope开源平台,具备高精度与良好泛化能力。
3. 环境部署与快速启动
3.1 镜像部署与环境初始化
本方案基于FRCRN语音降噪-单麦-16k预置镜像,已集成所需依赖库与模型缓存,极大简化部署流程。
部署步骤如下:
- 在GPU服务器上部署镜像(推荐使用NVIDIA 4090D及以上显卡)
- 启动后进入Jupyter Notebook界面
- 执行以下命令激活环境并进入工作目录:
conda activate speech_frcrn_ans_cirm_16k cd /root提示:该环境中已预装
modelscope,pydub,tqdm,librosa等关键库,无需额外安装。
3.2 一键推理脚本调用
完成环境配置后,只需执行以下命令即可启动全流程处理:
python 1键推理.py该脚本封装了从降噪到标注的全部逻辑,用户仅需提前组织好输入音频文件即可。
4. 核心处理流程详解
4.1 第一步:原始音频获取与预处理
为确保训练数据一致性,建议选择音质优良、背景干净的教学类视频作为源材料。以B站UP主“甜药”的教学视频为例:
- 视频链接示例:https://space.bilibili.com/106017013
- 使用工具:DownKyi 下载高清音频流
- 格式转换:通过 FileConverter 将
.mp4转为.wav格式
创建标准目录结构用于后续处理:
import os base_dir = "./" directories = ["input_dir", "output_dir", "denoised_dir"] for directory in directories: dir_path = os.path.join(base_dir, directory) if not os.path.exists(dir_path): os.makedirs(dir_path) print(f"文件夹 '{dir_path}' 已创建。") else: print(f"文件夹 '{dir_path}' 已存在。")最终目录结构如下:
./ ├── input_dir/ # 存放原始.wav音频 ├── denoised_dir/ # 存放降噪后音频 └── output_dir/ # 存放切片及最终结果将下载并转换后的音频文件统一放入input_dir文件夹中。
4.2 第二步:基于FRCRN的语音降噪处理
使用达摩院提供的FRCRN(Full-Band Refined CRN)模型进行高质量语音增强。该模型在复杂噪声环境下表现优异,能有效去除背景音乐、环境杂音等干扰。
代码实现:
import os from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # 初始化降噪管道 ans_pipeline = pipeline( Tasks.acoustic_noise_suppression, model='damo/speech_frcrn_ans_cirm_16k' ) input_folder = "./input_dir" output_folder = "./denoised_dir" if not os.path.exists(output_folder): os.makedirs(output_folder) for audio_file in os.listdir(input_folder): if audio_file.endswith(".wav"): input_path = os.path.join(input_folder, audio_file) output_path = os.path.join(output_folder, audio_file) result = ans_pipeline(input_path, output_path=output_path) print(f"Processed {audio_file}")优势分析:相比传统谱减法或Wiener滤波,FRCRN采用时频联合建模,在低信噪比场景下仍能保持自然的人声质感,避免“机械感”失真。
4.3 第三步:基于VAD的智能语音切片
降噪完成后,需将长音频按语义语句切分为短片段。本方案采用 FSMN-VAD 模型进行端点检测,准确识别语音起止时间。
实现代码:
import os from modelscope.pipelines import pipeline from pydub import AudioSegment inference_pipeline = pipeline( task=Tasks.voice_activity_detection, model='damo/speech_fsmn_vad_zh-cn-16k-common-pytorch' ) audio_folder = "./denoised_dir" output_folder = "./output_dir" if not os.path.exists(output_folder): os.makedirs(output_folder) for audio_file in os.listdir(audio_folder): if audio_file.endswith(".wav"): audio_in = os.path.join(audio_folder, audio_file) result = inference_pipeline(audio_in=audio_in) audio = AudioSegment.from_file(audio_in) time_segments = result["text"] # 单位:毫秒 for i, segment in enumerate(time_segments): start_ms, end_ms = segment audio_segment = audio[start_ms:end_ms] output_path = os.path.join(output_folder, f"{os.path.splitext(audio_file)[0]}_{i}.wav") audio_segment.export(output_path, format="wav")注意:切片长度建议控制在2~10秒之间,过短影响上下文理解,过长不利于模型训练收敛。
4.4 第四步:基于声纹比对的说话人过滤
尽管已完成降噪与切片,但仍可能存在其他人物语音混入的情况。为保证数据纯净性,需通过声纹识别技术筛选出仅属于目标说话人的片段。
多线程加速实现:
import os import concurrent.futures from modelscope.pipelines import pipeline from tqdm import tqdm max_workers = 16 # 根据CPU核心数调整 sv_pipeline = pipeline( task='speaker-verification', model='damo/speech_eres2net_base_250k_sv_zh-cn_16k-common', model_revision='v1.0.0' ) reference_audio = "./output_dir/甜药教学_希尔.wav_3.wav" # 参考音频(确认为目标说话人) audio_folder = "./output_dir" audio_files = [os.path.join(audio_folder, f) for f in os.listdir(audio_folder) if f.endswith(".wav")] def process_audio(audio_file): try: result = sv_pipeline([reference_audio, audio_file]) if result["text"] != "yes": os.remove(audio_file) except Exception as e: print(f"Error processing {audio_file}: {e}") with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: futures = [executor.submit(process_audio, af) for af in audio_files] progress_bar = tqdm(concurrent.futures.as_completed(futures), total=len(futures), unit="file") for _ in progress_bar: pass实践建议:参考音频应选择清晰、无噪声、典型发音的片段,确保声纹特征稳定可靠。
4.5 第五步:ASR自动标注生成元数据
最后一步是对保留下来的语音片段进行文本标注,形成(音频路径|说话人|语言|文本)的标准格式,适用于Bert-VITS2等主流TTS框架。
支持多语言自动识别与转录:
from modelscope.pipelines import pipeline import os import shutil def get_inference_pipeline(lang_code): if lang_code == "ZH": return pipeline( task=Tasks.auto_speech_recognition, model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch') elif lang_code == "EN": return pipeline( task=Tasks.auto_speech_recognition, model='damo/speech_paraformer_asr-en-16k-vocab4199-pytorch') elif lang_code == "JP": return pipeline( task=Tasks.auto_speech_recognition, model='damo/speech_UniASR_asr_2pass-ja-16k-common-vocab93-tensorflow1-offline') else: raise ValueError("Unsupported language code") def process_directory(source_dir, character_name, lang_code, start_number, parent_dir_template, output_file): if not os.path.exists(source_dir): print(f"跳过不存在的文件夹: {source_dir}") return start_number parent_dir = parent_dir_template.format(character_name=character_name) if not os.path.exists(parent_dir): os.makedirs(parent_dir) inference_pipeline = get_inference_pipeline(lang_code) file_number = start_number for dirpath, _, filenames in os.walk(source_dir): for file in filenames: if file.endswith(".wav"): wav_path = os.path.join(dirpath, file) new_filename_base = f"{character_name}_{file_number}" new_wav_file_path = os.path.join(parent_dir, new_filename_base + '.wav') new_lab_file_path = os.path.join(parent_dir, new_filename_base + '.lab') shutil.copy2(wav_path, new_wav_file_path) rec_result = inference_pipeline(audio_in=new_wav_file_path) text = rec_result.get('text', '') with open(new_lab_file_path, 'w', encoding='utf-8') as f: f.write(text) with open(output_file, 'a', encoding='utf-8') as f: f.write(f"{new_wav_file_path}|{character_name}|{lang_code}|{text}\n") file_number += 1 print(f"Processed: {new_filename_base}") return file_number # 参数配置 character_name = "甜药" source_dir = "./output_dir" parent_dir = "./Data/Apex/audio/wavs/{character_name}" output_file = "./Data/Apex/filelists/Apex.list" process_directory(source_dir, character_name, "ZH", 0, parent_dir, output_file) print("全部处理完毕!")生成的数据格式示例如下:
./Data/Apex/audio/wavs/甜药/甜药_0.wav|甜药|ZH|今天我们要学习的是角色养成的基本思路。5. 总结
本文系统介绍了如何利用FRCRN语音降噪-单麦-16k镜像,结合ModelScope生态中的多个SOTA模型,构建一条高效、自动化的语音数据清洗与标注流水线。
关键价值总结:
- ✅开箱即用:预置镜像省去繁琐环境配置
- ✅全流程覆盖:从原始音频到标注数据一站式解决
- ✅高保真处理:FRCRN降噪 + FSMN-VAD切片 + ERes2Net声纹过滤,保障数据质量
- ✅可扩展性强:支持多语言、可适配不同TTS/ASR任务需求
该方案特别适用于个性化语音合成、虚拟偶像训练、客服语音克隆等需要高质量单人语音数据的场景。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。