kaldi I/O

kaldi中經常出現ark或者scp,今天就對kaldi I/O進行一下討論,

archive(.ark) 和 script(.scp) 都是文件格式,這兩種格式都被映成table的格式,一個table是一組有規則的表,前面是比如utt2spk中,前面一列是uid,後面一列是speaker,如下所示:

utt1 spk_of_utt1

utt2 spk_of_utt2

或者比如spk2utt 前面一列是spk,後面一串是數據,如下所示:

spk1 utt1_of_spk1 utt2_of_spk1 utt3_of_spk1

spk2 utt2_of_spk2 utt2_of_spk2


這種table前面都是一個可識別的字符串,後面跟着一個數據或者一串數據,這裏的一個table不是一個C++的類或者對象,而是對於不同的需求,有不同的C++對象進行讀寫。

ark和scp區別在於如下:

1)archive文件和script文件的真正區別在於是否真實包含數據,

2)script文件指向了文件的位置,而archive包含真實的數據;

3)scp格式是text-only的格式,每行是個key(一般是句子的標識符(id))後接空格,接這個句子特徵數據的路徑。

ark格式可以是text或binary格式,(你可以寫爲text格式,命令行要加’t’,binary是默認的格式)文件裏面數據的格式是:key(如句子的id)空格後接數據。


kaldi中還有“rspecifier”和“wspecifier”,其中

“rspecifier”用於說明如何讀表的字符串;而“wspecifier”

用於說明如何寫入表的字符串

需要注意的是 “rspecifier”和“wspecifier”並不是C++中的類或者對象,他們只是爲了方便使用,對變量的描述名稱,

“rspecifier”類型有如下方式:

1)“-”或者“” 表示標準輸入

2)管道“|”輸入 通過popen()得到管道輸入的字符串

3)文件偏移輸入,比如“/some/filename:123456”,打開文件並定位到行12345

4)沒有比配以上模式的話,認爲輸入爲一個文件名,當然如果顯然隨便寫一個串,當試圖當文件打開的話,如果文件不存在就會報錯

5)沒有輸入,如:一長串的空格“     |”

“wspecifier”類型有如下方式:

1)“-”或者“”表示標準輸出

2)管道“|”輸出,通過popen打開文件並輸出

3)普通文件,如“/some/filename”

4)沒有輸出,不合法的文件名稱,如:一串的空格“|   ”


今天順便看了一下kaldi的代碼,方便理解rspecifier如何對上述提到的5中類型進行解析,其代碼如下:



分析了一下代碼,雖然kaldi是個很給力的工具,但是仔細看其代碼,真心感覺kaldi的代碼太差了(見標紅的兩處)。


參考地址:

http://kaldi-asr.org/doc/io_tut.html

http://kaldi-asr.org/doc/io.html#io_sec_tables

http://kaldi-asr.org/doc/group__io__group.html#gga5fc772c800c3d40d2b95564e8a839baba8d445a74e5988adcc38570c156ea2dfc


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章