【问题标题】:Python and Kaldi: Broken Pipe ErrorPython 和 Kaldi:断管错误
【发布时间】:2017-06-13 14:23:17
【问题描述】:

设置如下:我正在使用 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/catchtrapping 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 |' -\")"

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

【问题讨论】:

    标签: python shell pipe kaldi


    【解决方案1】:

    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 是特征维度。您可以使用 add-deltas 而不是 copy-feats,然后您会看到 39。
    • 使用 add-deltas 而不是 copy-feats 会产生 120 并再次返回状态 13。
    • 尽管如此,我想根据我的设置,我可以在 bash 脚本中使用上述代码调用 python -c,该脚本由 python 程序调用以调用 feat-to-dim 并抑制错误。这对我来说很好。谢谢!
    猜你喜欢
    • 2011-03-29
    • 2020-11-18
    • 2016-09-29
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多