Как использовать Python Popen с espeak и aplay
Я пытаюсь позвонить
espeak -ves -s130 'HEY' --stdout | aplay -D 'sysdefault'
через подпроцесс. Открыть, с
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
Есть идеи, как это реализовать? Спасибо
1 ответ
Ваш пример эквивалентен вводу этого в оболочке:
$ espeak '-ves -s100 \'HEY\' --stdout'
$ aplay '-D \'sysdefault\''
Что явно не так. Каждая запись в списке представляет собой один аргумент (запись argv), передаваемый исполняемому файлу, с вашей стороны не требуется экранирование / цитирование. Итак, вы хотите использовать:
["aplay", "-D", "sysdefault"]
["espeak", "-ves", "-s100", "HEY", "--stdout"],
Также см. Документацию (выделено мое):
Аргументы требуются для всех вызовов и должны быть строкой или последовательностью аргументов программы. Предоставление последовательности аргументов обычно предпочтительнее, поскольку позволяет модулю позаботиться о любом необходимом экранировании и цитировании аргументов (например, чтобы разрешить пробелы в именах файлов). Если передается одна строка, либо shell должен иметь значение True (см. Ниже), либо строка должна просто указывать имя программы, которая должна быть выполнена, без указания каких-либо аргументов.