我正在编写一个 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
选项从文件中读取时,会说出每个单词。
代替:
利用:
当您省略 周围的双引号
$line
时,shell会对参数扩展的结果进行分词,并且每个词作为单独的命令行参数传递给. 该命令只讲第一个参数。写入而不是抑制分词,导致存储在参数中的所有文本作为单个参数传递给. (它还抑制了globbing,这是您在这种情况下不希望发生的另一件事,尽管到目前为止您的测试输入很可能还没有触发它。)espeak
espeak
"$line"
$line
line
espeak
即使在更简单的使用中也会发生这种情况
espeak
。例如,只说“你好” ,espeak hello world
而说“你好,世界”。espeak 'hello world'
espeak "hello world"
至于使用什么样的引号,写的原因
"$line"
,而不是'$line'
,是单引号对于你需要的东西来说太强大了。它们会抑制分词和通配,但也会抑制参数扩展。因此,使用'$line'
,该espeak
命令将看到文字文本$line
,而不是参数中保存的任何文本line
。