Python和Kaldi:管道错误

时间:2017-01-27 19:44:05

标签: python shell pipe kaldi

设置如下:我正在使用Kaldi工具。它们以某种形式的bash脚本调用。这些bash脚本由用python编写的包装程序调用,该程序将任务提交给Sun Grid Engine。

我想要执行的命令是以下

feat-to-dim 'ark:copy-feats scp:train.scp ark:- |' -

在命令行中执行此操作,产生正确的结果' 40'连同警告

WARNING (feat-to-dim[5.0.23-f7b2f]:Close():kaldi-io.cc:501) Pipe copy-feats scp:train.scp ark:- | had nonzero return status 13

但是,如果我用以下方式包装它:

python -c "import os; os.system(\"feat-to-dim 'ark:copy-feats scp:train.scp ark:- |' -\")"

程序copy-feats失败并显示错误:

ERROR (copy-feats[5.0.23-f7b2f]:Write():kaldi-matrix.cc:1240) Failed to write matrix to stream

在各种堆栈跟踪和跟随错误之后,还会打印以下警告:

WARNING (feat-to-dim[5.0.23-f7b2f]:Close():kaldi-io.cc:501) Pipe copy-feats scp:train.scp ark:- | had nonzero return status 134

这是我发现的:feat-to-dim提前关闭管道,而copy-feats尝试继续写输出。由于无法实现,copy-feats将被终止。 13可能表示管道损坏错误。

对于Python,这是一个严重的问题,为什么它把它变成一个错误并终止。但在这种情况下,产生此错误的不是Python,而是copy-feats。因此,python或try/catch中的trapping the pipe之类的东西在这种情况下似乎没有任何成功。

此外,以下几行完美无缺,没有任何警告或错误:

python -c "import os; os.system(\"copy-feats scp:train.scp ark:-\")" > cp
python -c "import os; os.system(\"feat-to-dim ark:cp -\")"

,以下行产生简单错误消息cat: write error: Broken pipe并退出状态256:

python -c "import os; os.system(\"feat-to-dim ark:'cat cp |' -\")"

这里有进一步的建议吗?

1 个答案:

答案 0 :(得分:0)

  

13可能表示管道出现故障。

13是一个答案(特征维度),你可以使用它作为结果,你可以忽略所有其他错误,如

with open(os.devnull, "w") as devnull:
    subprocess.call("feat-to-dim 'ark:copy-feats scp:feats.scp ark:- |' -", shell=True, stderr=devnull)
  

这是我发现的:feat-to-dim提前关闭管道而copy-feats试图继续写输出。

这是一个kaldi设计,它试图只读取第一个特征并简单地转储其余部分,但由于管道无意终止作者子节点,它必须以这样糟糕的方式退出。一个选项是以壮观的方式读取完整的子输出,但这样会更慢。

你可以打开Kaldi bug。