kaldi I/O

来源:互联网 发布:mac 10.7.5怎么升级 编辑:程序博客网 时间:2024/05/18 20:37

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


1 0