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

2024-03-28 06:10

本文主要是介绍Kaldi语音识别技术(四) ----- 完成G.fst的生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

  • Kaldi语音识别技术(四) ----- 完成G.fst的生成
    • 一、N-Gram 语言模型简介
    • 二、环境准备
      • srilm工具的安装
    • 三、文件准备
      • (一) 准备语料
        • 1. 使用Python生成语料
        • 2. 使用awk 快速生成语料
      • (二) 语言模型
        • 1. 统计词频
        • 2. 生成语言模型
        • 3. 计算困惑度
    • 四、G.fst的生成及查看
        • 1. 使用 format_lm_sri.sh 脚本生成
        • 2. 使用 arpa2fst 工具生成
        • 3.G.fst文本可视化
    • 五、小的G.fst
        • 1. 创建小的语料
        • 2. 生成小语料的统计文件
        • 3. 生成小语料的语言模型
        • 4. 生成小的G.fst
        • 5. G.fst文本可视化
        • 6.G.fst图形可视化
    • 六、封装成Shell脚本

一、N-Gram 语言模型简介

N-Gram是大词汇连续语音识别中常用的一种语言模型,对中文而言,我们称之为汉语语言模型(CLM, Chinese Language Model)。汉语语言模型利用上下文中相邻词间的搭配信息,可以实现到汉字的自动转换,汉语语言模型利用上下文中相邻词间的搭配信息,在需要把连续无空格的拼音、笔划,或代表字母或笔划的数字,转换成汉字串(即句子)时,可以计算出具有最大概率的句子,从而实现到汉字的自动转换,无需用户手动选择,避开了许多汉字对应一个相同的拼音(或笔划串,或数字串)的重码问题。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

二、环境准备

srilm工具的安装

•这是生成ngram的工具-可以用来生成G.fst

•源站下载 http://www.speech.sri.com/projects/srilm/download.html(需要填写信息,国内目前无法访问)

•下载见这里 点我免费下载srilm-1.7.3.tar.gz和srilm-1.7.1.tar.gz

•将下载的srilm-1.7.3.tar.gz上传到kaldi目录的tools目录中 我的路径是~/kaldi/kaldi/tools

mv srilm-1.7.3.tar.gz srilm.tar.gz # 重命名
cd ~/kaldi/kaldi/tools
vim install_srilm.sh # 打开kaldi自带的安装脚本

该脚本需要从国外下载,先注释19~33行再执行,它会帮我们自动安装srilm,如下:

在这里插入图片描述

sh install_srilm.sh # 执行安装脚本

安装成功如下所示:

在这里插入图片描述

按照提示执行 . ./env.sh刷新环境变量

输入ng按两次TAB键出现以下内容说明srilm安装成功,可以正常使用

在这里插入图片描述

可以添加环境变量,避免每次都要执行 env.sh 激活

echo "export PATH=/root/kaldi/kaldi/tools/srilm/bin/i686-m64:/root/kaldi/kaldi/tools/srilm/bin" >> /etc/profilesource /etc/profile

创建G的文件夹

mkdir -p ~/kaldi/data/G/normal
mkdir -p ~/kaldi/data/G/G_learn

三、文件准备

(一) 准备语料

在这里插入图片描述

1. 使用Python生成语料

这里我们使用之前生成好的 text 文件 直接生成

# -*- coding: utf-8 -*-
# @Author : yxn
# @Date : 2022/11/13 12:23 
# @IDE : PyCharm(2022.2.3) Python3.9.13
def get_lm(data):"""使用python脚本生成语料"""lm = []with open(data, "r", encoding="utf-8") as f:for line in f.readlines():lm.append(line.strip("\n").strip().split(" ")[1:])# # 保存语料save_path = "/root/kaldi/data/G/normal/text.lm"with open(save_path, "w", encoding="utf-8") as f:for i in lm:f.writelines(" ".join(i) + "\n")print("text.lm 语料生成成功! ")if __name__ == '__main__':data_path = "/root/kaldi/kaldi_file/text"  # 之前数据处理生成的text文件get_lm(data_path)

生成的语料如下:

在这里插入图片描述

2. 使用awk 快速生成语料
awk -F ' ' '{for (i=2;i<=NF;i++) printf("%s ",$i);print ""}' /root/kaldi/kaldi_file/text > ~/kaldi/data/G/normal/text.lm

效果和上面的python脚本是一模一样的,但是效率要高得多得多!

(二) 语言模型

1. 统计词频

在这里插入图片描述

ngram-count -text text.lm -order 3 -write train.text.count
#•参数详解:
#•-text 后接我们准备的语料
#•-order 后接我们的几元模型,即N-Gram 中的N
#•-write 统计的词频文件放入的文件

结果如下图所示:
在这里插入图片描述

2. 生成语言模型

在这里插入图片描述

ngram-count -read train.text.count -order 3 -lm LM -interpolate -kndiscount
#•参数详解:
#•-read 后接我们生成的语料统计文件
#•-order 后接我们的几元模型,即N-Gram 中的N
#•-lm 生成的语言模型名称
#•-interpolate 平滑函数 插值平滑
#•-kndiscount 回退概率函数

结果如下图所示:

在这里插入图片描述

3. 计算困惑度
ngram -ppl text.lm -order 3 -lm LM -debug 1

结果如下图所示:
在这里插入图片描述

四、G.fst的生成及查看

1. 使用 format_lm_sri.sh 脚本生成

推荐使用该脚本生成,其底层原理就是调用了arpa2fst命令

cd ~/kaldi/data
utils/format_lm_sri.sh L/lang G/normal/LM dict/lexicon.txt G/normal
#•参数详解:
#•第一个参数 lang文件夹
#•第二个参数 使用SRI生成的LM
#•第三个参数 词典
#•第四个参数 G.fst生成的位置
# Usage: utils/format_lm_sri.sh [options] <lang-dir> <arpa-LM> [<lexicon>] <out-dir>
#  E.g.: utils/format_lm_sri.sh data/lang data/local/lm/foo.kn.gz data/local/dict/lexicon.txt data/lang_test

执行成功如下:
在这里插入图片描述

可以看到 ~/kaldi/data/G/normal路径下面有了如下文件:

在这里插入图片描述

2. 使用 arpa2fst 工具生成

与上面的方法类似,命令如下

arpa2fst --disambig-symbol=#0 --read-symbol-table=L/lang/words.txt G/normal/LM G/test/G.fst 
#•参数详解:
#•第一个参数 消歧符号
#•第二个参数 words.txt
#•第三个参数 使用SRI生成的LM
#•第四个参数 G.fst生成的位置
#Usage: arpa2fst [opts] <input-arpa> <output-fst>
# e.g.: arpa2fst --disambig-symbol=#0 --read-symbol-table=data/lang/words.txt lm/input.arpa G.fst

输出结果如下:
在这里插入图片描述

3.G.fst文本可视化
cd ~/kaldi/data/G/normal
fstprint --isymbols=words.txt --osymbols=words.txt G.fst > G_detail.txt
# 参数中,由于G.fst实际是一个fsa(有限状态接收器),所以输入和输出都是词

在这里插入图片描述

五、小的G.fst

同前面L.fst 一样,学习过程当中我们同样使用一个小的G.fst来进行学习

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

1. 创建小的语料
cd ~/kaldi/data/G/G_learn
vim text.lm
# 输入以下内容
今天 天气 真好
今天 天气 还 不行
# wq保存退出
2. 生成小语料的统计文件
ngram-count -text text.lm -order 3 -write train.text.count
3. 生成小语料的语言模型
ngram-count -read train.text.count -order 2 -lm LM

特别提醒: 由于小语料数据量太小,故不能使用平滑函数和回退函数

4. 生成小的G.fst
cd ~/kaldi/data
utils/format_lm_sri.sh L/lang_learn G/G_learn/LM dict/lexicon.txt G/G_learn

在这里插入图片描述

5. G.fst文本可视化
cd ~/kaldi/data/G/G_learn
fstprint --isymbols=words.txt --osymbols=words.txt G.fst > G_learn_detail.txt

在这里插入图片描述

6.G.fst图形可视化
#(1)生成dot文件
fstdraw --isymbols=phones.txt --osymbols=words.txt G.fst > G.dot
#(2)绘图
dot -Tjpg -Gdpi300 G.dot > G.jpg # 不太清晰
dot -Tsvg G.dot > G.svg

下载到本地电脑进行查看如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nCL7VucQ-1668614245175)(E:\滇西科技师范学院大三\语音识别技术kaldi\学习笔记三(G的生成)]\19.png)

六、封装成Shell脚本

后面有时间更新...

这篇关于Kaldi语音识别技术(四) ----- 完成G.fst的生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854694

相关文章

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推