kaldi學習 - egs/yesno —— 數據准備(二)


  參考文檔:http://www.cnblogs.com/welen/p/7485151.html 

 

  寫在前面,本文雖然對大多數腳本進行了解釋,但只是初學者的理解,如果你認為讀起來不知所雲,建議從 kaldi 官方文檔 讀起,兩邊配合理解,可以解決很多看起來好像很難理解的東西。(官方文檔地址: http://www.kaldi-asr.org/doc/data_prep.html )

 

  今天為止,/rgs/yesno/ 實例的數據准備階段的腳本終於基本看完了,你我很忙,“知識不慌張”。學習總是一件很有成就感的事情。再次提醒,當你閱讀中文文檔和博客感到抓狂的時候,不防看看 kaldi 官方文檔,可能需要一些時間去學會怎樣尋找自己需要的東西,但是學習不就是一個從無到有的過程嗎,向來如此。

 

  run.sh 是整個實例的頂層調用腳本,可以看到清晰的處理脈絡。上一篇(http://www.cnblogs.com/gstblog/p/8933797.html)當中,主要是對腳本的prepare_data進行了學習,包含了腳本文件中涉及到的其他腳本文件,今天繼續往下學習

  local/prepare_dict.sh   utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang  

  路徑: kaldi-trunk/egs/yesno/s5

  運行: ./run.sh

  目前代碼:

#!/bin/bash

train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"

if [ ! -d waves_yesno ]; then
  wget http://www.openslr.org/resources/1/waves_yesno.tar.gz || exit 1;
  # was:
  # wget http://sourceforge.net/projects/kaldi/files/waves_yesno.tar.gz || exit 1;
  tar -xvzf waves_yesno.tar.gz || exit 1;
fi

train_yesno=train_yesno
test_base_name=test_yesno

rm -rf data exp mfcc

# Data preparation

local/prepare_data.sh waves_yesno
local/prepare_dict.sh
utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang
local/prepare_lm.sh

  1.  local/prepare_dict.sh

    prepare_dict 用於數據准備階段的字典准備,創建了 data/local/dict 目錄,並創建了里面必要的文件。字典主要是為了羅列出 單詞和發音的對應關系,方便后面訓練模型和測試數據使用,里面的文件各司其職,有的負責對應單詞和發音,有的負責存儲非語言學發音(靜音,噪聲,笑聲等,但是這個例子里面只有 SIL(silence))。

     data/local/dict 里面的文件包括:

       

    其中,各個文件解釋如下

    lexicon.txt: 發音字典文件,里面內容形式是 <word> - <utterance>, 左邊一列是單詞,右邊一列是對應的發音 。這里發音用 Y , N ,SIL 表示

        

    lexiconp.txt: 也是發音字典文件,只不過它添加了對應的發音概率。在這里為了方便處理,這里其實把所有的發音概率都設為了1,而不是左右的概率加起來等於1。第二列就是概率。

        

 

     其他的文件則專門分別記錄的單詞的發音,靜音,非靜音等等信息

        

 

    prepare_dict.sh 代碼如下:

#!/bin/bash

#====
# create directory saving dict files
#====
mkdir -p data/local/dict

#====
# copy some files form input 
# SIL means silence
# lexicon.txt,                完整的詞位-發音對     
# lexiconp.txt,            完整的詞位-發音概率-發音     
# lexicon_words.txt,        單詞-發音對            
# silence_phones.txt,         非語言學發音(靜音,噪音,笑聲等)        
# nonsilence_phones.txt,    語言學發音            
# optional_silence.txt ,            備選非語言發音 
#====

#====
# grep: 查找指令 ,-v選項表示反向查找,
#  第三行代碼意思是,查找phones.txt的內容, 凡是不含 SIL 的行,會被重定向輸出 ( > )到 nonsilence_phones.txt
#====

cp input/lexicon_nosil.txt data/local/dict/lexicon_words.txt

cp input/lexicon.txt data/local/dict/lexicon.txt

cat input/phones.txt | grep -v SIL > data/local/dict/nonsilence_phones.txt

echo "SIL" > data/local/dict/silence_phones.txt

echo "SIL" > data/local/dict/optional_silence.txt

echo "Dictionary preparation succeeded"    

 

  2.  utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang

     上面是一條帶有命令行參數的指令,--position-dependent-phones 是命令選項,這里賦值為false,后面四項是prepare_lang.sh 的四個參數。參數解釋如下:      

        utils/prepare_lang.sh <input_dir> <oov> <temperary_dir> <output_dir>

    oov: 數據集之外的單詞,會映射到這里;
    <temperary_dir>:僅僅就是一個臨時文件,不需要過多關注;
    <output_dir>: 這個目錄是真正的數據的輸出目錄

    命令選項 --position-dependent-phones 與詞位信息有關,默認值是 true,這時候會使用詞位信息 _B _E _I _S ,表示開始,結束,詞中,單個詞。
    具體的可以在 yesno/s5/utils/prepare_lang.sh中找到。還有一些其它選項也在這個文件里面。
    在這個例子當中,預料信息很少,全部都是孤立詞,所以把這個選項設為false。
    
    

     在上一條指令 ./local/prepare_dict 中,我們搞定了一些詞典信息,但是kaldi處理數據需要專門的數據結構 fst(Finite Satte Transducers,有窮狀態轉換器),具體可以參考網上資料,以及官方文檔。而這一條指令,就是創建 /dict/lang 目錄,保存這些信息。

    3. /data/lang 里面有什么

    剛剛說了 prepare_lang.sh 創建了 /data/lang 目錄,完成了從普通數據結構(人能夠讀懂的數據結構)到特定格式(fst格式)的轉換,那么這個目錄里到底有什么?這些文件有什么內容呢?所謂的特定的格式是什么樣的?分析一下。

    3.1 有什么?

      看一下里面打底有哪些文件,還有一個phone目錄,也一並展示

        

    3.2 是什么內容

      先看看 /dict/lang 下面的幾個文件

    3.2.1 phone.txt 和 words.txt

        

        這兩個文件分別存儲了 音素與整數的映射,單詞與整數的映射,從這里就可以看出 數據准備階段一開始數據結構與FST格式的不同。

     3.2.2  L.fst

        這是一個 fst 格式的發音詞典,輸入是音素,而輸出是詞。

     3.2.3  L_disambig.fst

        這也是一個 fst 格式的發音詞典,只是在這個文件當中,添加了消除歧義的符號,比如#1,#2,以及自循環符號 #0。

     3.2.4 oov.txt 

        這個文件里面存儲了一些符號,所有ooV詞(詞表之外的詞,out of  vocabulary)都會被映射為這個符號。

     3.2.5 topo

        

 

      這個文件里面存儲了我們后將要用到的 HMM 模型的拓撲模型,可以看到有兩部分,第一部分 <ForPhones></ForPhones> 之間的數字是 2,3 ,是發音的編號指的是 YES, NO ,這個可以從 phones.txt 找到,自然 下面一部分 的數字 1 指的是SIL。 YES,NO 公有3種狀態,SIL有五種狀態,它們各自狀態之間的轉移以及轉移概率則是每一行<Transition> state probability 指定。

      3.2.6 phones/*

      phones 目錄下的文件很明顯有一個特點,每一個文件都有3個,但是他們的后綴名都不一樣,同名不同后綴的文件,其實有着完全一樣的內容,只是他們各自存儲信息的格式是不同的。這里用 nonsilence.* 舉例子

        

         

 

 這里,context_indep.* 存儲了上下文無關的信息。nonsilence.* silence.* optional_silence.*存儲了音素信息。extra_question.*存儲的是一些額外的信息,主要是和音調和重音之類的信息有關。disambig.* 則存儲了一些消除歧義使用的符號,在前面已經見過,比如#0, #1等等。roots.# 可以提供建立上下文決策樹的信息。set.* 包含了一系列的因素集,一般是將同一個音素(有時候會包含詞位信息 _B _E)存儲在同一行,聚類使用。

 

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM