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 -f
opçã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 espeak
comando fala apenas o primeiro argumento. Escrever "$line"
em vez de $line
suprime a divisão de palavras, fazendo com que todo o texto armazenado no line
parâ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 world
diz 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 espeak
comando veria o texto literal $line
em vez de qualquer texto contido no line
parâmetro.