0

设置如下:我正在使用 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或捕获管道之类的东西似乎没有任何成功。

此外,以下几行运行良好,没有任何警告或错误:

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 |' -\")"

您在这里有什么进一步的建议吗?

4

1 回答 1

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 设计,它尝试只读取第一个功能并简单地转储其余功能,但是由于管道没有办法终止 writer child,它必须以如此糟糕的方式退出。一个选项是读取feat-to-dim的完整子输出,但这会更慢。

你可能可以打开 Kaldi bug 来解决这个问题。

于 2017-01-27T21:18:54.920 回答