kaldi 在线识别

Posted zhwl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kaldi 在线识别相关的知识,希望对你有一定的参考价值。

基于KALDI的THCHS30训练实践

 
 

基于KALDI的THCHS30训练实践V1.5

6-24-2019_SLIP_V1.0

6-25-2019_SLIP_V1.1

6-26-2019_SLIP_V1.2

6-28-2019_SLIP_V1.3

7-1-2019_SLIP_V1.4

7-8-2019_SLIP_V1.5

首先在老师给的机器上看一下,到/voice_rec/kaldi/egs/thchs30/s5下,不出所料没有data文件,但是有一个download_and_untar.sh,看了一下代码太多,所以还是直接自己动手丰衣足食。

技术图片

? download_and_untar.sh

下载的处理过程:

 wget http://cn-mirror.openslr.org/resources/18/data_thchs30.tgz
 wget http://cn-mirror.openslr.org/resources/18/test-noise.tgz
 wget http://cn-mirror.openslr.org/resources/18/resource.tgz
  • 1
  • 2
  • 3

完成后mkdir thchs30-openslr并解压到./s5/thchs30-openslr。

修改./s5/cmd.sh为:

#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"
export train_cmd=run.pl 
export decode_cmd="run.pl --mem 4G" 
export mkgraph_cnd="run.pl --mem 8G"                                                     
export cuda_cmd="run.pl --gpu 1"        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

修改./s5/run.sh为:

#n=8      #parallel jobs 
n=4   #change by num of cpuCores 
#thchs=/nfs/public/materials/data/thchs30-openslr                                         
thchs=/home/model/voice_rec/kaldi/egs/thchs30/s5/thchs30-openslr 
  • 1
  • 2
  • 3
  • 4

bash run.sh 便开始训练了。它大概有几个过程:数据准备,monophone单音素训练, tri1三因素训练, trib2进行lda_mllt特征变换,trib3进行sat自然语言适应,trib4做quick,后面就是dnn了 。

技术图片

先到这里,让他跑着。

今天一早上去一看,发现并没有进程。

因为如果成功运行结束,thchs30/s5/exp中会有变化,我们可以进去看一下:

技术图片

tri1/final.mdl即为输出的模型,此外graph_word文件夹下面有words.txt.和HCLG.fst,一个是字典,一个是有限状态机。

然后在kaldi/src下

make ext
  • 1

编译扩展程序。经过几分钟的编译后,可以在src/onlinebin下看到

技术图片

online-wav-gmm-decode-faster 用来回放wav文件来识别的,online-gmm-decode-faster用来从麦克风输入声音来识别的。

现在配置一个demo:

cd egs/voxforge/
cp -r ./online_demo/ ../thchs30/#将voxforge下的online_demo cp 到thchs30下
cd ../thchs30/
cd online_demo/
mkdir online-data#创建两个目录
mkdir work
cd online-data/
mkdir audio#创建两个目录
mkdir models
cd models/
mkdir tri1#在models下创建tri1
cd tri1/
cp ../../../../s5/exp/tri1/35.mdl ./#将/thchs30/s5/exp/tri1下的两个文件 cp 到当前目录
cp ../../../../s5/exp/tri1/final.mdl ./
cp ../../../../s5/exp/tri1/graph_word/words.txt ./#将./graph_word下的两个文件 cp 到当前目录
cp ../../../../s5/exp/tri1/graph_word/HCLG.fst ./
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

修改后的文件目录应该是这样的:

来自:https://blog.csdn.net/m0_38055352/article/details/82560600tdsourcetag=s_pcqq_aiomsg

online_demo
├── online-data
│   ├── audio
│   │   ├── 1.wav
│   │   ├── 2.wav
│   │   ├── 3.wav
│   │   ├── 4.wav
│   │   ├── 5.wav
│   │   └── trans.txt
│   └── models
│       └── tri1
│           ├── 35.mdl
│           ├── final.mdl
│           ├── HCLG.fst
│           └── words.txt
├── README.txt
├── run.sh
└── work[这个文件夹运行run.sh成功后才会出现]
    ├── ali.txt
    ├── hyp.txt
    ├── input.scp
    ├── ref.txt
    └── trans.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

修改thchs30/online_demo/run.sh:

:‘#Here is changed by slip.we donot need online data
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
‘
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
ac_model_type=tri1
#changed by slip.to be our url
  • 1
  • 2
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;;
#changed by slip.from model into final.mdl
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

现在便可以开始run了:

./run.sh    #开始回放识别,即识别.wav文件
./run.sh -test-mode live    #从麦克风识别
  • 1
  • 2

将B6_390至B6_395共6个文件cp到audio目录下,并且…/ run.sh

技术图片

可以看到虽然错误率有点高,但是还是基本跑通了。

由于前一天第一次训练,没有发现/best_wer 文件,所以又训练了一遍,这次在thchs30/s5/exp/tri1/decode_test_word/scoring_kaldi下发现了该文件,打开:

技术图片

我们可以看到,错误率在36.23%。

因为突然关机,之前写的文档进度没保存,可见及时存档的重要性。。。下面补充一下:

在测试完数据之后,我们准备采取我们自己真实的声音进行识别,看一下识别效率,作为对照,我们准备了两组数据:取自数据集的文本,任意取自互联网的文本。

 A19_123.wav.trn
另外 假设 不 麻烦 请 关照 一下 内务 及 星空 花园 原则上 别 让 屋子 变成 鬼屋 就好 了 啦 云云
 A19_124.wav.trn
另外 女单 中国队 还有 韩晶 娜 和 尧 燕 奥运 排名 第六 七位 也 可 与 高手 一 搏
 A19_125.wav.trn
工厂 和 厂房 依 山 而 建 全部 配备 排污 系统 你 见 不到 黑 烟 听不到 噪声 也 看不到 污水
 A19_126.wav.trn
对於 她 在 人 赃 俱 获 的 情况 下 仍 强 辞 夺 理 颇 感 有趣 她 似乎 不知道 绝望 为 何物
 A19_127.wav.trn
要 想 扶 优 汰 劣 首先 要 解决 谁 优 谁 劣 的 问题 要 判定 谁 优 谁 劣 必须 得 有一个 衡量 的 尺子
 A19_128.wav.trn
仅 绘画 而论 齐白石 是 巍巍 昆仑 可 这位 附庸风雅 的 门外汉 连 一块 石头 都 不是
 A19_129.wav.trn
他 患有 风湿 性 腰疼 病 一 粘 潮湿 劳累 就 疼痛 难忍 但 装 井口 又 必须 弯腰 弓 背 钻进 满 是 泥水 的 钻 台 下边 干活
 A19_130.wav.trn
大 花鞋 的 殷勤 与 自信 早已 烟消云散 她 抱着 双臂 冷冷 地 看着 这一切
 A19_131.wav.trn
去年 二月 未 满 十 岁 的 徐敏 又 被 上海 前进 业余 进修 学院 录取 继续 学习 新概念英语 第四册
 A19_132.wav.trn
得到 李公朴 噩耗 闻一多 怒 愤 填 膺 拍案而起 怒斥 反动派 卑鄙无耻

以上为取自数据集的文本
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

kaldi是支持麦克风传入实时识别的,但是由于没有麦克风装置,所以在经过同学录音,然后传入识别后,结果如下:

铺天盖地的各种消息是自由球员市场即将开启的重要标志。
不过看似杂乱无序、纠缠成团的局面,却有一个被视为重中之重的线头。
只要沿着这条线抽丝剥茧,所有问题都将明朗化。
手术事宜要待医生对其进行进一步的检查、治疗和评估后再确定。
把这份爱延续下去,这将会是女儿一生中最宝贵的财富。
燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。
盼望着,盼望着,东风来了,春天的脚步近了。
现代散文家朱自清的白话散文对“五四”以后的散文作家产生过一定的影响。
母亲在牌桌上遇见一位太太,她有个女儿,透着聪明伶俐。
随着各地公积金管理政策的优化和完善,不少地方简化了公积金提取手续

以上为取自网络的文本
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在经过同学录音,然后传入识别后,结果如下:

在之前的训练中,由于服务器没有GPU,所以没有进行DNN的训练。

技术图片

在获得GPU服务器后,由于权限不足,又没能安装kaldi需要的依赖,亦不能完成DNN,所以我们准备在基础的服务器上用CPU跑一下DNN:

技术图片

这次我准备将kaldi用python封装一下,作为一个方法可以被其他人调用。

代码如下:

‘‘‘
@author:slip
input:null
return:list

before run this file.please ensure this is in same path with run.sh.
and this file will try to translate .wav files in ./online-data/audio to Chinese in list.
so also put files in ./online-data/audio first.
‘‘‘
import os
def asr():
    val = os.popen(‘./run.sh‘)
    toprint = False
    vallist=[]
    temp=val.readlines()
    c=0
    ret=[]
    for i in temp:
        c+=1
        if ord(i[0])>15000:
            #print(i)
            #i.replace(‘
‘.‘‘)
            ret.append(i.replace(‘
‘.‘‘))
            vallist.append(c)
#print(vallist)
    return ret
if __name__==‘__main__‘:
    print(asr())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

运行这段代码,结果如下:

model@student:~/voice_rec/kaldi/egs/thchs30/online_demo$ python3 test.py
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:./ds.txt 1:2:3:4:5 ark.t:./work/trans.txt ark.t:./work/ali.txt
File: B22_300
File: B22_301
File: B22_302
File: B22_303
File: B22_304
File: test1
WARNING (online-wav-gmm-decode-faster[5.5.388~1-777f8]:Read():wave-reader.cc:260) Expected 1441862 bytes in RIFF chunk. but afte
./run.sh: line 93: online-data/audio/trans.txt: No such file or directory
compute-wer --mode=present ark.t:./work/ref.txt ark.t:./work/hyp.txt
WARNING (compute-wer[5.5.388~1-777f8]:Open():util/kaldi-table-inl.h:513) Failed to open stream ./work/ref.txt
ERROR (compute-wer[5.5.388~1-777f8]:SequentialTableReader():util/kaldi-table-inl.h:860) Error constructing TableReader: rspecifi

[ Stack-Trace: ]
/home/model/voice_rec/kaldi/src/lib/libkaldi-base.so(kaldi::MessageLogger::LogMessage() const+0x82c) [0x7ffbbde5b2ca]
compute-wer(kaldi::MessageLogger::LogAndThrow::operator=(kaldi::MessageLogger const&)+0x21) [0x40b89d]
compute-wer(kaldi::SequentialTableReader<kaldi::TokenVectorHolder>::SequentialTableReader(std::__cxx11::basic_string<char. std::
compute-wer(main+0x2ad) [0x40a623]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7ffbbd2f6830]
compute-wer(_start+0x29) [0x40a2a9]

kaldi::KaldiFatalError[‘现时 疫情 藏 羚羊 来 乔 维 乔 接着 劳作 了 战役 全 后来 熊 焱 的 光顾 ‘. ‘鲁 ‘. ‘帐篷 安好 后 四周 还 用 罗 干 转 巨额 委员 父亲 有 逾 五 博 参加 了 会见 ‘. ‘曹禺 觉得 这个 细节 的 很 别致 由此 开始 寻找 奥 逆耳 的 基本 来 读 当然 作 的 客厅 就 被 拦腰 报 住 了 ‘. ‘普 ‘. ‘瓮安 仍 很 坦诚 深入 ‘. ‘害 ‘. ‘因为 罢工 而 按 人均 ‘. ‘然而 ‘. ‘然而 平安 笼 阴影 ‘.‘声明 ‘. ‘而 ‘]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

识别率不令人满意,但是可以运行下来。。。在实际调用中,仅返回最后面的list。


感谢:

https://blog.csdn.net/m0_38055352/article/details/82560600

https://blog.csdn.net/zhanaolu4821/article/details/88894990
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
版权声明:本文为q448402571原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q448402571/article/details/95951213
 

灰信网(软件开发博客聚合)

程序员专属的优秀博客文章阅读平台

以上是关于kaldi 在线识别的主要内容,如果未能解决你的问题,请参考以下文章

[转]kaldi中的在线识别----Online Recognizers

基于kaldi的iOS实时语音识别(本地)+03+音频采集传输

[转] 如何用kaldi训练好的模型做特定任务的在线识别

kaldi使用cvte模型进行语音识别

我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦

Kaldi 语音识别基础教程