Skript für Ansagen in mp3-Dateien

edit by @Manuel:

Eine aktuelle Anleitung findet ihr hier (Stand 21.12.2020).


Originalbeitrag:

Ich hab ein Script geschrieben, das Ansagen zu mp3-Dateien hinzufügen kann. Siehe GitHub-Pull-Request oder Stephans Fork.

Motivation:

Im Hörspielmodus gibt es das Problem, dass man beim Auflegen der Karte nicht weiß, welche Folge abgespielt wird. Spielt man z.B. Benjamin Blümchen ab, dann kommt immer zuerst der Titelsong, der sich bei allen Folgen gleich anhört.

Das Skript fügt der mp3-Datei eine Ansage wie z.B. „Benjamin Blümchen findet einen Schatz“ hinzu. Wenn man eine andere Folge hören will, kann man dann einfach nochmal die Benjamin-Blümchen-Karte auflegen.

Funktionsweise:

Angenommen man hat einen Ordner mit folgendem Inhalt:

+- 04_Benjamin Blümchen/
   +- Benjamin Blümchen hat Geburtstag.mp3
   +- Benjamin Blümchen auf dem Mond.mp3
   +- Benjamin Blümchen im Urlaub.mp3
   +- Benjamin Blümchen als Weihnachtsmann.mp3
   +- Benjamin Blümchen als Pilot.mp3
   +- Benjamin Blümchen als Lokomotivführer.mp3

Dann kann man mit folgendem Aufruf mp3-Dateien mit Ansagen generieren:

python add_lead_in_messages.py -i '04_Benjamin Blümchen' -o /Volumes/TonUINO/04 --google-key=123456 --add-numbering

Was dann passiert:

  • Es werden neue mp3-Dateien mit den Ansagen erzeugt. Man kann dabei auch direkt auf die SD-Karte schreiben (wie im Beispiel).
  • Die Original-Dateien werden dabei nicht geändert.
  • Die mp3-Daten werden nicht neu kodiert (also kein Qualitätsverlust).
  • Auf Wunsch werden die mp3-Dateien kompatibel zu DFPlayer Mini numeriert. Also z.B. 001_Benjamin Blümchen hat Geburtstag.mp3
  • Das Skript erzeugt die Ansagen entweder mit Google Text-to-speech (wenn der Parameter --google-key angegeben wurde) oder mit dem Mac-Tool say.

Das Ergebnis sieht dann so aus:

+- /Volumes/TonUINO/04/
   +- 001_Benjamin Blümchen hat Geburtstag.mp3
   +- 002_Benjamin Blümchen auf dem Mond.mp3
   +- 003_Benjamin Blümchen im Urlaub.mp3
   +- 004_Benjamin Blümchen als Weihnachtsmann.mp3
   +- 005_Benjamin Blümchen als Pilot.mp3
   +- 006_Benjamin Blümchen als Lokomotivführer.mp3
13 „Gefällt mir“

Super Funktion!
Wenn es das jetzt auch noch für Windows gäbe wäre das noch besser :wink:

Wenn du die Variante mit Google Text-to-Speech verwendest, könnte es auch unter Windows laufen.

Die Abhängigkeiten sind: Python, ffmpeg und curl. Das gibt es so viel ich weiß alles auch für Windows. curl evtl. über cygwin (wobei ich die Abhängigkeit zu curl auch noch loswerden könnte).

leider kenne ich mich mit Pyton gar nicht aus.
Ich habe mir ein Google api key erstell und dann anhand dieser Anleitung http://www.py2exe.org/index.cgi/Tutorial eine exe Datei erstellt.
Wenn ich diese jetzt mit dem Befehl .\tonuino.exe -i C:\Python27\15\ -o C:\Python27\15a\ --lang de --google-key {key} ausführe bekomme ich nur folgendes angezeigt:

@Til kennst du dich auch mit Windows aus bzw weißt du oder jmd anderes wie ich aus dem Pyton script eine laufende exe bekomme?

Deine exe-Lösung scheint soweit zu funktionieren. Falls das noch jemand unter Windows probieren will, würde ich jedoch eher dazu raten, es mit cygwin zu probieren.

Sieht so aus, als käme von Google eine Fehlermeldung.

Füge mal im Code vor die Zeile mit mp3Data = base64.... folgenden print-Befehl hinzu (die erste Zeile ist neu, die zweite gehört schon zum Code):

print('responseJson: {}'.format(responseJson))
mp3Data = base64.b64decode(responseJson['audioContent'])

Dann poste davon die Ausgabe.

1 „Gefällt mir“

danke für die schnelle Antwort.
Nachdem ich die Zeile eingefügt habe, habe ich die Meldung bekommen dass die google API noch nicht deaktiviert war. Habe daher nouch die cloude text to speach api aktiviert.
Danach habe ich eine lange kryptische Ausgabe bekomem, die hiermit anfängt:


Wollte jetzt nicht alles Posten, weil ich denke, dass es nicht so wichtig ist.
Zudem hat Windows diese Meldung gebracht:

cygwin habe ich installiert, allerdings bekomme ich dort diese Meldung:

OK, dann war das das Problem. Schade, diese Ausgabe wäre die interessante gewesen. Damit hätte ich eine bessere Fehlerausgabe bauen können.

Das bedeutet, dass es prinzipiell funktioniert. Der Teil nach audioContent sind die MP3-Daten. D.h. das Skript kann schonmal die Ansage erzeugen.

Das heißt, dass das Skript die Ansage nicht zur MP3-Datei hinzufügen konnte. Hast Du ffmpeg installiert?

Das bedeutet, dass cygwin kein python am erwarteten Pfad findet. Probiere mal das Skript nicht direkt aufzurufen, sondern mit python davor (ich passe mal meine Beschreibung oben an). Also z.B. so:

python add_lead_in_messages.py -i '04_Benjamin Blümchen' -o /Volumes/TonUINO/04 --google-key=123456 --add-numbering

Die Fehlermeldung war sehr aussagekräftig. (API nicht aktiviert, um sie zu aktivieren gehe auf URL):
responseJson: {u'error': {u'status': u'PERMISSION_DENIED', u'message': u'Cloud Text-to-Speech API has not been used in project xxx before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/texttospeech.googleapis.com/overview?project=xxx then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.', u'code': 403, u'details': [{u'@type': u'type.googleapis.com/google.rpc.Help', u'links': [{u'url': u'https://console.developers.google.com/apis/api/texttospeech.googleapis.com/overview?project=xxx', u'description': u'Google developers console API activation'}]}]}}

Ich habe es jetzt unter Windows mit der exe zum laufen bekommen. Du hattest recht, ich hatte ffmpeg nicht installiert. Vielen Dank!!!
Ich werde mich spätestens morgen daran machen und eine Anleitung für die Windowsnutzer machen.

Anleitung um das Script vom Til unter Windows zu nutzen
Am besten lest ihr euch erstmal alles durch bevor ihr anfangt.
Ich hoffe ich habe nichts vergessen:

Unter https://cloud.google.com/text-to-speech/ einen Testaccount anlegen.
Ein neues Projekt anlegen und links auf APi & Dienste auf Dashboard
APIs und dienste aktivieren anklicken und die Cloud Text to Speach API aktivieren (Im Zweifel beide aktivieren)
Links auf Anmeldedaten --> Anmeldedaten erstellen --> API-Schlüssel einen schlüssel erstellen und notieren

Python herunterladen: https://www.python.org/downloads/
“Add Python to Path” anhaken
Ich habe als Installationspfad c:\python genommen

Download ffmpeg https://ffmpeg.zeranoe.com/builds/
Installationsanleitung: https://de.wikihow.com/FFmpeg-unter-Windows-installieren
Til’s add_lead_in_messages.py unter https://github.com/xfjx/TonUINO/tree/DEV (Später evtl unter Master) herunterladen und im Pythonordner speichern.

exe erzeugen (Quelle: http://www.py2exe.org/index.cgi/Tutorial)
mit Notepad den folgenden Code als setup.py im gleichen Verzeichnis wie Til’s py-Datei speichern:

from distutils.core import setup
import py2exe

setup(console=['add_lead_in_messages.py'])

Powershell öffnen
cd c:\python eingeben und enter drücken
pip install py2exe einfügen und enter drücken
python setup.py install einfügen und enter drücken

Jetzt sollte unter c:\python\dist eine add_lead_in_messages.exe sein.

Powershell öffnen

cd c:\python\dist eingeben und enter drücken
Mit folgendem Befehl die MP3’s erzeugen:

.\add_lead_in_messages.exe -i C:\"Quellordner" -o C:\"Zielordner" --lang de --google-key 123456

Wenn die MP3’s noch nicht nummeriert sind, könnt ihr noch --add-numbering anfügen, dadurch werden sie automatisch nummeriert.

4 „Gefällt mir“

Vielen Dank für die Anleitung.

Wie gesagt: Der Schritt “Exe erzeugen” ist wahrscheinlich überflüssig. Wenn Du in der Powershell python setup.py ausführen kannst, dann kannst du genauso einfach python add_lead_in_messages.py ausführen.

Evtl. ist auch cygwin überflüssig. D.h. Python und ffmpeg sollten ausreichen.

1 „Gefällt mir“

Hattet Ihr das hier eigentlich gesehen?

@Dennis Das von dir verlinkte Skript erzeugt die Ansagen für die Ordner advert und mp3. Hier geht es ja darum in vorhandene Hörspiele ein Titelansage einzubauen.

@stephan ja, das habe ich gesehen, es ist aber wohl die gleiche Basis, daher der kleine Hinweis.

Ich hatte tatsächlich überlegt, ob ich das Skript noch erweitern sollte. Ich finde die Idee mit den Ansagen echt gut. Aber das python-skript läuft jetzt ja soweit.

Wenn du es dennoch als Powershell realisieren würdest, wäre das nochmal ein Schritt einfacher als mit Python, da dann kein zusätzliches Programm installiert werden muss.

ffmpeg benötigst du auch wenn das Skript über die Powershell läuft. Aber ja, für die Freunde von Windows macht es das dann vielleicht noch ein Stück einfacher.

Ich wollte mich heute daran machen, meine ganzen Dateien damit zu bearbeiten.
Habt ihr Linux User auch das Problem, dass die letzten 2-4 Buchstaben nicht mit gesprochen werden?
Bsp: Dateiname 001_Conni_bekommt_eine_Katze.mp3
Die TTS sagt aber nur "Conni bekommt eine Kat
Oder
011_Conni_im_Krankenhaus.mp3 = Conni im Kranken

Woran kann das liegen?
Bei mir spielt es keine Rolle ob ich die Python Datei direkt oder die Exe ausführe

Ich habe es auch unter Linux (und mit Google TTS) gemacht und hatte das Problem nicht. Meine Dateinamen hatten keine vorangestellte Nummer und Leerzeichen statt Unterstriche, also so: Conni bekommt eine Katze.mp3.

Hmm macht bei mir keinen Unterschied.
hab auch mal 3 Leerzeichen vor das .mp3 gesetzt. Ändert auch nichts.
Kann man irgendwie eine pause zwischen tts und start der MP3 generieren?

Benutzt ihr das Skript aus Thorstens Repo oder das aus Stephans Repo? In Stephans Repo habe ich das Ganze noch etwas weiterentwickelt. Das Problem ist, dass sich in Thorstens Version die Samplerate ändern kann, was manche Player nicht vertragen.

Außerdem wäre noch interessant, wie die Konsolenausgabe aussieht. Dort schreibt das Skript den Text raus, der ins Text-to-Speech gesteckt wird.

Eine Pause kannst Du mit einem Gedankenstrich erzeugen (also ein Minuszeichen).