web-dev-qa-db-ja.com

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オプションを使用してファイルから読み取ると、すべてのWordが発声されることに注意してください。

2
j0h

の代わりに:

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を表示します。

3
Eliah Kagan