Espeakを使用して歌詞をオーディオクリップに変換するbashスクリプトを書いています。問題は、私が読んでいる行ごとではなく、eSpeakが最初の単語のみを言うことです。ファイルに行を引用符で囲んでみましたが、問題は解決しませんでした。
これが私のbashスクリプトです:
#!/bin/bash
input="$1"
##input="/path/to/txt/file"
while IFS= read -r line
do
echo "$line"
espeak -k cantonese $line
done < "$input"
行ごとのテキストファイルは次のとおりです。
"Work it"
"Make it"
"Do it"
"Make us"
"Harder"
"Better"
"Faster"
"Stronger"
ESpeakにすべての単語を言わせるにはどうすればよいですか?
-f
オプションを使用してファイルから読み取ると、すべてのWordが発声されることに注意してください。
の代わりに:
espeak -k cantonese $line
使用する:
espeak -k cantonese "$line"
$line
の周りの 二重引用符 を省略すると、シェルは Word splitting を実行します パラメータ展開 の結果で、各Wordは個別のコマンドライン引数としてespeak
に渡されます。 espeak
コマンドは最初の引数のみを読み上げます。 "$line"
の代わりに$line
を書き込むと、Wordの分割が抑制され、line
パラメータに格納されているすべてのテキストが単一の引数としてespeak
に渡されます。 (これは globbing も抑制します。これは、この状況では発生させたくないもう1つのことですが、テスト入力がこれまでトリガーしていない可能性が高いです。)
これは、espeak
のより単純な使用法でも発生します。たとえば、espeak hello world
は「hello」とだけ言い、espeak 'hello world'
またはespeak "hello world"
は「hello world」と言います。
使用する kind of quotes については、"$line"
ではなく'$line'
と記述する理由は次のとおりです 単一引用符 は必要なものに対して強力すぎる。これらはWordの分割とグロビングを抑制しますが、もパラメータの展開を抑制します。したがって、'$line'
を使用すると、espeak
コマンドは、line
パラメータに保持されているテキストではなく、リテラルテキスト$line
を表示します。