AI语音降噪与数据处理实践|基于FRCRN语音降噪-单麦-16k镜像快速实现

1. 引言

在语音识别、语音合成和AI配音等任务中,高质量的语音数据是模型训练效果的关键前提。然而,原始音频通常包含背景噪声、多人语音干扰以及非连续语句等问题,严重影响后续处理的准确性。

本文将围绕 FRCRN语音降噪-单麦-16k 镜像展开,详细介绍如何利用该预置模型快速完成从原始音频到干净标注数据集的全流程构建。整个流程涵盖:环境部署、一键推理降噪、语音切片、说话人过滤与自动标注五大核心步骤,帮助开发者高效构建可用于TTS或VITS类模型训练的纯净语音语料库。

本方案基于ModelScope平台提供的达摩院开源模型体系,结合Jupyter交互式开发环境,具备开箱即用、流程清晰、可扩展性强等特点,适合个人研究者及中小团队进行语音数据预处理。


2. 环境准备与镜像部署

2.1 部署FRCRN语音降噪镜像

首先,在支持GPU的平台上(推荐使用NVIDIA 4090D及以上显卡)部署 FRCRN语音降噪-单麦-16k 镜像:

  1. 在平台选择“创建实例”并搜索镜像名称;
  2. 选择配备至少一张高性能GPU的实例规格;
  3. 完成资源配置后启动实例。

提示:该镜像已集成PyTorch、ModelScope、pydub、tqdm等必要依赖库,无需手动安装基础环境。

2.2 进入Jupyter并激活环境

实例启动成功后,通过Web界面访问Jupyter Notebook服务:

  1. 打开浏览器进入Jupyter主页;
  2. 新建Terminal终端;
  3. 执行以下命令切换至工作目录并激活Conda环境:
conda activate speech_frcrn_ans_cirm_16k
cd /root

此时环境已就绪,可直接运行内置脚本或自定义代码。


3. 一键推理实现语音降噪

3.1 脚本调用方式

镜像内预置了 1键推理.py 脚本,用户只需执行以下命令即可对 /root/input_dir 目录下的所有 .wav 文件进行批量降噪处理:

python "1键推理.py"

该脚本内部封装了达摩院的 FRCRN 模型(damo/speech_frcrn_ans_cirm_16k),其核心优势在于:

  • 支持16kHz采样率单通道语音;
  • 对低信噪比场景(如背景音乐、键盘声、空调噪音)有良好抑制能力;
  • 推理速度快,适合批量处理长音频。

3.2 自定义输入输出路径

若需修改输入/输出路径,请编辑 1键推理.py 文件中的如下变量:

input_folder = "./input_dir"      # 原始音频存放路径
output_folder = "./denoised_dir"  # 降噪后音频保存路径

确保目标文件夹存在且包含 .wav 格式的音频文件。


4. 构建完整语音处理流水线

虽然一键脚本能完成基本降噪,但要生成可用于模型训练的数据集,还需进一步完成切片、去噪、说话人筛选与文本标注。下面我们将分步构建完整的自动化处理流程。

4.1 创建项目目录结构

为规范管理各阶段数据,建议先建立标准目录结构:

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


4.2 使用FRCRN模型进行语音降噪

若不使用默认脚本,也可自行编写更灵活的降噪逻辑。以下是核心代码示例:

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"已处理: {audio_file}")

注意:FRCRN模型仅支持16kHz单声道WAV格式。若源音频为立体声或多采样率,请提前使用 soxpydub 转换。


4.3 基于VAD的语音切片处理

降噪完成后,需将长音频按语句边界切分为独立短句。我们采用达摩院的 FSMN-VAD 模型进行端点检测:

import os
from modelscope.pipelines import pipeline
from pydub import AudioSegment

# 初始化VAD模型
vad_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 = vad_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}")

此方法能准确识别语音起止点,避免静音段混入,提升后续标注质量。


4.4 剔除非目标说话人语音

即使经过降噪和切片,仍可能存在他人插话或旁白污染。为此,我们引入 说话人验证模型(Speaker Verification) 来过滤非目标人物语音。

4.4.1 准备参考音频

选取一段确认为目标说话人的清晰语音作为参考样本,例如:

reference_audio = "./output_dir/甜药教学_希尔.wav_3.wav"
4.4.2 多线程批量比对

使用 eres2net_base 模型进行嵌入向量比对,并通过多线程加速处理:

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'
)

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"处理失败: {audio_file}, 错误: {e}")

with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
    futures = [executor.submit(process_audio, af) for af in audio_files]
    list(tqdm(concurrent.futures.as_completed(futures), total=len(futures), desc="说话人验证"))

说明:模型输出 "yes" 表示两段语音来自同一人;否则视为不同说话人并删除。


4.5 自动生成语音标注文件

最后一步是对保留的语音片段进行自动转录并生成结构化标注文件,供下游模型使用。

4.5.1 加载ASR模型

根据语言类型加载对应的自动语音识别(ASR)模型:

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')
    else:
        raise ValueError("暂不支持该语言")
4.5.2 批量生成标注列表

以中文为例,生成符合 Bert-VITS2 格式的标注文件:

import shutil

character_name = "甜药"
source_dir = "./output_dir"
parent_dir = f"./Data/{character_name}/wavs"
output_list = "./Data/filelists/train.list"

if not os.path.exists(parent_dir):
    os.makedirs(parent_dir)

asr_pipeline = get_asr_pipeline("ZH")
file_number = 0

for file in os.listdir(source_dir):
    if file.endswith(".wav"):
        wav_path = os.path.join(source_dir, file)
        new_wav_name = f"{character_name}_{file_number}.wav"
        new_wav_path = os.path.join(parent_dir, new_wav_name)

        # 复制音频文件
        shutil.copy2(wav_path, new_wav_path)

        # ASR识别文本
        try:
            rec_result = asr_pipeline(audio_in=new_wav_path)
            text = rec_result.get("text", "").strip()
        except:
            text = ""

        # 写入标注文件
        with open(output_list, 'a', encoding='utf-8') as f:
            f.write(f"{new_wav_path}|{character_name}|ZH|{text}\n")

        file_number += 1
        print(f"已标注: {text}")

生成的每行格式为:

<音频路径>|<角色名>|<语言>|<文本内容>

适用于大多数开源TTS系统(如VITS、Bert-VITS2等)。


5. 总结

本文系统介绍了基于 FRCRN语音降噪-单麦-16k 镜像的语音数据处理全流程,涵盖从环境部署到标注生成的五个关键环节:

  1. 环境部署:一键拉取镜像并激活专用环境;
  2. 语音降噪:利用FRCRN模型清除背景噪声;
  3. 语音切片:通过VAD技术提取完整语句;
  4. 说话人过滤:借助SV模型剔除非目标语音;
  5. 自动标注:结合ASR生成结构化文本标签。

整套流程高度自动化,可在数小时内完成数十分钟原始音频的清洗与标注,显著降低语音数据准备成本。同时,所有组件均基于ModelScope开放模型生态,具备良好的可复现性与扩展性。

未来可进一步优化方向包括:

  • 支持GPU加速说话人验证;
  • 引入情绪/语速标签增强元数据;
  • 构建图形化界面简化操作门槛。

对于希望快速构建私有语音语料库的研究者而言,该方案提供了一条高效、稳定的技术路径。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐