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 -f
Option 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 espeak
Befehl spricht nur das erste Argument. Wenn Sie "$line"
anstelle von schreiben $line
, wird die Worttrennung unterdrückt, sodass der gesamte im line
Parameter 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 world
sagt 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 espeak
Befehl also den wörtlichen Text anzeigen $line
und nicht den Text, der im line
Parameter enthalten ist.