私は、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
。
答え1
の代わりに:
espeak -k cantonese $line
使用:
espeak -k cantonese "$line"
省略すると二重引用符周りでは$line
、シェルは単語の分割の結果に基づいてパラメータ拡張であり、各単語は別々のコマンドライン引数として に渡されますespeak
。espeak
コマンドは最初の引数のみを読み上げます。 の"$line"
代わりに と記述すると$line
単語の分割が抑制され、パラメータに格納されているすべてのテキストがline
1 つの引数として に渡されますespeak
。(また、グロビングこれは、この状況では発生したくないもう 1 つのことですが、これまでのところ、テスト入力によってトリガーされた可能性はほとんどありません。
これは、 のより単純な使用法でも発生しますespeak
。たとえば、espeak hello world
は単に「hello」と言いますが、espeak 'hello world'
または はespeak "hello world"
「hello world」と言います。
何に関して親切引用文"$line"
を使用する際に、ではなく と書く理由'$line'
は、一重引用符必要以上に強力です。単語の分割やグロブは抑制できますが、またパラメータの拡張を抑制します。 を使用すると'$line'
、コマンドはパラメータに保持されているテキストではなく、espeak
リテラル テキストを参照します。$line
line