使用 espeak 的 bash 腳本只說出第一個單字

使用 espeak 的 bash 腳本只說出第一個單字

我正在編寫一個 bash 腳本,使用 espeak 將歌詞轉換為音訊剪輯。問題是 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作為單一參數傳遞給espeak. (它還抑制通配,這是在這種情況下您不希望發生的另一件事,儘管到目前為止您的測試輸入很可能沒有觸發它。

即使在更簡單的使用中也會發生這種情況espeak。例如,espeak hello world只說“你好”,而espeak 'hello world'or 則espeak "hello world"說“你好世界”。

至於什麼種類的報價使用時,之所以要寫"$line",而不是'$line',是因為單引號對於你的需要來說太強大了。他們會抑制分詞和通配符,但他們會抑制參數擴展。因此'$line',使用 時,espeak命令將看到文字文本,$line而不是參數中保存的任何文本line

相關內容