Sprachsynthese

..unter Linux ist auch möglich.

Inhaltsverzeichnis

Wie macht man das nun?
Wie funktioniert das Ganze?
Was braucht man alles??
Wie installiere ich das Ganze?
Der Betrieb
Links zu weiteren Beschreibungen

Bin vor einigen Jahren darauf gestossen und möchte es hier Aktuell präsentieren wie man das bewerkstelligt.
"Der Tux kann lesen".

Wie macht man das nun?

Im Linux Magazin gab es einen sehr ausführlicher Artikel dazu. Nur Leider ist der nicht mehr Online, stimmte auch nicht mehr ganz, einige Links waren auch nicht mehr erreichbar und so weiter. Darum möcht diese Wissen und meinen kleinen Teil erhalten und mit euch teilen. Also dann los.

Linux Magazin > Jahrgang 2000 > Ausgabe 05 > Sprachsynthese

Wie funktioniert das Ganze?

Das ganze funktioniert im mehreren Stufen.

  1. In den ersten zwei Schritten wird der Text so aufbereitet das bestimmt Stellen auf bestimmte weisse gelesen werden. Das macht das Programm preproc. Manche Stellen aber werden nicht richtig vom Programm preproc aufbereitet. Für diese Stellen gibt es zusätzlich ein Perl-Skript msfilter.pl das dabei hilft. Die funktionsweise der beiden Programme ist ähnlich und ergänzen sich.
  2. Des weiteren müssen Zeileumbrüche wo kein Satzende ist entpfernt werden, damit später hier keine Sprechpause entsteht. Aber auch dann Zeilenumbrüche dort einzufügen wo Sprechpause erwünscht sind. Des weiteren müssen Abkürzungen in ganze Wörter umwandelt werden, die Zahlen wie 1,23 in Wörter, Sonderzeichen z.B. @ in "ät" umwandelt werdem usw., das erledigt das Programm preproc.
  3. Der nächste Stufe ist die Umwandlung des Textes in Lautschrift das Ergebnis sind sogenannte "*.pho-Dateien" die mit dem Programm txt2pho erzeugt werden. (Das Programm erzeugt bessere Ergebnisse wenn es weiss ob es eine Frauen- oder Männerstimme werden wird.)
  4. Und die vierte Stufe ist das Programm mbrola das aus den "*.pho-Dateien" eine Audio-Datei macht.
  5. Die Audioformate des Programms mbrola sind *.raw, *.au, *.wav oder ein *.aiff Format welche alle ein wenig unbekannt wirken, bis auf das *.wav Format das man von CDs her kennt. In einer fünften Stufe kann man diese noch in eine platzsparendere Variante wie z.B. MP3s oder Oggs umwandeln. Oder gleich ausgeben mit dem Programm play (oder aplay) oder irgendeinen anderen Audioplayer der das jeweilige Format unterstützt.

Was braucht man alles??

Hinweis für alle die andere Artikel zu diesem Thema kennen:
Die Funktion von numfilt und pipefilt, wird von preproc komplett übernommen und in sofern sind sie nicht mehr nötig. Die ersten zwei Programme werden oft in älteren Veröffentlichungen noch oft verwendet und auch das ersetzen von dem @-Zeichen das alles ist aber nicht nötig.

Hinweis zu msfilter.pl:
Wobei es mitlerweile Probleme gibt mit dem Zeichensatz UTF-8 welches auf vielen Linuxsysteme schon verwendet wird. Zum Beispiel werden dadurch die deutschen Umlaute nicht richtig verarbeitet. Mit msfilter.pl hab ich das Problem, zumindest für die deutschen Umlaute äöüß umgangen indem diese Zeichen wie im Kreuzworträtzel geschreiben werden, also z.B. ä durch ae ersetzt werden.

Man braucht das Programm TXT2PHO das findet man unter [2] in diesem Paket sind alle Pakete einhalten die man zu Erstellung der *.pho Dateien braucht. numfilt findet man auf der gleichen Seite wie TXT2PHO unten bei Anwendungen.

Dann braucht man das Programm mbrola das man auf der Homepage [3] zuhause ist. Im Download Bereich [4] findet dann die bin Dateien für mbrola und die Sprachpakete. Die Sprachpakete beginnen mit einem DE und dann eine Zahl. Dahinter steht noch ein "male" für männliche Stimme "female" für weibliche Stimme. Man braucht nicht alle eine genügt.

[2] http://www.ikp.uni-bonn.de/forschung/phonetik/sprachsynthese
[3] http://tcts.fpms.ac.be/synthesis/mbrola.html
[4] http://tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html

Wie installiere ich das Ganze?

Nachdem die Pakete runtergeladen sind. Packt man als erstes das Paket von txt2pho aus. In diesem Ordner sind noch mal zwei gezipte Dateien die man auch gleich auspackt. Das Programm preproc muss erst noch übersetzt werden. Dazu wechselt man in diesen Ordner und ruft in der Konsole die folgenen Befehle auf:

mkdir obj
make

Nachdem das Programm übersetzt ist verschiebt man die 4 Programmedateien (txt2pho, pipefilt, numfilt, preproc) nach /usr/local/bin dafür muss man als root angemeldet sein! Wer sie nicht in die Ordner findet kann auch find bennutzen  .

Als nächstes legt man das Verzeichnis txt2pho in /usr/local an. In diesen verschiebt man den Ordner data dort hin. Danach von dem Ordner preproc die zwei Dateien mit dem Namen Hadifax.abk und Rules.lst nach /usr/local/txt2pho/preproc den man zuvor anlegen werden muss. Als letzes noch des Verzeichnis /usr/local/txt2pho/voices an das später gebraucht wird.

Als nächstes die Konfiguation des Programms txt2pho diese Datei befindet sich an drei Stellen einmal unter:

/etc/txt2phorc
/usr/local/txt2pho/preproc/hadifix.cfg
~/.txt2phorc

Der Inhalt der Datei:

DATAPATH=/usr/local/txt2pho/data/
INVENTORY=male
INVPATH=/usr/local/txt2pho/data/
TREE=newtree
PROMCOMP=1
REDUCTION=3
SPEECHRATE=1.15
USENET=2

so das Paket von txt2pho ist installiert. Nun können wir uns mbrola zuwenden.

Man pakt das Paket von mbrola aus, wechselt in den Ordner, sucht ist die richtige binäre Datei aus (In den meisten fällten 'mbrola-linux-i386') benennt sie um in mbrola und verschiebt sie nach /usr/local/bin. Danach packt man das Sprachpaket de...zip aus und verschiebt den Ordner nach /usr/local/txt2pho/voices. Fertig!!!

Der Betrieb

Das diese ganze Programme auch zusammen arbeiten, hab ich mir ein Skript geschieben (leicht abgewandelt).

Mein "sag-was" Skript:

#!/bin/sh
#
# sag-was

binordner=$"/usr/local/txt2pho"

hilfe()
{
echo "############################################
Ein Skript zur Umwandlung von Text zu Ton
$ sag-was -2 -f=AUSGABEDATEI EINGABEDATEI

-1, -2, -3 ...  Sind die verschiedenen Stimmen grade Zahlen sind weibliche
                Stimmen die ungeraden die männlichen Stimmen. 
-f=             Möglichkeit die Datei zu speichern um sie später anzuhören.
                (NEU! die Datei wird in gleich in eine *.ogg Datei& nbsp;umgewandelt)
-h              Um die Hilfe anzuzeigen 
############################################"
exit
}

# default Sprache
# sprache "male-de1"
t2p='-m'
mbr='-f1.25 -t0.9 -l 15400'
mbf="$binordner/voices/de1/de1"

# wenn keine Datei angegeben nimmt er den STANDARD-IN
file="/dev/stdin"

# Mbrola gibt die Daten als *.au Datei aus
mbo="- -.au"

# Spiel die Datei wenn kein -f=DATEINAME angegeben ist.
datei="nein"

while test -n "$1"
do
    case $1 in 
        -1) # sprache "male-de1"
        & nbsp;   t2p='-m'
            mbr='-f1.25 -t0.9 -l 15400'
            mbf="$binordner/voices/de1/de1";;
            
        -2) # sprache "female-de2"
            t2p='-f'
            mbr='-f1.25 -t1.0 -l 19300'
            mbf="$binordner/voices/de2/de2";;
        
        -3) # sprache "male-de3"
            t2p='-m'
     & nbsp;      mbr='-f1.20 -t0.9 -l 19000'
            mbf="$binordner/voices/de3/de3";;
        
        -f=*) dateiname=$(echo $1 | sed -e 's/^-f=//g' )
              datei="ja";;
              
        -h) hilfe ;;
        
        -*) echo "ungültige Option '$1'"
            exit ;;
        
        *)  file="$1";;
    esac
    shift
done

if [ $datei = "ja" ]
then
cat $file | sed 's/@/ ät /g' | preproc \
"$binordner/preproc/Rules.lst" "$binordner/preproc/Hadifix.abk" | \
txt2pho $t2p | mbrola $mbr $mbf $mbo | sox -t .au - "$dateiname.ogg"
fi

if [ $datei = "nein" ]
then
# Ausgabe mit play
cat $file | sed 's/@/ ät /g' | preproc \
"$binordner/preproc/Rules.lst" "$binordner/preproc/Hadifix.abk" | \
txt2pho $t2p | mbrola $mbr $mbf $mbo | play - -t au

# Ausgabe mit aplay
#cat $file | sed 's/@/ ät /g' | preproc \
#" $binordner/preproc/Rules.lst" "$binordner/preproc/Hadifix.abk" | \
#txt2pho $t2p | mbrola $mbr $mbf $mbo | aplay - -t au
fi

Ich hab bis jetzt 3 Sprachpakete installiert (de1, de2, de3).

Das Skript wird hat eine Option die es ermöglicht die Stimme auszuwählen.

-1    für die erste Stimmt (männlich)
-2    für eine weiblche Stimme
-3    für wieder eine männliche Stimme.

-f=   um es in eine Datei zu speicher zu können z.B. 
grey@grey:~$ sag-was -2 Textdatei -f=Sounddatei.au

ein Beispiel:

grey@grey:~$ sag-was -2 Textdatei

Bei txt2pho steht eine Option -m oder -f da die bestimmt ob male/female also männliche- bzw. weibliche Stimme.

Bei mbrola sind mehrere Optionen mit denen man die Stimmen verändern kann. Dort ist herumspielen angesagt bis es einem gefällt. Ihr könnt es ruhig ändern  .

Beim letzten der Sprachvarianten hab ich es so abgeändert das es als Datei ausgegeben wird. Mit audacity? oder Konsole mit "play DATEINAME" kann man sie z.B. abspielen.

Viel Spass damit


Der Spaß geht weiter, denn man kann sich mit dem Teil auch Webseiten vorlesen lassen. Dazu wird einfach das Skript saghtml im Verzeichnis ~/bin erstellt und ausführbar gemacht.

#!/bin/sh

# Mit Elinks
#elinks -dump -no-numbering "$2" | sag-was "-$1"

# Oder mit Lynx
lynx -dump -nolist "$2" | sag-was "-$1"

# Oder gleich als *.ogg im XMMS 
#elinks -dump -no-numbering "$2" | sag-was "-$1" -f=/tmp/sag-was && xmms /tmp/sag-was.ogg &>/dev/null

Der Aufruf erfolgt mit saghtml <Stimme> <URL>.
Beispiel: saghtml -2 http://pengupedia.de/Sprachsynthese liest genau diese Seite vor ;)

Links zu weiteren Beschreibungen