• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

Sprachdateien aus Textzeilen

isidor

Carola
Registriert
28.10.08
Beiträge
112
Hallo Gemeinde!
Ich habe den Bedarf aus einer Liste von Textzeilen, einzelne Sprachdateien zu erzeugen (.wav). Es geht darum für eine Fernsteuerung aus dem Modellbaubereich einzelne Statements über den Sender ansagen zu lassen (z.Bsp. "Batterie Low") . Die Statements könnten in einer beliebigen Form als Datei zur Verfügung gestellt werden (Beispiel: Textdatei - eine Zeile ein Statement). Sie sollen dann per einfacher Aktion auf einen Schlag in eine entsprechende Anzahl .wav Dateien gewandelt werden. Jeder Komfortzuwachs natürlich willkommen - wie zum Beospiel eine zweite Tabellenspalte die den gewünschten wav-Dateinamen enthält.

Im Windowsbereich gibt es dafür das Projekt TTSAutomate. Eine entsprechende Recherche hat mich bisher nichts vergleichbares in der MAC Welt finden lassen. Lediglich diese Seite mit entsprechenden Konvertierungsprogrammen.

Hat hier jemand Erfahrung damit? Kann mir jemand eine Software empfehlen, die die meinem Vorhaben entgegen kommt?
Vielen Dank für jede weiterführnede Info!
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo,

du brauchst da wirklich keine extra Software. Schon der erste Mac konnte Text in Sprache umwandeln!
In den Systemeinstellungen (im aktuellen macOS in Bedienungshilfen > Sprachausgabe) kannst du die Stimmen anpassen und sogar auf höhere Qualität aktualisieren. Dort findest du auch die erforderlichen Stimmen für die jeweilige Sprache.

Multilingual sind die nur begrenzt: dein deutsch-englisch Mix "Batterie low" würde mit der deutschen (weiblichen) Systemstimme Anna gerade so gehen. Besser man bleibt in einer Sprache!

In der Automator.app gibt es eine Aktion, Text in eine Sprach-Datei umzuwandeln, allerdings ist die sehr rudimentär und für deine Zwecke nur als Einstieg zu gebrauchen.
Mit AppleScript oder hier besser Shell Script lässt sich das jedoch exakt auf die gewünschten Parameter zuschneiden

Beispiel:
Eine Textdatei XYZ.txt auf dem Schreibtisch mit folgendem Inhalt
Batterie schwach
Batterie voll
drei
vier

Lies jede Zeile aus XYZ.txt
Erstelle pro Zeile mit Stimme Anna eine AIFF Datei mit Name der Zeile und Inhalt der Zeile

Code:
while read ZEILE; do
say -v Anna -o "$HOME/Desktop/Desktop/$ZEILE.aiff" "$ZEILE"
done < "$HOME/Desktop/XYZ.txt

Ergebnis:

Batterie schwach.aiff
Batterie voll.aiff
drei.aiff
vier.aiff

- - - - - - - - - - - - - - - - - - - - - - - - -

Batterie schwach | 1
Batterie voll | 2
drei | 3
vier | 4


Lies jede Zeile aus XYZ.txt und Unterscheide die durch | getrennten Spalten
Erstelle pro Zeile mit Stimme Anna eine WAV Datei mit Name Spalte 2 und Inhalt Spalte 1

Code:
while IFS='|' read SPALTE1 SPALTE2; do
  say -v Anna -o "$HOME/Desktop/$SPALTE2.wav" --data-format=LEF32@22050 "$SPALTE1"
done < "$HOME/Desktop/XYZ.txt"

Ergebnis:
1.wav
2.wav
3.wav
4.wav

Gruß
 

isidor

Carola
Registriert
28.10.08
Beiträge
112
Vielen, vielen Dank! Anna und ein kleines Tool namens "Speech" hatte ich schon in der Vergangenheit genutzt. Aber der Vorgang war müheselig, langwierig und auf jeden Fall langweilig, weil ich ihn für jedes gewünschte Statement wiederholen musste. Und es kommen leicht 40 - 50 Statements zusammen.
Obwohl ich etwas Shell-Script programmieren kann, habe ich noch nicht daran gedacht es hierfür zu nutzen.

Nochmal vielen Dank! Ich werde Deine Anregung nutzen und schauen wie weit ich komme. Ich werde mich hier wieder zurückmelden - entweder mit meinem fertigen Script oder einer wieteren Frage :)
 
  • Like
Reaktionen: ottomane

isidor

Carola
Registriert
28.10.08
Beiträge
112
@sedna nochmals vielen, vielen Dank! Es funktioniert bestens und ist genau was ich brauche.
Indeal wäre es jetzt noch, wenn ich die Lautstärke der resultierenden WAV-Datei um 3 oder 4DB anheben könnte. HAst Du dazu auch noch so eine geniale Idee?

Bei mir kommen aktuell die folgenden Zeilen zum Einsatz:

while IFS='|' read SPALTE1 SPALTE2; do
say -v Samantha -o "./$SPALTE2.wav" --data-format=LEI16@32000 "$SPALTE1"
done < "./Statements.txt"

So der so ist es schon mal super. Sollte sich noch ein Weg finden um den Pegel der WAV-Datei anzuheben, werde ich es hier noch ergänzen.
 
  • Like
Reaktionen: Wuchtbrumme

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo,

eine Idee habe ich schon ... nur wird es jetzt etwas aufwändiger in der Vorbereitung. macOS kommt nicht mit dem passenden Tool, so dass man da auf 3rd Party Lösungen zurückgreifen muss.

Aber zuerst einmal der Hinweis, dass ein Anheben der WAV Datei um 3 oder 4 dB keine geeignete Vorgehensweise ist, da dies wohlmöglich - und hier mit ziemlicher Sicherheit (!) - zu einem Clipping, einer digitalen Übersteuerung führen würde.
Der Begriff für das, was du auf das Audiomaterial anwenden müsstest, ist Normalisieren. Wobei man in verschiedenen Arten der Normalisierung unterscheidet ... in deinem Fall die Anhebung des "lautesten" Signals an die maximal mögliche Amplitude:
Das lauteste Signal liegt dann direkt an der Grenze der digitalen Übersteuerung.
Es gibt zwar noch weitere Möglichkeiten, das Signal zu "verstärken", aber da kannst du dich ja mal selber schlau machen (Stichworte Kompression, Lautheit, dynamische Bearbeitung usw) .

Es gibt tolle Programme, die Audio normalisieren können... allerdings auch ein grandioses Open.Source Tool, welches von einer großen Community über viele Jahre weiterentwickelt wurde (und wird). Es ist das Schweizer Taschenmesser schlechthin und es nennt sich FFmpeg.
Doch ist das hier wohl schon "too much" für dich. Das Normalisieren dort ist auf einem sehr hohen Level und etwas aufwändig zu bedienen, es sei denn, man installiert die Erweiterung FFmpeg-normalize, für die man aber wiederum zuvor Python 3 installieren müsste....

Es gibt aber noch ein anderes Tool, welches -glaube ich- nicht mehr weiter entwickelt wird, aber für deine Zwecke ausreicht

Lade es und lege die im Download enthaltene ausführbare Datei sox an einen Ort deiner Wahl

Code:
while IFS='|' read SPALTE1 SPALTE2; do
say -v Samantha -o "./$SPALTE2 temp.wav" --data-format=LEI16@32000 "$SPALTE1"
'/Pfad/zu/dem Tool/sox' --norm "./$SPALTE2 temp.wav" "./$SPALTE2.wav"
rm "./$SPALTE2 temp.wav"
done < "./Statements.txt"


Gruß
 

isidor

Carola
Registriert
28.10.08
Beiträge
112
Ich habe die Umwandlung von geschriebenen Text in WAV-Dateien schon mal gemacht (Programm Speech). Damals allerdings sehr mühselig Statement für Statement, einzeln und nacheinander. Die so entstandenen Statements mussten sich im Kontext bereits existierender Statements behaupten und klangen allesamt etwas zu leise. Mit einem GUI-Basierenden Tool (ich meine Audacity) habe ich sie daher um 3db angehoben. Das hat super geklappt und meine selbst erzeugte Sprachdateien klangen daraufhin soweit "ebenbürdig".
Von daher bin ich guter Hoffnung, dass ich noch nicht ins Clipping hineinrausche. Sollte dem so sein, werd ich mich auch mal mit der Normalisierung beschäftigen und dann alle im Sender existierenden Sprachdateien mit berücksichtigen.

Jetzt versuch ich erstmal wie weit ich mit SoX komme.
Nochmals vielen, vielen Dank! Deine Fachkenntnis ist mir hier eine wirklich große Hilfe!
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo,

danke für die Rückmeldungen 🙃

Um dein Audiomaterial um 3dB anzuheben, dabei aber Clipping zu vermeiden, hat SoX einen einfachen Limiter, der aber für deine Zwecke reichen sollte...
Lies mal die sox.txt und sieh, was das Tool noch so alles kann :cool:

Hier mal Encoden, Normalisieren und zusätzlich ein Limiter (3dB angehoben) mit SoX
Code:
while IFS='|' read SPALTE1 SPALTE2; do
say -v Samantha -o "./$SPALTE2.aiff" "$SPALTE1"
sox -G --norm  "./$SPALTE2.aiff" "./$SPALTE2.wav"  gain -l 3
rm "./$SPALTE2.aiff"
done < "./Statements.txt"



Gruß
 
Zuletzt bearbeitet:
  • Like
Reaktionen: ottomane

isidor

Carola
Registriert
28.10.08
Beiträge
112
Hi @sedna!
Ich habe eben Dein Programmiervorschlag mit der Sox-Normalisierung getestet. Was soll ich sagen - perfekt!
Die Zeilen tun genau was ich gebraucht habe und klingen im Kontext vorhandener wav-Dateien gleichberechtigt:

while IFS='|' read SPALTE1 SPALTE2; do
say -v Samantha -o "./$SPALTE2 temp.wav" --data-format=LEI16@32000 "$SPALTE1"
'./sox' --norm "./$SPALTE2 temp.wav" "./$SPALTE2.wav"
rm "./$SPALTE2 temp.wav"
done < "./Statements.txt"

Die Variante mit der 3DB Erhöhung funktioniert noch nicht. Auf dem MAC wird sie anständig abgespielt, aber im Sender bleibt alles still. Mir ist auch aufgefallen, dass beim Abspielen mit QuickTime die durch Sox bearbeiteten Dateien den Fortschrittsbalken aus dem Tritt bringen. Ist die wav noch nativ, von say erzeugt, marschiert der Fortschrittsbalken normal von links nach rechts. Bei den durch Sox bearbeiteten Dateien fällt er nochmals zurück und fängt wieder von vorne an. Hängt vielleicht damit zusammen, dass mein Teststatement 2 Wörter hat ...

Ist aber alles nicht wild, weil es die Variante mit der Normalisierung vollständig tut.
Jetzt muss ich schon fast aufpassen, dass ich mich nicht ärgere ob der Arbeit die mich das früher gekostet hat.

Nochmals vielen Dank! Das war ein kleiner Quantensprung für mich :)
 
  • Like
Reaktionen: ottomane