如何从 Python 执行这个特定的 shell 命令?

如何从 Python 执行这个特定的 shell 命令?

好的,所以,我有这个非功能性的 shell 脚本,我正在用 python 逐段重写它,除了我从 shell 中收到“意外的“|”错误”(见下文):

#/bin/sh
LINES=`cat $@ | wc -l`

for i in `seq 1 $lines`; do

head -n $i $@ | tail -n 1 | text2wave -o temp.wav
sox "otherstuff.wav" "temp.wav" "silence.wav" "output.wav"
mv output.wav otherstuff.wav
rm -rf temp.wav

done

这在实践中不太可行。但是,如果我知道文件中的行数,我可以在特定文件上运行它以 TTS 整个文件,并在每行之间插入 10 秒的静音,因为我不必说

LINES=`cat $@ | wc -l`

出于流量控制的目的,以及将行计数合并到我可以在任何地方使用的脚本中的方法,我将使用 Python 来完成这项工作。到目前为止,我有这个片段,也不起作用:

import linecache, os

for i in range(linelength):
    lineone = linecache.getline(filename, i)
    os.system("echo " + lineone + "|" + "festival --tts")

这在解释器中给出了这个错误IPython

d 68.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 67.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 52.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 42.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 71.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 51.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 19.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 18.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 16.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 15.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 1.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 16.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 14.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 96.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 95.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 35.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 25.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 74.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 83.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
a 9.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 9.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 97.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 99.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 76.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 77.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 89.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 99.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
b 94.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 54.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
d 66.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 81.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512
c 61.
sh: 2: Syntax error: "|" unexpected
Out[60]: 512

并复制

for i in `seq 1 $lines`; do

head -n $i $@ | tail -n 1 | text2wave -o temp.wav

但对于测试所有内容来说更方便,因为它只是将其读出(festival并且text2wave是同一包的一部分,一个读出内容,另一个写入文件)...

现在,已经检索并存储的行数linelength(我让 python 做到这一点没有问题):

如果只是简单的话

for i in range(linelength):
    lineone = linecache.getline(filename, i)
    os.system("echo somestuffnotaline | festival --tts")

然后节日会说“somEhstuffnotaLINE”,但我不会像它说“c 62” - “d 74” - 等等那样高兴,这些是每行的内容在我正在处理的文件中。

答案1

你的问题又长又漫无边际,我不知道你希望得到什么答案。从你的标题来看,我认为你的重点是这段Python代码:

lineone = linecache.getline(filename, i)
os.system("echo " + lineone + "|" + "festival --tts")

你的问题是lineone整行,包括最后的换行符。你需要,正如 Perl 土地上的人们所说,咀嚼它

lineone = linecache.getline(filename, i).rstrip('\n')
os.system("echo " + lineone + "|" + "festival --tts")

您的第一个 shell 脚本看起来非常复杂并且速度缓慢。为什么要计算行数,然后按数字顺序检索行?你可以简单地一次读取一行输入,就像在 Python 中一样。

while IFS= read -r line; do
  echo "$line" | text2wave -o temp.wav
  sox "otherstuff.wav" "temp.wav" "silence.wav" "output.wav"
  mv output.wav otherstuff.wav
  rm temp.wav
done

您应该能够通过使用原始音频文件来进一步简化这一过程,这些文件不包含标头,因此可以连接:

while IFS= read -r line; do
  echo "$line" | text2wave -otype raw >>otherstuff.raw
  cat silence.raw >>otherstuff.raw
done
sox … otherstuff.raw otherstuff.wav

您需要知道sox原始音频文件编码的参数(例如采样深度)。

答案2

我建议使用popen()调用而不是system()and 将行写入输入流。

import linecache, os
p = os.popen("festival --tts", "w")
for i in range(linelength):
    lineone = linecache.getline(filename, i)
    p.write(lineone+'\n')
p.close()

利用festival可以将多行文本作为输入的优点。

相关内容