发音测评 kaldi compute gop 保姆级实战指南
用 kaldi 计算gop得分
- 用 kaldi 计算gop得分
- 计算原理
- 计算流程
- 动手实做
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明,违反必究。
本文链接:https://blog.csdn.net/junxing2018_wu/article/details/126334989
用 kaldi 计算gop得分
计算原理
该部分参考 kalid官方操作指南
- GOP-GMM
在传统的基于GMM-HMM的系统中,GOP最早是在(Witt et al., 2000)中提出的。
它被定义为标准化后对数时段后验概率(the duration normalised log of the posterior)
G O P ( p ) = 1 t e − t s + 1 l o g p ( p ∣ o ) GOP(p) = \frac {1} {t_e - t_s + 1} log {p(p|o)} GOP(p)=te−ts+11logp(p∣o)
这里的 o o o是输入观测值, p p p是规范发音音素, t s t_s ts, t e t_e te 代表开始和结束的帧索引
这里假设对于任意的 q i q_i qi, q j q_j qj,
p ( q i ) ≈ p ( q j ) p(q_i) \approx p(q_j) p(qi)≈p(qj)
我们有
l o g p ( p ∣ o ) = p ( o ∣ p ) p ( p ) ∑ q ∈ Q p ( o ∣ q ) p ( q ) ≈ p ( o ∣ p ) ∑ q ∈ Q p ( o ∣ q ) log p(p|o) = \frac {p(o|p)p(p)} {\sum_{q \in Q} {p(o|q)p(q)}} \approx \frac {p(o|p)} {\sum_{q \in Q} {p(o|q)}} logp(p∣o)=∑q∈Qp(o∣q)p(q)p(o∣p)p(p)≈∑q∈Qp(o∣q)p(o∣p)
这里的 Q Q Q表示所有phone音素集合
等式的分子是从强制对齐结果计算出来的,而分母是从具有不受约束的音素循环的维特比解码中计算出来的。
Kaldi 没有为我们实现 GOP-GMM,因为 GOP-NN 的性能比 GOP-GMM 好得多。
- GOP-NN
GOP-NN的定义与 GOP-GMM 有点不同。GOP-NN 定义为规范音素与得分最高的音素之间的对数音素后验比率(Hu et al., 2015)。
首先,我们定义 Log Phone Postterior (LPP):
L P P ( p ) = l o g p ( p ∣ o ; t s , t e ) LPP(p) = log p(p|o; t_s, t_e) LPP(p)=logp(p∣o;ts,te)
然后我们使用LPP定义 GOP-NN:
G O P ( p ) = l o g L P P ( p ) m a x q ∈ Q L P P ( q ) GOP(p) = log {\frac {LPP(p)} {max_{q \in Q} LPP(q)}} GOP(p)=logmaxq∈QLPP(q)LPP(p)
LPP 可以计算为:
L P P ( p ) ≈ 1 t e − t s + 1 ∑ t = t s t e l o g p ( p ∣ o t ) LPP(p) \approx \frac {1} {t_e - t_s + 1} {\sum_{t=t_s}^{t_e} log{p(p|o_t)}} LPP(p)≈te−ts+11t=ts∑telogp(p∣ot)
p ( p ∣ o t ) = ∑ s ∈ p p ( s ∣ o t ) p(p|o_t) = \sum_{s \in p} {p(s|o_t)} p(p∣ot)=s∈p∑p(s∣ot)
where s s s is the senone label, s ∣ s ∈ p s|s∈p s∣s∈p is the states belonging to those triphones whose current phone is p p p.
这里 s s s表示senone标记, s ∣ s ∈ p s|s∈p s∣s∈p 是当前音素是 p p p时的那些三音素的状态
- Phone-level Feature
通常,基于分类器的方法比基于gop的方法性能更好
和基于gop的方法不同,需要额外的监督训练过程。监督训练的输入特征是phone级别的分段特征。
phone级别的特征定义为:
[ L P P ( p 1 ) , … , L P P ( p j ) , … , L P P ( p M ) , L P R ( p 1 ∣ p i ) , … , L P R ( p j ∣ p i ) , … , L P R ( p M ∣ p i ) ] [LPP(p_1), \dots, LPP(p_j), \dots, LPP(p_M), LPR(p_1|p_i), \dots, LPR(p_j|p_i), \dots, LPR(p_M|p_i)] [LPP(p1),…,LPP(pj),…,LPP(pM),LPR(p1∣pi),…,LPR(pj∣pi),…,LPR(pM∣pi)]
这里 M M M 是所有phone音素集合
其中 phone p j p_j pj 和 phone p i p_i pi 之间的对数后验概率比率(
Log Posterior Ratio (LPR))定义为:
L P R ( p j ∣ p i ) = l o g p ( p j ∣ o ; t s , t e ) − l o g p ( p i ∣ o ; t s , t e ) LPR(p_j|p_i) = log p(p_j|o;t_s, t_e) - log p(p_i|o;t_s, t_e) LPR(pj∣pi)=logp(pj∣o;ts,te)−logp(pi∣o;ts,te)
计算流程
- load_wav : 加载音频(16k wav)
- make_mfcc.sh : 提取 MFCC 特征(frame_size, 40)
- extract_ivectors : 提取 ivector 特征(暂时不能理解为啥gop需要说话人信息)
- compute_output.sh :
- align_mapped.sh : 每帧映射到 transition-id (三音素ID)
- ali-to-phones : 每帧映射到 phone-id
- compute-gop : [纯音素-id + LPPs + LPRs]
动手实做
- 安装kaldi
- 拉取最新的 kaldi 代码
- 根据 INSTALL 说明,进行编译,基本都能顺利成功
python 版本需要注意,默认使用python2.7,可以指定为常用的python3版本
可能系统默认gcc 版本不支持,可以通过指定gcc的版本进行编译,例如,CXX=g++-6 extras/check_dependencies.sh make depend CC=gcc-6 CPP=g++-6 CXX=g++-6 LD=g++-6 make CC=gcc-6 CPP=g++-6 CXX=g++-6 LD=g++-6 -j 8
- 验证是否安装成功,如果执行
compute-gop --help
看到如下信息kaldi就安装成功啦~ Congratulations~~~
$ compute-gop --helpCompute Goodness Of Pronunciation (GOP) from a matrix of probabilities (e.g. from nnet3-compute).
Usage: compute-gop [options] <model> <alignments-rspecifier> <prob-matrix-rspecifier> <gop-wspecifier> [<phone-feature-wspecifier>]
e.g.:nnet3-compute [args] | compute-gop 1.mdl ark:ali-phone.1 ark:- ark:gop.1 ark:phone-feat.1Options:--log-applied : If true, assume the input probabilities have been applied log. (bool, default = true)--phone-map : File name containing old->new phone mapping (each line is: old-integer-id new-integer-id) (string, default = "")--skip_phones_string : Do not write features and gops for those phones (string, default = "0")Standard options:--config : Configuration file to read (this option may be repeated) (string, default = "")--help : Print out usage message (bool, default = false)--print-args : Print the command line arguments (to stderr) (bool, default = true)--verbose : Verbose level (higher->more logging) (int, default = 0)
- 准备需要的python包
pip install kaldi-io==0.9.4 kaldiio==2.17.2 imblearn -i https://pypi.tuna.tsinghua.edu.cn/simple
```
- 使用开源数据 speechocean762 测试计算gop分数
```bash
# 进入到工作目录
```
$ cd $KALDI_ROOT/egs/gop_speechocean762/s5/# 把假命令替换成真命令
$ rm -f step
$ cp -r ../../wsj/s5/steps .
$ rm -f utils
$ cp -r ../../wsj/s5/utils .
$ rm -f local/feat_to_score_train.py
$ cp local/tuning/feat_to_score_train_1c.py local/feat_to_score_train.py
$ rm -f utils/run.pl
$ cp utils/parallel/run.pl utils/# 执行gop计算
$ chmod 777 run.sh
$ ./run.sh
...
steps/align_mapped.sh: done aligning data.
The features are visualized and saved in exp/gop_train/feats.png
MSE: 0.70
Corr: 0.23precision recall f1-score support0 0.24 0.31 0.27 14121 0.05 0.78 0.09 18602 0.99 0.36 0.53 44097accuracy 0.37 47369macro avg 0.43 0.48 0.30 47369
weighted avg 0.93 0.37 0.50 47369
# 看到这里 恭喜您已经完成了本次实验。
```
发音测评 kaldi compute gop 保姆级实战指南相关推荐
- 纯小白实践ORB-SLAM2保姆级运行指南
一.前记 此篇为博采众家博客之长,沥血整理之集大成者 本人大一学生,参加了SLAM相关的年度项目,第一步便是需要实践ORB-SLAM,在电脑上运行程序并完成可视化与实时化.预实验是跑现成的数据集,正式 ...
- 废弃fastjson!大型项目迁移Gson保姆级实战
前言 本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson. 这么做的主要的原因是公司受够了fastjson频繁的安全漏洞问题,每 ...
- 【Python】2500块的外包项目,一款加密的直播引流软件,逆向JavaScript,保姆级实战教学!
目录 前言 分析(x0) 分析(x1) 分析(x2) 代码 效果 结语 前言 告知:本人所有文章,禁止转载. 大家好,我叫善念.连续更新了8篇原创文章了,可也见不到什么反响.也许是我发的文章内容过于简 ...
- Servlet终极保姆级入门指南
文章目录 一.Servlet概述 1.1.Servlet是什么 1.2.Servlet的示范 1.3.常见错误 1.3.1.url-pattern 中配置的路径没有以斜杠打头 1.3.2.servle ...
- 小红书保姆级投放指南 | 助力引爆618
5月到来,618营销正式进入放量冲刺期,作为年中重量级营销节点,各大品牌角逐激烈. 本期千瓜推出618投放指南,助力品牌在冲刺期抢占用户心智.抓住高转化周期流量,打赢这场无硝烟之战. 整体节奏把控 四 ...
- Linux挂载新硬盘【保姆级教程】
目录 写在前面 Get服务器的IP地址.账密 保姆级挂载指南 设置开机自动挂载硬盘 写在前面 [注意]你的电脑连接学校的无线网或者通过学校的网线端口上网,否则你是连不上学校服务器,也不能运行代码!!! ...
- 【强化学习实战-04】DQN和Double DQN保姆级教程(2):以MountainCar-v0
[强化学习实战-04]DQN和Double DQN保姆级教程(2):以MountainCar-v0 实战:用Double DQN求解MountainCar问题 MountainCar问题详解 Moun ...
- 数仓建设保姆级教程,离线和实时一网打尽(理论+实战)
本文大纲: 因内容较多,带目录的PDF查看是比较方便的,点击下方链接获取完整PDF版: 数仓建设保姆级教程PDF文档 一.数仓基本概念 1. 数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先 ...
- 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下
文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...
最新文章
- Antd-Design List渲染列中Button 点击事件 传递参数
- CentOS7 系统基于Vim8搭建Go语言开发环境
- 问题 C: 完美的数(思维)
- Node.js 函数
- iOS API离线文档下载和查阅
- linux下使用pidcat找bug
- JavaScript 计时器
- PJSIP学习笔记——PJSUA层发起呼叫的主要流程
- weakhashmap_Java WeakHashMap keySet()方法与示例
- Linux Vim三种工作模式(命令模式、输入模式和编辑模式)详解
- 查找数组中被删除的一个元素
- 分布式常见面试题整理
- CAD图纸管理,CAD图纸高效的管理解决方案
- Camtasia2020注册机顶级屏幕录像视频编辑软件安装教程
- java使用代理请求https
- 小波变换在图像分割中的应用
- 国产处理器性能再提升,与Intel差距不大,替代时机日益接近
- HTML页面添加背景音乐
- 谈国际政治经济与升斗小民
- 多伦多大学计算机科学选课,多伦多大学选课攻略 帮你彻底摆脱选课恐惧症!(内含福利)...