rspecifier、wspecifiers用法

常用的“o”(once)、“p”(permissive)、“s”(sorted)、“cs”(called-sorted)。

1
2
3
#examples
ark:o,s,cs:-
scp,p:data/my.scp

Tabla 中读数据的程序需要一个rspecifier输入,该字符串指明了如何读 取索引数据;而写数据到 Table 中的程序需要一个wspecifier输入,该字符串 指示如何写数据。这两个字符串指出是否需要 scritptarchive 文件,文件位置, 以及不同的选项。常用的rspecifiersark:-,表示从标准的输入中读取 archive 数据;而scp:foo.scp表示 script文件foo.scp会告诉我们从哪里去读取数据(因为scp文件只存了路径)。 下面几点需要牢记 :

  • 冒号后面的部分被解释为wxfilenamerxfilename(与 Non-table I/O 中一样),这意味着管道和标准的输入/输出均可支持。
  • 一个 Table 通常只包含一种类型的对象(例如浮点型矩阵)
  • 在“rspecifiers”中,“ark,s,cs:-”表示当我们读数据时,我们希望keys是有序的(s),以及我们会按顺序访问数据(cs),若这些条件不满足时,程序会崩溃。这些保证了Kaldi中高效的的随机访问,而不占用大量的内存。
  • 对于规模较少并且不太方便进行排序列的数据(例如:说话人自适应 应变换矩阵),若省略掉 s, cs 参数,几乎没有损害。
  • 当Kaldi程序有多个rspecifiers输入时,程序会轮流访问相应的对象;其中第一个使用顺序访问,而后面的采用随机访问,因此,第一个“rspecifier”不需要“s, cs”选项。
  • 在访问script文件时,例如p:foo.scp,其中p意味着当我们 需要的文件不存在时,程序不会崩溃(对于 archive,当期望的文 件被破坏或被截断时,p也地阻止程序崩溃)。
  • 写数据时,选项t表示文本模式,例如:ark,t:--binary 命令行选项对 archives 无效。

.ark.scp

.ark.scp是 kaldi 中两种记录数据的格式。.ark 是数据(二进制文件),.scp 是记录对应 .ark 的路径。.ark 文件一般都是很大的,因为他们里面是真正的数据。这两种格式都是表(table)的概念。

wspecifier meaning
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

最后一个,.scp是.ark的偏移量

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  
ark,s,cs:- read archive(sorted) from stdin…

最后一个,”s”排序,”cs”它将按排序顺序被调用,archive上允许内存高效的随机访问

Kaldi中特征文件格式的转换

## kaldi中的ark文件与htk中的mfcc文件的互相转换

​ (1)、ark2mfcc

​ 使用底层命令copy-feats-to-htk

​ Save features as HTK files:

​ 每个发音会转化为一个对应的htk格式的特征文件,后缀可以自己定义

1
2
3
4
5
#usage
copy-feats-to-htk [options] in-rspecifier
#egs
copy-feats-to-htk --output-dir=/tmp/HTK-features --output-ext=fea scp:feats.scp
# --output-ext是扩展名,一般写mfcc,可以自己定义。

​ (2)、mfcc2ark

​ 使用命令行copy-feats

​ Copy features [and possibly change format]

1
2
3
4
5
6
#usage
copy-feats [options] <feature-rspecifier> <feature-wspecifier>
#Or
copy-feats [options] <feats-rxfilename> <feats-wxfilename>
#egs
copy-feats --htk-in=true scp:mfcc.scp  ark,scp:foo.ark,foo.scp

​ 这里的输入是mfcc文件的地址文件,这样作为一个输入流传到copy-feats中转化为ark格式的kaldi文件。

## ark文件与txt文件互相转换

​ 这个很简单,也只需要用到copy-feats命令

1
2
copy-feats ark:train.ark  ark,t:/train.txt      #ark转化为txt
copy-feats ark,t:train.txt  ark:train.ark        #txt转化为ark