Lass' deinen Computer sprechen mit "text-to-speech" oder wie man einen Sprachsynthesizer unter Linux (i386) zum Laufen bringt.
Text-to-Speech gentoo
http://gentoo-wiki.com/HOWTO_let_your_Gentoo_speak_with_speechd
Wie funktioniert text-to-speech
text-to-speech besteht grundsätzlich aus zwei Applikationen:
- das txt-2-pho-Programm
MBROLA, der eigentliche Sprach-Synthesizer.
Das txt-2-pho-Programm macht aus dem Input und einer Sprach-Datenbank eine Phone-Datei, die der Sprach-Synthesizer interpretiert und schließlich an einen Player ausgeben kann. Um nähere Informationen über die Funktion von text-to-speech zu erhalten, sollte man die Homepage des MBROLA-Projekts besuchen (http://tcts.fpms.ac.be/synthesis/mbrola.html).
Eine Alternative zum oben genannten ist festival.
Installation
Was brauche ich alles
Also es wird folgendes benötigt:
MBROLA binary (die gibt es hier: http://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip)
Eine Stimme wobei es derzeit 6 verschiedene deutsche Stimmen gibt
WEIBLICH: http://tcts.fpms.ac.be/synthesis/mbrola/dba/de1/de1-980227.zip
MÄNNLICH: http://tcts.fpms.ac.be/synthesis/mbrola/dba/de2/de2-990106.zip
WEIBLICH: http://tcts.fpms.ac.be/synthesis/mbrola/dba/de3/de3-000307.zip
MÄNNLICH: http://tcts.fpms.ac.be/synthesis/mbrola/dba/de4/de4.zip
WEIBLICH: http://tcts.fpms.ac.be/synthesis/mbrola/dba/de5/de5.zip
MÄNNLICH: http://tcts.fpms.ac.be/synthesis/mbrola/dba/de6/de6.zip
Für den Anfang reicht es, wenn ihr euch erstmal für eine einzige entscheidet, wie ihr die Stimmen wechseln könnt, zeige ich später.
text2pho (http://www.ikp.uni-bonn.de/dt/forsch/phonetik/hadifix/txt2pho.zip)
bplay (das gibt es z.B. hier http://www.amberdata.demon.co.uk/bplay/bplay-0.991.tar.gz) Dieser Link funktioniert nicht!
aplay (Soundausgabe über alsa, als Alternative zu bplay, ist heute überall dabei)
Und jetzt installieren...
Wenn alles runtergeladen ist, geht's ans installieren. Als erstes wird bplay installiert:
tar xvfz bplay-0.991.tar.gz cd bplay-0.991 make su -c "cp bplay /usr/local/bin"
Und schon ist bplay verfügbar. Weiter gehts mit dem MBROLA binary:
unzip mbr301h.zip su -c "mv mbrola-linux-i386 /usr/local/bin"
Ein Script erwartet den Filenamen "mbrola", deshalb fehlt noch ein
ln -s /usr/local/bin/mbrola-linux-i386 /usr/local/bin/mbrola
(Den restlichen entpackten Datenmüll kann man natürlich löschen, genauso wie bei bplay...)
Nun wäre auch MBROLA bereit. Jetzt noch text2pho:
unzip txt2pho.zip cd txt2pho tar xvfz numfilt-0.1.tar.gz su -c "mv txt2pho /usr/local/bin" cd numfilt-0.1 gcc -o numfilt numfilt.c su -c "mv numfilt /usr/local/bin"
Jetzt sollte man ein Verzeichnis erstellen, in dem das ganze letztendlich liegen soll. Ich nehme dazu "/usr/local/txt2speech":
su -c "mkdir /usr/local/txt2speech"
Dann noch die restlichen Daten von txt2pho ins Verzeichnis legen:
su -c "cp -r data/ /usr/local/txt2speech"
Jetzt wechselt nochmal ins Verzeichnis wo ihr die Sprachdateien abgelegt habt. Dann packen wir jetzt noch die Stimme in das Verzeichnis und entpacken sie gleich.
su -c "cp de2-990106.zip /usr/local/txt2speech" cd /usr/local/txt2speech/ su -c "unzip de2-990106.zip"
Dann machen wir das noch alles für die Anwender verfügbar:
su -c "chmod -R o+rx /usr/local/txt2speech"
Das war es schon mit der Installation.
Konfiguration
.txt2phorc
Diese Dateien sollte jetzt in eurem Homedirectory verfügbar sein. Öffnet diese Datei und verändert folgende Zeilen:
- DATAPATH=/home/tpo/txt2pho_data/
Ändern in:
- DATAPATH=/usr/local/txt2speech/data/
Dann
- INVPATH=/home/tpo/txt2pho_data/
Ändern in:
- INVPATH=/usr/local/txt2speech/data/
Was ihr jetzt noch braucht, sind zwei Skripte die euch die Benutzung erleichtern sollen.
Soundausgabe mit ALSA
Bei Einsatz von aplay muss das Skript txt2speech.sh noch geändert werden: Statt bplay -b 16 -s 22050 schreibt ihr aplay -r 22050 -f S16_LE.
Wenn ihr die Stimme tauschen wollt, müsst ihr die Datei txt2speech.sh bei folgender Zeile ändern:
- VOICE=de2
Gebt statt "de2" die Stimme an, die ihr runtergeladen habt. Die Stimme muss natürlich dann auch im Verzeichnis "/usr/local/txt2speech/" im entsprechenden Unterverzeichnis sein. Also z.B. wenn ihr Stimme "de3" runtergeladen und entpackt habt, dann müsste die Stimme in "/usr/local/txt2speech/de3/" als "de3" vorhanden sein. Und in der Datei "txt2speech" müsst ihr statt
- VOICE=de2
dann
- VOICE=de3
eintragen.
Man muss auch noch die Datei "/usr/local/txt2speech/data/hadifix.cfg" ändern. Und zwar gibt man bei den ersten beiden Einträgen als Pfad folgendes an:
- /usr/local/txt2speech/data/
Jetzt kopiert noch die beiden Skripte nach "/usr/local/bin" damit sie für alle User verfügbar sind:
su -c "mv say /usr/local/bin && mv txt2speech.sh /usr/local/bin"
Und macht sie ausführbar:
su -c "chmod +x /usr/local/bin/say && chmod +x /usr/local/bin/txt2speech.sh"
- Kleine Anmerkung:
- In Zeile 8 ist das -m Flag beim Aufruf von txt2pho gesetzt. Das sollte man wegnehmen sonst bekommt man Probleme bei weiblichen Sprechern.
-> numfilt | txt2pho | $MBROLA $DB - - | bplay -b 16 -s 22050 (NikolaiH)
- In Zeile 8 ist das -m Flag beim Aufruf von txt2pho gesetzt. Das sollte man wegnehmen sonst bekommt man Probleme bei weiblichen Sprechern.
Nun gebt folgendes ein:
say "Ich habe alles kapiert und richtig gemacht"
Wenn ihr den Satz verstanden habt, dann stimmt das auch.
Ich weiss, dass dieser Text nicht perfekt ist, aber er sollte ja auch nur seinen Zweck erfüllen und auch nicht mehr sein, als eine kleine Richtlinie. Wenn ihr trotzdem Anregungen, Kritik oder Fragen loswerden wollt, dann bitte an RolandHeimpoldinger.
Anwendungsbeispiele
Fortune Sprüche
- fortune | speak mit folgendem script speak:
if [ x"$#" = x"0" ]; then file=/dev/stdin else file=${1} fi cat $file | sed 's/@/ ät /g' | pipefilt | numfilt | preproc /usr/local/Sprachsynthese/txt2pho/preproc/Rules.lst \ /usr/local/Sprachsynthese/txt2pho/preproc/Hadifix.abk | \ txt2pho -m | mbrola -f 0.8 -t1 -l 15000 /usr/local/Sprachsynthese/mbrola/voice/de2/de2 - -.au | \ play - -t au
X-Chat
Licq
In den Optionen unter Ereignisse bei
[x] Ereignis-Kommandos aktivieren Befehl: say
Jetzt kann man bei Nachricht zb reinschreiben: 'Nachricht von %a'
Die Nachrichten kann man sich afaik nicht vorlesen lassen, ich hab keine Variable für den Nachrichtentext gefunden.
micq
Bei micq dagegen kann man sich die Nachrichten einwandfrei vorlesen lassen. micq kann man nämlich so einstellen, dass es bei jedem 'event' ein eventscript ausführt. Dazu sucht man in der ~/.micq/micqrc die Optionen 'sound' und 'event' und ändert sie etwa wie folgt:
sound event event /home/yourhomedir/.micq/eventscript
Nun kann man die Datei /home/yourhomedir/.micq/eventscript etwa wie folgt aussehen lassen:
# to prevent "*" in messages from being transformed # to a list of files in the current working directory mkdir -p /tmp/emptydir31415/ cd /tmp/emptydir31415/ # for debugging purposes echo "eventscript $*" >> $HOME/.micq/eventscript.log case $5 in "msg") #/usr/bin/bplay /usr/sounds/Message.wav &> /dev/null; # transform micqs encoding to Latin-I # alternatively: echo ... | iconv -f UTF-8 -t US-ASCII//TRANSLIT | say ... echo "$3 sagt: $7" \ | sed -e 's/ä/ä/g' \ | sed -e 's/ü/ü/g' \ | sed -e 's/ö/ö/g' \ | sed -e 's/ß/ß/g' \ | say - &;; "on") /usr/bin/bplay /usr/sounds/Global.wav &> /dev/null; # transform micqs encoding to Latin-I # alternatively: echo ... | iconv -f UTF-8 -t US-ASCII//TRANSLIT | say .... echo "$3 ist online." \ | sed -e 's/ä/ä/g' \ | sed -e 's/ü/ü/g' \ | sed -e 's/ö/ö/g' \ | sed -e 's/ß/ß/g' \ | say - & esac
Dann noch ausführbar machen:
chmod u+x /home/yourhomedir/.micq/eventscript
Die Datei /usr/sounds/Global.wav kann dabei der Sound sein, der beim Original-icq dabei ist. Die Ausführungen von 'sed' ersetzen Umlaute so, dass sie vorgelesen werden können (die encodings von micq und 'say' sind unterschiedlich). Grossgeschriebene Umlaute werden nicht ersetzt, dies kann aber kanonisch erweitert werden.
Fragen
- Bei mir taucht .txt2pho im Homedirectory nicht auf? Wer kann mir helfen?
- Eine Beispiel txt2phorc findet sich im txt2pho Verzeichnis. Einfach diese nehmen und ins home- oder global ins etc-Verzeichnis kopieren. (NikolaiH)
Probleme
- Ich habe Probleme mit der englischen Sprachausgabe! Es kommen bei allen verfügbaren englischen (egal ob UK oder US) Sprachdateien die selben Fehler.
Fatal error: Unkown recovery for l-o: segment
- Dies ist die Ausgabe beim Aufruf von "say Hello". MROLA hat mit den englischen Sprachpaketen wahrscheinlich Probleme mit Konsonanten und den darauffolgenden Buchstaben. Die deutsche Stimme funktioniert ohne Probleme. Wer hat die englsiche Stimme zum Laufen gebracht oder die selben Probleme gehabt?
Beitragende: RolandHeimpoldinger