Shell

如何從 Python 執行這個特定的 shell 命令?

  • July 12, 2014

好的,所以,我有這個非功能性的 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”-等等,我不會那麼高興,這些是我正在處理的文件中每一行的內容.

你的問題很長而且漫無邊際,我不知道你對答案的期望是什麼。按照你的標題,我認為你的重點是這段 Python 程式碼:

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

您的問題是lineone整行,包括最後的換行符。正如他們在 Perl 領域所說的那樣,您需要chomp it

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原始音頻文件的編碼參數(例如採樣深度)。

引用自:https://unix.stackexchange.com/questions/25670