用 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​+11​logp(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∈Q​p(o∣q)p(q)p(o∣p)p(p)​≈∑q∈Q​p(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∈Q​LPP(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​+11​t=ts​∑te​​logp(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
  1. 拉取最新的 kaldi 代码
  2. 根据 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
  1. 验证是否安装成功,如果执行 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 保姆级实战指南相关推荐

  1. 纯小白实践ORB-SLAM2保姆级运行指南

    一.前记 此篇为博采众家博客之长,沥血整理之集大成者 本人大一学生,参加了SLAM相关的年度项目,第一步便是需要实践ORB-SLAM,在电脑上运行程序并完成可视化与实时化.预实验是跑现成的数据集,正式 ...

  2. 废弃fastjson!大型项目迁移Gson保姆级实战

    前言 本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson. 这么做的主要的原因是公司受够了fastjson频繁的安全漏洞问题,每 ...

  3. 【Python】2500块的外包项目,一款加密的直播引流软件,逆向JavaScript,保姆级实战教学!

    目录 前言 分析(x0) 分析(x1) 分析(x2) 代码 效果 结语 前言 告知:本人所有文章,禁止转载. 大家好,我叫善念.连续更新了8篇原创文章了,可也见不到什么反响.也许是我发的文章内容过于简 ...

  4. Servlet终极保姆级入门指南

    文章目录 一.Servlet概述 1.1.Servlet是什么 1.2.Servlet的示范 1.3.常见错误 1.3.1.url-pattern 中配置的路径没有以斜杠打头 1.3.2.servle ...

  5. 小红书保姆级投放指南 | 助力引爆618

    5月到来,618营销正式进入放量冲刺期,作为年中重量级营销节点,各大品牌角逐激烈. 本期千瓜推出618投放指南,助力品牌在冲刺期抢占用户心智.抓住高转化周期流量,打赢这场无硝烟之战. 整体节奏把控 四 ...

  6. Linux挂载新硬盘【保姆级教程】

    目录 写在前面 Get服务器的IP地址.账密 保姆级挂载指南 设置开机自动挂载硬盘 写在前面 [注意]你的电脑连接学校的无线网或者通过学校的网线端口上网,否则你是连不上学校服务器,也不能运行代码!!! ...

  7. 【强化学习实战-04】DQN和Double DQN保姆级教程(2):以MountainCar-v0

    [强化学习实战-04]DQN和Double DQN保姆级教程(2):以MountainCar-v0 实战:用Double DQN求解MountainCar问题 MountainCar问题详解 Moun ...

  8. 数仓建设保姆级教程,离线和实时一网打尽(理论+实战)

    本文大纲: 因内容较多,带目录的PDF查看是比较方便的,点击下方链接获取完整PDF版: 数仓建设保姆级教程PDF文档 一.数仓基本概念 1. 数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先 ...

  9. 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下

    文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...

最新文章

  1. Antd-Design List渲染列中Button 点击事件 传递参数
  2. CentOS7 系统基于Vim8搭建Go语言开发环境
  3. 问题 C: 完美的数(思维)
  4. Node.js 函数
  5. iOS API离线文档下载和查阅
  6. linux下使用pidcat找bug
  7. JavaScript 计时器
  8. PJSIP学习笔记——PJSUA层发起呼叫的主要流程
  9. weakhashmap_Java WeakHashMap keySet()方法与示例
  10. Linux Vim三种工作模式(命令模式、输入模式和编辑模式)详解
  11. 查找数组中被删除的一个元素
  12. 分布式常见面试题整理
  13. CAD图纸管理,CAD图纸高效的管理解决方案
  14. Camtasia2020注册机顶级屏幕录像视频编辑软件安装教程
  15. java使用代理请求https
  16. 小波变换在图像分割中的应用
  17. 国产处理器性能再提升,与Intel差距不大,替代时机日益接近
  18. HTML页面添加背景音乐
  19. 谈国际政治经济与升斗小民
  20. 多伦多大学计算机科学选课,多伦多大学选课攻略 帮你彻底摆脱选课恐惧症!(内含福利)...

热门文章

  1. 人为什么要设定长期目标?
  2. php新窗口打开,php如何跳转新窗口
  3. yolo数据集的制作教程之海绵宝宝数据集的制作
  4. 优酷背后的大数据秘密【大数据开发实战技术】
  5. 第五九九章 大力的互联网帝国
  6. mui刷新当前页面和返回当前页面刷新处理
  7. 在计算机中级培训前的讲话,在电脑培训班上的讲话
  8. 社保掌上通服务器维护,社保掌上通怎么查不了?开通了社保服务的城市有哪些?...
  9. 2013年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——解析版
  10. 剧情反转,国产机创新不断,苹果无奈降价不断