一站式语音处理流程|FRCRN语音降噪-单麦-16k镜像快速上手
1. 引言
在语音识别、语音合成和AI配音等任务中,高质量的语音数据是模型训练效果的关键前提。然而,原始音频通常包含背景噪声、非目标说话人干扰以及不规则语段等问题,严重影响后续处理的准确性。
本文基于FRCRN语音降噪-单麦-16k镜像,提供一套完整的端到端语音处理流程:从环境部署、一键推理,到实际应用中的降噪、切分、说话人筛选与自动标注,帮助开发者快速构建干净、结构化、可训练的语音数据集。
该镜像集成了达摩院ModelScope平台上的多个高性能语音模型,涵盖语音降噪(FRCRN)、端点检测(VAD)、说话人验证(SV)和自动语音识别(ASR)等能力,适用于中文语音预处理场景,支持16kHz采样率输入。
2. 环境准备与镜像部署
2.1 部署镜像
首先,在支持CUDA的GPU服务器上部署FRCRN语音降噪-单麦-16k镜像。推荐使用NVIDIA 4090D单卡及以上配置以获得最佳性能。
完成部署后,系统将自动生成一个Jupyter Lab访问入口。
2.2 进入开发环境
- 打开浏览器访问Jupyter界面;
- 登录后进入终端(Terminal);
- 激活预置的Conda环境:
conda activate speech_frcrn_ans_cirm_16k- 切换至根目录并查看脚本文件:
cd /root ls你会看到名为1键推理.py的脚本文件,这是用于批量执行语音降噪的核心程序。
2.3 目录结构初始化
为规范数据管理,建议创建如下目录结构:
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/ # 原始含噪音频存放路径 ├── denoised_dir/ # 降噪后音频输出路径 └── output_dir/ # 切片及标注结果存储路径将待处理的.wav文件统一放入input_dir中,即可开始下一步处理。
3. 核心语音处理流程详解
3.1 步骤一:语音降噪(FRCRN模型)
使用达摩院提供的damo/speech_frcrn_ans_cirm_16k模型进行高保真语音降噪。该模型基于深度复数域卷积递归网络(FRCRN),能有效抑制背景噪音(如键盘声、风扇声、环境人声等),同时保留语音细节。
安装依赖
pip install -U modelscope执行降噪脚本
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) # 遍历处理所有WAV文件 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"已处理: {audio_file}")提示:此模型仅支持16kHz单声道WAV格式输入。若源音频为视频或多通道,请提前使用工具(如FFmpeg或FileConverter)转换。
3.2 步骤二:语音活动检测(VAD)实现语句切分
降噪完成后,需将长音频按“完整语句”切分为短片段,便于后续建模。我们采用FSMN-VAD模型进行端点检测。
加载VAD模型并切分音频
import os from modelscope.pipelines import pipeline from pydub import AudioSegment # 初始化VAD模型 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, (start_ms, end_ms) in enumerate(time_segments): segment = audio[start_ms:end_ms] segment.export( os.path.join(output_folder, f"{os.path.splitext(audio_file)[0]}_{i}.wav"), format="wav" ) print(f"已完成切分: {audio_file}")该步骤会生成大量命名带序号的.wav小文件,每个代表一句独立话语。
3.3 步骤三:剔除非目标说话人(Speaker Verification)
尽管已做降噪和切分,但仍可能混入旁白、弹幕音效或其他角色语音。为此,我们引入说话人验证模型过滤非目标语音。
使用E-Res2Net模型比对声纹
import os import concurrent.futures from modelscope.pipelines import pipeline from tqdm import tqdm # 多线程参数设置(根据CPU核心数调整) max_workers = 16 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") and f != os.path.basename(reference_audio) ] 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"处理失败 {audio_file}: {e}") # 并行处理提升效率 with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: futures = [executor.submit(process_audio, af) for af in audio_files] for _ in tqdm(concurrent.futures.as_completed(futures), total=len(futures)): pass print("说话人过滤完成。")注意:参考音频应选择清晰、无杂音、典型语调的一段作为“声纹锚点”。
3.4 步骤四:自动生成文本标注(ASR + 文件组织)
最后一步是对每段语音生成对应的文字内容,并整理成标准训练格式。我们使用Paraformer模型进行高精度中文语音识别。
自动标注主函数
from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import os import shutil def get_asr_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("暂不支持的语言类型") 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) asr_pipeline = get_asr_pipeline(lang_code) file_number = start_number for root, _, files in os.walk(source_dir): for file in files: if file.endswith(".wav"): wav_path = os.path.join(root, file) new_name = f"{character_name}_{file_number}" new_wav_path = os.path.join(parent_dir, new_name + ".wav") new_lab_path = os.path.join(parent_dir, new_name + ".lab") # 复制音频文件 shutil.copy2(wav_path, new_wav_path) # 执行语音识别 try: rec_result = asr_pipeline(audio_in=new_wav_path) text = rec_result.get("text", "").strip() except Exception as e: print(f"ASR失败 {new_name}: {e}") text = "" # 写入标注文件 .lab with open(new_lab_path, 'w', encoding='utf-8') as f: f.write(text) # 记录到总列表 with open(output_file, 'a', encoding='utf-8') as f_out: f_out.write(f"{new_wav_path}|{character_name}|{lang_code}|{text}\n") file_number += 1 print(f"已处理: {new_name} -> {text}") return file_number # 参数配置 character_name = "甜药" source_dir = "./output_dir" parent_dir_template = "./Data/Apex/audio/wavs/{character_name}" output_list_file = "./Data/Apex/filelists/Apex.list" # 清空旧记录 if os.path.exists(output_list_file): os.remove(output_list_file) # 执行处理 process_directory(source_dir, character_name, "ZH", 0, parent_dir_template, output_list_file) print("全部标注任务完成!")输出格式示例:
./Data/Apex/audio/wavs/甜药/甜药_0.wav|甜药|ZH|今天我们要讲的是量子力学的基础知识。此格式兼容主流TTS框架(如Bert-VITS2、SoVITS等),可直接用于模型训练。
4. 总结
本文围绕FRCRN语音降噪-单麦-16k镜像,系统性地介绍了从原始音频到高质量标注数据集的全流程处理方案,涵盖四大关键环节:
- 语音降噪:利用FRCRN模型清除背景噪声,提升语音信噪比;
- 语句切分:通过VAD技术精准定位语音起止点,生成自然语句片段;
- 说话人过滤:借助E-Res2Net声纹比对,剔除非目标人物语音污染;
- 自动标注:结合Paraformer大模型实现高准确率ASR,输出结构化训练数据。
整套流程高度自动化,配合Jupyter脚本可实现“一键式”处理,显著降低语音数据准备门槛,特别适合个人开发者、AI配音项目、虚拟主播训练等场景。
此外,所有模型均来自ModelScope开源平台,具备良好的可复现性和扩展性,用户可根据需求替换为其他语言或更高精度模型。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。