天天看点

kaldi文件格式

kaldi文件分两大类:列表表单(.scp结尾)和存档表单(.ark结尾)。它们是配合的。

列表表单的每个元素占一行,每行分两个字段,前一个是索引(index),后一个文件(file)。

audio_index1 /paht/to/audio1.wav
audio_index2 /paht/to/audio2.wav
audio_index3 /paht/to/audio3.wav

但是需要说明一点,“文件”的本质是一个存储地址,它可能是在磁盘上,也可能是在内存上。还可能是一个二进制文件某字节的位置。

要充分了解这点,否则后面遇到具体的用法时会糊涂。

存档表单,用于存储数据,可以是文本数据,也可以是二进制数据。

存档表单的内容是关于索引和数据的组合。在文本型的存档表单中,每个元素是以\n结尾,它与换行符相同,打开后与列表表单非常相似,但本质上只是一种巧合。

如下文本存档表单的内容:

text_index1 this the first text\ntext_index2 this is the second text...

它是一个整体,换行符"\n"本身也是文件内容的一部分。这是与列表表单是不同的。

对于二进制存档表单,情况又 不同。它是在索引+空格之后再添加一个\0B符号,数据和索引的分隔标志位,且在真实数据之前还添加了头<header>,来指示后续的元素数据的大小,以免读取错误。

binary_indext1 \0B<header><content>binary_index2 \0B<header><content>..

对于声学特征存档文件来说,<header>中可以包含特征的帧数、维度、特征类型、占用字节数和是否压缩等等。

Kaldi命令如果需要输入、输出时,需要指定rspecifier和wspecifier,就是读指示符和写指示符。例如compute-mfcc-feats [options...] <wav-rspecifier>  <feats-wspecifier>。而每个指示符要么是列表表单相关的scp,p|s|cs:path/to/file.scp,要么存档列表相关的ark,t|b:path/to/file.ark。

比较特殊的有两点,一是,可以从标准输入或者标准输入作为文件,文件位置用“-”表示,结合管道操作组合变化比较多;二是在输出时,可以同时制定列表表单和存档表单两种方式,以逗号隔开。例如:

ark,scp:/path/to/file.ark, /path/to/file.scp,必须是ark在前,scp在后。

继续阅读