kaldi 源码阅读(二) - 代码结构分析

简介: 源码目录结构分析egs/ 开放数据集合,主要目录 wsj, rm |- README.txt src/ 代码主目录 |- configure 构建 kaldi.

源码目录结构分析

egs/            开放数据集合,主要目录 wsj, rm
   |- README.txt   
src/             代码主目录
   |- configure     构建 kaldi.mk 文件(c库,编译优化参数等)
   |- Makefile      组织整体代码依赖相关内容
   |- ……
tools/            基础工具包
   |- atlas            数学算法库
   |- clpack          cl线代库加速包
   |- srilm            语言模型生成工具
   |- openfst       加权有限状态机(Makefile文件中自动下载并编译)
   |- sctk             Speech Recognition Scoring Toolkit(Makefile文件中自动下载并编译)
   |- sph2pipe     SPHERE 文件转换(其他音频)工具(Makefile文件中自动下载并编译)
   |- openblas     开源blas库(Makefile文件中自动下载并编译)
   |- extras          扩展工具包

常见文件格式

常见内容标记说明

标记名称 说明
utterance-id 发音编号, 可以是任意的文本字符串
speaker-id 说话人编号, 常作为发音编号的前缀
record-id 和在“wav.scp”中使用的是同一个标识字符串, 与 uttid 一样
word 单词列表
segment-begin/segment-end 以秒为单位。它们指明了一段发音在一段录音中的时间偏移量

比如:

文件名称 内容格式
text < uttid > < word >
wav.scp < uttid > < utter_file_path >
utt2spk < uttid > < speakid >
spk2utt < speakid > < uttid >
segments <uttid> <recid> <segbegin> <segend>
feats.scp < uttid > <extended-filename-of-features>

注意:

对于 text 中不一定要保证每个单词都必须出现在词汇表中,若词汇表中没有则被映射到 lang/oov.txt 文件中(lang/oov.int 文件为其 SPN 的数字形式,从 words.txt 中提取)。

在每一个 feats.scp 特征文件中保存的都是Kaldi格式的矩阵。在这个例子中,矩阵的维度是13(译者注:即列数;行数则 和你的文件长度有关,标准情况下帧长20ms,帧移10ms,所以一行特征数据对应10ms的音频数据)。比如:

s5# head -3 data/train/cmvn.scp 
// 表示 2001-A 对应的特征从 cmvn_train.ark 文件的 7 字节开始读取数据
2001-A /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:7
// 表示 2001-B 对应的特征从 cmvn_train.ark 文件的 253 字节开始读取数据
2001-B /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:253
// 表示 2005-A 对应的特征从 cmvn_train.ark 文件的 499 字节开始读取数据
2005-A /home/xxxx/kaldi/egs/swbd/s5/mfcc/cmvn_train.ark:499

对于 phones.txt 和 words.txt 分别存放词典, 比如:

s5$ head -3 data/lang/phones.txt
<eps> 0
SIL 1
SIL_B 2

s5$ head -3 data/lang/words.txt
<eps> 0
!SIL 1
-'S 2

这些为符号标 (symbol-table) 文件,符合 OpenFst 的格式定义。

在 kaldi 中, 这些文件被用于音素符号的文本形式和数字形式之间进行转换。大多数情况下,只有脚本 utils/int2sym.pl 和 utils/sym2int.pl 及 OpenFst 中 fstcompile 和 fstprint 会读取这些文件。

文件 L.fst 是 FST 形式的发音词典, 其中输入是音素,输出为词汇。
文件 L_disambig.fst 也为发音词典,但还包含为消歧而引入的符号(比如 #1, #2 等,以及自环(self-loop) 而引入的 #0)。

lang/topo 文件指明 HMM 模型拓扑结构

lang/G.fst 文件中存放了语言模型(语法),FST 格式表示,解码时使用,根据使用的语言模型的不同,生产 G.fst 的步骤会不同。比如:

# 在 rm 中使用 local/rm_data_prep.sh 文件里面
# 生成 G.txt 语法文件
local/make_rm_lm.pl $RMROOT/rm1_audio1/rm1/doc/wp_gram.txt  > $tmpdir/G.txt || exit 1;
# 在 local/rm_prepare_grammar.sh 会将文本格式语法文件转换为二进制 G.fst 文件
fstcompile --isymbols=data/lang/words.txt --osymbols=data/lang/words.txt --keep_isymbols=false \
    --keep_osymbols=false $tmpdir/G.txt > data/lang/G.fst
目录
相关文章
|
存储 前端开发 JavaScript
AntV X6源码探究简析
AntV是蚂蚁金服全新一代数据可视化解决方案,其中X6主要用于解决图编辑领域相关的解决方案,其是一款图编辑引擎,内置了一下编辑器所需的功能及组件等,本文旨在通过简要分析x6源码来对图编辑领域的一些底层引擎进行一个大致了解,同时也为团队中需要进行基于X6编辑引擎进行构建的图编辑器提供一些侧面了解,在碰到问题时可以较快的找到问题点。
393 0
|
算法
《重构2》第七章-封装
《重构2》第七章-封装
106 0
|
JSON 前端开发 数据可视化
umi3源码探究简析
作为蚂蚁金服整个生态圈最为核心的部分,umi可谓是王冠上的红宝石,因而个人认为对于整个umi架构内核的学习及设计哲学的理解,可能比如何使用要来的更为重要;作为一个使用者,希望能从各位大佬的源码中汲取一些养分以及获得一些灵感
237 0
|
存储 JSON Go
Go疑点细节速查[精炼]
Go疑点细节速查[精炼]
|
人工智能 JSON 前端开发
一眼就懂的TVM7大功能
简明扼要的介绍TVM的7大功能
|
API 数据库
FastAPI 学习之路(三十五)项目结构优化
FastAPI 学习之路(三十五)项目结构优化
1102 0
FastAPI 学习之路(三十五)项目结构优化
|
开发工具 git C语言
kaldi 源码阅读(一) - 环境搭建
按照我一贯的做法,来阅读开源代码: 1. 编译以及基础功能的测试 2. 模块功能划分 3. 单一模块解析(添加注释或日志) 4. 扩展新demo工程 5. 自定义模块及调用 文章也会按照上述流程进行开展。
2506 0
|
前端开发 JavaScript
精读《如何编译前端项目与组件》
# 1 引言 说到前端编译方案,也就是如何打包项目,如何编译组件,可选方案有很多,比如: - 通过 webpack / parcel / gulp 构建项目。 - 通过 parcel / gulp / babel 构建组件。 如果你喜欢零配置的 parcel,那么项目和组件都可以拿它来编译。 如果你业务比较复杂,需要使用 webpack 做深度定制,那么常见组合是:项目
1061 0
|
Python Perl
kaldi 源码分析(九) - topo 文件分析
在 egs/wsj/s5/steps/nnet3/chain/gen_topo*.py 与 src/hmm/hmm-topology.cc 文件进行对应 在 gen_topo*.p{l, y} 文件中进行自动创建 topo 文件, 然后在 hmm-topology.cc 文件中的 HmmTopology::Read() 函数中解析 topo 文件生成 HmmTopology 对象。
1587 0
|
算法 语音技术
kaldi 源码分析(七) - HCLG 分析
Kaldi 语音识别主流程: 语音识别过程 解码网络使用 HCLG.fst 的方式, 它由 4 个 fst 经过一系列算法组合而成。分别是 H.fst、C.fst、L.fst 和 G.fst 4 个 fst 文件: 1. G:语言模型,输入输出类型相同,实际是一个WFSA(acceptor接受机),为了方便与其它三个WFST进行操作,将其视为一个输入输出相同的WFST。
5323 0
下一篇
无影云桌面