解析命令行选项

本文介绍了Kaldi中ParseOptions类的使用,展示了如何解析和处理命令行参数,包括选项的注册、默认值设置、位置参数的获取等。同时,提到了隐式命令行参数如--config、--print-args、--help和--verbose的作用。

介绍

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是典型的)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雪snowflake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值