Python和Kaldi:断管错误

Python和Kaldi:断管错误,python,shell,pipe,kaldi,Python,Shell,Pipe,Kaldi,设置如下:我正在使用Kaldi工具。它们在某种形式的bash脚本中被调用。这些bash脚本由一个用python编写的包装程序调用,该程序将任务提交给sungrid引擎 我要执行的命令如下 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

设置如下:我正在使用Kaldi工具。它们在某种形式的bash脚本中被调用。这些bash脚本由一个用python编写的包装程序调用,该程序将任务提交给sungrid引擎

我要执行的命令如下

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 feat
尝试继续写入输出。由于这是不可能的,
复制专长
被终止<代码>13可能表示管道破裂错误

对于Python来说,这是一个严重的问题,为什么它会将其转化为错误并终止。但在本例中,产生此错误的不是Python,而是
copy feats
。因此,在这种情况下,python或类似的东西似乎没有任何成功之处

此外,以下行工作正常,没有任何警告或错误:

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:break pipe
和退出状态256:

python -c "import os; os.system(\"feat-to-dim ark:'cat cp |' -\")"
你还有什么进一步的建议吗

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看看

实际上,13是命令行中执行的
feat to dim'ark:copy feats scp:train.scp ark:-|“-
的返回状态。答案(特征维度)应该是40。谢谢你的建议。它可以工作,但很难集成到我的设置中,因为默认情况下忽略所有错误不是我想要的。是否也有可能以某种方式捕捉到此断管错误如果我能在bash代码中处理它就最好了。不,13是一个特性维度。您可以使用添加增量而不是复制专长,然后您将看到39。使用
add delta
而不是
copy feats
生成120,并再次返回状态13。不过,我想根据我的设置,我可以在bash脚本中使用上面的代码调用python-c,python程序调用该脚本调用
feat-to-dim
并抑制错误。那对我来说很好。非常感谢。