sidekit中GMM-UBM中speaker-adaptation部分

本文深入剖析sidekit库在GMM-UBM模型中的说话人自适应调整过程,包括accumulate_stat()和adapt_mean_map_multisession()两个关键方法。文章强调理解numpy矩阵运算加速技巧,并探讨了仅更新一次speaker model就能得到良好结果的现象,同时欢迎读者分享其他框架的实现方式或指正错误。
摘要由CSDN通过智能技术生成

----2016.12.18 已补充 ----
sidekit还是挺不错的,很简单,文档更是直接把源码给你,如果能顺利搭好环境,如果有基础的话,一天之内跑通应该是没有问题的。
下面开始对GMM-UBM中说话人自适应调整以及计算得分进行详细的分析,其中也会有代码改写的部分,因为那么多h5文件,看着挺烦的, 在看下面之前首先保证已经熟悉了sidekit, 并且对里边的h5文件的格式都很清楚,否则没有必要继续往下看。

下面这是自适应部分的源码,utils是自己写的,gmm-score 和 EER 部分暂时请忽略,后面会涉及到,重点看MAP部分:

import sidekit
import numpy as np
from utils import EER, gmm_score
import h5py

'''
this stand version can run the predicted result
'''
enroll_idmap = sidekit.IdMap('task/enroll_spks2utt.h5')
ubm = sidekit.Mixture()
ubm.read("task/ubm.h5")
nj = 10

server_eval = sidekit.FeaturesServer(feature_filename_structure="./mfcc_eval/{}.h5",
                                     dataset_list=["energy", "cep", "vad"],
                                     mask=None,
                                     feat_norm="cmvn",
                                     keep_all_features=False,
                                     delta=True,
                                     double_delta=True,
                                     rasta=True,
                                     context=None)

print('Compute the sufficient statistics')
enroll_stat = sidekit.StatServer(enroll_idmap, ubm)
enroll_stat.accumulate_stat(ubm=ubm, feature_server=server_eval,\ seg_indices=range(enroll_stat.segset.shape[0]), num_thread=nj)
enroll_stat.write('task/stat_enroll_stand.h5')

print('MAP adaptation of the speaker models')

regulation_factor = 3  # MAP regulation factor
enroll_sv = enroll_stat.adapt_mean_map_multisession(ubm, regulation_factor)
enroll_sv.write('task/map_enroll_stand.h5')


print('Compute trial scores')
enroll = sidekit.StatServer('task/map_enroll_stand.h5')

s = np.zeros((59, 1024))

gscore = gmm_score(ubm, enroll, server_eval, s)
scores = gscore.compute_scores()

eer = EER(scores)
eer.compute_eer()

上面这段主要是两个方法一个是计算统计量accumulate_stat(), 还有一个是MAP部分更新统计量adapt_mean_map_multisession(), 下面分别看一下这两个方法,其中有写参数传递跟源码不太一样,本来想重写,但是写的不如人家好:

    
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值