例:
ark,s,cs:apply-cmvn --norm-means=true --norm-vars=false -- \
utt2spk=ark:data/fbank/test/split1/1/utt2spk \
scp:data/fbank/test/split1/1/cmvn.scp \
scp:data/fbank/test/split1/1/feats.scp ark:- |' \
'ark:|lattice-scale --acoustic-scale=10.0 \
ark:- ark:- | gzip -c >exp/chain/tdnn/decode_test/lat.1.gz
初次见到这个,肯定要感慨这是什么鸟语?花香,通过查看资料才基本搞懂kaldi的一些常用命令。
说明:
archive(.ark)、script(.scp) : 是表格(table)一个‘表’就是一组有序的事物,前面是识别字符串(如句子的id),一个‘表’不是一个c++的对象,因为对应不同的需求(写入、迭代、随机读入)我们分别有c++对象来读入数据。Table有两种形式:“archive”和“script”文件。它们之间的差别在于:archive 包含实际的数据,而 script 文件则指出数据的具体位置。
.scp格式是text-only的格式,每行是个key(一般是句子的标识符(id))后接空格,接这个句子特征数据的路径 。
.ark格式可以是text或binary格式,(你可以写为text格式,命令行要加‘t’,binary是默认的格式)文件里面数据的格式是:key(如句子的id)空格后接数据。
.ark 和.scp 是 kaldi 中两种记录数 据的格式, .ark 是数据(二进制文件),scp 是记录对应 ark 的路径。 .ark 文件一般都是很大的(因为他们里面是真正的数据)。开头的ark:或scp:是要说明的格式,同名的 archive(.ark) 和 script(.scp) 文件代表的同一部分数据,注意,这 些命令行都有前缀”scp:” 或 “ark:”,kaldi 不会自己判断这到底是个 script 还是 archive 形式,这需要我们加前缀告诉 kaldi 这是什么格式的文件。对于 code 而言, 这两种格式对它来说都是一样的。
这两种格式都是‘表(table)’的概念。一个‘表’就是一组有序的事物,前面是 识别字符串(如句子的 id),一个‘表’不是一个 c++的对象,因为对应不同的需 求(写入、迭代、随机读入)我们分别有 c++对象来读入数据。
常见示例:
.scp格式 是 text-only 的格式,每行是个 key(一般是句子的标识符(id))后 接空格,接这个句子特征数据的路径 。
.ark格式 可以是 text 或 binary 格式,(你可以写为 text 格式,命令行要加‘t’, binary 是默认的格式)文件里面数据的格式是:key(如句子的 id)空格后接数据。
比如: raw_mfcc_dev.1.scp里的FNLP0_si1308 /Users/yelong/kaldi/egs/timit/s5/mfcc/raw_mfcc_test.3.ark:13意思是,打开存档(archive)文件,fseek()定位 到 13(字节),然后开始读数据。
wspecifier | meaninig |
---|---|
ark:foo.ark | write to archive foo.ark |
scp:foo.scp | write to files using mapping in foo.scp |
ark:- | write archive to stdout |
ark,t | gzip -c >foo.gz |
ark,t:- | write text-form archive to stdout |
ark,scp:foo.ark,foo.scp | write archive and scp file (其实就是最上面两个的结合) |
rspecifier | meaning |
---|---|
ark:foo.ark | Read from archive foo.ark |
scp:foo.scp | Read as specified in foo.scp |
ark:- | read archive from stdin |
ark:gunzip -c foo.gz | unzip and read from foo.gz |
ark,s,cs:- | read archive from stdin … |
最后一个,“s”排序,“cs”它将按照排序顺序被调用。archive上允许内存高效的随机访问。