Specifying Table formats: wspecifiers and rspecifiers

Table类需要传递字符窜给构造函数或Open函数。这个字符串叫做 wspecifier如果它是传递给TableWriter类,或 rspecifier如果它是传递给RandomAccessTableReader或SequentialTableReader类。有效的 rspecifiers和 wspecifiers的例子包括:

std::string rspecifier1 = "scp:data/train.scp"; // script file. std::string rspecifier2 = "ark:-"; // archive read from stdin. // write to a gzipped text archive. std::string wspecifier1 = "ark,t:| gzip -c > /some/dir/foo.ark.gz"; std::string wspecifier2 = "ark,scp:data/my.ark,data/my.ark";

通常,rspecifier或 wspecifier包括由逗号分隔的,无序的一个或两个字母的定义的选项和“ark”“scp”标识。后面跟着冒号和一个 rxfilename或 wxfilename。冒号前面选项的顺序并不重要。

Writing an archive and a script file simutaneously

wspecifiers的一个特例是:冒号前是“ark,scp”;冒号后是一个用于写 archive的 wxfilename,一个逗号,然后是一个 wxfilename(用于script file)。例如:

"ark,scp:/some/dir/foo.ark,/some/dir/foo.scp"

这会以像"utt_id /somedir/foo.ark:1234"这样的方式来写入archive和script file,指定了 archive的偏置,来达到更有效率的随机访问。接着你就可以随意处理script file,比如分解成多个片段,它仍像其他 script file一样正常工作。注意,虽然冒号前面的选项顺序一般不重要,这个例子中“ark”必须放在“scp”前面;这是为了避免冒号后面的两个 wxfilename产生混淆(archive始终在第一个)。指定 archive的 wxfilename必须是一个正常的文件名,否则写入的 script file不能被 Kaldi直接读取,但是代码中并没有限定这一点。

Valid options for wspecifiers

允许的wspecifier选项有:

  • “b”(binary) 以二进制方式写(目前这是不必要,因为它是默认方式)
  • “t”(text) 以文本方式写
  • “f”(flush) 每次写操作后都刷新数据流
  • “nf”(non-flush) 每次写操作后不刷新数据流(目前这是无意义的,但是调用代码可以更改这个默认值)
  • “p” 指许可模式,影响“scp:”wspecifiers在scp文件丢失一部分条目时,“p”选项会导致它不写这些内容,同时不会报告错误。

用了很多选项的 wspecifiers的例子是:

"ark,t,f:data/my.ark" "ark,scp,t,f:data/my.ark,|gzip -c > data/my.scp.gz"

Valid options for rspecifiers

读下面的选项时,请记住读 archives的代码不能在 archive中进行搜索,因为 archive可能是一个管道(经常是这样)。如果RandomAccessTableReader在读 archive,读代码可能要在内存中存储很多对象,以防后面再次被请求到,或代码需要搜寻到 archive的末尾,当它想找到一个 key而 archive中实际并不存在这样的 key时。下面的一些选项就是用来避免这种情况。

重要的rspecifier选项是:

  • “o”(once) 是用户声明给RandomAccessTableReader每个 key只被请求一次。这样就不必把已经读过的对象储存在内存中以防万一它们会再被用到。
  • “p”(pemissive) 指示代码忽略掉错误,只提供有效数据;无效数据会被视为不存在。在 scp文件中,一个查询Haskey()强制加载相应的文件,而如果该文件已损坏,代码知道返回错误。在 archive中,这个选项避免了由 archive损坏或截断所引起的异常(它只是不会读那样的点)
  • “s”(sorted) 指示代码 archive中的 key是按字符顺序排序的。对RandomAccessTableReader来说,这意味着当Haskey()查询某个不存在 archive中的 key时,它在遇到一个“更高”的 key时就会立刻返回错误;而不必读到文件末尾
  • “cs”(called-sorted) 指示代码调用Haskey()和Value()时是按照字符顺序的。因此,如果其中一个函数被调用于某个字符串时,读代码就会忽视字符串序低的那些对象。这节省了内存。实际上,“cs”代表用户声明了程序可能在遍历的其他 archive是排好序的。

如果用户错误地提供了上面的选项,e.g.对实际上没有排序的 archive给定“s”选项,RandomAccessTableReader代码会尽可能地检测出此错误并停止工作。

为了对称和方便,也提供下面的一些选项,但是目前并不起作用。

  • “no”(not-once) 是“o”的对立选项(当前代码中,它没有任何作用)
  • “np”(not-permissive) 是“p”的对立选项(当前代码中,它没有任何作用)
  • “ns”(not-sorted) 是“s”的对立选项(当前代码中,它没有任何作用)
  • “ncs”(not-called-sorted) 是“cs”的对立选项(当前代码中,它没有任何作用)
  • “b”(binary) 什么都不做,仅为了写脚本方便
  • “t”(text) 什么都不做,仅为了写脚本方便

使用了很多选项的rspecifiers的典型例子是:

"ark:o,s,cs:-" "scp,p:data/my.scp"

results matching ""

    No results matching ""