Estoy escribiendo un script bash para convertir letras en clips de audio usando espeak. El problema es que espeak sólo dice la primera palabra, en lugar de línea por línea que estoy leyendo. Intenté poner las líneas en el archivo entre comillas, pero esto no solucionó el problema.
Aquí está mi 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"
Aquí está el archivo de texto línea por línea:
"Work it"
"Make it"
"Do it"
"Make us"
"Harder"
"Better"
"Faster"
"Stronger"
¿Cómo puedo hacer que Espeak diga cada palabra?
Tenga en cuenta que se dice cada palabra cuando leo un archivo usando la -f
opción.
Respuesta1
En lugar de:
espeak -k cantonese $line
Usar:
espeak -k cantonese "$line"
Cuando omites eldoble comillasalrededor $line
, el caparazón realizadivisión de palabrassobre el resultado deexpansión de parámetrosy cada palabra se pasa como un argumento de línea de comando independiente a espeak
. El espeak
comando solo dice el primer argumento. Escribir "$line"
en lugar de $line
suprime la división de palabras, lo que hace que todo el texto almacenado en el line
parámetro se pase como un único argumento a espeak
. (También suprimeglobo, que es otra cosa que no desea que suceda en esta situación, aunque lo más probable es que las entradas de su prueba no lo hayan activado hasta ahora).
Esto sucede incluso en usos más simples de espeak
. Por ejemplo, espeak hello world
dice simplemente "hola", mientras que espeak 'hello world'
o espeak "hello world"
dice "hola mundo".
En cuanto a queamablede citasusar, la razón para escribir "$line"
, en lugar de '$line'
, es quecomillas simplesson demasiado poderosos para lo que necesitas. Suprimirían la división de palabras y la globbing, perotambiénsuprimir la expansión de parámetros. Entonces, con '$line'
, el espeak
comando vería el texto literal $line
en lugar de cualquier texto contenido en el line
parámetro.