kaldi输入输出机制
表单
- 经过local文件夹中的预处理脚本的处理,原始数据文件被处理成kaldi的标准格式——表单(table)
- 表单的本质是若干元素的集合,每个元素有一个索引
- 索引必须是一个不包含空格的非空字符串
- 而元素的类型取决于创建表单时的定义
- 例如:摇窗机一个音频表单,那么元素的内容就是音频文件名:aduio1 /音频/audio1.wav
- audio1 就是索引,后面的路径就是表单元素
- 在kaldi中,所有的数据文件都是以表单形式存储的,比如文本、音频特征、特征变换矩阵
- 表单可以存储在磁盘上,也可以存储在内存中[以管道的形式]
- 表单有两种
- 列表(Script-file) 表单
- 存档(Archive)表单
- 一套特有的输入输出机制
列表表单
-
作用
-
列表表单 用于索引存储于磁盘或内存中的文件
-
在Kaldi通用脚本中,这类表单默认以
.scp
为扩展名,但对于Kaldi可执行程序来说并没有扩展名的限制 -
file1_index /path/to/file1 file2_index /path/to/file2
- 空格之前的字符串是表单索引,空格之后的内容是文件定位符,用于定位文件
-
文件定位符
-
可以是磁盘中的物理地址
-
也可以是以管道形式的内存地址
-
file1_index gunzip -c /path/to/file1.gz | file2_index gunzip -c /path/to/file2.gz |
- 上面的示例中,第一个空格之后的内容表示wav格式的音频文件的压缩包酱油gunzip进行解压并传输到内存管道中
- 而kaldi的可执行文件将从管道中读取解压之后的文件内容并执行后续操作
- 这样做可以节省磁盘空间
-
偏移定位符
- 如果文件定位符执行的是二进制的kaldi存档文件,则还可以增加偏移定位符
- 用于指向该二进制文件中从某一个字节开始的内容
- 扩展偏移定位符:
- 通过切片操作指定读取的行和列的范围
-
-
-
从管道文件和偏移定位符可以看出,文件定位符定义的“文件”,本质是上一个存储地址,这个地址可能是一个外部磁盘的物理地址,也可能是管道指向的内存地址,还可能是从一个磁盘文件中的某个字节开始的地址。
-
无论哪种形式,列表表单的元素一定是“文件”
存档表单
-
存档表单用于存储数据,数据可以是文本数据,也可以是二进制数据
-
这类表单通常默认以.ark为扩展名,但没有严格限制
-
存档表单没有行的概念,存档表单的元素直接没有间隔符,对于文本类型的存档文件来说,需要保证每个元素都以换行符结尾
-
text_index1 this is first text\text_index2 this is second text\n
-
二进制类型存档表单中
索引以每个字符对于的ASCII值存储,然后是一个空格,接下来是“\0B”,这个标志位是区别文本和二进制内容 的重要标识
紧接着是二进制的表单元素,直至下一个索引
可以通过内容本身判断这个元素占用的空间大小,这个信息保存在一段文件头中
binary_index1 \0B<header><content>binary_index2 \0B<header><content>
<header>中可以包含特征的帧数,维度,声学特征类型,占用字节数和释放压缩等信息
读写声明符
-
读声明符和谐声明符定义了可执行程序处理输入表单文件和输出表单文件的方式,他们都是有两部分组成
-
表单属性(specifier option)
- scp:列表表单
- ark,t ; ark :存档表单
-
表单文件名 ( xfilename)
- path/file1
-
-
这两部分都冒号组合在一起
-
他们可以接受的表单文件名如下:
- 磁盘路径
- 对于读声明符,指定一个存在于磁盘的文件路径
- 对于写声明符,制定一个希望输出的文件路径
- 标准输入
- 对于读声明符和写声明符,如果指定 “-” 为表单文件名,则意味着要从标准输入获取文件内容,或者将输出打印到标准输入
- 管道符号
- 如果在某个可执行程序后边加上管道符号,则意味着要将输出送入管道,由管道后边的可执行程序接收
- 如果在某个可执行程序前面加上管道符号,则意味着要从管道中获取输入
- 磁盘路径夹偏移定位符
- 这种方式只能用于读声明符,用户告知可执行程序从文件的某个字节开始读取
- 磁盘路径
-
# 参数1:
# 读声明符
# 表单属性: scp:
# 表单文件名: path/file1
# 参数2:写声明符 ark,t:path/utt2dur
cmd scp:path/file1 ark,t:path/utt2dur
表单属性
写属性
-
表单类型:标识符为scp或ark,这个属性定义了输出表单文件的类型
-
scp是列表表单
-
ark是存档表单
-
同时输出一个存档表单和一个列表表单,必须ark在前scp在后
-
ark,scp:/path/archiver.ark,/path/archive.scp
-
-
二进制模式:标识符为b,表示将输出表单保存为二进制文件,只对输出存档表单生效
-
文本模式:标识符为t,表示输出的表单保存为文本文件,只对输出存档表单生效
-
刷新模式:标识符为f,表示刷新,标识符为nf,表示不刷新,用于确定在每次写操作后是否刷新数据流,默认是刷新
-
宽容模式:标识符为p,只对输出列表生效。在同时输出存档表单和列表表单时,如果表单的某个元素对应的存档内容无法获取,那么在列表表单中直接跳过这个元素,不提示错误
读属性
-
表单类型:标识符为scp或ark,输入表单文件的类型,无法在输入时同时定义一个存档表单和列表表单,只能输入一个表单文件,当同时输入多个表单时,可以通过多个读声明符实现
-
单次访问:标识符为o,标识符no为多次访问,告知可执行程序在读入表单中每个索引值出现一次,不会出现多个元素使用同一个索引的情况
-
有序表单:标识符为s,告知可执行程序元素的索引是有序的,ns是无序的
-
有序访问:标识符是cs或ncs,字面含义与有序表单属性的含义类似。这个属性的含义是,告知可执行程序表单中的元素将被顺序访问
-
二进制模式:标识符为b,表示将输出表单保存为二进制文件,只对输出存档表单生效
-
文本模式:标识符为t,表示输出的表单保存为文本文件,只对输出存档表单生效
-
刷新模式:标识符为f,表示刷新,标识符为nf,表示不刷新,用于确定在每次写操作后是否刷新数据流,默认是刷新
-
宽容模式:标识符为p,只对输出列表生效。在同时输出存档表单和列表表单时,如果表单的某个元素对应的存档内容无法获取,那么在列表表单中直接跳过这个元素,不提示错误
使用方法
可以把命令输出到管道,通过管道作为表单文件
# scp echo 'utt1 data/103-1240-0000.wav |' 读声明符
# echo 'utt1 data/103-1240-0000.wav' 输出一个表单
# 表单组成: "scp:[磁盘路径、标准输入-、管道符号|、磁盘路径夹偏移定位符]"
# 表单组成: "ark:[磁盘路径、标准输入-、管道符号|、磁盘路径夹偏移定位符]"
wav-to-duration "scp:echo 'utt1 data/103-1240-0000.wav' |" ark,t:-
多个读入文件,和多个输出文件,读入文件只能是单个类型的表单,输出可以是多种类型的表单
# 读声明符1 "ark:compute-mfcc scp:wav1.scp ark:- |",
# 读声明符2 "ark:compute-pitch scp:wav2.scp ark:- |"
# 写声明符:输输出多个文件feats.ark,feats.scp:ark,scp:feats.ark,feats.scp
paste-feats "ark:compute-mfcc scp:wav1.scp ark:- |" "ark:compute-pitch scp:wav2.scp ark:- |" ark,scp:feats.ark,feats.scp