kaldi I/O機制

擴展文件名

使用擴展的文件名來表示輸入輸出:
- rxfilename表示讀取的數據流,比如file/stream/standard input
- wxfilename表示輸出的數據流

1.rxfilename
類型包括
- “-” or “” 表示標準輸入
- “command |” 命令通過管道作爲輸入,解析的時候去掉”|”,將剩下的command通過popen()交由shell處理
- “/some/filename:12345” 文件有偏移
- “/some/filename” 不滿足上面三種形式的當做普通文件解析

2.wxfilename
類型包括
- “-” or “” 標準輸入
- “|command” 輸出經由管道傳給command,同樣通過調用popen()函數交由shell
- “/some/filename” 不是以上兩種形式的當作普通文件解析

I/O類型

分爲兩類:
- non-table 文件或者數據流包含一個或者兩個object
- table 文件或者數據流包含object的集合,使用string進行map

non-table

可以使用copy相關的命令對文件進行二進制和文本之間的轉化,比如”copy-matrix –binary=false foo.mat -“

table

table有兩種形式:
- script file: map的value存放的是數據的存放路徑
- archive: map的value存放的是實際的數據

文件格式

1.scp
標準格式是

<key> <rxfilename>

其中rxfilename的形式可以是以下幾種

#1.文件路徑
/some/filename
#2.管道
gunzip -c /usr/data/file_010001.wav.gz |
#3.文件範圍
foo.ark:89142[0:51,89:100]

2.ark
標準格式是

token1 [something]token2 [something]token3 [something] ....

文件使用

table類型的文件可以使用wspecifiers/rspecifiers作爲文件名傳入命令行,有效的使用方式:

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";

格式可以總結爲以下形式:

ark/scp,[option]: rxfilename/wxfilename

相比於前面的rxfilename/wxfilename增加的前面的頭表示table的格式以及讀寫的方式,option包括:

##wspecifiers相關的選項
b: 二進制格式
t: 文本格式
f: 每次寫操作flush
nf: 與f相反
p: 當scp文件缺失某些項的時候,不報錯
##rspecifiers相關的選項
o: once,每一個key只被查找一次
p: permissive,忽略錯誤
s: sorted,keys是排序的
cs: called-sorted,可以節省內存
發佈了132 篇原創文章 · 獲贊 94 · 訪問量 62萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章