3

我试着打电话

espeak -ves -s130 'HEY' --stdout | aplay -D 'sysdefault'

通过 subprocess.Popen,与

espeak_process = Popen(["espeak", "-ves -s100 'HEY' --stdout"], stdout=subprocess.PIPE)
aplay_process = Popen(["aplay", "-D 'sysdefault'"], stdin=espeak_process.stdout, stdout=subprocess.PIPE)

但它不起作用

ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM  'sysdefault'
aplay: main:682: audio open error: No such file or directory

知道如何实现吗?谢谢

4

1 回答 1

4

您的示例相当于在 shell 中键入:

$ espeak '-ves -s100 \'HEY\' --stdout'
$ aplay '-D \'sysdefault\''

这显然是错误的。每个列表条目都是传递给可执行文件的一个参数(argv 条目),您不需要转义/引用。所以你想使用:

["aplay", "-D", "sysdefault"]
["espeak", "-ves", "-s100", "HEY", "--stdout"],

另请参阅文档(强调我的):

所有调用都需要 args,它应该是一个字符串或一系列程序参数。提供一系列参数通常是首选,因为它允许模块处理任何所需的参数转义和引用(例如,允许文件名中的空格)。如果传递单个字符串,shell 必须为 True(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。

于 2015-01-12T23:50:59.783 回答