Skript für Ansagen in mp3-Dateien

Ich habe das aus Thorstens genommen.
Wenn ich das vom Stephans Repo nehme bekomme ich als Fehlermedung:

Traceback (most recent call last):
File „C:\Python27\add_lead_in_messages.py“, line 7, in
import argparse, base64, json, os, re, subprocess, sys, text_to_speech
ImportError: No module named text_to_speech

Ein oder mehr minus am ende macht auch kein Unterschied.

Du musst das Skript in dem Verzeichnis ausführen, in dem es liegt (und wo auch die text_to_speech.py liegt).

Hmm, wahrscheinlich werden Pausen am Ende nicht beachtet. Ich hab’s bisher nur mitten im Text probiert. Ansonsten fällt mir kein einfacher Weg ein, wie Du eine Pause erzeugen kannst.

das war mir nicht klar. Jetzt funktioniert es.
Die Titel werden nun auch vollständig vorgelesen.
Vielen Dank für die Hilfe Til!

Ich habe auch das Skript aus Thorstens Repo verwendet. Und jetzt wo du darauf hinweist fällt mir auf: Der DFPlayer liest bei mir den Titel zwar vollständig vor, aber der Anfang der Titelmelodie des Hörspiels ist abgeschnitten. Wenn ich die mp3 mit VLC am PC abspiele aber nicht.
Vermutlich ist das ein ähnlicher Effekt wie der, der bei skss aufgetreten ist… und weshalb du das Script weiterentwickelt hast.

Ich kann das bestätigen. Bei mir ist es auch so, dass der VLC player es richtig abspielt und der DFPlayer wird der Anfang vom Original abgeschnitten :frowning:

Ist das bei den Linux usern auch so?

Kann es sein das ihr den 0 Ohm wiederstand am DFPlayer entfernt habt und die Brücke auf der anderen Seite verwendet um den Verstärker vom Player über den Bussy Pin zu steuern? Das führt nämlich zu einem delay zwischen start der Wiedergabe und einschalten des Verstärker.

Nein, (ich zumindestens nicht).
Das Problem ist auch nicht dass die MP3’s generell später anlaufen sondern dass erst die generierte Titelansage kommt z.B. Leo Lausemaus wünmscht sich ein Haustier (dauer ca 2-3 Sek) und die eigentliche MP3 dann am Anfang um diese Zeit abgeschnitten wird.
Wird die Datei am PC wiedergegeben, wird nach der Titelansage nichts abgeschnitten.

Siehe:
Titel auf dem PC

Titel auf dem DFPlayer

Wie installiert man das denn in Linux? In welchen Ordner kommt das py? Etc

Das py Script dorthin wo die mp3 hinsollen.
Was hast du genau vor.

Hi gmbo.

Ich habe vor, es zu benutzen. Das Skript läuft jetzt, aber es kommen sehr viele Fehler, unter anderem, dass kein Google Text to speech installiert ist. Es heißt bei der „Anleitung“, dass es klappt, wenn alle Abhängigkeiten und Pakete installiert sind. Aber, ich sehe nirgends, welche Pakete, und Abhängigkeiten nötig sind. Ich habe im Grunde genommen nur das py und keine Erklärung, wie es zu nutzen ist. Schade eigentlich

In meinem GitHub Repo ist eine kurze Anleitung. Link ist in meinem Profil. Für Google speech und Amazon Polly brauchst du halt Accounts. Für „say“ nen Mac (dafür gehts offline). Generell ist es etwas für Fortgeschrittene, das mag stimmen.

Die API habe ich. Linux mint auch. Aber, anscheinend reicht python nicht. Irgendwelche Programme oder Abhängigkeiten fehlen da noch und es wäre schön, wenn beschrieben würde, was genau Voraussetzung unter Linux ist, um es zu nutzen.

ffmpeg könnte sein. Ich hab’s schon lange nicht benutzt. Es lief bei mir aber auch out of the Box.

Ffmpeg wars. Danke dir. Sollte am besten noch in die Anleitung rein.

unter Mint habe ich mit pico2wave die Sprachdateien mal erstellt. Ich hatte da ffmpeg schon drauf.
installation mit

sudo apt-get install libttspico-utils

dann muß eventuell noch

sudo apt-get install lame
sudo apt-get install ffmpeg
sudo apt-get install libavcodec-extra

installiert werden

Bei mir läuft

#!/bin/bash
mkdir mp3
mkdir advert

awk -F’|’ ‚{system(„pico2wave -l=de-DE -w=outfile.wav "“ $2 „" && lame -b 128 outfile.wav " $1 " && rm outfile.wav“)}‘ < files.txt

for i in {1…255};
do
j=$(printf „%04d“ $i)
pico2wave -l=de-DE -w=outfile.wav „$i“
lame -b 128 outfile.wav mp3/$j.mp3
rm outfile.wav
done

Google nutze ich nicht, hatte aber gehört, dass gerade bei der Text2speach sich etwas geändert hätte.
Sollte aber nicht das Problem sein, da es ja wohl von anderen Betriebssystemen funktioniert.

Wenn ich z. B.

~/tonuino/Sprachdatei/tools $ python add_lead_in_messages.py -i 01 -o 01s --use-google-key=ABCD

aufrufe
bekomme ich

Adding lead-in „Kasimir backt“ to /home/gisbert/tonuino/Sprachdatei/tools/01s/001_Kasimir_backt.mp3

Generating: temp-lead-in.mp3 - Kasimir backt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 664 0 401 100 263 1863 1222 --:–:-- --:–:-- --:–:-- 1856
Traceback (most recent call last):
File „add_lead_in_messages.py“, line 124, in
addLeadInMessage(args.input, args.output)
File „add_lead_in_messages.py“, line 55, in addLeadInMessage
addLeadInMessage(os.path.join(inputPath, child), os.path.join(outputPath, child))
File „add_lead_in_messages.py“, line 82, in addLeadInMessage
text_to_speech.textToSpeechUsingArgs(text=text, targetFile=tempLeadInFile, args=args)
File „/home/gisbert/tonuino/Sprachdatei/tools/text_to_speech.py“, line 58, in textToSpeechUsingArgs
textToSpeech(text, targetFile, lang=args.lang, useAmazon=args.use_amazon, useGoogleKey=args.use_google_key)
File „/home/gisbert/tonuino/Sprachdatei/tools/text_to_speech.py“, line 84, in textToSpeech
mp3Data = base64.b64decode(responseJson[‚audioContent‘])
KeyError: ‚audioContent‘

als Meldung.

welches py-Script rufst du auf?
In Stephans Repository stehen unter tools
add_lead_in_messages.py create_audio_messages.py text_to_speech.py

Kannst du deinen Aufruf und die genaue Fehlermeldung posten, dann kann man das vieleicht nachvollziehen.
Den API-Key solltest du natürlich ändern in 123456 oder sowas.

Es wäre natürlich schon wenn alles beschrieben wäre,
aber leider hat man für jedes Betriebssystem nicht die Erfahrung und auch nicht die Zeit und Muße das für andere unentgeltlich zu tun.
Bei einem selbst klappt das ja und welche Erfahrung und Vorkenntnisse andere haben ist auch unterschiedlich und man weiß das nicht.

Ich muß hier einfach erst einmal Danke sagen für die vielen freiwiligen, die ihre Erfahrung hier teilen, damit ein so tolles Projekt überhaupt läuft.

Deshalb, je genauer du beschreibst was du erreichen möchtest, was du getestet hast und was dabei als Meldungen kommt, desto genauer können die Antworten sein und vieleicht gibt es Dadurch wieder ein Stück Beschreibung mehr, die dadurch entsteht.

Hi gmbo.

Danke dir für deine Antwort. Habe jetzt, siehe oben, ffmpeg drauf und es klappt. Aber, teilweise gehen Dateien jetzt nicht mehr. Er startet, und nach der Ansage ist Schluss. Obwohl zb 40 Minuten als Länge angezeigt wird. Zum Glück habe ich nicht die originalen ersetzt, sondern die neuen als Kopie, die aber, teilweise nicht mehr, nach dem Intro, gehen.

Du weißt dass unter Linux auch ein verstecktes Verzeichnis auf die SD geschrieben wird das du löschen mußt weil es sonst Probleme gibt.

Ich habe das Script text_to_speech.py mal ein bisschen modifiziert,
Dann läuft es auch ohne Google mit pico2wave

Wenn ich in text_to_speech.py

picoVoiceByLang = {
‚de‘: ‚de-DE‘,
‚en‘: ‚en-US‘,
‚fr‘: ‚fr-FR‘,
}
einfüge und

def addArgumentsToArgparser(argparser):
argparser.add_argument(‚–lang‘, choices=[‚de‘, ‚en‘, ‚fr‘], default=‚de‘, help=‚The language (default: de)‘)
argparser.add_argument(‚–use-say‘, action=‚store_true‘, default=None, help=„If set, the MacOS tool say will be used.“)
argparser.add_argument(‚–use-pico‘, action=‚store_true‘, default=None, help=„If set, the Linux tool pico2wave will be used.“)
argparser.add_argument(‚–use-amazon‘, action=‚store_true‘, default=None, help=„If set, Amazon Polly is used. If missing the MacOS tool say will be used.“)
argparser.add_argument(‚–use-google-key‘, type=str, default=None, help=„The API key of the Google text-to-speech account to use.“)

erweitere

und dann weil ich mit der Übergabe der args nicht so zurechtkomme den Part else in texttospeech() mit

else:
        subprocess.call([ 'pico2wave', '-l='+picoVoiceByLang[lang], '-w='+'temp.wav', '"'+text+'"' ])
        subprocess.call([ 'ffmpeg', '-y', '-i', 'temp.wav', '-acodec', 'libmp3lame', '-ab', '128k', '-ac', '1', targetFile ])
        os.remove('temp.wav')

austausche

Dann läuft auch

python add_lead_in_messages.py -i 01 -o 01s --use-say

und hängt die Dateinamen vor die Hörspiele an.

Hi gmbo. Ja, das weiss ich, dass versteckte Ordner erstellt werden, habe es aber vergessen :slight_smile: , und trotzdem werden die Mp3, selbst am PC, nicht korrekt wiedergeben. Ich kodiere jetzt mit lame alle zu korrekten Mp3s. Deine Lösung werde ich auch noch probieren, erst recht weil die ohne API auskommt, das ist ein riesen Schritt vorwärts.

Ich habe mich auch mal da rangetraut und leider lief das nicht ohne Weiteres. Im Fork von @stephan habe ich zwei Pullrequests erstellt, so dass das Skript bei mir zumindest auf Ubuntu 16.04 (Python 3.5) erfolgreich lief und Ansagen über Google Text-to-speech erzeugt hat.

Unter Windows 10 wo ich Python 3.7 verwende, beschwert sich „subprocess.check_output“ darüber, dass es einen String und nicht „byte“ erwartet. Müsste so zwischen Zeile 95 und 100 in der text_to_speech.py sein. Kurz vorher im Code wird tatsächlich der json body in utf-8 encodiert, wodurch daraus ein byte Objekt wird. Ich habe das encoding des Body testweise rausgenommen und dann läufts auch problemlos unter Windows.

Bei Gelegenheit versuche ich es nochmal mit Python 3.5 unter Windows. Entweder wurde mit 3.7 am subprocess Modul etwas geändert oder Linux und Windows verhalten sich komplett unterschiedlich. Leider weiß ich nicht, ob das Entfernen des Encodings evtl unerwünschte Nebeneffekte auf andere OS / Python-Version Kombinationen hat, deshalb hier die Frage: Hat da jemand spontan eine Idee oder auch das gleiche Problem gehabt?

Nachtrag: Ich habe möglicherweise das default Encoding in der Windows Powershell auf UTF-8 umgestellt. Vielleicht ging es nur deshalb. Bei Gelegenheit oder wenn ich nochmal Ansagen erstelle schaue ich mir das sicher nochmal genauer an. Im Prinzip funktionierte es aber wunderbar.

Gibt es hier denn Leute, wo das „richtig“ funktioniert? Wenn es ein generelles Problem ist, stimmt vielleicht nur mit dem Aufruf von ffmpeg etwas nicht oder mit der verwendeten Version.

Es könnte auch an den Quell-MP3s liegen. Meine habe ich vor dem Hinzufügen der Ansagen extra in CBR 128kbit / 44,1 khz enkodiert um Platz zu sparen und weil VBR ja u.U. auch Probleme machen kann. Trotzdem (oder deswegen?) wird ein kleines Stück am Anfang der Titel abgeschnitten.