为什么要降噪?
在许多语音相关的应用场景中,噪声的存在会严重影响性能和用户体验。例如:
- 语音识别: 噪声会降低语音识别的准确率,尤其是在低信噪比环境下。
- 语音克隆: 噪声会使依据参考音频合成语音的自然度和清晰度下降。
通过语音降噪能够一定程度上解决这些问题。
常见的降噪方法
目前,语音降噪技术主要有以下几种方法:
- 谱减法: 这是一种经典的降噪方法,原理简单。
- 维纳滤波: 这种方法对稳定的噪声效果较好,但对于变化的噪声效果有限。
- 深度学习: 这是目前最先进的降噪方法。利用强大的深度学习模型,例如循环神经网络 (RNN)、卷积神经网络 (CNN) 和生成对抗网络 (GAN),来学习噪声和语音之间的复杂关系,实现更精准、更自然的降噪效果。
ZipEnhancer 模型:深度学习降噪
本工具基于通义实验室开源的 ZipEnhancer 模型 ,并提供了一个简单易用的界面和 API 接口,让每个人都能轻松体验深度学习降噪的魅力。
ZipEnhancer 模型的核心是 Transformer 网络结构和多任务学习策略。它不仅能够去除噪声,还能同时增强语音质量和消除回声。工作原理如下:
- 自注意力机制: 捕捉语音信号中重要的长时关系,理解声音的上下文信息。
- 多头注意力机制: 从不同的角度分析语音特征,实现更精细的噪声抑制和语音增强。
如何使用本工具?
Windows 预打包版:
- 下载并解压预打包版本 (https://github.com/jianchang512/remove-noise/releases/download/v0.1/win-remove-noise-0.1.7z)。
- 双击
runapi.bat
文件,浏览器将自动打开http://127.0.0.1:5080
。 - 选择音频或视频文件,即可开始降噪。
源码部署:
- 环境准备: 确保安装了 Python 3.10 - 3.12。
- 安装依赖: 运行
pip install -r requirements.txt --no-deps
。 - CUDA 加速(可选): 如果你有 NVIDIA 显卡,可以安装 CUDA 12.1 来加速处理:bash
pip uninstall -y torch torchaudio torchvision pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
- 运行程序: 运行
python api.py
。
Linux 系统:
- 需要安装
libsndfile
库:sudo apt-get update && sudo apt-get install libsndfile1
。 - 注意: 请确保
datasets
库版本为 3.0,否则可能会出现错误。可以使用pip list | grep datasets
命令查看版本。
界面预览
API 使用方法
接口地址: http://127.0.0.1:5080/api
请求方法: POST
请求参数:
stream
: 0 返回音频 URL,1 返回音频数据。audio
: 待处理的音频或视频文件。
返回结果 (JSON):
- 成功 (stream=0):
{"code": 0, "data": {"url": "音频URL"}}
- 成功 (stream=1): WAV 音频数据。
- 失败:
{"code": -1, "msg": "错误信息"}
示例代码 (Python): (已在原文基础上优化)
python
import requests
url = 'http://127.0.0.1:5080/api'
file_path = './300.wav'
# 获取音频 URL
try:
res = requests.post(url, data={"stream": 0}, files={"audio": open(file_path, 'rb')})
res.raise_for_status()
print(f"降噪后音频 URL: {res.json()['data']['url']}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
# 获取音频数据
try:
res = requests.post(url, data={"stream": 1}, files={"audio": open(file_path, 'rb')})
res.raise_for_status()
with open("ceshi.wav", 'wb') as f:
f.write(res.content)
print("降噪后的音频已保存为 ceshi.wav")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")