作者:桂。
時間:2017-05-04 18:31:09
鏈接:http://www.cnblogs.com/xingshansi/p/6806637.html

前言
語音識別等應用離不開音頻特征的提取,最近在看音頻特征提取的內容,用到一個python下的工具包——pyAudioAnalysis: An Open-Source Python Library for Audio Signal Analysis,該工具包的說明文檔可以點擊這里下載,對應的github鏈接點擊這里。
這個工具包原說明文檔支持的是Linux安裝,且不能與python3很好地兼容,注意啦
一、常用工具包簡介
目前針對音頻信號,C/C++ 、Python、MATLAB等常用的工具包有:

二、pyAudioAnalysis工具包簡介
pyAudioAnalysis是一個音頻處理工具包,主要功能如圖:

其中Feature Extraction包括(順序有先后):

補充說明一下:
- 1-Zero Crossing Rate:短時平均過零率,即每幀信號內,信號過零點的次數,體現的是頻率特性
- 2-Energy:短時能量,即每幀信號的平方和,體現的是信號能量的強弱
- 3-Entropy of Energy:能量熵,跟頻譜的譜熵(Spectral Entropy)有點類似,不過它描述的是信號的時域分布情況,體現的是連續性
- 4-Spectral Centroid:頻譜中心又稱為頻譜一階距,頻譜中心的值越小,表明越多的頻譜能量集中在低頻范圍內,如:voice與music相比,通常spectral centroid較低
- 5-Spectral Spread:頻譜延展度,又稱為頻譜二階中心矩,它描述了信號在頻譜中心周圍的分布狀況
- 6-Spectral Entropy:譜熵,根據熵的特性可以知道,分布越均勻,熵越大,能量熵反應了每一幀信號的均勻程度,如說話人頻譜由於共振峰存在顯得不均勻,而白噪聲的頻譜就更加均勻,借此進行VAD便是應用之一
- 7-Spectral Flux:頻譜通量,描述的是相鄰幀頻譜的變化情況
function [vsf] = FeatureSpectralFlux (X, f_s) % difference spectrum (set first diff to zero) afDeltaX = diff([X(:,1), X],1,2); % flux vsf = sqrt(sum(afDeltaX.^2))/size(X,1); end - 8-Spectral Rolloff:頻譜滾降點,給出定義:

- 9~21-MFCCs:就是大名鼎鼎的梅爾倒譜系數,這個網上資料非常多,也是非常重要的音頻特征。
- 22~33-Chroma Vector:這個有12個參數,對應就是12級音階,還是看原文解釋:A 12-element representation of the spectral energy where the bins represent the 12 equal-tempered pitch classes of western-type music (semitone spacing).
- 34-Chroma Deviation:這個就是Chroma Vector的標准方差。
這個在音樂聲里可能用的比較多,目前沒有接觸這類特征:

什么是Chroma特征呢?給出一個示意圖

code示例:
from pyAudioAnalysis import audioBasicIO
from pyAudioAnalysis import audioFeatureExtraction
import matplotlib.pyplot as plt
[Fs, x] = audioBasicIO.readAudioFile("sample.wav");
F = audioFeatureExtraction.stFeatureExtraction(x, Fs, 0.050*Fs, 0.025*Fs);
plt.subplot(2,1,1); plt.plot(F[0,:]); plt.xlabel('Frame no'); plt.ylabel('ZCR');
plt.subplot(2,1,2); plt.plot(F[1,:]); plt.xlabel('Frame no'); plt.ylabel('Energy'); plt.show()
如果希望了解更多的音頻特征,這里給出一個鏈接,點擊這里,包含的特征有:

對應都有graph、sound可以點擊,sound是對應的音頻,graph對應的是特征的效果圖,比如打開zeroCross:

三、pyAudioAnalysis工具包安裝
pyAudioAnalysis對應鏈接點擊這里。安裝這個工具包需要依賴:

A-hmmlearn安裝
hmmlearn的鏈接點擊這里。安裝hmmlearn有幾個前提:

下載之后,我把hmmlearn-master放在python-3.5.2-0\Lib\目錄,cmd窗口下cd進去,輸入:
pip install -U --user hmmlearn
即可安裝成功:

B-Simplejson工具包安裝:
Simplejson是Python的JSON編碼和解碼器,它具有簡單、快速、完整、正確和易於擴展的特點,對應的鏈接點擊這里。Simplejson工具包直接conda安裝即可:

C-eyed3安裝:
eyed3:A tool for working with audio files, specifically MP3 files containing ID3 metadata. 它提供了讀寫 ID3 標簽(v1.x 和 v2.3/v2.4)的功能。同時可檢測 MP3 文件的頭信息,包括比特率、采樣頻率和播放時間等。eyed3直接conda install沒有成功,對應的鏈接點擊這里。選擇了這個版本:

放在了python庫的Lib文件夾下:C:\Users\Nobleding\Anaconda3\pkgs\python-3.5.2-0\Lib,cd到對應目錄下,pip install 文件名.whl,即可完成安裝

D-pydub安裝:
pydub是音頻處理常用的工具包,例如:
打開一個wav格式文件:
from pydub import AudioSegment
song = AudioSegment.from_wav("never_gonna_give_you_up.wav")
打開一個mp3格式文件:
song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")
或者其他音頻、視頻格式:
ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg")
flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv")
mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma")
aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")
更多細節信息可以訪問其主頁。我在github上下載對應的工具包,里邊有對應的安裝說明。

如果處理wav文件,沒有其他要求,如果音頻是其他格式它要求電腦安裝 ffmpeg orlibav.如果沒有安裝,運行會有提示:

ffmpeg下載,選擇版本

解壓並添加環境變量,並利用ffplay測試一下打開一個mp4文件:

ffmpeg安裝成功。這個時候import pydub,不再有warning信息

E-pyAudioAnalysis安裝
Github給出的是linux下的安裝思路,這里下載之后將pyAudioAnalysis放在了\Anaconda3\Lib\site-packages文件夾下,輸入指令:

成功調用,原數據是支持Python2的,很多細節要修改,給出一個簡單讀取wav的測試:
from pyAudioAnalysis import audioBasicIO
import numpy as np
import matplotlib.pyplot as plt
[Fs, x] = audioBasicIO.readAudioFile("count2.wav");
time = np.arange(0,len(x))*1.0/Fs
plt.plot(time,x)
效果圖:
