当前位置:   article > 正文

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

python librosa频谱图
  • 读取音频

  • 提取特征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的数量,这里设为128print('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(211)# 绘制波形图librosa.display.waveplot(data,sample_rate)plt.title('beat waveform')plt.subplot(212)# 绘制频谱图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 npimport matplotlib.pyplot as pltimport madmomsignal,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(离散傅里叶变换
    • 声谱图
# STFTstft = 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_filterspec = madmom.audio.spectrogram.Spectrogram('data/sample.wav')print('spec',spec,type(spec))# calculate the differencediff = np.diff(spec, axis=0)# keep only the positive differencespos_diff = np.maximum(0, diff)# sum everything to get the spectral fluxsf = 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()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/134311
推荐阅读
相关标签
  

闽ICP备14008679号