好的,所以,我有这个非功能性的 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
可以将多行文本作为输入的优点。