Python 處理 ASR(語音識別)
相關包:python_speech_features
這個庫提供了一般的用於ASR(語音識別)的語音特征,他包含了MFCCs(梅爾倒譜系數)和 filterbank energies(濾波器組能量?)。
你需要numpy和scipy來運行這個庫,這個項目的代碼保存在 https://github.com/jameslyons/python_speech_features
支持的特征:
python_speech_features.mfcc() - 梅爾倒譜系數
python_speech_features.fbank() - 濾波器組能量(?)
python_speech_features.logfbank() - 對數濾波器組能量
python_speech_features.ssc() - 子帶頻譜質心特征
使用MFCC特征:
from python_speech_features import mfcc
from python_speech_features import logfbank
import scipy.io.wavfile as wav
(rate,sig) = wav.read("file.wav")
mfcc_feat = mfcc(sig,rate)
fbank_feat = logfbank(sig,rate)
print(fbank_feat[1:3,:])
從這里你可以把特征寫入一個文件
python_speech_features模塊提供的函數
mfcc
python_speech_features.base.mfcc(signal, samplerate=16000, winlen=0.025, winstep=0.01, numcep=13, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97, ceplifter=22, appendEnergy=True, winfunc=<function
計算一個音頻信號的MFCC特征
參數:
signal - 需要用來計算特征的音頻信號,應該是一個N*1的數組
samplerate - 我們用來工作的信號的采樣率
winlen - 分析窗口的長度,按秒計,默認0.025s(25ms)
winstep - 連續窗口之間的步長,按秒計,默認0.01s(10ms)
numcep - 倒頻譜返回的數量,默認13
nfilt - 濾波器組的濾波器數量,默認26
nfft - FFT的大小,默認512
lowfreq - 梅爾濾波器的最低邊緣,單位赫茲,默認為0
highfreq - 梅爾濾波器的最高邊緣,單位赫茲,默認為采樣率/2
preemph - 應用預加重過濾器和預加重過濾器的系數,0表示沒有過濾器,默認0.97
ceplifter - 將升降器應用於最終的倒譜系數。 0沒有升降機。默認值為22。
appendEnergy - 如果是true,則將第0個倒譜系數替換為總幀能量的對數。
winfunc - 分析窗口應用於每個框架。 默認情況下不應用任何窗口。 你可以在這里使用numpy窗口函數 例如:winfunc=numpy.hamming
返回: 一個大小為numcep的numpy數組,包含着特征,每一行都包含一個特征向量。
fbank
python_speech_features.base.fbank(signal, samplerate=16000, winlen=0.025, winstep=0.01, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97, winfunc=<function
從一個音頻信號中計算梅爾濾波器能量特征
參數:
signal - 需要用來計算特征的音頻信號,應該是一個N*1的數組
samplerate - 我們用來工作的信號的采樣率
winlen - 分析窗口的長度,按秒計,默認0.025s(25ms)
winstep - 連續窗口之間的步長,按秒計,默認0.01s(10ms)
nfilt - 濾波器組的濾波器數量,默認26
nfft - FFT的大小,默認512
lowfreq - 梅爾濾波器的最低邊緣,單位赫茲,默認為0
highfreq - 梅爾濾波器的最高邊緣,單位赫茲,默認為采樣率/2
preemph - 應用預加重過濾器和預加重過濾器的系數,0表示沒有過濾器,默認0.97
winfunc - 分析窗口應用於每個框架。 默認情況下不應用任何窗口。 你可以在這里使用numpy窗口函數 例如:winfunc=numpy.hamming
返回:2個值。第一個是一個包含着特征的大小為nfilt的numpy數組,每一行都有一個特征向量。第二個返回值是每一幀的能量
logfbank
python_speech_features.base.logfbank(signal, samplerate=16000, winlen=0.025, winstep=0.01, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97)
從一個音頻信號中計算梅爾濾波器能量特征的對數
參數:
signal - 需要用來計算特征的音頻信號,應該是一個N*1的數組
samplerate - 我們用來工作的信號的采樣率
winlen - 分析窗口的長度,按秒計,默認0.025s(25ms)
winstep - 連續窗口之間的步長,按秒計,默認0.01s(10ms)
nfilt - 濾波器組的濾波器數量,默認26
nfft - FFT的大小,默認512
lowfreq - 梅爾濾波器的最低邊緣,單位赫茲,默認為0
highfreq - 梅爾濾波器的最高邊緣,單位赫茲,默認為采樣率/2
preemph - 應用預加重過濾器和預加重過濾器的系數,0表示沒有過濾器,默認0.97
返回: 一個包含特征的大小為nfilt的numpy數組,每一行都有一個特征向量
ssc
python_speech_features.base.ssc(signal, samplerate=16000, winlen=0.025, winstep=0.01, nfilt=26, nfft=512, lowfreq=0, highfreq=None, preemph=0.97, winfunc=<function
從一個音頻信號中計算子帶頻譜質心特征
參數:
signal - 需要用來計算特征的音頻信號,應該是一個N*1的數組
samplerate - 我們用來工作的信號的采樣率
winlen - 分析窗口的長度,按秒計,默認0.025s(25ms)
winstep - 連續窗口之間的步長,按秒計,默認0.01s(10ms)
nfilt - 濾波器組的濾波器數量,默認26
nfft - FFT的大小,默認512
lowfreq - 梅爾濾波器的最低邊緣,單位赫茲,默認為0
highfreq - 梅爾濾波器的最高邊緣,單位赫茲,默認為采樣率/2
preemph - 應用預加重過濾器和預加重過濾器的系數,0表示沒有過濾器,默認0.97
winfunc - 分析窗口應用於每個框架。 默認情況下不應用任何窗口。 你可以在這里使用numpy窗口函數 例如:winfunc=numpy.hamming
返回:一個包含特征的大小為nfilt的numpy數組,每一行都有一個特征向量
hz2mel
python_speech_features.base.hz2mel(hz)把一個赫茲值轉換為梅爾值
參數: hz - 一個單位為Hz的值,他也可以是一個numpy數組,轉換按元素進行
返回: 一個單位為Mels的值,如果輸入時矩陣,那么返回的也是對應大小的矩陣
mel2hz
python_speech_features.base.mel2hz(mel)
把一個梅爾值轉化為赫茲
參數:
mel - 一個單位為Mels的值,他也可以是一個numpy數組,轉換按元素進行
返回: 一個單位為Herz的值,如果輸入時矩陣,那么返回的也是對應大小的矩陣
get_filterbanks
python_speech_features.base.get_filterbanks(nfilt=20, nfft=512, samplerate=16000, lowfreq=0, highfreq=None)
計算一個梅爾濾波器組。過濾器存儲在行中,列對應於FFT箱。過濾器以大小為nfilt *(nfft/2+1)的數組返回。
參數:
nfilt - 濾波器組的濾波器數量,默認20
nfft - FFT的大小,默認512
samplerate - 我們用來工作的信號的采樣率
lowfreq - 梅爾濾波器的最低邊緣,單位赫茲,默認為0
highfreq - 梅爾濾波器的最高邊緣,單位赫茲,默認為采樣率/2
返回: 一個包含有濾波器的大小為nfilt *(nfft/2+1)的數組,每一行都有一個過濾器。
lifter
python_speech_features.base.lifter(cepstra, L=22)
將倒譜提升器應用於倒頻譜的矩陣。這具有增加高頻DCT系數的幅度的效果。
參數:
cepstra -- 梅爾倒譜矩陣,大小為numframes*numcep
L - 提升器的系數,默認22,L<=0禁用
delta
python_speech_features.base.delta(feat, N)
從特征向量序列計算delta特征。
參數:
feat - 一個大小為特征數量的numpy數組,每一行都有一個特征向量
N - 對於每一幀,計算delta特征根據前后N幀
返回:一個大小為特征數量的numpy數組,包含有delta特征,每一行都有一個delta向量
framesig
sigproc模塊提供的函數
python_speech_features.sigproc.framesig(sig, frame_len, frame_step, winfunc=<function
將信號框成重疊幀。
參數:
sig - 音頻信號幀
frame_len - 樣品中每一幀的長度
frame_step - 下一幀開始后前一幀開始后的樣本數。
winfunc - 分析窗口應用於每個框架。 默認情況下不應用任何窗口。
stride_trick - 使用步長技巧快速計算滾動窗口和窗口倍增
返回:一個幀的數組,大小是frame_len
deframesig
python_speech_features.sigproc.deframesig(frames, siglen, frame_len, frame_step, winfunc=<function
使用重疊添加過程撤消了frameig操作。
參數:
frames - frames的數組
siglen - 所需信號的長度,如果未知,則使用0。輸出將被截斷到siglen樣本。
frame_len - 樣品中每一幀的長度
frame_step - 下一幀開始后前一幀開始后的樣本數。
winfunc - 分析窗口應用於每個框架。 默認情況下不應用任何窗口。
返回: 一個1維信號
magspec
python_speech_features.sigproc.magspec(frames, NFFT)
計算幀中每個幀的幅度譜。如果幀是NxD矩陣,輸出將是Nx(NFFT/2+1)。
參數:
frames - frames的數組,每一行就是一幀
NFFT - 使用的FFT長度。如果NFFT>幀長度,幀就是零填充的。
返回:如果幀是ND矩陣,輸出將是N(nfft/2+1)。每一行都是相應幀的幅度譜。
python_speech_features.sigproc.powspec(frames, NFFT)
計算幀中每個幀的功率譜。如果幀是NXD矩陣,輸出將是NX(NFFT/2+1)。
參數:
frames - frames的數組,每一行就是一幀
NFFT - 使用的FFT長度。如果NFFT>幀長度,幀就是零填充的。
返回:如果幀是ND矩陣,輸出將是N(nfft/2+1)。每一行都是相應幀的功率譜。
logpowspec
python_speech_features.sigproc.logpowspec(frames, NFFT, norm=1)
計算幀中每個幀的對數功率譜。如果幀是NXD矩陣,輸出將是NX(NFFT/2+1)。
參數:
frames - frames的數組,每一行就是一幀
NFFT - 使用的FFT長度。如果NFFT>幀長度,幀就是零填充的。
norm - 如果范數=1,則對數功率譜被歸一化,使得最大值(跨越所有幀)為0。
返回:如果幀是ND矩陣,輸出將是N(nfft/2+1)。每一行都是相應幀的對數功率譜。
preemphasis
python_speech_features.sigproc.preemphasis(signal, coeff=0.95)
對輸入信號進行預加重。
參數:
signal - 過濾器的信號
coeff - 預加重系數,0為無,默認0.95
返回:濾波后的信號