Sprachsynthese unter Linux

Ein Artikel im Linuxmagazin machte mich neugierig. Hieraus auch der Quellennachweis:

Die Theorien und Bausteine sowie weitere Projekte sind unter folgenden Quellen zu finden:


[1] rsynth: Eins der Urprogramme zur Spracherzeugung: ftp://ftp.cdrom.com/pub/linux/sunsite/apps/sound/speech/rsynth-2.0.tgz

[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/

Wie in etwa geht das?

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 .

Was braucht man dazu?

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/ .

Nu´ aber los!

Weitere Vorbereitungen:

_ 483 1 160 6 160 10 160 14 160 18 160 22 160 26 160 30 160 35 160 39 160

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...

Tipps:

_______________________________________________

#!/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.

Viel Spaß wünscht Stefan .