-
2019-05-17 13:55:49
对音频信号的处理可以通过 librosa.ifgram 方法获取 stft 短时傅立叶变换的矩阵,对该矩阵进行修改搬移,再进行 istft 逆转换获得处理后的音频信号。
y, sr = librosa.load(path) frequencies, D = librosa.ifgram(y, sr=sr) ''' 中间对D进行处理就行了 ''' y = librosa.istft(D)
D为stft变换的矩阵,x 轴为时间序列,y轴为频率序列坐标对应frequencies,值为幅度。
由于D类型为numpy.ndarray,所以我们很方便就可以通过numpy库对矩阵处理。
- 回音
D = np.repeat(D, 2, axis=1)
- 间断
D[:,::2] = 0
- 音色
D = np.roll(D, 50, axis=0)
- 压缩频率
def _pool(D, poolsize): x = D.shape[1] // poolsize restsize = D.shape[1] % poolsize if restsize > 0: x += 1 rightlist = np.zeros([ D.shape[0], poolsize-restsize]) D = np.c_[D, rightlist] D = D.reshape( (-1, poolsize) ) D = D.sum(axis=1).reshape(-1,x) return D def rewardshape(D, shape): x = shape[0] - D.shape[0] y = shape[1] - D.shape[1] if x > 0: bottomlist = np.zeros([x, D.shape[1]]) D = np.r_[D, bottomlist] if y > 0: rightlist = np.zeros([ D.shape[0], y]) D = np.c_[D, rightlist] return D def pool(D, size=(3,3), shapeed=False): _shape = D.shape if size[1] > 1: D = _pool(D, size[1]) if size[0] > 1: D = _pool(D.T, size[0]).T if shapeed: D = rewardshape(D, _shape) return D
更多相关内容 - 回音
-
使用librosa对音频进行加载拼接截取叠加等操作
2020-12-10 18:00:07注意:librosa只能读取wav格式音频文件 代码如下 import numpy as np import librosa # 1.加载音频文件 audio_path1 = './audio1.wav' y1, sr1 = librosa.load(audio_path1) dur1 = librosa.get_duration(y1, sr=...注意:librosa只能读取wav格式音频文件
代码如下
import numpy as np import librosa # 1.加载音频文件 audio_path1 = './audio1.wav' y1, sr1 = librosa.load(audio_path1) dur1 = librosa.get_duration(y1, sr=sr1) print('数据x类型和采样率sr类型', type(y1), type(sr1)) print('数据x尺寸和采样率', y1.shape, sr1) print('该音频的时长为:', dur1) audio_path2 = './audio2.wav' y2, sr2 = librosa.load(audio_path2) dur2 = librosa.get_duration(y2, sr=sr2) print('数据x类型和采样率sr类型', type(y2), type(sr2)) print('数据x尺寸和采样率', y2.shape, sr2) print('该音频的时长为:', dur2) # 2.音频拼接 audio_dst = np.hstack((y1, y2)) print('数据x尺寸和采样率', audio_dst.shape) librosa.output.write_wav('./拼接.wav', audio_dst, sr2) # 3.音频截取 start = 12 duration = 20 stop = start +duration audio_dst = y2[start*sr2:stop*sr2] librosa.output.write_wav('./截取-2.wav', audio_dst, sr2) # 4.音频叠加 num_min = min(len(y1), len(y2)) num_max = max(len(y1), len(y2)) audio_dst = np.zeros(num_max) for i in range(num_max): if i<num_min: audio_dst[i] = y1[i] + y2[i] else: if len(y1)>=len(y2): audio_dst[i] = y1[i] else: audio_dst[i] = y2[i] librosa.output.write_wav('./叠加.wav', audio_dst, sr2) # 5.生成静音音频 num = 3*sr2 audio_dst = np.zeros(num) librosa.output.write_wav('./静音.wav', audio_dst, sr2) # 6.调整音频音量 librosa.output.write_wav('./调整音量.wav', y2*0.1, sr2)
结果展示
-
2021-8-8 librosa库统一音频数据时长
2021-08-08 18:01:56librosa wavio thikdsp-github soundfile 需要注意不同库读取音频得到的data类型是不同的,有的是array有的是list,元素也不同有的是整数,有的是浮点数,也即是归一化了的。 norm:boolean [scalar] enable ...目前我接触到的处理音频的python库有:
wave-标准库
scipy.io.wavfile
librosa
wavio
thikdsp-github
soundfile
需要注意不同库读取音频得到的data类型是不同的,有的是array有的是list,元素也不同有的是整数,有的是浮点数,也即是归一化了的。norm:boolean [scalar]
enable amplitude normalization. For floating point y, scale the data to the range [-1, +1].本此实验还是采用librosa
为啥呢?
1.以array形式读取和存入的数值——用numpy处理数据
2.读取和存入都会自动归一化处理——保证音量一致了
3.其它的一些读出竖排的数据或者list我试了试没这个方便src_root = 'D:\workspace\Jupyter\speech\wavfiles' classes = os.listdir(src_root) for _cls in sorted(classes): for fn in sorted(os.listdir(os.path.join(src_root, _cls))): f = wave.open(os.path.join(src_root, _cls, fn)) SampleRate = f.getframerate() frames = f.getnframes() # Duration 也就是音频时长 = 采样点数/采样率 Duration = wav_time = frames / float(SampleRate) # 单位为s wav,sr = librosa.load(os.path.join(src_root, _cls, fn),sr=16000) #所有都需要librosa处理归一 if Duration<=2.0: n = 32000-wav.shape[0]#需要补齐的0 ndarray=np.pad(wav,(0,n),'constant', constant_values=(0,0.0000000e+00)) librosa.output.write_wav(os.path.join('D:\workspace\Jupyter\speech\clean', _cls, fn), ndarray, 16000) elif Duration>2.0: ndarray=wav[:32000]#从尾部截掉 print(os.path.join(src_root, _cls, fn)) librosa.output.write_wav(os.path.join('D:\workspace\Jupyter\speech\clean', _cls, fn), ndarray, 16000) else: continue
-
LIBROSA实现音频基本处理+乐音三要素原理解析
2020-12-18 09:25:19向量x ∈ R N x\in R^Nx∈RN表示时间区间上的音频信号,x i x_ixi表示t = h i t=h_it=hi时的声压x i = α p ( h i ) , i = 1 , . . . , N x_i=\alpha p(h_i),i=1,...,Nxi=αp(hi),i=1,...,N 每个x i x_ixi...声音的向量表示
原理
- 向量x ∈ R N x\in R^Nx∈RN表示时间区间上的音频信号,x i x_ixi表示t = h i t=h_it=hi时的声压x i = α p ( h i ) , i = 1 , . . . , N x_i=\alpha p(h_i),i=1,...,Nxi=αp(hi),i=1,...,N
- 每个x i x_ixi称为样本
- h(>0)为采样时间
- 1/h为采样率,典型的采样率为1 / h = 44100 / s e c 1/h=44100/sec1/h=44100/sec或48000 / s e c 48000/sec48000/sec
- α \alphaα被称为比率因子
使用python的librosa库可以读取音频信号,并用matplotlib显示波形
y,sr = librosa.load("MUSIC STEM.wav",sr=None) #y为长度等于采样率sr*时间的音频向量 plt.figure() librosa.display.waveplot(y, sr) #创建波形图 plt.show() #显示波形图
- 1
- 2
- 3
- 4
结果
分析
音频信号每一位分别对应一个采样点,其位数等于“采样率*音频时长(以秒为单位)”,记录了每个样本上音频的振幅信息
缩放音频信号
原理
音频的响度由音频信号每个样本的数值绝对值大小决定,因此对音频信号作代数乘法运算,可以增减音频的响度
numpy数组提供的代数乘法功能可以用于增减音频响度,并利用librosa库将音频向量写回文件
y=2*y #增加一倍振幅 y=0.5*y #减小振幅为原来一半 y=-y #翻转振幅 y=10*y #大幅增加振幅 librosa.output.write_wav(dir,y,sr) #将音频向量写回文件
- 1
- 2
- 3
- 4
- 5
结果
四种操作结果的波形分别如图所示
- y=2*y时,得到的音频响度略大于原音频
- y=0.5*y时,得到的音频响度略小于原音频
- y=-y时,得到的音频响度与原音频一致
- y=10*y时,得到的音频响度远大于原来音频
分析
- 音频信号每个样本的数值反应了振动离开平衡点的距离,即振幅,振幅越大,声音具有的能量越大,声音听起来响度就越大
- 对样本数值进行倍增,若倍增系数绝对值大于1则声音响度增加,若倍增系数绝对值小于1则声音响度下降
- 由于振动离开平衡点的距离是一个绝对值,因此倍增系数为负数时效果与倍增系数是其相反数时一致
线性组合和混音
原理
-
对多个音频信号进行线性运算y = a 1 x 1 + a 2 x 2 + . . . + a k x k y=a_1x_1+a_2x_2+...+a_kx_ky=a1x1+a2x2+...+akxk可以实现混音
-
此时每个音频信号x k x_kxk称为音轨
-
混合后的结果y称为混合
-
每个系数a k a_kak是音轨在混合中的权重
numpy数组提供的线性运算功能可以用于实现混音
再尝试人声与伴奏的混合,取一段人声轨和一段伴奏轨,分别赋予权重(0.25,0.75)、(0.5,0.5)、(0.4,0.6)进行线性混合
y=0.25*x1+0.75*x2 y=0.5*x1+0.5*x2 y=0.6*x1+0.4*x2
- 1
- 2
- 3
结果
波形图如下所示:
得到的音频为在伴奏上加上人声的效果
分析
-
音频是线性相加,得到的波形图中无法直观分出人声和伴奏,但由于人声和伴奏中各频率谐波分量与伴奏中不同,线性相加在频域被分配到了各频率谐波上,所以可以在频谱图上清晰区分出来
-
为了得到足够清晰的混音音频,需要不断更改每个混音音轨的权重以得到最适合的混合模式
拓展
虽然人声和伴奏中谐波分量基本不同,但相同频率上的相加也容易导致撞频的发生,使得混合的人声和伴奏难以区分,因此对于双声道音频,我们常常采用偏置的方法,为两个声道中人声和伴奏设不同的权重(通常一个声道人声大,一个声道伴奏声大)
形状为(2,n)的numpy数组可以用于容纳双声道音频信号。两个声道分别取权重(0.4,0.6)、(0.6,0.4)进行混合,波形如下:
乐音
- 对于声音信号p(t),若满足p ( t + T ) ≈ p ( t ) p(t+T)\approx p(t)p(t+T)≈p(t),其中周期T取值在0.0005秒到0.01秒之间,则p被视为乐音
- 周期长短(决定频率并)决定音高
- 每个周期内波形的特点决定了音色
- 乐音的能量决定了响度,即声压
音高
- f = 440 H z f=440Hzf=440Hz是中央A
- 一个八度在频率上翻了一倍
- 十二平均律中,每个半音在频率上翻了2 1 / 12 2^{1/12}21/12倍
- 每个半音的距离就是黑白键上两个键之间的距离,从do到升do,各白键之间的差音为全全半全全全半,而每个全音中的半音被分到了黑键上
- 任意两个音之间的距离称为音程,音程的单位是度,相同单音之间音程为1度,之后每差一个音级增加1度
实验步骤:
- 设置基频f为440Hz,用numpy以440Hz生成正弦函数
- 每隔1/44100s设置一个采样点,每间隔1s生成1s的440Hz正弦波
- 在这基础上,第n次生成时再生成1s频率为440 ⋅ 2 ( n − 1 ) / 12 H z 440·2^{(n-1)/12}Hz440⋅2(n−1)/12Hz的正弦波,与原正弦波线性相加进行和弦,从而模拟小二度到纯八度的所有音程
x=np.empty((0,)) #生成空数组 for i in range(0,13): x1=np.linspace(0,1, num=44100, endpoint=True, dtype=float) #生成采样点 x1=5*np.sin(2*np.pi*440*np.power(2,i/12)*x1)+5*np.sin(2*np.pi*440*x1) #生成波形与和弦 x2=np.zeros((44100,)) #留空部分 x=np.concatenate((x,x1,x2),axis=0) #连接数组
- 1
- 2
- 3
- 4
- 5
- 6
生成的26s音频中有13段不同音程的和弦,有的和弦听起来和谐,有的和弦听起来不和谐
- 小二度音程(相差一个半音)、大七度音程(相差五个全音一个半音)是极不协和音程
- 大二度音程(相差一个全音)、小七度音程(相差五个全音)、三全音(三个全音)是不协和音程
- 小三度音程(相差一个全音一个半音)、大三度音程(相差两个全音)、小六度音程(相差四个全音)、大六度音程(相差四个全音一个半音)是不完全协和音程
- 纯四度音程(相差两个全音一个半音)、纯五度音程(相差三个全音一个半音)是完全协和音程
- 纯八度音程(相差六个全音)是极完全协和音程
音色
-
对于周期性信号p ( t ) = ∑ k = 1 K ( a k c o s ( 2 π f k t ) + b k s i n ( 2 π f k t ) ) p(t)=\displaystyle \sum_{k=1}^K (a_kcos(2\pi fkt)+b_ksin(2\pi fkt))p(t)=k=1∑K(akcos(2πfkt)+bksin(2πfkt)),每个分解信号为谐波或泛音
-
f为频率
-
a与b为谐波系数
-
在K足够大时,任意周期性信号都可以通过积分变换为这种形式
-
谐波振幅的配比决定了音色,对于每个频率由k决定的谐波,其谐波振幅为c k = a k 2 + b k 2 c_k=\sqrt{a_k^2+b_k^2}ck=ak2+bk2,因此谐波振幅可以组成一个长度为k的向量c = ( 0.3 , 0.4 , . . . ) c=(0.3,0.4,...)c=(0.3,0.4,...),足够多的谐波以不同振幅数值混合可以组成不同音色
在220-11000Hz之间分别生成1、5、10、20、50个频段的正弦、余弦信号,随机生成谐波系数
结果
五种情况下混合波形图如下所示:
得到一段每隔1s播放1s不同音色音频的音频文件分析
- 使用不同足够多的谐波以不同谐波系数混合可以组成不同音色音频
- 现实中已知乐器也可以利用频谱分析提取音色特征,供计算机再现
- 利用谐波原理可以制作各种各样的电子合成器,供作曲家使用
-
librosa 音频分析
2021-04-28 11:26:35该篇博文是对librosa能量_librosa语音信号处理重新编辑 读取音频 读取音频文件。默认采样率是22050,如果要保留音频的原始采样率,使用sr = None。 y, sr = librosa.load...# offset:float,在此时间之后开始阅读(以 -
librosa音频处理教程
2022-05-05 21:43:27librosa音频处理教程 -
librosa 音频处理库
2018-11-09 10:36:321. 名词解释 名称 含义 sr(sample_rate) 采样率,表示一秒采样多少个样本点 hop_length 步幅;...librosa.amplitude_to_db(melspec)#计算log mel 谱 参考:文献 github doc librosa paper 博客 librosa 音频处理库 - 简书 -
使用librosa库对音频信号进行采样以及分帧处理
2020-10-20 16:19:06采样之后,生成音频时间序列 y,其中 len(y) = T * sr = 2 × 24000 = 48000,y.shape = (48000, ),sr=24000。 import librosa # 读取音频 y, sr = librosa.load(path='path.wav', sr=24000) print(len(y), y.... -
python - librosa模块/pydub模块,处理音频文件,获取音频文件时长
2021-05-07 10:19:02import librosa import wave import contextlib import eyed3 def get_duration_mp3(file_path): """ 获取mp3音频文件时长 :param file_path: :return: """ mp3Info = eyed3.load(file_path) return mp3... -
librosa | 系统实战(十八~十九)写音频&音乐
2021-08-27 18:06:33文章目录[librosa学习(一 ~八)点此处](https://blog.csdn.net/qq_44250700/article/details/119685358)九、写音频(1)soundfile.write(2)缩放音频subplot绘图代码:(3)线性组合和混音(4)变速(更改采样率)... -
librosa处理音频信号
2019-12-14 19:59:15这会将音频时间序列作为numpy数组返回,默认采样率(sr)为22KHZ mono。我们可以通过以下方式更改此行为: librosa . load ( audio_path , sr = 44100 ) 以44.1KHz重新采样,或禁用重新采样。采样率是每秒... -
python librosa音频处理库 Core IO and DSP(翻译文档)
2018-06-12 21:58:02英文文档地址:...一、Audio processing1.1 librosa.core.load加载音频,audioread这种方式能加载的音频格式,我一般都把音频处理成wav格式然后通过该函数加载。参数为:path:音频路径 sr:音频频率(... -
音频特征提取——librosa工具包使用
2020-12-04 02:10:39时间:2017-05-06 11:20:47前言本文主要记录librosa工具包的使用,librosa在音频、乐音信号的分析中经常用到,是python的一个工具包,这里主要记录它的相关内容以及安装步骤,用的是python3.5以及win8.1环境。... -
GitHub - Zhangtingyuxuan/...使用Librosa音频处理库和openSMILE工具包,进行简单的声学特征提取
2020-12-28 22:00:33使用Librosa音频处理库和openSMILE工具包,进行简单的声学特征提取,包括韵律学特征(持续时间、短时能量、过零率、基频等)、基于谱的相关特征(MFCC特征)和声音质量特征(共振峰、频率微扰、振幅微扰)。如果您觉得有..... -
【NLP】音频特征工程(librosa库)(1)
2020-09-20 19:06:40librosa库提取音频特征 -
librosa:音频和音乐分析
2020-07-21 11:17:38文章目录librosa安装分析步骤读取音频提取特征Log-Mel SpectrogramMFCC绘制波形图和梅尔频谱图 librosa Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能... -
librosa语音信号处理
2021-09-24 10:28:53时域1.1 读取音频1.2 重采样1.3 读取时长1.4 读取采样率1.5 写音频1.6过零率1.7 波形图2. 频域2.1 短时傅里叶变换2.2 幅值和相位2.3 短时傅里叶逆变换2.4 幅值转dB2.5功率转dB2.6 绘制频谱图2.7 Mel滤波器组2.8 计算... -
EE103(1):librosa实现音频基本处理+乐音三要素原理解析
2020-03-03 16:21:51向量x∈RNx\in R^Nx∈RN表示时间区间上的音频信号,xix_ixi表示t=hit=h_it=hi时的声压xi=αp(hi),i=1,...,Nx_i=\alpha p(h_i),i=1,...,Nxi=αp(hi),i=1,...,N 每个xix_ixi称为样本 h(>0)为采样时间 1... -
音频信号处理python库——librosa简介
2021-05-09 05:24:15做的项目需要提一些音频特征,而librosa这个库非常给力,这里写一些介绍。Youtube上有一个介绍的视频,台上这位大佬非常帅呀,想想他也是librosa team member,我会更喜欢librosa的。下面根据文档简单的介绍下... -
librosa | 系统实战(一 ~ 四)
2021-08-13 22:51:16librosa是python中用于提取音乐特征的库 一、安装 参考 https://blog.csdn.net/qq_39516859/article/details/80333431 二、 -
音频处理库—librosa的安装与使用
2019-03-04 16:48:11目录 序言 一、libsora安装 pypi conda source 二、librosa常用功能 核心音频处理函数 音频处理 频谱表示 幅度转换 时频转换 特征提取 绘图显示 ...读取音频 ...Librosa是一个用于音频... -
python的 librosa包操作音频
2020-01-09 17:09:47import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np filepath = 'MWdVM0VuQU9NTDQ...# y音频时间序列 sr:音频的采样率 y, sr = librosa.load(filepath, sr=Non... -
音频分析工具librosa
2020-09-01 11:58:27librosa.feature.mfcc 主要学习利用该库提取mfcct特征,望各位批评指正。 MFCCs (Mel-frequency cepstral coefficients):梅尔倒谱系数 librosa.feature.mfcc(y...y: 语音时间序列。np.ndarray [shape=(n,)] or None sr: -
音频特征提取——python/ librosa工具包使用
2018-07-16 15:29:27前言 本文主要记录librosa工具包的使用,librosa在音频、乐音信号的分析中经常用到,是python的一个工具包,这里主要记录它的相关内容以及安装步骤,用的是python3.5以及win10环境。一、MIR简介音乐信息检索(Music... -
pyhton使用librosa提取语音信号特征之后出现的
2021-05-15 21:25:18<p>RuntimeError: stack expects each tensor to be equal size, but got [3751, 128] at entry 0 and [2979, 128] at entry 3 <p><img alt="" height="379" src=... ... -
音频文件的写入
2020-04-15 08:00:04音频文件读取与存储的话,目前有librosa,scipy.io.wavfile,soundfile,essentia其中前两者是一样的程序,sf的读取与写入只能是wav/ogg/flac的,最后一个库win安装失败,这个问题我给官方提过,服务器没有问题,我似乎...