机器环境:cpu+ubuntu16.04+24g内存,8g内存训练会出错,只能训练出单音节模型。

kaldi的编译源码直接在Github上clone下来<https://github.com/kaldi-asr/kaldi>。介绍下如下的几个目录:

  1. tools/: 主要存放了 Kaldi 依赖的包已经各种工具,如:OpenFST, ATLAS, IRSTLM, sph2pipe 等等。
  2. src/: Kaldi 的源代码;
  3. egs/: 为各种示例项目和代码;

安装:

  1. 详细的安装过程和指令可以参考 ./INSTALL, src/INSTALL, 以及 tools/INSTALL。编译 tools 和 src 之前,可以先执行 tools/extras/check_dependencies.sh 来查看需要安装哪些依赖。并且安装相关依赖包。<python指定2.7版本,参考https://www.cnblogs.com/Yanfang20180701/p/10588087.html>
  2. 在./tool目录下输入make,开始编译,输入make -j 4命令可以加快速度(多核并行处理)。
  3. 之后切换到./src目录下,输入./configure进行配置,然后输入make all进行编译。当然这个过程也可以并行处理加速,输入make -j 4。经过漫长的编译过程以后,就安装完毕了。

thchs30数据

数据下载链接:https://www.openslr.org/18/,thchs30,是清华大学提供的30个小时的中文语料库,包含以下文件

  • data_thchs30.tgz, 6.4G, sppech data and transcripts
  • test_noise.tgz, 1.9G, standard 0db noisy test data
  • resource.tgz, 24M, supplementary resources, incl. lexicon for training data, noise samples

下载之后全部解压到/home/chen/work/voice/kaldi/egs/thchs30/s5/thchs30-openslr/下(thchs30-openslr自己建的文件夹)

drwxrwxr-x 6 chen chen 4096 12月 24 09:41 ./
drwxrwxr-x 9 chen chen 4096 12月 26 18:18 ../
drwxrwxr-x 8 chen chen 4096 12月 18 17:49 data_thchs30/
drwxr-xr-x 4 chen chen 4096 1月  25  2016 resource/
drwxr-xr-x 5 chen chen 4096 1月  25  2016 test-noise/

训练

打开s5下的cmd.sh脚本,注释掉queue.pl执行方式,修改如下:export train_cmd=run.pl
export decode_cmd="run.pl --mem 4G"
export mkgraph_cmd="run.pl --mem 8G"
export cuda_cmd="run.pl --gpu 1"
#export train_cmd=queue.pl
#export decode_cmd="queue.pl --mem 4G"
#export mkgraph_cmd="queue.pl --mem 8G"
#export cuda_cmd="queue.pl --gpu 1"

继续打开 run.sh,修改 thchs30 语料库的路径:

#corpus and trans directory
#thchs=/nfs/public/materials/data/thchs30-openslr
thchs=/home/chen/wxingqiuork/voice/kaldi/egs/thchs30/s5/thchs30-openslr

在run.sh注释掉用DNN训练模型,因为默认 DNN 是用 GPU 来跑的,然后执行thchs30/s5/run.sh 的脚本,该脚本包含了整个训练过程中需要执行的各种命令,执行时间大概十多个小时。

从日志的输出也可以看出整个训练过程大致包括数据准备、monophone 单因素训练(steps/train_mono.sh)、tri1 三因素训练(steps/train_deltas.sh)、tri2 进行 lda_mllt 特征变换(steps/train_lda_mllt.sh)、tri3b 进行 sat 自然语言适应(step/train_sat.sh)、tri4b 进行 quick 训练(step/train_quick.sh),之后就是 DNN 训练。

模型位子

下面看下 tri1,因为下面的示例会以 tri1 模型来识别。

chen@chen:tri1[master*]$ ls -l
总用量 66176
-rw-rw-r-- 1 chen chen  3435133 12月 26 11:59 35.mdl
-rw-rw-r-- 1 chen chen     8326 12月 26 11:59 35.occs
-rw-rw-r-- 1 chen chen  1524364 12月 26 11:59 ali.1.gz
-rw-rw-r-- 1 chen chen  1495302 12月 26 11:59 ali.2.gz
-rw-rw-r-- 1 chen chen  1655834 12月 26 11:59 ali.3.gz
-rw-rw-r-- 1 chen chen  1533052 12月 26 11:59 ali.4.gz
-rw-rw-r-- 1 chen chen        1 12月 26 11:56 cmvn_opts
drwxrwxr-x 4 chen chen     4096 12月 26 13:15 decode_test_phone
drwxrwxr-x 4 chen chen     4096 12月 26 12:42 decode_test_word
lrwxrwxrwx 1 chen chen        6 12月 26 11:59 final.mdl -> 35.mdl
lrwxrwxrwx 1 chen chen        7 12月 26 11:59 final.occs -> 35.occs
-rw-rw-r-- 1 chen chen 14109331 12月 26 11:56 fsts.1.gz
-rw-rw-r-- 1 chen chen 13876553 12月 26 11:56 fsts.2.gz
-rw-rw-r-- 1 chen chen 15234357 12月 26 11:56 fsts.3.gz
-rw-rw-r-- 1 chen chen 14475131 12月 26 11:56 fsts.4.gz
drwxrwxr-x 3 chen chen     4096 12月 26 12:43 graph_phone
drwxrwxr-x 3 chen chen     4096 12月 26 12:04 graph_word
drwxrwxr-x 2 chen chen    12288 12月 26 11:59 log
-rw-rw-r-- 1 chen chen        2 12月 26 11:56 num_jobs
-rw-rw-r-- 1 chen chen     2098 12月 26 11:56 phones.txt
-rw-rw-r-- 1 chen chen     8161 12月 26 11:56 questions.int
-rw-rw-r-- 1 chen chen    35098 12月 26 11:56 questions.qst
-rw-rw-r-- 1 chen chen   305009 12月 26 11:56 tree

chen@chen:tri1[master*]$ ls -l graph_word/
总用量 842184
-rw-rw-r-- 1 chen chen       290 12月 26 12:00 disambig_tid.int
-rw-rw-r-- 1 chen chen 861725005 12月 26 12:04 HCLG.fst
-rw-rw-r-- 1 chen chen         5 12月 26 12:04 num_pdfs
drwxrwxr-x 2 chen chen      4096 12月 26 12:04 phones
-rw-rw-r-- 1 chen chen      2098 12月 26 12:04 phones.txt
-rw-rw-r-- 1 chen chen    646753 12月 26 12:04 words.txt

其中, final.mdl 就是训练出来的可以使用的模型,另外,在 graph_word 下面的 words.txt 和 HCLG.fst 分别为字典以及有限状态机。单独介绍这三个文件,是因为我们下面的示例主要基于这三个文件来识别的。

离线识别示例:

下面我们用上面训练的 tri1 模型来识别一个给定的音频文件。我们这里使用 online-wav-gmm-decode-faster 工具来回放指定的 wav 文件并进行识别。

对于当前源码,在上面的编译安装过程中,默认情况下并不会生成 online-wav-gmm-decode-faster 程序(默认会生成的是 online2 相关程序),此时需要自己手动编译此工具,如下:

chen@chen:online[master*]$ pwd
/home/chen/work/voice/kaldi/src/online
chen@chen:online[master*]$ make

下面为示例的步骤:

1.将 kaldi/egs/voxforge/online_demo 拷贝到 kaldi/egs/thchs30/ 下;
2.在 kaldi/egs/thchs30/online_demo/ 下新建两个文件夹 online-data/ 和 work/,以及在 online-data 下新建两个文件夹 audio/ 和 models/,audio/ 下面可以存放需要回放和识别的语音文件,路径结构如下:

chen@chen:online_demo[master*]$ tree -L 4
.
├── online-data
│   ├── audio
│   │   ├── C21_517.wav      // 需要回放和识别的语音文件,可以放多个
│   │   └── trans.txt        // 为空即可
│   └── models
│       └── tri1
│           ├── 35.mdl       // 模型训练步骤生成的模型文件
│           ├── final.mdl    // 模型训练步骤生成的模型文件
│           ├── HCLG.fst     // 拷贝 thchs30/s5/exp/graph_word/HCLG.fst
│           └── words.txt    // 拷贝 thchs30/s5/exp/graph_word/words.txt
├── README.txt
├── run.sh
└── work

3.打开 kaldi/egs/thchs30/online_demo/run.sh,更改如下:

更新模型名
# Change this to "tri2a" if you like to test using a ML-trained model
#ac_model_type=tri2b_mmi
ac_model_type=tri1
- 注释掉如下这段从 voxforge 下载现网的测试预料和模型的代码
#if [ ! -s ${data_file}.tar.bz2 ]; then
#    echo "Downloading test models and data ..."
#    wget -T 10 -t 3 $data_url;
#
#    if [ ! -s ${data_file}.tar.bz2 ]; then
#        echo "Download of $data_file has failed!"
#        exit 1
#    fi
#fi
- 修改如下执行识别的命令(将模型的部分更改为 $ac_model/final.mdl)
online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85\
    --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 \
    scp:$decode_dir/input.scp $ac_model/final.mdl $ac_model/HCLG.fst \
    $ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
    ark,t:$decode_dir/ali.txt $trans_matrix;;

4.执行 kaldi/egs/thchs30/online_demo/run.sh,如下输出:

chen@chen:online_demo[master*]$ ./run.sh

SIMULATED ONLINE DECODING - pre-recorded audio is used

The (bigram) language model used to build the decoding graph was
  estimated on an audio book's text. The text in question is
  "King Solomon's Mines" (http://www.gutenberg.org/ebooks/2166).
  The audio chunks to be decoded were taken from the audio book read
  by John Nicholson(http://librivox.org/king-solomons-mines-by-haggard/)

NOTE: Using utterances from the book, on which the LM was estimated
        is considered to be "cheating" and we are doing this only for
        the purposes of the demo.

You can type "./run.sh --test-mode live" to try it using your
  own voice!

online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3 scp:./work/input.scp online-data/models/tri1/final.mdl online-data/models/tri1/HCLG.fst online-data/models/tri1/words.txt 1:2:3:4:5 ark,t:./work/trans.txt ark,t:./work/ali.txt online-data/models/tri1/final.mat 
File: A2_0
律师 阳春 淹 井 大 快 文章 的 底色 四月 的 李 銮 更 顺利 地 先 和 秀媚 诗意 盎然

File: A2_1
他 仅 凭 腰部 的 力量 在 甬道 上下 翻腾 永 冻 蛇行 状 如 海豚 一直 以 一头 的 优势 领先

File: A2_2
企业 依靠 技术 花钱 曾 向 他 负责 全 肠 产品 质量 与 技术 培训 成 了 长 米 的 大 盲人

File: D4_750
说 北京 的 一些 爱国 将士 马 占 山 梨 杜 唐 据 吴 素 饼 爱 邓 甜美 但 也 奋起 抗战

File: test
去年 搜寻 中国 城区 所 从事 的 资格 整个 素质

compute-wer --mode=present ark,t:./work/ref.txt ark,t:./work/hyp.txt 
%WER -nan [ 0 / 0, 0 ins, 0 del, 0 sub ]
%SER -nan [ 0 / 0 ]
Scored 0 sentences, 0 not present in hyp.

效果不好。

在线识别识别示例:

chen@chen:online_demo[master*]$ ./run_2.sh  --test-mode live

在线识别话筒可能遇到的问题:https://blog.csdn.net/YoungLittleT/article/details/80854894

离线录音命令:arecord  -d 5 -f dat -r 16000HZ -c 1 -t wav test.wav

arecord 制作16 bit 16000HZ语音

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

arecord -Dhw:0,1 -d 10 -f cd -r 44100 -c 2 -t wav test.wav
参数解析
-D 指定了录音设备,0,1 是card 0 device 1的意思,也就是TDM_Capture
-d 指定录音的时长,单位时秒
-f 指定录音格式,通过上面的信息知道只支持 cd cdr dat 
-r 指定了采样率,单位时Hz
-c 指定channel 个数
-t 指定生成的文件格式
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

参考:https://blog.csdn.net/xiongtiancheng/article/details/80577478

效果同样糟糕

备注

测试完tri1的模型后,一定很想试试tri2或3.但当你操作时,会遇到如下的问题:

ERROR (online-wav-gmm-decode-faster:LogLikelihoods():diag-gmm.cc:533) DiagGmm::ComponentLogLikelihood, dimension mismatch 39vs. 40

怎么解决?

答案:

1、于是修改run.sh成如下这个样子  :

ac_model_type=tri4b

------------------------------------中间有代码------------

trans_matrix="$ac_model/final.mat"

if [ -s $ac_model/matrix ]; then
    trans_matrix=$ac_model/12.mat
fi

2、 再次修改run.sh(添加2个参数--left-context=3 --right-context=3)

online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 \
            --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3\
            scp:$decode_dir/input.scp $ac_model/final.mdl $ac_model/HCLG.fst \
            $ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
            ark,t:$decode_dir/ali.txt $trans_matrix;;

3、同时把把s5下的exp下的tri4b下的拷到models的tri4b下。

4、 运行./run.sh

相关链接:https://blog.csdn.net/allyli0022/article/details/78644690

kaldi训练thchs30做在线识别相关推荐

  1. 如何用kaldi训练好的DNN模型做在线识别

    在已经训练好模型的情况下,需要针对一个新任务做在线识别应该怎么做呢? 一种情况是,用已有的声学模型和新训练的语言模型. 语言模型可以同srilm等工具训练,但是怎样将语言模型与DNN声学模型一起来进行 ...

  2. 基于kaldi训练唤醒词模型的一种方法

    0. 前言 什么是唤醒?激活Google智能助手,你可以对手机说"Hey Google"或者"OK Google",其他诸如阿里的天猫精灵智能音箱(天猫精灵). ...

  3. AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?

    来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...

  4. 图像处理项目——基于机器视觉技术的人脸在线识别系统设计

    基于机器视觉技术的人脸在线识别系统设计 本设计研究人脸检测与识别技术,在基于机器视觉技术上,构建了一套人脸在线检测识别系统,系统将由以下几个部分构成:计算机图像预处理.数据收集和预处理. 人脸图像定位 ...

  5. 基于cnn的人脸识别_基于卷积神经网络(CNN)的人脸在线识别系统

    微信搜索"AI大道理",选择"置顶"公众号 重磅干货,深入讲解AI大道理 ------ 本设计研究人脸识别技术,基于卷积神经网络构建了一套人脸在线检测识别系统, ...

  6. 跨平台Android和IOS百度语音在线识别原生插件

    一.插件推荐 跨平台Office文档.图片在线预览,视频播放原生插件 Android和IOS图片在线预览,视频播放原生插件 跨平台Android和IOS百度OCR文字识别.证卡识别.票据识别原生插件 ...

  7. kaldi中的声纹识别

    kaldi中的声纹识别 文章目录 kaldi中的声纹识别 kaldi的安装 运行aishell例程 使用TIMIT数据库进行声纹识别 kaldi中声纹识别的流程 我的博客:https://yutouw ...

  8. tensorflow+python flask进行手写识别_python+flask搭建CNN在线识别手写中文网站!简直太屌了!...

    原标题:python+flask搭建CNN在线识别手写中文网站!简直太屌了! 使用python+flask搭建的一个网站,然后从网页的写字板上获取鼠标手写的汉字经过转码后传回后台,并经过图片裁剪处理之 ...

  9. 在线识别图片文字,分享识别技巧

    在这个信息科技发展的时代,必须要有过硬的知识才能跟的上时代的步伐.就像是同一个职位,我们必须要有自己独特的工作技巧或者是技能,才能更好的胜任.像是办公室文员,每天要接触的是很多文件,还有将文件转换成文 ...

最新文章

  1. 五、DNS与bind
  2. 城市智能化发展中,AI公司应该做什么?
  3. 转载 想要在项目中引入其他项目的方法为
  4. java多态性详解——父类引用子类对象
  5. map和struct的多重嵌套
  6. codeforce GOODBYE 2018
  7. 直接让浏览器下载文件而不打开
  8. c语言程序设计班档案管理系统报告,C语言班级档案管理系统
  9. UI标签库专题九:JEECG智能开发平台 Choose(选则操作标签)
  10. 开源身份证识别_新的开源:金钱,公司和身份
  11. 【设计模式】工厂模式
  12. java中复数的类型_java构造一个复数类
  13. CSS---px rpx pt em rem四种单位总结
  14. 其实,我几乎很少看书!
  15. PX4飞行模式-多旋翼
  16. DOS命令:systeminfo
  17. 医学图像分割之TransUNet
  18. 从零开始之驱动发开、linux驱动(十六、poll机制)
  19. 【蓝桥杯】有一张 m×n 个小方格的地图,一个机器人位于地图的左上角,它每步只能向右或者向下移动一格。。。
  20. kernel error 解决办法

热门文章

  1. 如何在工作中调整自己的心态
  2. MySQL:数据库结构优化、高可用架构设计、数据库索引优化
  3. Shrio异常The security manager does not implement the WebSecurityManager interface.
  4. 中科蓝讯蓝牙: 通用IO(GPIO)一般操作
  5. 一阶电路和二阶电路的时域分析(1)——“电路分析”
  6. 第二篇 - 设计篇:静馨舍app功能设计
  7. 项目申请书一点总结经验
  8. 保/防护器件系列之TVS-瞬态抑制二极管
  9. 功能升级丨腾讯云Web直播互动组件火热上线!
  10. mac python读取txt