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”-等等,我不會那麼高興,這些是我正在處理的文件中每一行的內容.
你的問題很長而且漫無邊際,我不知道你對答案的期望是什麼。按照你的標題,我認為你的重點是這段 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
原始音頻文件的編碼參數(例如採樣深度)。