我正在編寫一個 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
。