使用Python实现音频降噪功能

 更新时间:2024年11月11日 08:53:48   作者:白鸟无言  
在音频处理领域,背景噪声是一个常见的问题,为了提高音频的质量,我们需要对音频进行降噪处理,本文将介绍如何使用 Python 实现音频降噪,文中通过代码示例讲解的非常详细,需要的朋友可以参考下

依赖库安装

在开始之前,我们需要安装以下依赖库:

  • pydub:用于音频文件的读取和写入。
  • numpy:用于数组和数值计算。
  • noisereduce:用于音频降噪。
  • matplotlib:用于绘制波形图。

使用以下命令安装依赖库:

pip install pydub numpy noisereduce matplotlib

安装 FFmpeg

FFmpeg 是一个强大的多媒体处理工具,pydub 库需要依赖它来处理音频文件。请按照以下步骤在 Windows 上安装 FFmpeg:

  1. 下载 FFmpeg:访问 FFmpeg 的官方网站。下载预编译的 FFmpeg 二进制文件。
  2. 解压文件:解压到一个目录,例如 C:\ffmpeg。
  3. 配置环境变量:将 FFmpeg 的 bin 目录添加到系统环境变量中,然后重启
  4. 验证安装:打开终端,输入命令 ffmpeg -version,如果安装成功,将看到 FFmpeg 的版本信息输出。

对于m4a文件,可以使用FFmpeg将其转换为wav,再进行处理:

ffmpeg -i file.m4a file.wav

导入库

from pydub import AudioSegment
import numpy as np
from pathlib import Path
import noisereduce as nr
import matplotlib.pyplot as plt

设置参数和读取音频文件

# 设置音频文件路径
seq = "01"
data_folder = Path("data/")
file_to_open = data_folder / f"{seq}.wav"

# 设置截取时间(秒)
time_beg = 10
time_end = 55

# 读取音频文件
audio = AudioSegment.from_file(file_to_open, format="wav")

# 打印音频信息
print(f"Channels: {audio.channels}")
print(f"Frame rate: {audio.frame_rate} Hz")
print(f"Duration: {len(audio) / 1000.0} seconds")

将音频数据转换为 NumPy 数组

# 获取音频样本数据
raw_data = np.array(audio.get_array_of_samples())

# 处理立体声和单声道
if audio.channels == 2:
    # 将立体声数据重塑为二维数组
    raw_data = raw_data.reshape((-1, 2))
    # 截取指定时间段的数据
    raw_data = raw_data[time_beg * audio.frame_rate : time_end * audio.frame_rate, :]
    print(f"Stereo audio detected. Data shape: {raw_data.shape}")
else:
    # 截取指定时间段的数据
    raw_data = raw_data[time_beg * audio.frame_rate : time_end * audio.frame_rate]
    print(f"Mono audio detected. Data shape: {raw_data.shape}")

对音频进行降噪处理

# 初始化降噪后的数据数组
reduced_noise = np.zeros_like(raw_data)

# 设置降噪参数(可调整 prop_decrease 的值来改变降噪力度)
prop_decrease_value = 0.95

if audio.channels == 2:
    # 分别对每个通道进行降噪
    for i in range(audio.channels):
        reduced_noise[:, i] = nr.reduce_noise(
            y=raw_data[:, i], sr=audio.frame_rate, prop_decrease=prop_decrease_value
        )
else:
    # 对单声道音频进行降噪
    reduced_noise = nr.reduce_noise(
        y=raw_data, sr=audio.frame_rate, prop_decrease=prop_decrease_value
    )

将降噪后的数据转换回音频并保存

# 将降噪后的数据转换为 AudioSegment 对象
if audio.channels == 2:
    # 将二维数组展平成一维交错数组
    interleaved = reduced_noise.astype(np.int16).flatten().tobytes()
else:
    interleaved = reduced_noise.astype(np.int16).tobytes()

# 创建新的音频段
denoised_audio = audio._spawn(interleaved)

# 保存降噪后的音频文件
output_path = data_folder / f"{seq}_denoised.wav"
denoised_audio.export(output_path, format="wav")

绘制降噪前后的波形图

plt.figure(figsize=(12, 6))

# 原始音频波形
plt.subplot(2, 1, 1)
plt.title('原始音频波形')
plt.plot(raw_data)
plt.tight_layout()

# 降噪后音频波形
plt.subplot(2, 1, 2)
plt.title('降噪后音频波形')
plt.plot(reduced_noise)
plt.tight_layout()

plt.show()

调整降噪力度

在降噪处理中,prop_decrease参数控制了降噪的力度,其取值范围为 0 到 1。值越大,降噪力度越强。您可以通过调整 prop_decrease_value 的值来改变降噪效果:

prop_decrease_value = 0.5  # 降低降噪力度

测试结果

附录

完整程序:

from pydub import AudioSegment
import numpy as np
from pathlib import Path
import noisereduce as nr
import matplotlib.pyplot as plt

seq = "03"
data_folder = Path("data/")
file_to_open = data_folder / f"{seq}.wav"

time_beg = 120
time_end = 170

prop_decrease = 0.95

# 读取原始音频文件
audio = AudioSegment.from_file(file_to_open, format="wav")

# 打印音频信息
print(f"Channels: {audio.channels}")
print(f"Frame rate: {audio.frame_rate}")
print(f"Duration: {len(audio) / 1000.0} seconds")

# 将音频数据转换为 NumPy 数组
raw_data = np.array(audio.get_array_of_samples())

# 如果是立体声,转换为二维数组
if audio.channels == 2:
    # 截取
    raw_data = raw_data.reshape((-1, 2))
    raw_data = raw_data[time_beg * audio.frame_rate:time_end * audio.frame_rate, :]
    print(f"Stereo audio detected. Data shape: {raw_data.shape}")

    # 对每个通道分别进行降噪
    reduced_noise = np.zeros_like(raw_data)
    for i in range(audio.channels):
        reduced_noise[:, i] = nr.reduce_noise(y=raw_data[:, i], sr=audio.frame_rate, prop_decrease=prop_decrease)
else:
    print(f"Mono audio detected. Data shape: {raw_data.shape}")
    raw_data = raw_data[time_beg * audio.frame_rate:time_end * audio.frame_rate]
    # 对单通道音频进行降噪
    reduced_noise = nr.reduce_noise(y=raw_data, sr=audio.frame_rate)
    
# # 放大音量
# reduced_noise = reduced_noise * 10

# # 将大于1000的值截断为0
# reduced_noise[np.abs(reduced_noise) > 2000] = 0


# 将降噪后的数据转换回 AudioSegment 对象
# 注意,AudioSegment 需要一维数组,立体声需要交错的字节数据

# 将数组转换为 bytes
if audio.channels == 2:
    # 将二维数组转换为交错的一维数组
    interleaved = reduced_noise.astype(np.int16).flatten().tobytes()
else:
    interleaved = reduced_noise.astype(np.int16).tobytes()

denoised_audio = audio._spawn(interleaved)

# 保存降噪后的音频
output_path = data_folder / f"{seq}_denoised.wav"
denoised_audio.export(output_path, format="wav")

# 绘制降噪前后的波形
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.title('raw_data')
plt.plot(raw_data)
plt.tight_layout()

plt.subplot(2, 1, 2)
plt.title('reduced_noise')
plt.plot(reduced_noise)
plt.tight_layout()

plt.show()

以上就是使用Python实现音频降噪功能的详细内容,更多关于Python音频降噪的资料请关注脚本之家其它相关文章!

相关文章

  • 使用wxPython实现逐行加载HTML内容并实时显示效果

    使用wxPython实现逐行加载HTML内容并实时显示效果

    这篇博客中,我们将详细分析如何使用 wxPython 构建一个简单的桌面应用程序,用于逐行加载并显示 HTML 文件的内容,并在加载完成后通过浏览器组件呈现最终页面,通过该应用,我们可以体验到逐行加载 HTML 内容的视觉效果,类似于模拟代码输入,需要的朋友可以参考下
    2024-11-11
  • 如何用python反转图片,视频

    如何用python反转图片,视频

    这篇文章主要介绍了如何用python反转图片,视频,帮助大家更好的利用python处理图像,感兴趣的朋友可以了解下
    2021-04-04
  • python2和python3应该学哪个(python3.6与python3.7的选择)

    python2和python3应该学哪个(python3.6与python3.7的选择)

    许多刚入门 Python 的朋友都在纠结的的问题是:我应该选择学习 python2 还是 python3,Python 3.7 已经发布了,目前Python的用户,主要使用的版本 应该是 Python3.6 和 Python2.7 ,那么是不是该转到 Python 3.7 呢
    2019-10-10
  • PyTorch模型转TensorRT是怎么实现的?

    PyTorch模型转TensorRT是怎么实现的?

    今天给大家带来的是关于Python的相关知识,文章围绕着PyTorch模型转TensorRT是怎么实现的展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • python3使用QQ邮箱发送邮件

    python3使用QQ邮箱发送邮件

    这篇文章主要为大家详细介绍了python3使用QQ邮箱发邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • django ObjectDoesNotExist 和 DoesNotExist的用法

    django ObjectDoesNotExist 和 DoesNotExist的用法

    这篇文章主要介绍了django ObjectDoesNotExist 和 DoesNotExist的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 中秋将至利用python画一些月饼从天而降不用买了

    中秋将至利用python画一些月饼从天而降不用买了

    中秋没两天就要到了,今天小编就利用python画个月饼的小游戏,文中内容非常详细,感兴趣的小伙伴一定要收藏起来送给远方的朋友呀
    2021-09-09
  • python中class(object)的含义是什么以及用法

    python中class(object)的含义是什么以及用法

    这篇文章主要介绍了python中class(object)的含义是什么以及用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Pandas含中文表格对齐输出的几种情况

    Pandas含中文表格对齐输出的几种情况

    今天使用python计算数据相关性,但是发现计算出的表格中间好多省略号,而且也不对齐, 这也太难看了,下面这篇文章主要给大家介绍了关于Pandas含中文表格对齐输出的几种情况,需要的朋友可以参考下
    2023-04-04
  • 通过自学python能找到工作吗

    通过自学python能找到工作吗

    在本篇内容里小编给大家分享的是一篇关于通过自学python能找到工作吗的分析内容,对此有兴趣的朋友们可以参考下。
    2020-06-06

最新评论