espeak を使用した bash スクリプトは最初の単語のみを発音します

espeak を使用した bash スクリプトは最初の単語のみを発音します

私は、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、シェルは単語の分割の結果に基づいてパラメータ拡張であり、各単語は別々のコマンドライン引数として に渡されますespeakespeakコマンドは最初の引数のみを読み上げます。 の"$line"代わりに と記述すると$line単語の分割が抑制され、パラメータに格納されているすべてのテキストがline1 つの引数として に渡されますespeak。(また、グロビングこれは、この状況では発生したくないもう 1 つのことですが、これまでのところ、テスト入力によってトリガーされた可能性はほとんどありません。

これは、 のより単純な使用法でも発生しますespeak。たとえば、espeak hello worldは単に「hello」と言いますが、espeak 'hello world'または はespeak "hello world"「hello world」と言います。

何に関して親切引用文"$line"を使用する際に、ではなく と書く理由'$line'は、一重引用符必要以上に強力です。単語の分割やグロブは抑制できますが、またパラメータの拡張を抑制します。 を使用すると'$line'、コマンドはパラメータに保持されているテキストではなく、espeakリテラル テキストを参照します。$lineline

関連情報