【发布时间】:2018-03-07 09:03:07
【问题描述】:
我正在使用 python 开发一个法语聊天机器人。对于第一次文本到语音的尝试,我使用 espeak 和 mbrola。我用子流程来称呼它:
from subprocess import run, DEVNULL
def speak(text):
command = ["espeak", "-vmb-fr1", text]
run(command, stderr=DEVNULL, stdout=DEVNULL)
speak("Bonjour.")
如你所见,我将 stderr 和 stdout 发送到 /dev/null
当我运行程序时,它似乎工作,espeak 正在说话,但我明白了:
*** Error in `mbrola': free(): invalid pointer: 0x08e3af18 ***
*** Error in `mbrola': free(): invalid pointer: 0x0988af88 ***
我认为这是 mbrola 中的 C 错误。我想我无法修复它。但它有效,所以我只想忽略错误。我能怎么做 ?有什么办法吗?
编辑,回复abarnert:
当我通过 shell (python myscript.py 2>&1 >/dev/null) 重定向 stdout 和 stderr 时,消息仍然显示。
- 发行版:Debian 9.3
- glibc 版本:2.24
【问题讨论】:
-
我相信这些消息是由您的系统 malloc 库发出的,而不是由实际的
espeak或mbrola代码发出的,因为它在mbrola中检测到一个危险的错误。也许它会将消息发送到您的控制台,而不是发送到父母可以捕获的任何内容?尝试使用自己的 stdout 和由 shell 重定向的 stderr 运行脚本,看看消息是否仍然显示。 -
感谢您的评论。请你能告诉你“用自己的标准输出和由shell重定向的标准错误运行你的脚本”是什么意思吗?对不起,如果这是一个愚蠢的问题。
-
python myscript.py 2>&1 >/dev/null -
它仍然显示...
-
首先,
set |grep MALLOC_CHECK_向您展示了什么?接下来,如果您export MALLOC_CHECK_=0并再次尝试您的代码会发生什么? (请注意名称末尾的时髦下划线。这很重要。)同时,您是否检查过 espeak/mbrola 的较新版本,或者向它们提交了错误?
标签: python subprocess mbrola