【基于pyAudioKits的Python音频信号处理项目(一)】实现音频频谱分析仪并进行交互式滤波器设计
pyAudioKits是基于librosa和其他库的强大Python音频工作流支持。
API速查手册
通过pip安装:
pip install pyAudioKits
pyAudioKits的GitHub地址,如果这个项目帮助到了你,请为它点上一颗star,谢谢你的支持!如果你在使用过程中有任何问题,请在评论区留言或在GitHub上提issue,我将持续对该项目进行维护。
在进行音频信号有关研究时,我们常常需要用到语谱图的分析。同时,我们也需要进行降噪或者有用的频率成分的提取。
常规情况下,为了实现降噪或者有用的频率成分的提取,我们会将整个音频信号通过一个时不变滤波器。如果噪声是平稳信号,该方法可以有效滤除噪声。然而实际情况下,噪声往往是非平稳的,这就意味着我们需要在不同时间点上使用参数不同的滤波器,即使用一个时变滤波器。
短时傅里叶变换可以用于生成音频信号的语谱图,语谱图上包含了信号随时间变化的频率成分信息,因此我们完全可以将时变滤波器的设置和语谱图的分析进行结合。
Filter-Artist基于pyAudioKits开发,实现了一个STFT语谱图定位滤波分析系统,这个系统旨在对音频信号进行短时傅里叶变换。而且,为了更好地对语谱图进行分析,我们让用户可以借助GUI,使用鼠标,在特定时间的特定频点设置巴特沃斯滤波器,交互性地提取自己感兴趣的信号成分、屏蔽噪声,观察滤波后的波形并实时播放滤波后的音频。
该项目的GitHub地址。如果它对你有用,请为它点上一颗star,谢谢!
运行环境:
Python ≥ 3.8.3
依赖:
pyAudioKits ≥ 1.0.6
PyQt5 ≥ 5.15.4
numpy ≥ 1.22.4
opencv-python ≥ 4.5.2.52
在命令行输入:
python main.py
以执行
main.py
,得到窗口如下图所示。点按Load按钮,并读取预置的录音文件rec2_01.wav。
此时显示了rec2_01.wav的语谱图。
可以选用多种窗型来显示语谱图。默认展示的是矩形窗的结果:
使用汉明窗:
可以设置巴特沃斯滤波器的阶数和通带/阻带宽度。
不勾选Erase Mode的情况下,设置的是带通滤波器。在语谱图上点按鼠标并拖动,则鼠标初始位置决定滤波器设置的起始时间和中心频率,鼠标释放位置决定滤波器设置的结束时间。设置一个宽度较大的高频通带以提取蜂鸣器音。
勾选Erase Mode的情况下,设置的是带阻滤波器。在语谱图上点按鼠标并拖动,则鼠标初始位置决定滤波器设置的起始时间和中心频率,鼠标释放位置决定滤波器设置的结束时间。设置三个宽度较小的阻带以消除蜂鸣器音。
点击play按钮播放音频。
点击Save按钮对音频进行保存。
点击Redo按钮重置对音频的编辑。
核心代码:
核心代码位于audio.py
文件内
from pyAudioKits.audio import read_Audio
from pyAudioKits.analyse import FFT
from pyAudioKits.filters import lowPassButterN, highPassButterN, bandPassButterN, bandStopButterN
import matplotlib.pyplot as plt
import numpy as npclass myspectrogram:def __init__(self,direction,window):self.__wav = read_Audio(direction) #利用pyAudioKits的api读取音频self.__M=0.03 #设置窗长为0.03sself.__R=0.015 #设置步长为0.015sif window=="Hamming":self.__Window = "hamming"elif window=="Rectangle":self.__Window = Nonedef __stft(self):self.__freq = FFT(self.__wav.framing(self.__M, 1 - self.__R/self.__M, self.__Window)) #利用pyAudioKits的api进行短时傅里叶变换def save(self,direction):self.__wav.save(direction) #利用pyAudioKits的api保存音频def play(self):self.__wav.sound() #利用pyAudioKits的api播放音频def drawFreq(self):self.__stft()#创建子图,并取消横纵坐标plt.figure(figsize=(8,2))plt.axis('off')plt.gca().xaxis.set_major_locator(plt.NullLocator())plt.gca().yaxis.set_major_locator(plt.NullLocator())plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)plt.margins(0,0)self.__freq.plot(ax=plt.gca(),cbar=False,freq_scale="mel",plot_type="dB") #将子图传入pyAudioKits的频谱绘制apiplt.savefig("tmp.png") #保存子图,后续通过PyQt读取并显示def filtering(self,n,sizeFreq,erase,xposeStart,yposeStart,xposeEnd,yposeEnd):def freq_transform(freq): #将鼠标在频谱上点击的y轴位置,即一个[0,1]之间的数,映射到梅尔尺度频率sr = self.__wav.srlength = int(self.__M * sr / 2)max_freq_point = int(sr / 2)max_freq = sr / 2freq_points = 700 * (np.power(10, np.linspace(0, 2595 * np.log10(1 + max_freq/700), length)/2595) - 1)freq_point = freq_points[int(length * freq)]freqs = np.linspace(0,max_freq,max_freq_point)return freqs[int(freq_point)]#将鼠标在频谱上点击的x轴位置,即一个[0,1]之间的数,映射到音频时间,后续用于音频切片xsize=self.__R * self.__freq.shape[0]xposeStart=xsize*xposeStartxposeEnd=xsize*xposeEndyposeNow=float(yposeStart)width=float(sizeFreq)/200 #将滤波器宽度映射到[0,1]的尺度上#计算滤波器的两个截止频率low=yposeNow-widthhigh=yposeNow+width#获取滤波器并进行滤波if erase:if low>0 and high<1:filt = lambda x: bandStopButterN(x, n, freq_transform(low), freq_transform(high))if low<=0:filt = lambda x: highPassButterN(x, n, freq_transform(high))if high>=1:filt = lambda x: lowPassButterN(x, n, freq_transform(low))else:if low>0 and high<1:filt = lambda x: bandPassButterN(x, n, freq_transform(low), freq_transform(high))if low<=0:filt = lambda x: lowPassButterN(x, n, freq_transform(high))if high>=1:filt = lambda x: highPassButterN(x, n, freq_transform(low))if xposeStart<xposeEnd:self.__wav[xposeStart:xposeEnd]=filt(self.__wav[xposeStart:xposeEnd])if xposeEnd<xposeStart:self.__wav[xposeEnd:xposeStart]=filt(self.__wav[xposeEnd:xposeStart])
【基于pyAudioKits的Python音频信号处理项目(一)】实现音频频谱分析仪并进行交互式滤波器设计相关推荐
- 【基于pyAudioKits的Python音频信号处理(一)】pyAudioKits安装与API速查手册
文章目录 pyAudioKits 基本用法 创建或加载音频 来自NumPy数组 来自文件 录音 模拟 Audio对象 播放 绘制 转为NumPy数组 获取属性 保存 索引和切片 连接 合成 四则运算 ...
- pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存
pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存 目录 输出结果 代码实现 输出结果 代码实现 # -*- codi ...
- matlab音频信号处理实验报告,matlab音频信号处理实验报告.docx
matlab音频信号处理实验报告 MATLAB音频信号处理实验 南昌航空大学信息工程学院 课程实验报告 实验名称:实验时间:2014年4月23日 指导教师: 班级: 学号: 姓名: 成绩: 南昌航空大 ...
- 【基于pyAudioKits的Python音频信号处理(七)】端点检测和语音识别
pyAudioKits是基于librosa和其他库的强大Python音频工作流支持. API速查手册 通过pip安装: pip install pyAudioKits 本项目的GitHub地址,如果这 ...
- Python之音频信号处理(一)音频基础知识
一.音频基础知识 1.声音的三要素 (1)音调 人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高.一般音频 儿童>女生>男生. 人耳听觉音频范围 ...
- python实时采集与处理声音信号_Python之音频信号处理(一)音频基础知识
一.音频基础知识 1.声音的三要素 (1)音调 人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高.一般音频 儿童>女生>男生. 人耳听觉音频范围 ...
- 【基于pyAudioKits的Python音频信号处理项目(二)】深度学习语音识别
pyAudioKits是基于librosa和其他库的强大Python音频工作流支持. API速查手册 通过pip安装: pip install pyAudioKits 本项目的GitHub地址,如果这 ...
- FPGA数字信号处理(20)单级半带(HB)滤波器设计
本篇是FPGA数字信号处理的第20篇,前面介绍了多速率信号处理系统中用到的多速率FIR滤波器.CIC滤波器,本文将介绍另一种常用的半带滤波器(Half-Band Filter)的相关知识及设计方法.本 ...
- 数字信号处理——线性相位型(Ⅰ、Ⅲ型)FIR滤波器设计(1)
目录 引言 设计说明 1.线性相位型FIR滤波器简介 2.线性相位型FIR滤波器的结构
- 基于MATLAB有噪声语音信号处理算法设计
获取项目源文件,联系Q:1415736481,可指导毕设,课设 摘要 滤波器设计在数字信号处理中占有极其重要的地位,FIR数字滤波器和IIR滤波器是滤波器设计的重要组成部分.利用MATLAB信号处理工 ...
最新文章
- linux查看特定文件的位置
- python之常见问题集锦
- linux用户及权限操作
- 0623TP框架联系
- jQuery UI dialog插件出错信息:$(this).dialog is not a function
- openlayers3应用一:显示百度地图
- android 点击后退按钮,android – 按下后退按钮后重新选择正确的NavigationView菜单项...
- 虚拟机安装教程win10_Parallels Desktop如何安装windowns系统?PD虚拟机安装win10系统详细教程
- Maya界面编程入门:在Maya中使用Qt
- Empty paragraph passed to @param command
- Linux内核网络:实现与理论--介绍
- 视频剪辑一定要知道这6个免费视频素材库
- 安全测试(三) 服务器安全 渗透测试 常规服务器安全漏洞 高危端口暴露、弱口令密码、暴力破解、服务器提权、Mysql数据库提权等 浅谈《社会工程学》实战案例
- win10系统升级没有声音?老司机教你怎么重新安装声卡驱动
- 【GPU精粹与Shader编程】(四) 《GPU Gems 2》全书核心内容提炼总结 · 上篇
- LruCache的终极解析
- 黑苹果重置NVRAM方法,无法进入系统,丢失引导
- 【rk3399】AIO-3399J Linux_SDK Recovery按键无法进入Loader模式
- word2003快速排版工具栏_手机版编辑器上线!如何快速编辑微信图文?
- android xfire,XFire完整入门教程