Sprachsynthese

Die Idee

Was tut man, wenn man täglich eine bis eineinhalb Stunden alleine im Auto sitzt? Radio hören ist nicht schlecht, aber man kann die Zeit auch sinnvoller nutzen und all die Vorträge anhören, für die man sich zu Hause doch nie die Zeit nimmt.

Wenn man sich ein Radio zulegt, das MP3 abspielen kann (z.B. das recht günstige VDO CD 139 MP3), hat man erstmal ausgesorgt - auf eine CD passen schliesslich Stunden. Oder man brennt die Vorträge einzeln auf eine Audio-CD.  Ich habe auch gehört, es gäbe Adapter, über die man einen MP3-Player an ein Autoradio anschliessen kann. Möglichkeiten gibt es genug!

Nur: was tun, wenn ein Ende absehbar ist? Man ist durch mit den Vorträgen, die man auf CD hat oder bringen kann? Ich dachte mir: Man müsste sich doch Bücher vorlesen lassen können! Und tatsächlich, nach ein bisschen Bastelei klappt es wunderbar: man kann PDF-Dateien sehr leicht in MP3 konvertieren.

Was braucht man dafür?

Alles, was man dafür braucht, bekommt man kostenlos (ich sag's aber gleich: das Ergebnis ist entsprechend ...):

Das wäre eigentlich schon alles. Aber ich habe noch Tools geschrieben, die zusätzlich zum Einsatz kommen:

So hört es sich an

Ein Beispiel: beispiel.mp3

Wie schon angedeutet - man darf von Tools, die es umsonst gibt nicht erwarten, dass die Ausgabe klingt wie Elmar Gunsch. Man merkt schon deutlich, dass die Stimme künstlich ist, aber so schlecht ist sie auch nicht, oder? Das Tempo ist ein wenig verlangsamt, damit man sich im Auto nicht all zu sehr darauf konzentrieren muss, das Gesprochene zu verstehen. Aber Geschwindigkeit und Tonhöhe kann man sehr leicht variieren.

An dieser Stelle verabschiede ich mich von denjenigen, denen die erzielte Qualität nicht ausreicht.

Den anderen erkläre ich jetzt, wie es funktioniert.

Installation der benötigten Software

pdftotext

Dieses Tool sollte schon vorhanden sein. Wer eine Distribution benutzt, die es nicht mitbringt, weiss sicher auch, wo und wie er es bekommt ;-)

txt2pho und mbrola

Leider bedeutet die Installation dieser Pakete (Download über die Links oben; ich empfehle die männliche Stimme de6) einiges an Handarbeit, die den  Maus-und-Fenster-Linuxer abschrecken wird - dafür hat man hinterher aber auch begriffen, wie alles funktioniert und zusammen hängt. Man kann damit nämlich auch alles mögliche andere machen als nur PDFs in MP3s wandeln.

Diese beiden Pakete installieren wir also gemäss "Lesestunde" oder "SprachAusgabe"; das sind zwei sehr gute Artikel über die Thematik. Allerdings würde ich die Dinge nicht in /usr/local installieren, sondern in /opt, aber das ist Geschmackssache.

Wer möchte, kann die Filter, die txt2pho mitbringt (numfilt, pipefilt, preproc) auch installieren. Ich rate für den Augenblick jedoch davon ab.

lame

Für lame gilt dasselbe wie für pdftotext.

Im Grunde hat man damit schon alles, was man für die Konvertierung braucht. Daher empfehle ich  an dieser Stelle, mit dem bisher Installierten erstmal ein wenig zu experimentieren. Wenn es bisher nämlich Probleme gibt, klappt auch alles folgende nicht. Also: ausprobieren!


Funktioniert alles, geht es weiter mit:

txt2mp3.sh

Dieses Script vereinfacht den ganzen Prozess. Wir kopieren es irgendwo hin, meinetwegen legen wir dafür das Verzeichnis /opt/txt2mp3 an. Bitte darauf achten, dass das Script ausführbar ist (notfalls chmod 755 txt2mp3.sh).

Filter

msfilter.pl erlaubt es in Verbindung mit der zugehörigen msfilter.ini , den Text vor der Konvertierung ein wenig aufzubereiten, damit das Ergebnis besser wird. Legen wir es auch nach /opt/txt2mp3. Bitte darauf achten, dass das Script ausführbar ist (notfalls chmod 755 msfilter.pl)

Vorsicht! msfilter.ini enthält Umlaute; die Datei muss daher ggf. an die Locale des Zielsystems angepasst werden.

Die Konvertierung an einem Beispiel erklärt

Da jetzt alles Nötige installiert ist und hoffentlich funktioniert, können wir daran gehen, einen ersten Text zu konvertieren.

Auswahl eines geeigneten Textes

Es eignen sich selbstverständlich nicht alle Texte gleichermassen zur Konvertierung. Am besten klappt es natürlich mit solchen, die von A bis Z aus einfachem Text bestehen. Kompliziertes Layout, Tabellen und dergleichen führen zu schlechten Ergebnissen. Seitenzahlen, Kolumnentitel, Anmerkungen am Seitenende etc. sind nicht verhängnisvoll, machen aber beim Vorbereiten des Textes Arbeit.

Konvertierung von PDF in einfachen Text

Wir nehmen die Datei test.pdf und wandeln sie mit pdftotext in eine Datei mit einfachem Text um:

$ pdftotext -nopgbrk test.pdf

Dieser Befehl erzeugt die Datei test.txt, die nur noch den in test.pdf enthaltenen Text enthält, keine grafischen Elemente mehr. Der Parameter -nopgbrk sorgt dafür, dass auch keine Seitenvorschübe (das Zeichen ^L) im Ergebnis enthalten sind. Mit weiteren Parametern kann man dafür sorgen, dass nur bestimmte Seiten extrahiert werden (bei Bedarf siehe dazu die man-Page von pdftotext).

Damit hätten wir jetzt den Ausgangstext vorliegen.

Manuelle Vorarbeiten

Zwar werden wir später mit msfilter.pl einiges automatisiert verbessern, aber es hilft nichts: Zunächst müssen wir uns den Ausgangstext ansehen, ob irgend welche störenden Elemente drin sind. Unter anderem sollte man achten auf

Aufteilen des Textes in Kapitel

Wo wir den Text schon im Editor haben, speichern wir jedes Kapitel in eine eigene Datei ab. Da für jede Textdatei eine eigene MP3-Datei erzeugt wird, fördert das die Übersicht (so bekommt etwa jedes Kapitel einen eigenen ID3-Tag mit Titel) und die MP3-Dateien werden auch nicht zu riesig.

Anpassen von msfilter.ini

Der Filter msfilter.pl nimmt elegant ein paar Veränderungen vor. Dabei bezieht er seine Weisheit zum einen aus ein paar Regeln, die ich direkt im Script hinterlegt habe (wer eines dieser Features nicht haben will, kann die entsprechende Anweisung einfach aus dem Script streichen):

Zum anderen, und deshalb erwähne ich das hier, liest er aber auch eine Tabelle mit Ersetzungsregeln: die Datei msfilter.ini. Man sollte an dieser Stelle prüfen, ob die Regeln in dieser Datei zum Text passen. Die Datei enthält folgendes:

Beachte: die Datei enthält keine gewöhnlichen Strings, sondern reguläre Ausdrücke, die Perl versteht. Auch wer die Syntax nicht kennt, bekommt aus den vorhandenen Beispielen wahrscheinlich eine Idee, wie das mit den regulären Ausdrücken funktioniert.

Erzeugen einer INI-Datei

Ich habe Komfort versprochen - hier ist er:

Wir erzeugen jetzt eine INI-Datei, die die Texte, die wir konvertieren, beschreibt. Diese Beschreibung beeinflusst den Konvertierungsprozess - wir können damit z.B. Tonhöhe und Sprechgeschwindigkeit fest legen. Dann werden aus dieser Beschreibung auch ID3-Tags erzeugt, so dass sich das Endergebnis auch in einem MP3-Player sehen lassen kann.

Sagen wir, wir hätten die Dateien test_01.txt, test_02.txt, test_03.txt, test_04.txt und test_05.txt vorliegen. Für diese Dateien erzeugen wir eine INI-Datei des Namens test.ini. Das ist wichtig: Die INI-Datei muss so heissen wie die Textdateien ohne den Unterstrich und die Nummerierung. Oder anders herum: Die Namen der Textdateien müssen alle enden auf einen Unterstrich und eine Nummerierung (ein- oder zweistellig ist egal).

Die exemplarische INI-Datei, wenn wir z.B. diese Webseite vertonen wollten, wird zunächst folgendes enthalten:

Artist=Martin Schweikert
Album=Sprachsynthese
Year=2004

Title01=Die Idee
Title02=Was braucht man dafür?
Title03=So hört es sich an
Title04=Installation der benötigten Software
Title05=Die Konvertierung an einem Beispiel erklärt

Das sind Angaben, die in die ID3-Tags fliessen. Der Profi wird vermuten, dass hier ID3-Tags der Version 2 erzeugt werden, denn einige Titel sind länger als 30 Zeichen. Will man das nicht, dann schreibt  man in eine beliebige Zeile die Angabe

ID3=1

In diesem Fall findet später eine Prüfung statt, ob auch alle Angaben kurz genug sind.

Drei Angaben werden automatisch hinzu gefügt:

So viel zur Kosmetik der ID3-Tags.

Eine wichtige Angabe muss wahrscheinlich noch sein: die zu verwendende Stimme. Ist das nicht /opt/txt2pho/data/de6 (so der Default in txt2mp3.sh), muss Ort und Name der Stimmen-Datenbank angegeben werden. Das Beispiel für eine weibliche Stimme, wenn die Installation streng nach "Lesestunde" vorgenommen wurde, wäre:

Stimme=/usr/local/mbrola/txt2pho/data/de6

Will man die Tonhöhe oder die Sprechgeschwindigkeit beeinflussen, kann man das mit den Parametern Frequenz bzw. Tempo tun. Um die Defaults von mbrola zu benutzen, würde man schreiben:

Frequenz=1.0
Tempo=1.0

Für meinen Geschmack wäre das zu hoch und zu schnell, aber das kann ja jeder einstellen, wie er will.

Zu guter Letzt: wo wir uns doch so viel Mühe mit dem Filter gemacht haben, legen wir noch fest, dass er auch benutzt wird. Den vollen Nutzen haben wir von

Filter=/opt/txt2mp3/msfilter.pl /opt/txt2mp3/msfilter.ini

Das bedeutet: benutze den Filter /opt/txt2mp3/msfilter.pl samt den Regeln in /opt/txt2mp3/msfilter.ini. Wollten wir die Regeln nicht benutzen, genügte

Filter=/opt/txt2mp3/msfilter.pl

Hier kann man aber aus dem Vollen schöpfen: Wenn man alles ausnutzen möchte, was die Filter hergeben, kann man auch eintragen (aber unbedingt an die eigenen Gegebenheiten anpassen!)

Filter=/opt/txt2mp3/msfilter.pl /opt/txt2mp3/msfilter.ini | pipefilt | numfilt | preproc /usr/local/Sprachsynthese/txt2pho/preproc/Rules.lst /usr/local/Sprachsynthese/txt2pho/preproc/Hadifix.abk

Eine sinnvolle INI-Datei wäre test.ini

Ausführen von txt2mp3.sh

Wenn alles korrekt installiert und konfiguriert ist, kommt jetzt der Moment, wo wir

$ txt2mp3.sh test.ini
tippen, uns genüsslich zurück lehnen und zusehen, wie unsere Texte in MP3s konvertiert werden. Am Schluss haben wir die Dateien test_01.mp3, test_02.mp3, test_03.mp3, test_04.mp3 und test_05.mp3 vorliegen.