我正在编写一个 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
只说“hello”,而espeak 'hello world'
或espeak "hello world"
说“hello world”。
至于什么种类引文使用,写"$line"
而不是 的原因'$line'
是单引号功能太强大,无法满足您的需要。它们会抑制单词拆分和通配符,但它们会还抑制参数扩展。因此'$line'
,使用 时,espeak
命令将看到文字文本$line
,而不是参数中保存的任何文本line
。