Kaldi语音识别技术(三) ----- 完成L.fst的生成

文章目录

  • Kaldi语音识别技术(三) ----- 完成L.fst的生成
    • 基础知识
    • 一、运行环境准备
    • 二、文件准备
      • lexicon.txt
      • phones.txt
      • silence_phones.txt
      • nonsilence_phones.txt
      • optional_silence.txt
    • 三、L.fst的生成
      • prepare_lang.sh 脚本的使用
    • 四、L.fst可视化
      • 1. fstprint 查看
      • 2. fstdraw 绘图
    • 五、小的L.fst
      • 文件准备
      • 生成并查看
    • 六、封装成shell脚本调用

基础知识

一个完整的Kaldi需要得到下面四个FST

识别流程如下:

本章节完成以下内容:(路径以我写的为准,自己根据情况更改)

一、运行环境准备

  1. 安装 dot 相关的包
yum install ghostscript
yum install graphviz
  1. 软链接运行环境(亲测使用软连接的会使L_disambig.fst生成失败,用不了,可忽略)
cd /root/kaldi/kaldi/data
ln -s /root/kaldi/kaldi/egs/wsj/s5/utils/ ./
ln -s /root/kaldi/kaldi/egs/wsj/s5/steps/ ./
  1. 执行 path.sh 使用kaldi环境, 其在/root/kaldi/kaldi/egs/wsj/s5/下面,可以自己cp后更改位置

二、文件准备

所有文件放在 ~/kaldi/data/dict 路径下面 (而不是 data/local/dict)

lexicon.txt

•字典

使用之前的 lexicon.txt ,放在路径 ~/kaldi/data/dict下面,(lexicon.txt最后可能需要添加一个空行)

phones.txt

•所有音素

这里我们使用python脚本得到所有音素,代码如下:(自定义一个python文件并执行它)

# -*- coding: utf-8 -*-
# @Author : yxn
# @Date : 2022/11/6 21:24
# @IDE : PyCharm(2022.2.3) Python3.9.13def get_phones(data):"""得到所有音素,生成phones.txt"""# 使用集合进行去重处理phones = set() # set集合可实现自动去重with open(data, "r", encoding="utf-8") as f:for i in f.readlines():# 获取每一个音素操作[phones.add(x) for x in i.strip("\n").strip().split("\t")[1].split(" ")]# 保存文件save_path = "/root/kaldi/data/dict/phones.txt"  # 保存位置 ~/kaldi/data/dict/with open(save_path, "w", encoding="utf-8") as f:for i in phones:f.writelines(i + "\n")print("phones.txt生成成功! ")if __name__ == '__main__':lexicon_path = "../data/dict/lexicon.txt" # /root/kaldi/kaldi/data/dict/lexicon.txtget_phones(lexicon_path)

执行文件得到phones.txt

python3 文件名 #eg:python3 get_phones.py

silence_phones.txt

•静音音素

vim silence_phones.txt
# 输入
SIL
# wq保存退出

nonsilence_phones.txt

•非静音音素,就是去除静音音素的 phones.txt

cp phones.txt nonsilence_phones.txt # 复制phones.txt
vim nonsilence_phones.txt
# 删除 SIL 后保存退出

optional_silence.txt

•词典中不存在的词识别的结果

为了方便我们将其识别为 SIL

vim optional_silence.txt
# 输入 SIL 后保存退出

三、L.fst的生成

prepare_lang.sh 脚本的使用

根据经验需要到 kaldi环境执行 我的环境为~/kaldi/kaldi/egs/wsj/s5

cd ~/kaldi/kaldi/egs/wsj/s5
utils/prepare_lang.sh  ~/kaldi/data/dict '<SIL>'  ~/kaldi/data/tmp/01 ~/kaldi/data/L/lang
# prepare_lang.sh 一共需要输入4个参数,各参数解释见基础知识

如果执行失败参考 https://blog.csdn.net/yxn4065/article/details/127723474 添加环境变量!

执行成功输出结果如下: (全部为SUCCESS则成功)

同时 ~/kaldi/data/L/lang目录下会生成以下文件:

•1、L.fst
•2、phones.txt       所有音素对应的id
•3、words.txt        所有词对应的id
•4、oov.txt          词典之外的词===>SIL
•5、oov.int          词典之外的词id
•6、topo             HMM状态结构图
•7、L_disambig.fst   消岐后的L.fst

各文件详细说明见下面:


~/kaldi/data/tmp/01目录下会生成以下文件:

四、L.fst可视化

关于 phones.txt 的内容说明

•将一个音素重新划分为4个音素(BEIS)其中,静音音素多了一个音素。

•B:Begin 开始

•E:End 结束

•I:Internal 中间

•S:Singleton 单个

•注:可以在生成的临时目录中找到lexiconp.txt查看 ~/kaldi/data/dict/lexiconp.txt

1. fstprint 查看

cd ~/kaldi/data
fstprint --isymbols=./L/lang/phones.txt --osymbols=./L/lang/words.txt ./L/lang/L.fst > ./L/see/L_detail.txt
# 各参数解释
# --isymbols=./L/lang/phones.txt 生成的音素信息
# --osymbols=./L/lang/words.txt  生成的词信息
# ./L/lang/L.fst                 L.fst位置
# > ./L/see/L_detail.txt         输出保存到 ~/kaldi/data/L/see/L_detail.txt

vim ./L/see/L_detail.txt查看内容如下

注:生成结果中的<eps>为空跳转

2. fstdraw 绘图

  1. 生成dot文件
cd ~/kaldi/data
fstdraw --isymbols=./L/lang/phones.txt --osymbols=./L/lang/words.txt ./L/lang/L.fst > ./L/see/L.dot
# cd ~/kaldi/data/L/lang/
# fstdraw --isymbols=phones.txt --osymbols=words.txt L.fst > L.dot
# vim ./L/see/L.dot可进行查看
  1. 直观可视化(当前文件不建议执行下面操作,太大了会导致虚拟机卡死,时间会比较长)
cd ~/kaldi/data/L/lang
dot -Tjpg L.dot > L.jpg # 转成jpg图片
dot -Tsvg L.dot > L.svg # 转成svg矢量图(放大不会失真)
dot -Tjpg -Gdpi300 L.dot > L.jpg # 转成jpg图片并设置图片质量

五、小的L.fst

由于我们的数据比较多,导致L.fst的图片无法生成查看,所以在课程当中我们采用更少的语音来识别做为学习的辅助理解!

这里我们以 “今天天气真好 ”、“今天天气还不行 ” 这2句话来制作小的可视化数据

文件准备

mkdir -p ~/kaldi/data/dict_learn
cd ~/kaldi/data/dict_learn

•lexicon.txt

<SIL> SIL
今天 j in1 t ian1
真好 zh en1 h ao3
天气 t ian1 q i4
还 h uan2
还 h ai2
不行 b u2 x ing2

•vim phones.txt

SIL
ai2
ao3
b
en1
h
i4
ian1
in1
ing2
j
q
t
u2
uan2
x
zh

•vim silence_phones.txt

SIL

•nonsilence_phones

ai2
ao3
b
en1
h
i4
ian1
in1
ing2
j
q
t
u2
uan2
x
zh

•vim optional_ silence.txt

SIL

生成并查看

# 1.执行prepare_lang.sh脚本生成L.fst
cd ~/kaldi/kaldi/egs/wsj/s5
utils/prepare_lang.sh  ~/kaldi/data/dict_learn '<SIL>'  ~/kaldi/data/tmp/01_learn ~/kaldi/data/L/lang_learn# 2. 文本可视化
cd ~/kaldi/data
fstprint --osymbols=./L/lang_learn/words.txt ./L/lang_learn/L.fst > ./L/see/L_learn.dot > ./L/see/L_learn.txt
# 如需查看 vim ./L/see/L_learn.txt# 3. 图形可视化
cd ~/kaldi/data
fstdraw --isymbols=./L/lang_learn/phones.txt --osymbols=./L/lang_learn/words.txt ./L/lang_learn/L.fst > ./L/see/L_learn.dotcd ~/kaldi/data/L/see
dot -Tjpg -Gdpi300 L_learn.dot > L_learn.jpg

结果如下:

在 本机电脑上使用 scp 命令下载 (也可以用winscp,xftp等下载),如果你的CentOS安装了图形化界面可以直接查看

scp root@192.168.242.130:~/kaldi/data/L/see/L_learn.jpg ./

如果是生成 的svg矢量图,旋转方式如下:
F12 打开开发者模式,修改内容,现在图片就是正的啦

六、封装成shell脚本调用

shell命令入门: https://www.runoob.com/linux/linux-shell.html

cd ~/kaldi/data
vim run.sh
# 该脚本完成L.fst的生成
#
target=~/kaldi/kaldi/egs/wsj/s5
tar_1="_learn"
tar_2="_dism"echo "========脚本开始执行======="
cd ${target}
. path.shmkdir -p ~/kaldi/data/tmp/01 ~/kaldi/data/L/lang
# 执行prepare_lang.sh脚本生成L.fst
utils/prepare_lang.sh  ~/kaldi/data/dict '<SIL>'  ~/kaldi/data/tmp/01 ~/kaldi/data/L/lang
echo "========prepare_lang.sh执行结束======="mkdir -p ~/kaldi/data/L/see
# 生成L.dot
fstdraw --isymbols=~/kaldi/data/L/lang/phones.txt --osymbols=~/kaldi/data/L/lang/words.txt ~/kaldi/data/L/lang/L.fst > ~/kaldi/data/L/see/L.dot
echo "========L.dot生成结束======="# 生成 L.jpg
cd ~/kaldi/data/L/see/
dot -Tjpg -Gdpi300 L.dot > L.jpg
echo "========L.jpg 生成结束======="
## 该脚本还在完善当中

Kaldi语音识别技术(三) ----- 完成L.fst的生成相关推荐

  1. Kaldi语音识别技术(五) ----- 特征提取

    Kaldi语音识别技术(五) ----- 特征提取 文章目录 Kaldi语音识别技术(五) ----- 特征提取 一.识别流程 二.MFCC特征提取概述 三.文件格式 文件格式说明 提取部分数据 修复 ...

  2. Kaldi语音识别技术

    一.参考资料 如何用Kaldi做语音识别? Kaldi官网 kaldi仓库 二.相关介绍 Kaldi是当前最流行的开源语音识别工具(Toolkit),旨在提供灵活且可扩展的组件,包括多种语音信号处理, ...

  3. 基于《Kaldi语音识别》技术及开源语音语料库分享

    前言: 数据堂自AI开源计划发起,面向高校和科研机构首次开源的[1505小时中文普通话语音数据集],该数据集句标注准确率达到了98%,得到了很多开发者的认可. 不仅如此,数据堂基于此开源数据集还精选出 ...

  4. 《kaldi语音识别实战》阅读笔记:三音素模型训练—train_deltas.sh解析

    一.使用说明 1.1 描述 训练三音素模型.与单音素模型训练相比,因为建模单元变为三音素,因此多了决策树状态绑定. steps/deltas.sh Usage: steps/train_deltas. ...

  5. 语音识别技术原理概述!

    原标题:语音识别技术原理概述! 语音识别的基本原理 所谓语音识别,就是将一段语音信号转换成相对应的文本信息,系统主要包含特征提取.声学模型,语言模型以及字典与解码四大部分,其中为了更有效地提取特征往往 ...

  6. (深入篇)漫游语音识别技术—带你走进语音识别技术的世界

    前有古人,后有小王,大家好,我是你们爱思考的小王学长,今天咱们继续漫游语音识别技术哈,今天内容稍微专业一些,大家可以结合上一篇漫游语音识别技术一起学习. 上篇我们简单了解了语音识别技术的概念.前世今生 ...

  7. 浅析语音识别技术的工作原理及发展

    浅析语音识别技术的工作原理及发展 语音是人类最自然的交互方式.计算机发明之后,让机器能够"听懂"人类的语言,理解语言中的内在含义,并能做出正确的回答就成为了人们追求的目标.我们都希 ...

  8. 从不温不火到炙手可热:语音识别技术简史

    作者 | 陈孝良,冯大航,李智勇 出品 | AI科技大本营(ID: rgznai100) [导读]语音识别自半个世纪前诞生以来,一直处于不温不火的状态,直到 2009 年深度学习技术的长足发展才使得语 ...

  9. 带你认识传统语音识别技术

    摘要:隐马尔可夫链HMM模型自从1980年代被用于语音识别以来,一直都是实际语音识别系统的主流方法. 本文分享自华为云社区<新手语音入门(四): 传统语音识别技术简介 | 隐马尔可夫链 | 声学 ...

最新文章

  1. ffmpeg文件拼接
  2. 包含绑定变量的sql进行调优需注意一点
  3. Windows 2000本地路由表
  4. Node --- Promise中的多异步协作
  5. kbmmw 5.0 中的REST 服务
  6. 第3篇:Flowable快速工作流脚手架Jsite_关闭演示模式
  7. python列表是顺序表还是链表_顺序表与链表
  8. Linux命令(20)linux服务器之间复制文件和目录
  9. 微信支付android错误码-1,安卓调用微信支付一直都是-1的错误,求问怎么解决
  10. 献给初学破解人的口诀和指令
  11. 人脸特征点定位——ASM和AAM算法
  12. 计算机控制系统第二章答案,计算机控制技术(第2版)部分课后题答案
  13. mpa和pis_有关压力单位pis-bar-mpa的换算
  14. 知识图谱 helloword
  15. 第11章 Docker 中 Gitlab 的安装与配置
  16. 解决ubuntu安装软件has install-snap change in progress错误
  17. 浅谈SAP顾问未来十年在中国的发展前景
  18. Django实训-学生管理系统
  19. Markdown两键排版微信公众号文章
  20. 通过Fiddler Script替换请求/响应内容

热门文章

  1. 当我去了不到 20 人的 IT 公司后。。。
  2. 程序员不修改Bug,我们该怎么办??
  3. IEEE Access 投稿
  4. 网页设置通栏后,缩小页面有一部分不显示
  5. 上海证券综合指数统计分析及挖掘(一)
  6. error:/usr/bin/ld:skipping incompatible ./libxxxx.so when searching for -lxxxx
  7. 脑电(EEG)等公开数据集汇总
  8. mysql慢查询优化_常见mysql的慢查询优化方式
  9. 【金九银十】软件测试中的高频面试题梳理(内附答案)
  10. 百万级深空天体数据库获取