FRCRN实战教程:使用test.py批量处理目录下所有WAV文件的方法
你是不是也遇到过这样的烦恼?手头有一堆录音文件,里面混杂着各种环境噪音——可能是键盘的敲击声、空调的嗡嗡声,或者是窗外的车流声。想要把它们处理干净,一个个手动操作不仅耗时耗力,还容易出错。
今天,我就来分享一个超级实用的方法:如何使用FRCRN语音降噪工具的test.py脚本,一键批量处理整个文件夹里的WAV文件。这个方法特别适合需要处理大量音频的场景,比如整理会议录音、清理播客素材,或者为语音识别系统准备干净的输入数据。
1. 项目与环境准备
1.1 FRCRN是什么?
FRCRN(Frequency-Recurrent Convolutional Recurrent Network)是阿里巴巴达摩院开源的一个单通道语音降噪模型。简单来说,它就像一个智能的"声音清洁工",专门负责从嘈杂的录音中提取出清晰的人声。
这个模型在ModelScope社区(你可以把它理解为一个AI模型的"应用商店")上开源,名字叫damo/speech_frcrn_ans_cirm_16k。它的特点是特别擅长处理复杂的背景噪声,比如办公室的交谈声、咖啡馆的音乐声,同时能很好地保留人声的清晰度。
1.2 环境检查
在开始批量处理之前,我们先确认一下环境是否就绪。这个FRCRN镜像已经预装了所有必要的组件:
- Python 3.8+:这是运行代码的基础环境
- PyTorch 1.10+:深度学习框架,模型运行的核心
- ModelScope:阿里云的模型管理平台,用来下载和加载FRCRN模型
- FFmpeg:音频处理工具,如果你的音频不是WAV格式,它会帮你转换
你可以通过运行简单的命令来检查这些组件是否安装正常:
python --version
python -c "import torch; print(torch.__version__)"
python -c "import modelscope; print(modelscope.__version__)"
如果都能正常显示版本号,说明环境已经准备好了。
2. 理解test.py脚本的工作原理
2.1 原始脚本的功能
默认的test.py脚本设计得很简单——它只处理一个固定的输入文件。如果你打开这个脚本看看,会发现它的核心逻辑是这样的:
# 这是test.py的简化版逻辑
def main():
# 1. 加载模型
model = load_frcrn_model()
# 2. 读取固定的输入文件
audio = read_audio("input_noisy.wav")
# 3. 进行降噪处理
clean_audio = model.process(audio)
# 4. 保存结果
save_audio(clean_audio, "output_clean.wav")
这个脚本每次运行都处理同一个文件(input_noisy.wav),输出结果也固定保存为output_clean.wav。对于批量处理来说,这显然不够用。
2.2 我们需要做什么改造?
要实现批量处理,我们需要对脚本进行几个关键改造:
- 遍历文件夹:让脚本能够自动找到文件夹里所有的WAV文件
- 动态输入输出:根据输入文件名自动生成输出文件名
- 进度显示:在处理大量文件时,让用户知道进度如何
- 错误处理:如果某个文件处理失败,不影响其他文件的处理
3. 创建批量处理脚本
3.1 方法一:直接修改test.py(推荐)
这是最直接的方法,我们直接在原来的test.py基础上进行修改。下面是完整的修改方案:
import os
import glob
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
def batch_process_wav_files(input_folder, output_folder):
"""
批量处理文件夹中的所有WAV文件
参数:
input_folder: 输入文件夹路径,包含需要处理的WAV文件
output_folder: 输出文件夹路径,用于保存处理后的文件
"""
# 创建输出文件夹(如果不存在)
os.makedirs(output_folder, exist_ok=True)
# 初始化FRCRN降噪管道
print("正在加载FRCRN降噪模型...")
ans_pipeline = pipeline(
Tasks.acoustic_noise_suppression,
model='damo/speech_frcrn_ans_cirm_16k'
)
print("模型加载完成!")
# 查找所有WAV文件
wav_files = glob.glob(os.path.join(input_folder, "*.wav"))
if not wav_files:
print(f"在文件夹 {input_folder} 中没有找到WAV文件")
return
print(f"找到 {len(wav_files)} 个WAV文件需要处理")
# 逐个处理文件
for i, input_file in enumerate(wav_files):
try:
# 生成输出文件名
filename = os.path.basename(input_file)
output_file = os.path.join(output_folder, f"cleaned_{filename}")
print(f"\n[{i+1}/{len(wav_files)}] 正在处理: {filename}")
# 执行降噪
result = ans_pipeline(input_file, output_path=output_file)
print(f" 处理完成,已保存到: {output_file}")
except Exception as e:
print(f" 处理文件 {filename} 时出错: {str(e)}")
continue
print(f"\n批量处理完成!共处理了 {len(wav_files)} 个文件")
print(f"处理后的文件保存在: {output_folder}")
if __name__ == "__main__":
# 设置输入输出文件夹路径
input_dir = "./noisy_audio" # 存放嘈杂音频的文件夹
output_dir = "./clean_audio" # 存放降噪后音频的文件夹
# 执行批量处理
batch_process_wav_files(input_dir, output_dir)
3.2 方法二:创建新的批量处理脚本
如果你不想修改原来的test.py,可以创建一个新的脚本文件。我建议命名为batch_process.py,这样既保留了原始脚本,又有了批量处理功能。
创建新文件的步骤:
# 1. 进入FRCRN目录
cd FRCRN
# 2. 创建新的批量处理脚本
nano batch_process.py
然后把上面的代码复制进去,保存退出。这样你就有了两个脚本:
test.py:原来的单文件处理脚本batch_process.py:新的批量处理脚本
4. 使用批量处理脚本
4.1 准备你的音频文件
在使用批量处理脚本之前,你需要做好两件事:
- 创建文件夹结构:
# 在FRCRN目录下创建两个文件夹
mkdir noisy_audio # 用于存放需要处理的嘈杂音频
mkdir clean_audio # 用于保存处理后的干净音频
- 准备WAV文件:
- 把所有需要降噪的WAV文件复制到
noisy_audio文件夹 - 确保所有文件都是16kHz采样率、单声道的WAV格式
- 文件名最好用英文,避免中文路径可能带来的问题
- 把所有需要降噪的WAV文件复制到
如果你有不是16kHz的音频,可以先用这个命令批量转换:
# 批量转换采样率为16kHz
for file in *.wav; do
ffmpeg -i "$file" -ar 16000 -ac 1 "converted_$file"
done
4.2 运行批量处理
准备好文件后,运行批量处理就很简单了:
# 如果你使用方法一(修改了test.py)
python test.py
# 如果你使用方法二(创建了新脚本)
python batch_process.py
运行后你会看到类似这样的输出:
正在加载FRCRN降噪模型...
模型加载完成!
找到 5 个WAV文件需要处理
[1/5] 正在处理: meeting_recording.wav
处理完成,已保存到: ./clean_audio/cleaned_meeting_recording.wav
[2/5] 正在处理: podcast_episode.wav
处理完成,已保存到: ./clean_audio/cleaned_podcast_episode.wav
...
批量处理完成!共处理了 5 个文件
处理后的文件保存在: ./clean_audio
4.3 高级使用技巧
自定义输入输出路径
如果你想把文件放在其他位置,可以修改脚本中的路径:
# 修改这两行来指定不同的文件夹
input_dir = "/path/to/your/noisy/files" # 你的嘈杂文件路径
output_dir = "/path/to/save/clean/files" # 保存路径
处理子文件夹中的文件
如果你想处理嵌套文件夹里的所有WAV文件,可以修改查找文件的部分:
# 使用递归查找所有子文件夹中的WAV文件
import os
def find_all_wav_files(root_folder):
wav_files = []
for root, dirs, files in os.walk(root_folder):
for file in files:
if file.endswith('.wav'):
wav_files.append(os.path.join(root, file))
return wav_files
# 替换原来的glob.glob
wav_files = find_all_wav_files(input_folder)
保留原始文件夹结构
如果你希望处理后的文件保持原来的文件夹结构:
# 在处理每个文件时,创建对应的输出文件夹结构
relative_path = os.path.relpath(input_file, input_folder)
output_file = os.path.join(output_folder, relative_path)
os.makedirs(os.path.dirname(output_file), exist_ok=True)
5. 常见问题与解决方案
5.1 文件格式问题
问题:脚本报错说找不到WAV文件,或者处理失败。
检查步骤:
- 确认文件扩展名确实是
.wav(注意大小写) - 检查文件是否损坏:
ffmpeg -i your_file.wav - 确认采样率是16000Hz:
ffprobe your_file.wav
批量检查脚本:
import wave
import os
def check_wav_files(folder):
for file in os.listdir(folder):
if file.endswith('.wav'):
try:
with wave.open(os.path.join(folder, file), 'rb') as wav:
print(f"{file}: {wav.getframerate()}Hz, {wav.getnchannels()}声道")
except:
print(f"{file}: 无法读取或格式错误")
5.2 内存不足问题
问题:处理大文件时内存不足。
解决方案:
- 分批处理:一次只处理一部分文件
- 使用更小的批处理大小(如果模型支持)
- 确保有足够的交换空间
分批处理示例:
# 每次只处理10个文件
batch_size = 10
for i in range(0, len(wav_files), batch_size):
batch = wav_files[i:i+batch_size]
print(f"处理批次 {i//batch_size + 1}")
# 处理这个批次...
5.3 处理速度优化
问题:处理大量文件时速度太慢。
优化建议:
- 使用GPU加速(如果可用)
- 并行处理多个文件(需要更复杂的代码)
- 先处理短文件,再处理长文件
简单的并行处理示例(使用多进程):
from multiprocessing import Pool
import functools
def process_single_file(input_file, output_folder, ans_pipeline):
# 处理单个文件的函数
pass
# 创建进程池
with Pool(processes=4) as pool: # 使用4个进程
results = pool.map(functools.partial(process_single_file,
output_folder=output_dir,
ans_pipeline=ans_pipeline),
wav_files)
6. 实际应用场景
6.1 会议录音整理
如果你经常需要整理会议录音,这个批量处理方法能帮你节省大量时间。每周的会议录音扔到一个文件夹里,运行一次脚本,所有文件就都处理干净了。
建议的工作流程:
- 每周一创建一个新的文件夹,比如
meetings_week_01 - 把当周的会议录音都放进去
- 运行批量处理脚本
- 处理后的文件自动加上
cleaned_前缀,方便识别
6.2 播客制作
对于播客制作者来说,背景噪音是个大问题。使用这个批量处理方法,你可以:
- 一次性处理整期节目的所有录音片段
- 保持所有片段的声音质量一致
- 大大减少后期制作的时间
6.3 语音识别预处理
如果你在做语音识别项目,干净的音频输入能显著提高识别准确率。你可以:
- 用这个脚本批量处理训练数据
- 创建干净的测试集
- 实时处理新收集的语音数据
7. 总结
通过改造FRCRN的test.py脚本,我们实现了一个简单但强大的批量处理工具。这个方法的核心优势在于:
一键处理:不再需要手动一个个处理文件,节省了大量时间 自动管理:自动识别文件夹中的所有WAV文件,自动生成输出文件名 错误容忍:单个文件处理失败不会影响其他文件 灵活扩展:可以根据需要添加更多功能,比如格式转换、质量检查等
无论你是处理几个文件还是几百个文件,这个方法都能帮你高效完成工作。最重要的是,它基于阿里巴巴达摩院开源的优秀模型,降噪效果有保障。
如果你在使用过程中遇到任何问题,或者有改进的想法,欢迎尝试调整代码。技术的乐趣就在于不断探索和优化,让工具更好地为我们服务。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_42561464/article/details/157087169



