Pythonでこの特定のシェルコマンドをどのように実行できますか?

Pythonでこの特定のシェルコマンドをどのように実行できますか?

いいですね。動作しないシェルスクリプトがありますが、シェルで「予期しない '|'エラーが発生することを除いて、Pythonで1つずつ書き直しています(下記参照)。

#/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ので、text2wave1つは内容を読み取り、もう1つはファイルに書き込みます)。

これで、検索され保存された行数は次のようになりますlinelength(Pythonでこれを行うには問題ありません)。

簡単だったら

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

それではフェスティバルでは「someEhstuffnotaLINE」と言うでしょうが、「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")

最初のシェルスクリプトは非常に複雑で遅いようです。行数を数え、数字順に行を検索するのはなぜですか?あなたは簡単にすることができます一度に1行ずつ入力を読む、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元のオーディオファイルエンコーディングのパラメータ(サンプルの深さなど)を知る必要があります。

おすすめ記事