python语音信号时频分析_librosa-madmom:音频和音乐分析

  • 读取音频

  • 提取特征Log-Mel Spectrogram

  • MFCC

  • 绘制波形图和梅尔频谱图

  • prerequisites

    • install

  • 起始点检测 onset detection tutorial

librosa

Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大

安装

pip install librosa

分析步骤

-专业名词:- sr:采样率、hop_length:帧移、overlapping:连续帧之间的重叠部分、n_fft:窗口大小、spectrum:频谱、spectrogram:频谱图或叫做语谱图、amplitude:振幅、mono:单声道、stereo:立体声

读取音频

# 加载音频
data,sample_rate = librosa.load('./test.wav')
print('data:',data.shape,'sample_rate:',sample_rate)

提取特征Log-Mel Spectrogram

  • Log-Mel Spectrogram特征是目前在语音识别和环境声音识别中很常用的一个特征,由于CNN在处理图像上展现了强大的能力,使得音频信号的频谱图特征的使用愈加广泛,甚至比MFCC使用的更多。
# 特征提取:Log-Mel Spectrogram特征
melspec = librosa.feature.melspectrogram(data, sample_rate, n_fft=1024, hop_length=512, n_mels=128)
# n_fft指的是窗的大小,这里为1024;hop_length表示相邻窗之间的距离,这里为512,也就是相邻窗之间有50%的overlap;n_mels为mel bands的数量,这里设为128
print('Mel频率的维度(频域):',melspec.shape[0],'Mel频率的时间帧长度(时域):',melspec.shape[1],'show data:',melspec)
# 转化为对数: Log-Mel Spectrogram特征是音频信号的时频表示特征。
logmelspec = librosa.power_to_db(melspec)
print('Mel频率的维度(频域):',logmelspec.shape[0],'Mel频率的时间帧长度(时域):',logmelspec.shape[1],'show data:',logmelspec)

MFCC

  • MFCC特征是一种在自动语音识别和说话人识别中广泛使用的特征
# MFCC特征是一种在自动语音识别和说话人识别中广泛使用的特征
mfccs = librosa.feature.mfcc(y=data, sr=sample_rate, n_mfcc=40)
print('mfccs',mfccs.shape,mfccs)

绘制波形图和梅尔频谱图

plt.figure()
plt.subplot(2, 1, 1)
# 绘制波形图
librosa.display.waveplot(data,sample_rate)
plt.title('beat waveform')

plt.subplot(2, 1, 2)
# 绘制频谱图
librosa.display.specshow(logmelspec, sr=sample_rate, x_axis='time', y_axis='mel')
plt.title('Mel spectrogram')
plt.tight_layout() #保证图不重叠
plt.show()

7a432ce643fae5105675b4785bbda6ec.png

madmom是什么?

  • madmom是专注于music信息抽取的一个python开发包。
  • madmom github

install

prerequisites

python=2.7+ 或python=3.5+

  • numpy>=1.13.4
  • scipy>=0.16
  • cython>=0.25
  • mido>=1.2.6
  • pytest
  • pyaudio
  • pyfftw

install

  • pip install madmom

音频信号处理

  • 读取音频数据
import numpy as np
import matplotlib.pyplot as plt
import madmom

signal,sample_rate = madmom.audio.signal.load_wave_file('data/sample.wav')
print('sample',signal,type(signal),' sample rate',sample_rate)

# 读取音频数字信号
sig = madmom.audio.signal.Signal('data/sample.wav')
print('sig',sig,' sample_rate',sig.sample_rate)

# 将信号重采样
framedsignal = madmom.audio.signal.FramedSignal(sig,frame_size=2048,hop_size=441)
print('fs',framedsignal,framedsignal.frame_size,' [0]',framedsignal[0],' [10]',framedsignal[10] ,
      ' fps',framedsignal.fps,' num_frames',framedsignal.num_frames,'hop_size',framedsignal.hop_size)


fs = madmom.audio.signal.FramedSignal(sig, frame_size=2048, fps=200)
print('fs',fs,fs.frame_size,' [0]',fs[0],' [10]',fs[10] ,
      ' fps',fs.fps,' num_frames',fs.num_frames,'fs.hop_size',fs.hop_size)
  • 短时傅里叶变换STFT
    • 声谱图:对原始信号进行分帧加窗后,可以得到很多帧,对每一帧做FFT(快速傅里叶变换),傅里叶变换的作用是把时域信号转为频域信号,把每一帧FFT后的频域信号(频谱图)在时间上堆叠起来就可以得到声谱图。
    • DCT跟FFT的关系就是:FFT是实现DCT的一种快速算法。
    • STFT短时傅里叶变换,实际上是对一系列加窗数据做FFT。
    • 采样率Fs为16KHz,表示一秒钟内采样16000个点,这个时候如果音频长度是10秒,那么raw waveform中就有160000个值,值的大小通常表示的是振幅。
    • 原始信号
    • STFT
    • DCT(离散傅里叶变换
    • 声谱图
# STFT
stft = madmom.audio.stft.STFT(fs)
print('stft',stft,type(stft),stft[0])

# 频谱图
spec = madmom.audio.spectrogram.Spectrogram(stft)
plt.imshow(spec[:, :200].T, aspect='auto', origin='lower')
plt.show()

起始点检测 onset detection tutorial

  • SuperFlux onset detection algorithm
from scipy.ndimage.filters import maximum_filter

spec = madmom.audio.spectrogram.Spectrogram('data/sample.wav')
print('spec',spec,type(spec))


# calculate the difference
diff = np.diff(spec, axis=0)
# keep only the positive differences
pos_diff = np.maximum(0, diff)
# sum everything to get the spectral flux
sf = np.sum(pos_diff, axis=1)

plt.figure()
plt.imshow(spec[:, :200].T, origin='lower', aspect='auto')
plt.show()

plt.figure()
plt.imshow(pos_diff[:, :200].T, origin='lower', aspect='auto')
plt.show()

plt.figure()
plt.plot(sf)
plt.show()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值