介绍
ParseOptions类处理通过argc和argv给main()的命令行选项的解析。首先,我们举例说明如何从命令行调用典型的Kaldi程序:
gmm-align --transition-scale = 10.0 --beam = 75 \
exp / mono / tree exp / mono / 30.mdl data / L.fst \
'ark:add-deltas --print-args = false scp:data / train.scp ark: - |' \
ark:data / train.tra ark:exp / tri / 0.ali
命令行选项只有长格式(没有单字母选项),必须出现在位置参数之前。在这种情况下,有六个位置参数,从"exp/mono/tree"
; 请注意,以一个开头的"ark:add-deltas"
是一个包含空格的单个字符串; 单引号由shell解释; 此参数作为管道调用。
解析命令行选项的示例
我们将通过介绍gmm-align.cc中的一些代码来说明如何在C ++级别处理这些选项(我们稍微修改了它以使其更清晰):
int main(int argc, char *argv[])
{
try { // try-catch block is standard and relates to handling of errors.
using namespace kaldi;
const char *usage =
"Align features given [GMM-based] models.\n"
"Usage: align-gmm [options] tree-in model-in lexicon-fst-in feature-rspecifier "
"transcriptions-rspecifier alignments-wspecifier\n";
// Initialize the ParseOptions object with the usage string.
ParseOptions po(usage);
// Declare options and set default values.
bool binary = false;
BaseFloat beam = 200.0;
// Below is a structure containing options; its initializer sets defaults.
TrainingGraphCompilerOptions gopts;
// Register the options with the ParseOptions object.
po.Register("binary", &binary, "Write output in binary mode");
po.Register("beam", &beam, "Decoding beam");
gopts.Register(&po);
// The command-line options get parsed here.
po.Read(argc, argv);
// Check that there are a valid number of positional arguments.
if(po.NumArgs() != 6) {
po.PrintUsage();
exit(1);
}
// The positional arguments get read here (they can only be obtained
// from ParseOptions as strings).
std::string tree_in_filename = po.GetArg(1);
...
std::string alignment_wspecifier = po.GetArg(6);
...
} catch(const std::exception& e) {
std::cerr << e.what();
return -1;
}
}
int main(int argc,char * argv [])
{
try { // try-catch块是标准的,与错误的处理有关。
使用命名空间kaldi ;
const char * usage =
“根据[基于GMM的]模型对齐特征。\ n”
“用法:align-gmm [options] tree-in model-in lexicon-fst-in feature-rspecifier”
“transcriptions-rspecifier alignments-wspecifier \ n” ;
//使用用法字符串初始化ParseOptions对象。
ParseOptions po(用法);
//声明选项并设置默认值。
bool binary = false ;
BaseFloat beam = 200.0;
//下面是一个包含选项的结构; 其初始化程序设置默认值。
TrainingGraphCompilerOptions gopts;
//使用ParseOptions对象注册选项。
婆。寄存器(“二进制”,&二进制,“以二进制模式写入输出”);
po.Register(“beam”,&beam,“Decoding beam”);
gopts。注册(&po);
//这里解析命令行选项。
po.Read(argc,argv);
//检查是否存在有效数量的位置参数。
if(po.NumArgs()!= 6){
po.PrintUsage();
出口(1);
}
//这里读取位置参数(只能获取它们
//从ParseOptions作为字符串)。
std :: string tree_in_filename = po.GetArg(1);
...
std :: string alignment_wspecifier = po.GetArg(6);
...
} catch(const std :: exception&e){
std :: cerr << e.what();
返回 -1;
}
}
上面的代码大多是不言自明的。在正常的Kaldi程序中,顺序如下:
- 使用用法字符串初始化ParseOptions对象。
- 您为可选参数(和选项结构)声明并设置默认值。
- 您可以使用ParseOptions对象注册命令行选项(选项结构具有自己的注册函数,这些函数对它们包含的所有变量执行相同的操作)。
- 你做“po.Read(argc,argv);” [如果给出无效选项,这将退出程序]
- 您检查位置选项的数量
po.NumArgs()
是否在程序的有效范围内。 - 你用
po.GetArg(1)
等等获得位置参数; 对于可能超出范围的可选位置参数,便捷函数po.GetOptArg(n)
返回第n个参数,如果n超出范围,则返回空字符串。
通常在编写新的命令行Kaldi程序时,最简单的方法是复制现有的程序并对其进行修改。
隐式命令行参数
某些命令行选项由ParseOptions对象本身自动注册。其中包括:
–config
此选项从配置文件加载命令行选项。例如,如果我们执行-config = configs / my.conf,该文件my.conf
可能包含:--first-option = 15#这是第一个选项 --second-option = false#这是第二个选项
--second-option = false#这是第二个选项–print-args
此布尔选项控制程序是否将命令行参数打印到标准错误(默认为true);–print-args=false
将关闭它。–help
这个boolean参数,如果为true将导致程序打印出一个用法消息(就像其他布尔参数一样,只–help
计为true)。您通常可以通过省略所有命令行参数来获取用法消息,因为大多数程序都需要位置参数。–verbose
这将控制详细级别,以便打印出使用KALDI_VLOG记录的消息。更高(例如-verbose = 2是典型的)。