script bash usando espeak diz apenas a primeira palavra

script bash usando espeak diz apenas a primeira palavra

Estou escrevendo um script bash para converter letras em clipes de áudio usando o espeak. O problema é que espeak diz apenas a primeira palavra, e não linha por linha que estou lendo. Tentei colocar as linhas do arquivo entre aspas, mas isso não resolveu o problema.

Aqui está meu script bash:

#!/bin/bash
input="$1"
##input="/path/to/txt/file"
while IFS= read -r line
do
  echo "$line"
  espeak -k cantonese $line

done < "$input"

Aqui está o arquivo de texto linha por linha:

"Work it"
"Make it"
"Do it"
"Make us"
"Harder"
"Better"
"Faster"
"Stronger"

Como posso fazer falar dizer cada palavra?

Observe que cada palavra é dita quando leio um arquivo usando a -fopção.

Responder1

Em vez de:

espeak -k cantonese $line

Usar:

espeak -k cantonese "$line"

Quando você omite oaspas duplasao redor $line, o shell executadivisão de palavrasno resultado deexpansão de parâmetros, e cada palavra é passada como um argumento de linha de comando separado para espeak. O espeakcomando fala apenas o primeiro argumento. Escrever "$line"em vez de $linesuprime a divisão de palavras, fazendo com que todo o texto armazenado no lineparâmetro seja passado como um único argumento para espeak. (Também suprimeglobulando, que é outra coisa que você não quer que aconteça nesta situação, embora suas entradas de teste provavelmente não tenham acionado isso até agora.)

Isso acontece mesmo em usos mais simples do espeak. Por exemplo, espeak hello worlddiz apenas “olá”, enquanto espeak 'hello world'ou espeak "hello world"diz “olá, mundo”.

Quanto ao quetipode citaçõespara usar, a razão para escrever "$line", em vez de '$line', é queaspas simplessão muito poderosos para o que você precisa. Eles suprimiriam a divisão e o globing de palavras, mastambémsuprimir a expansão de parâmetros. Assim, com '$line', o espeakcomando veria o texto literal $lineem vez de qualquer texto contido no lineparâmetro.

informação relacionada