How to open files in Kaldi
假定需要从/向磁盘载入/储存一个Kaldi对象,同时对象是类似声学模型那样的(而不像声学特征那样有很多,针对这个请参考 The Table concept);你一般会用到Input和Output类。一个例子:
{ // input. bool binary_in; Input ki(some_rxfilename, &binary_in); my_object.Read(ki.Stream(), binary_in); // you can have more than one object in a file: my_other_object.Read(ki.Stream(), binary_in); } // output. note, "binary" is probably a command-line option. { Output ko(some_wxfilename, binary); my_object.Write(ko.Stream(), binary);
花括号的作用是使Input和Output的对象在结束时就离开作用域,因此文件会被立刻关闭。这也许没什么用处(为什么不用标准的C++流呢?)。但是这样我们可以支持各种扩展的文件名,同时处理错误也更容易些(Input和Output类在遇到错误时会打印提示性信息,并抛出异常)。注意文件名包括“rxfilename”和“wxfilename”。我们经常使用这种类型的文件名,它们意在提示编程人员它们是扩展的文件名,这会在下一部分进行描述。
Input和Output类的接口比上面例子中的要稍微丰富一些。你可以调用Open()来打开,调用Close()来关闭,而不仅仅是让他们离开作用域。这些函数会返回布尔类型的状态值,而不像构造函数和析构函数在遇到错误时抛出异常。Open()函数(包括构造函数)也可以在被调用时不处理 Kaldi的二进制文件头,如果你是想读写非Kaldi对象。估计你不会用到这一额外的功能。
参考 Classes for opening streams 中与Input和Output相关的类和函数,和rxfilenames, wxfilenames (下一部分)