Ein Artikel im Linuxmagazin machte mich neugierig. Hieraus auch der Quellennachweis:
Die Theorien und Bausteine sowie weitere Projekte sind unter folgenden Quellen zu finden: |
|
[2] festival: http://www.cstr.ed.ac.uk/projects/festival/ |
[3] Ein deutschsprachiges Festival-Derivat: http://www.ims.uni-stuttgart.de/phonetik/synthesis/ |
[4] mbrola: http://tcts.fpms.ac.be/synthesis/mbrola.html |
[5] Lautelementebibliotheken: ftp://tcts.fpms.ac.be/pub/mbrola/VOICES/ |
[6] Das Sprachsynthesesystem Hadifix der Universität Bonn: http://www.ikp.uni-bonn.de/~tpo/Hadifix.html |
[7] Portele & Kraemer, 1995 - Symbolverarbeitung im Sprachsynthesesystem HADIFIX: ftp://asl1.ikp.uni-bonn.de/pub/vm41/tpwolf95.ps.gz |
[8] Ein Sprachsynthesesystem von Lucent: http://www.bell-labs.com/project/tts/ |
[9] Archiventpacker unzip: http://www.cdrom.com/pub/infozip/UnZip.html |
[10] sox - Sound eXchange: http://home.sprynet.com/~cbagwell/sox.html |
[11] Übersicht über einige Sprachsynthesesysteme: http://www.ims.uni-stuttgart.de/phonetik/gregor/synthspeech/examples.html |
[12] Mini-HOWTO zur Sprachsynthese auf Basis der RedHat Distribution: http://www.comp.nus.edu.sg/~rhandeev/Linux/TTS/ |
Der zu sprechende Text wird zunächst vorverarbeitet:
Uhrzeiten, Daten, Abkzg. und Sonderzeichen (@) werden erkannt und in Text umgewandelt von preproc .
Zahlen werden in Worte verwandelt mittels numfilt .
Unnötige Zeilenumbrüche werden eleminiert, Satzenden werden zu Zeilenenden mit »Atempausen« mit pipefilt .
Aus den Worten, Silben und Buchstaben werden Zahlenkolonnen, die Phonemen bedeuten durch txt2pho .
Dann endlich werden die Zahlenkolonnen zu einem wählbaren Audioformat (z.B. .raw)in mbrola .
Dieses Audioformat kann dann sofort zu Ohr gebracht werden mit rawplay .
Zunächst lädt man sich das Paket txt2pho.zip von [6]. Dies wird entpackt nach /usr/local . Darin befindet sich dann auch ein weiteres Archiv namens preproc , das man auch an Ort und Stelle entpacken kann. Unter /usr/local/txt2pho/preproc/ muß man noch das Verzeichnis obj/ anlegen, ein Terminal aufmachen, einmal make und dann gibt es das binary, das man dann nach /usr/local/bin/ kopiert. Sollte das make nicht klappen... Ich lege das binary besser gleich mit auf meine Homepage. Die, zum preprocessing nötigen Rules und Abkürzungen stehen dann auch in /usr/local/txt2pho/preproc/ .
Im Archiv von txt2pho.zip befinden sich auch pipefilt als binary, und numfilt-0.1.tar.gz welches dann auch dort entpackt werden kann. Diese beiden Programme müssen dann noch in /usr/local/bin/ kopiert werden . (nachschauen ob alles ausführbar ist).
Das binary txt2pho selber muß aus /usr/local/txt2pho/ auch noch nach .../bin/ .
Jetzt weiter: Bei [4] den mbrola selber herunterladen. Der mbrola braucht zum funktionieren noch voices, die unter [5] gezogen werden können. Diese heissen de1, de2 und de3. Der Umsetzer txt2pho liefert nur die Vorlage für deutsche Stimmen. Aus mbr301h.zip extrahiert man sich dann das passende binary für Linux und schafft es nach... na was schon, /usr/local/bin/ . Die Stimmen sind,nach dem entpacken, unter /usr/local/mbrola/ gut aufgehoben.
Um Laut zu geben ist noch der Player nötig. Um streamen zu können, bietet sich ein headerloses Format an : -.raw . Also kann man sich den rawplay per Suchmaschine oder hier ziehen. Der muß auch noch in irgendein .../bin/ .
Weitere Vorbereitungen:
Aus /usr/local/txt2pho/ die Datei txt2phorc nach ~/.txt2phorc kopieren. Änderungen: DATAPATH=/usr/local/txt2pho/data/ , INVPATH=/usr/local/txt2pho/data/ , die anderen Möglichkeiten spielt man sicher später noch raus, wenn man die ganzen READMEs studiert hat. Hier meine Version . Diese Datei als txt2pho nach /etc/ kopieren.
Jetzt kann man die einzelnen Komponenten schon mal ausprobieren. Eigentlich eignen sich alle zum pipen: echo »hallo«|txt2pho ergibt:
_ 10 0 171
h 95 20 167 41 164 62 160 83 157
a 102 4 155 24 154 43 153 63 152 82 150
l 47 4 149 47 148 89 147
o: 108 14 146 32 145 51 145 69 144 88 144
_ 483 1 160 6 160 10 160 14 160 18 160 22 160 26 160 30 160 35 160 39 160
Schiebt man das Ganze dann in mbrola, unter Angabe einer Stimmendatei, also :
echo "hallo"|txt2pho|mbrola /usr/local/mbrola/de1 - -.raw|rawplay
sollte dann schon etwas aus dem Brüllwürfel schieben. Hat man das dann einmal geschafft, hält auch der ungeübteste Scriptschreiber seine Finger nicht mehr still. Schiebe also einen Text durch Preprozessor, Nummernfilter und Satzzeichenfilter(pipefilt), rein in txt2pho, dann mbrola und rawplay, dann kommt die bessere Hälfte mit dem Seitenschneider...
Die Reihenfolge der Vorfiler ist nicht egal. Zuerst den Nummernfilter und dann den Satzzeichenfilter, sonst macht der einem die Zahlen kaputt. Danach der preproc . Oder war das andersrum ? Probieren geht über Studieren.
Mit einem Vorgeschaltetem html2text kann man sich dann Websites vorlesen lassen. Am besten die mit den vielen Blondinenwitzen. Allerdings empfiehlt es sich dann noch mit grep -v die vielen ------ und ======= rauszufiltern, den gleichgleichgleichgleichgleichgleichgleichgleichgleichgleichgleichgleichgleichgleichgleich hört sich an wie ein Schiffsdiesel, aber nicht wie eine Unterstreichung.
Der o.a. Artikel im Linuxmagazin hält noch ein paar Tips und scripts bereit, die noch weitere Ideen sprießen lassen.
Der numfilt muß nach dem preproc, weil er sonst Adressen und Computernamen mit Zahlen z.B.: win95.h mit Atempausen und Satzenden versieh und nach dem pipefilt, weil der pipefilt punkte und von numfilt eingefügte Leerzeichen wieder zu Atempausen und Satzenden macht.
Das sag_was.dat von M.Renner sieht dann so aus:
_______________________________________________
#!/bin/sh
# sags
# usage: 'sags filename' or '... | sags'
# Nimmt von stdin oder einer anderen Datei
# Gibt die Worte am Lautsprecher aus
# Abkürzungen werden ausgesprochen
# Zeilenenden werden entfernt
# Männliche Sprechweise und Stimme, in der Frequenz abgesenkt
# Michael Renner 20.01.2000
PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11"
if [ x"$#" = x"0" ]; then
file=/dev/stdin
else
file=${1}
fi
cat $file | preproc /usr/local/txt2pho/preproc/Rules.lst /usr/local/txt2pho/preproc/Hadifix.abk \
| pipefilt| numfilt| txt2pho -m | mbrola -f0.9 -t1 -l 15000 /usr/local/mbrola/de2 - -.raw | rawplay
_________________________________________
Die folgenden Zeilen sollten in /usr/local/txt2pho/preproc/Rules.lst eingefügt werden:
l: abcdefghijklmnopqrstuvwxyzäüöABCDEFGHIJKLMNOPQRSTUVWXYZÄÜÖß"@
c: 0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-"@
Das Kapitel Internet sollte folgendermaßen aussehen:
#
# Internet
#
N*@N* AS email
n*://[N*/]N* AS http_address
n*://[N*/] AS http_address
n*://N* AS http_address
n*://N*/ AS http_address
[N*/]N* AS http_address
[lc*.]lc* AS computer_address
N*ZN* AS email
ZN* AS email
N*Z AS email
In der Zeile computer_adress sind diese neu erzeugten Definitionen l und c benutzt, um " und @ einzuschließen. Sinn der Übung: Gequotete Rechnernamen und email-Adressen richtig zu interpretieren.