• 大小: 35KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: C/C++
  • 标签: 语音识别  MFCC  

资源简介

项目包含全部的代码,实现wav格式的语音信号的MFCC特征提取。

资源截图

代码片段和文件信息

#coding=utf-8
#计算每一帧的MFCC系数

import numpy as np
from preprocessing import audio2frame
from preprocessing import pre_emphasis
from preprocessing import spectrum_power
from scipy.fftpack import dct
import myplot
import math

#适配3.x版本的xrange
try:
    xrange(1)
except:
    xrange=range

def envelope(x):
    n=len(x)
    env=np.zeros(n)
    for i in range(n):
        j=max(0 i-5)
        k=min(i+5 n-1)
        env[i]=np.mean(x[j:k])
    return env

def fbank(signal samplerate=16000 win_length=0.025 win_step=0.01 filters_num=26 NFFT=512 \
    low_freq=0 high_freq=None pre_emphasis_coeff=0.97):
    ‘‘‘
    计算音频信号的经过梅尔三角滤波的能量谱
    参数说明:
    samplerate:采样频率
    win_length:窗长度,每一帧的时间间隔
    win_step:窗间隔
    filters_num:梅尔滤波器个数
    NFFT:FFT采样点个数
    low_freq:最低频率
    high_freq:最高频率
    pre_emphasis_coeff:预加重系数
    ‘‘‘
    high_freq=high_freq or samplerate/2 #计算音频样本的最大频率
    signal_emp=pre_emphasis(signal pre_emphasis_coeff)#预加重处理
    raw_spectrum=np.absolute(np.fft.fft(signal))
    emp_spectrum=np.absolute(np.fft.fft(signal_emp))
    #画出预加重前后的频域图
    myplot.plot_spectrum(10*np.log10(raw_spectrum) 10*np.log10(emp_spectrum) samplerate)

    #画出原始和预加重之后的时域图
    myplot.plot_signal1(signal signal_emp samplerate)

    frames=audio2frame(signal_emp win_length*samplerate win_step*samplerate)#得到帧数组
    #画出分帧之后的每一帧加上hamming窗之后的时域图,在此之前,在audio2frame中会先将原始的frame画出来
    myplot.plot_frames(frames np.shape(frames)[0] np.shape(frames)[1])
    #myplot.plot_hamming(frames[77:])

    spec_power=spectrum_power(frames NFFT)#得到每一帧的能量谱
    env=envelope(spec_power[1 :])
    #画出某一帧的频谱包络图,这里选取第一帧
    myplot.plot_envelope(10*np.log10(spec_power[1 :]) 10*np.log10(env) NFFT samplerate)

    energy=np.sum(spec_power 1)#对每一帧的能量谱求和
    energy=np.where(energy==0 np.finfo(float).eps energy)#对能量为0的地方调整为eps, 方便进行对数处理
    #画出每一帧没有经过滤波器组的功率谱和热图
    myplot.plot_power_before_mel(10*np.log10(spec_power) NFFT np.shape(frames)[0] samplerate)
    #myplot.plot_power_heatmap_before_mel(10*np.log10(spec_power))

    fb freq_point=get_filter_banks(filters_num NFFT samplerate low_freq high_freq)#获得每一个滤波器的频率宽度
    #画出滤波器组的形状
    myplot.plot_fbank(fb NFFT filters_num samplerate)

    feat=np.dot(spec_power fb.T)#对滤波器和能量谱进行点乘
    #得到num_frames*num_filter大小的矩阵,也就是得到了每一帧用滤波器组计算(将能量用滤波器进行加重)之后的结果
    feat=np.where(feat==0 np.finfo(float).eps feat)#同样不能出现0
    #画出经过滤波器组滤波的每一帧功率谱,注意这个时候的频率标度已经不是线性的了,是按照滤波器中心频率来标的
    myplot.plot_power_after_mel(freq_point np.arange(0 np.shape(frames)[0] 1) 10*np.log10(feat))
    return feat energy

def get_filter_banks(filters_num=20 NFFT=512 samplerate=16000 low_freq=0 high_freq=None):
    ‘‘‘
    计算梅尔三角间距滤波器,该滤波器在第一个和第三个频率处为0,在第二个频率处为1
    参数说明:
    filters_num: 滤波器个数
    NFFT:FFT的总计的个数
    samplerate:采样频率
    low_freq:最低频率
    high_freq:最高频率
    ‘‘‘
    #首先,将频率hz转化为梅尔频率,因为人耳分辨声音的大小与频率并非线性正比,所以化为梅尔频率再线性分割
    low_mel=hz2mel(low_freq)
    high_mel=hz2mel(high_freq)
    #需要在low_mel和high_mel之间等间距插入filters_num个点,一个filters_num+2个点

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       9378  2018-03-20 21:46  code\calcmfcc.py

     文件       4639  2018-03-20 22:20  code\myplot.py

     文件       5251  2018-03-20 10:04  code\preprocessing.py

     文件        313  2018-03-20 10:05  code\test.py

     文件      41964  2018-03-17 23:29  code\test.wav

     目录          0  2018-03-21 08:30  code

----------- ---------  ---------- -----  ----

                61545                    6


评论

共有 条评论