使用 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只说“hello”,而espeak 'hello world'espeak "hello world"说“hello world”。

至于什么种类引文使用,写"$line"而不是 的原因'$line'单引号功能太强大,无法满足您的需要。它们会抑制单词拆分和通配符,但它们会抑制参数扩展。因此'$line',使用 时,espeak命令将看到文字文本$line,而不是参数中保存的任何文本line

相关内容