美文网首页
kaldi 源码阅读(二) - 代码结构分析

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

作者: 走在成长的道路上 | 来源:发表于2018-08-01 19:03 被阅读0次

    源码目录结构分析

    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
    

    相关文章

      网友评论

          本文标题:kaldi 源码阅读(二) - 代码结构分析

          本文链接:https://www.haomeiwen.com/subject/drchvftx.html