• Librosa音频处理（二）
千次阅读
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库对矩阵处理。

1. 回音
D = np.repeat(D, 2, axis=1)
2. 间断
D[:,::2] = 0

3. 音色
D = np.roll(D, 50, axis=0)
4. 压缩频率
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只能读取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'
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'
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)



# 结果展示

展开全文
• librosa 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
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


展开全文
• 向量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...

## 声音的向量表示

### 原理

1. 向量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
2. 每个x i x_ixi​称为样本
3. h（>0）为采样时间
4. 1/h为采样率，典型的采样率为1 / h = 44100 / s e c 1/h=44100/sec1/h=44100/sec或48000 / s e c 48000/sec48000/sec
5. α \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

### 结果

四种操作结果的波形分别如图所示

1. y=2*y时，得到的音频响度略大于原音频
2. y=0.5*y时，得到的音频响度略小于原音频
3. y=-y时，得到的音频响度与原音频一致
4. y=10*y时，得到的音频响度远大于原来音频

### 分析

1. 音频信号每个样本的数值反应了振动离开平衡点的距离，即振幅，振幅越大，声音具有的能量越大，声音听起来响度就越大
2. 对样本数值进行倍增，若倍增系数绝对值大于1则声音响度增加，若倍增系数绝对值小于1则声音响度下降
3. 由于振动离开平衡点的距离是一个绝对值，因此倍增系数为负数时效果与倍增系数是其相反数时一致

## 线性组合和混音

### 原理

1. 对多个音频信号进行线性运算y = a 1 x 1 + a 2 x 2 + . . . + a k x k y=a_1x_1+a_2x_2+...+a_kx_ky=a1​x1​+a2​x2​+...+ak​xk​可以实现混音

2. 此时每个音频信号x k x_kxk​称为音轨

3. 混合后的结果y称为混合

4. 每个系数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

### 结果

波形图如下所示：

得到的音频为在伴奏上加上人声的效果

### 分析

1. 音频是线性相加，得到的波形图中无法直观分出人声和伴奏，但由于人声和伴奏中各频率谐波分量与伴奏中不同，线性相加在频域被分配到了各频率谐波上，所以可以在频谱图上清晰区分出来

2. 为了得到足够清晰的混音音频，需要不断更改每个混音音轨的权重以得到最适合的混合模式

### 拓展

虽然人声和伴奏中谐波分量基本不同，但相同频率上的相加也容易导致撞频的发生，使得混合的人声和伴奏难以区分，因此对于双声道音频，我们常常采用偏置的方法，为两个声道中人声和伴奏设不同的权重（通常一个声道人声大，一个声道伴奏声大）

形状为(2,n)的numpy数组可以用于容纳双声道音频信号。两个声道分别取权重(0.4,0.6)、(0.6,0.4)进行混合，波形如下：

## 乐音

1. 对于声音信号p(t)，若满足p ( t + T ) ≈ p ( t ) p(t+T)\approx p(t)p(t+T)≈p(t)，其中周期T取值在0.0005秒到0.01秒之间，则p被视为乐音
2. 周期长短（决定频率并）决定音高
3. 每个周期内波形的特点决定了音色
4. 乐音的能量决定了响度，即声压

### 音高

原理

1. f = 440 H z f=440Hzf=440Hz是中央A
2. 一个八度在频率上翻了一倍
3. 十二平均律中，每个半音在频率上翻了2 1 / 12 2^{1/12}21/12倍
4. 每个半音的距离就是黑白键上两个键之间的距离，从do到升do，各白键之间的差音为全全半全全全半，而每个全音中的半音被分到了黑键上
5. 任意两个音之间的距离称为音程，音程的单位是，相同单音之间音程为1度，之后每差一个音级增加1度

实验步骤：

1. 设置基频f为440Hz，用numpy以440Hz生成正弦函数
2. 每隔1/44100s设置一个采样点，每间隔1s生成1s的440Hz正弦波
3. 在这基础上，第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段不同音程的和弦，有的和弦听起来和谐，有的和弦听起来不和谐

分析

1. 小二度音程（相差一个半音）、大七度音程（相差五个全音一个半音）是极不协和音程
2. 大二度音程（相差一个全音）、小七度音程（相差五个全音）、三全音（三个全音）是不协和音程
3. 小三度音程（相差一个全音一个半音）、大三度音程（相差两个全音）、小六度音程（相差四个全音）、大六度音程（相差四个全音一个半音）是不完全协和音程
4. 纯四度音程（相差两个全音一个半音）、纯五度音程（相差三个全音一个半音）是完全协和音程
5. 纯八度音程（相差六个全音）是极完全协和音程

### 音色

1. 对于周期性信号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​(ak​cos(2πfkt)+bk​sin(2πfkt))，每个分解信号为谐波泛音

2. f为频率

3. a与b为谐波系数

4. 在K足够大时，任意周期性信号都可以通过积分变换为这种形式

5. 谐波振幅的配比决定了音色，对于每个频率由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不同音色音频的音频文件

### 分析

1. 使用不同足够多的谐波以不同谐波系数混合可以组成不同音色音频
2. 现实中已知乐器也可以利用频谱分析提取音色特征，供计算机再现
3. 利用谐波原理可以制作各种各样的电子合成器，供作曲家使用
展开全文
• 该篇博文是对librosa能量_librosa语音信号处理重新编辑 读取音频 读取音频文件。默认采样率是22050，如果要保留音频的原始采样率，使用sr = None。 y, sr = librosa.load...# offset：float，在此时间之后开始阅读(以
• librosa音频处理教程
• ## librosa音频处理库

千次阅读 2018-11-09 10:36:32
1. 名词解释 名称 含义 sr(sample_rate) 采样率,表示一秒采样多少个样本点 hop_length 步幅;...librosa.amplitude_to_db(melspec)#计算log mel 谱 参考：文献 github doc librosa paper 博客 librosa 音频处理库 - 简书
• 采样之后，生成音频时间序列 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....
• import 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学习（一 ~八）点此处](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重新采样，或禁用重新采样。采样率是每秒...
• 时间：2017-05-06 11:20:47前言本文主要记录librosa工具包的使用，librosa音频、乐音信号的分析中经常用到，是python的一个工具包，这里主要记录它的相关内容以及安装步骤，用的是python3.5以及win8.1环境。...
• 使用Librosa音频处理库和openSMILE工具包，进行简单的声学特征提取，包括韵律学特征(持续时间、短时能量、过零率、基频等)、基于谱的相关特征(MFCC特征)和声音质量特征(共振峰、频率微扰、振幅微扰)。如果您觉得有.....
• librosa库提取音频特征
• 文章目录librosa安装分析步骤读取音频提取特征Log-Mel SpectrogramMFCC绘制波形图和梅尔频谱图 librosa Librosa是一个用于音频、音乐分析、处理的python工具包，一些常见的时频处理、特征提取、绘制声音图形等功能...
• 时域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 计算...
• 向量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...
• librosa是python中用于提取音乐特征的库 一、安装 参考 https://blog.csdn.net/qq_39516859/article/details/80333431 二、
• 目录 序言 一、libsora安装 pypi conda source 二、librosa常用功能 核心音频处理函数 音频处理 频谱表示 幅度转换 时频转换 特征提取 绘图显示 ...读取音频 ...Librosa是一个用于音频...
• import 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.feature.mfcc 主要学习利用该库提取mfcct特征，望各位批评指正。 MFCCs (Mel-frequency cepstral coefficients):梅尔倒谱系数 librosa.feature.mfcc(y...y: 语音时间序列。np.ndarray [shape=(n,)] or None sr:
• 前言 本文主要记录librosa工具包的使用，librosa音频、乐音信号的分析中经常用到，是python的一个工具包，这里主要记录它的相关内容以及安装步骤，用的是python3.5以及win10环境。一、MIR简介音乐信息检索（Music...
• <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安装失败，这个问题我给官方提过，服务器没有问题，我似乎...

...