使用Python实现音频降噪

news2024/11/24 0:44:23

在音频处理领域,背景噪声是一个常见的问题。为了提高音频的质量,我们需要对音频进行降噪处理。本文将介绍如何使用 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18、论文阅读:AOD-Net:一体化除雾网络

AOD-Net: All-in-One Dehazing Network 前言介绍相关工作物理模型传统方法深度学习方法 建模与扩展变换后的公式网络设计与高级特征任务相结合 除雾评价数据集和实现 前言 该论文提出了一种基于卷积神经网络(CNN)的图像去雾模型,称为 All-in…

软件工程。

图 UML 数据流图(DFD) 1,数据流图概念 描绘信息流和数据从输入移动到输出的过程中所经受的变换。 也就是 数据流图。 数据流图以图形的方式描绘数据在系统中流动和处理的过程。 数据流图(DFD,Data Flow Diagram&a…

机器学习—为什么我们需要激活函数

如果我们使用神经网络中每个神经元的线性激活函数,回想一下这个需求预测示例,如果对所有节点使用线性激活函数,在这个神经网络中,事实证明,这个大神经网络将变得与线性回归没有什么不同,所以这将挫败使用神…

Java基础使用②Java数据变量和类型+小知识点

目录 1. Java小知识点 1.1 Java注释 1.2 Java标识符命名 1.3 Java关键字 2. 字面常量和数据变量 2.1 字面常量 2.2 数据类型 3.变量 3.1 变量概念 3.2 语法格式 3.3 整型变量 3.4 浮点型变量 3.5 字符型变量 3.6 布尔型变量 3.7 类型转换 3.8 类型提升 4. 字符…

Blender 几何、线框猴头的构建 笔记

一、学习blender视频教程链接 案例7:猴头构建_建模动画_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Bt4y1E7qn?spm_id_from333.788.videopod.episodes&vd_sourced0ea58f1127eed138a4ba5421c577eb1&p23 二、几何节点基础教程 1.首先添加几何节…

Kafka面试题解答(二)

1.怎么尽可能保证 Kafka 的可靠性 kafka是可能会出现数据丢失问题的,Leader维护了一个动态的in-sync replica set(ISR),意为和 Leader保持同步的FollowerLeader集合(leader:0,isr:0,1,2)。 如果Follower长…

用科技力量,重塑数字化园区新生态!

数字化园区的成功打造绝非易事,它需要在多个关键层面付出持之以恒的努力,而成都树莓集团在这一进程中无疑发挥着重要作用。 在数据的管理与应用方面,成都树莓集团更是展现出卓越的实力。集团运用先进的数据挖掘、分析技术,助力园区…

Mac上无法访问usr/local的文件

sudo chmod 755 /usr/loca 最后用百度提供的方法解决了

【Lucene】原理学习路线

基于《Lucene原理与代码分析完整版》,借助chatgpt等大模型,制定了一个系统学习Lucene原理的计划,并将每个阶段的学习内容组织成专栏文章,zero2hero 手搓 Lucene的核心概念和实现细节。 深入的学习和专栏计划,覆盖Lucen…

友思特应用 | 动态捕捉:高光谱相机用于移动产线上的食品检测

导读 高光谱成像技术能够为食品安全助力。以友思特BlackIndustry SWIR 1.7 Max 为代表的高光谱相机,完美解决了移动产线检测的应用难点。 高光谱技术:为食品安全保驾护航 食品安全一直是大众关心的热点话题,提供安全、高质量的食品需要对食…

HarmonyOS使用arkTS拉起指定第三方应用程序

HarmonyOS使用arkTS拉起指定第三方应用程序 前言代码及说明bundleName获取abilityName获取 前言 本篇只说采用startAbility方式拉起第三方应用,需要用到两个必备的参数bundleName,abilityName,本篇就介绍如何获取参数… 代码及说明 bundle…

Linux的基本指令(一)

1.ls指令 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及信息。 常用选项: -a列出目录下的所有文件,包括以 . 开头的隐含文件。 -l列出文件的详细信息 举例: rooti…

基于Springboot+Vue的博客系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

华为OD机试真题-矩形绘制

题目描述 实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除 当新绘制的矩形与之前的图形重善时,对图形取并集 当新擦除的矩形与之前的图形重善时,对图形取差集 给定一系列矩形的绘制和擦除操作,计算最终图形的面积。下…

数据编排与ETL有什么关系?

数据编排作为近期比较有热度的一个话题,讨论度比较高,同时数据编排的出现也暗示着数字化进程的自动化发展。在谈及数据编排时,通常也会谈到ETL,这两个东西有相似点也有不同点。 数据编排和ETL(提取、转换、加载&#x…

【Golang】Go语言教程

Go语言教程 文章目录 Go语言教程一、Go语言教程二、Go语言特色三、Go语言用途四、第一个Go程序六、运行代码的两种方式七、go run和go buil的区别7.1、go run7.2、Go build 一、Go语言教程 Go全称Golang Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变…

【重装系统后重新配置2】pycharm 终端无法激活conda环境

pycharm 终端无法激活 conda 环境,但是 Windows本地终端是可以激活的 原因是pycharm 默认的终端是 Windows PowerShell 解决方法有两个: 一、在设置里,修改为cmd 二、下面直接选择

这是一个bug求助帖子--安装kali 遇坑

第一个报错 介质:kali-linux-2024.1-live-amd64 环境:Dell笔记本 i510代cpu 现象及操作 安装完以后 然后我换了个国内的源进行了以下操作 apt-get update:更新源列表 apt-get upgrade:更新所有可以更新的软件包 然后进行清理。…

教你在.Net8.0的WinForm中使用WebView2,实现C#和JavaScript的实时双向互操作

1. 前言 随着 Web 技术的发展,使用网页内容(HTML、JavaScript、CSS 等)作为桌面应用程序的一部分变得越来越常见。在 C# WinForm 中,Microsoft 提供的 WebView2 控件让我们可以轻松地嵌入 Chromium 浏览器,并实现 C# …

如何安装QT(linux/windows)

1. linux 1.1 下载安装程序 进入QT官网,点击右上角下载 Qt | Tools for Each Stage of Software Development Lifecycle​www.qt.io/ 然后选择下载linux版本,这里你需要填写一些信息,注册一些即可 填写之后会出现下面这个网页,…