Bash-Skript sagt mit Espeak nur das erste Wort

Bash-Skript sagt mit Espeak nur das erste Wort

Ich schreibe ein Bash-Skript, um Liedtexte mit Espeak in Audioclips umzuwandeln. Das Problem ist, dass Espeak nur das erste Wort sagt und nicht die Zeile für Zeile, die ich vorlese. Ich habe versucht, die Zeilen in der Datei in Anführungszeichen zu setzen, aber das hat das Problem nicht behoben.

Hier ist mein Bash-Skript:

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

done < "$input"

Hier ist die Textdatei Zeile für Zeile:

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

Wie kann ich espeak dazu bringen, jedes Wort auszusprechen?

Bitte beachten Sie, dass jedes Wort gesagt wird, wenn ich mit der -fOption aus einer Datei lese.

Antwort1

Anstatt:

espeak -k cantonese $line

Verwenden:

espeak -k cantonese "$line"

Wenn Sie dieAnführungszeichenum $line, die Schale führtWorttrennungauf das Ergebnis vonParametererweiterung, und jedes Wort wird als separates Befehlszeilenargument an übergeben espeak. Der espeakBefehl spricht nur das erste Argument. Wenn Sie "$line"anstelle von schreiben $line, wird die Worttrennung unterdrückt, sodass der gesamte im lineParameter gespeicherte Text als einzelnes Argument an übergeben wird espeak. (Es unterdrückt auchGlotzen, was in dieser Situation ebenfalls nicht passieren soll, obwohl Ihre Testeingaben es bisher höchstwahrscheinlich nicht ausgelöst haben.)

Dies passiert sogar bei einfacheren Verwendungen von espeak. Beispielsweise espeak hello worldsagt nur „Hallo“, während espeak 'hello world'oder espeak "hello world"„Hallo Welt“ sagt.

WasArtvon Zitatenzu verwenden, der Grund "$line", statt als zu schreiben '$line', ist, dassEinzelzitatesind zu mächtig für das, was Sie brauchen. Sie würden Worttrennung und Globbing unterdrücken, aber sie würdenAuchParametererweiterung unterdrücken. Mit würde '$line'der espeakBefehl also den wörtlichen Text anzeigen $lineund nicht den Text, der im lineParameter enthalten ist.

verwandte Informationen