El script bash que usa espeak solo dice la primera palabra

El script bash que usa espeak solo dice la primera palabra

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 -fopció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 espeakcomando solo dice el primer argumento. Escribir "$line"en lugar de $linesuprime la división de palabras, lo que hace que todo el texto almacenado en el linepará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 worlddice 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 espeakcomando vería el texto literal $lineen lugar de cualquier texto contenido en el lineparámetro.

información relacionada