基于MFCC的语音评测方法
基于MFCC的语音评测方法
木易火山 发表于2年前
基于MFCC的语音评测方法
  • 发表于 2年前
  • 阅读 1923
  • 收藏 46
  • 点赞 0
  • 评论 5

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 通过改良DTW算法优化了发音检查的准确度,从原来的60%优化到99%

1、原来的方案:

(1)采用MFCC(梅尔倒谱)作为音频的特征

(2)采用DTW算法计算两段音频的距离,然后根据距离判断这两个音频是否是同一个音

方案的问题:经过实际数据验证,发现不同人读相同内容,计算出的距离会比较大。可能是因为我们对于MFCC每个维度的特征是同等对待的,有些特征可能是跟发音人者的音色相关度比较大,跟内容相关度小。

2、优化的方案:

根据之前的猜测,我们假设对于某个音节,可能有几个维度的特征跟其他音节差别特别大,我们需要找到这几个特征。基于这个假设,我们采用穷举法从13个特征中找到最能区分音节的特征组合。

代码如下:

# -*- coding: utf-8 -*-
import os
import numpy as np
from scikits.audiolab import wavread
import scikits.talkbox
import fastdtw
from scikits.talkbox import features
from scikits.talkbox.features import mfcc
weight=[0,1,1,1,1,1,1,1,1,1,1,1,1]
fdict={}
def getfeature(x):
    if(fdict.has_key(x)):
        return fdict[x]        
    else:
        data, fs, enc=wavread(x)
        temp=mfcc(data)[0]    
        fdict[x]=temp
        return temp
    
def mydist(a, b):
    i_dist=0
    i_len=0
    for i in range(13):
        if(weight[i]>0):
            i_dist=i_dist+abs(a[i]-b[i])
            i_len=i_len+1
    return i_dist/i_len
    
def dist(mf1, mf2):    
    re=fastdtw.fastdtw(mf1, mf2, 1, mydist)[0]
    return re
        
def calcsimilar(x, y):
    fx=getfeature(x)    
    fy=getfeature(y)    
    d = dist(fx, fy)
    return d
    
# 获取指定路径下所有指定后缀的文件
# dir 指定路径
# ext 指定后缀,链表&不需要带点 或者不指定。例子:['xml', 'java']
def GetFileFromThisRootDir(rootdir,filelist):        
    for i in os.listdir(rootdir):
        filepath = os.path.join(rootdir,i)
        if os.path.isdir(filepath):
            GetFileFromThisRootDir(filepath, filelist)
        elif i.endswith('.wav') and os.path.exists(filepath):
            filelist.append(filepath)
def calcfactor(path, name, template):
    ftemplate=getfeature(template)
    files=[]
    min_dist=999999
    max_dist=0
    GetFileFromThisRootDir(path, files)
    for filename in files:
        f=getfeature(filename)
        d=dist(f,ftemplate)
        if name+".wav" in filename:                        
            if(d>max_dist):
                max_dist=d
        else:
            if(d<min_dist):
                min_dist=d
    return (min_dist-max_dist)/max_dist
                
def train(path, name, template):    
    dist=-99999
    re_i=-1
    re_j=-1
    re_m=-1
    re_n=-1
    for n in range(13):
        for m in range(13):
            for i in range(13):
                for j in range(13):
                    for k in range(13):
                        weight[k]=1
                    weight[i]=0
                    weight[j]=0
                    weight[m]=0
                    weight[n]=0
                    d=calcfactor(path, name, template)
                    print d
                    if(d>dist):
                        dist=d
                        re_i=i
                        re_j=j   
                        re_m=m   
                        re_n=n          
    return dist, re_i, re_j, re_m, re_n
标签: DTW MFCC 音频识别
共有 人打赏支持
粉丝 3
博文 16
码字总数 8873
评论 (5)
久永
我必须承认,我把“发音”看成了“发育”。。。。
——怎么会有这种情况出现?3
紫电清霜

引用来自“久永”的评论

我必须承认,我把“发音”看成了“发育”。。。。
——怎么会有这种情况出现?3
你懂的
天命剑主
我必须承认,我把“发音”看成了“发育”。。。。
——怎么会有这种情况出现?
优雅先生

引用来自“久永”的评论

我必须承认,我把“发音”看成了“发育”。。。。
——怎么会有这种情况出现?3
我也是。。。
小春罗罗
我看成是否发育了。。。
×
木易火山
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: