Mbrola
Aus Gentoo Linux Wiki
| Installationsmethoden • LiveCDs • Kernel & Hardware • Laptops & Notebooks • Portage • System • Netzwerke & Services • X • Software • Anderes • alphabetischer HOWTO Index |
Inhaltsverzeichnis |
[Bearbeiten] Einleitung
Wir wollen hier einmal besprechen, wie wir unser Gentoo mit uns deutsch sprechen lassen.
Wenn wir mit diesem Artikel durch sind, kannst Du direkt auf der Console zum Beispiel sowas machen:
echo "Hallo Computer. Sag was." | say
und unser Computer wird uns diese Worte durch die Lautsprecher auf deutsch entgegenschmettern.
Am Ende des Artikels findet Ihr dann noch weiterführende Links, zum Beispiel zu meinem irssi-script "talk.pl", welches genau diese Technik benutzt, um Dir die Msgs aus irssi vorzulesen.
Nun, fangen wir an...
[Bearbeiten] Was wir brauchen
Zuallererst brauchen wir ein wenig Software. Wir haben hier zwei unterschiedliche Arten von Software. Software, die wir direkt emergen, und Software, die wir uns herunterladen müssen und von Hand installieren müssen. Wenden wir uns zuerst der einfacheren Variante zu.
Bitte merge nun erstmal folgendes Paket, falls nicht schon installiert:
* sox
...indem Du folgende Zeile in ein terminal als root eingibst:
emerge -av sox
Nun kommen wir zum zweiten Teil der Software. Legt dazu bitte zuerst als root ein neues Verzeichnis an:
mkdir -p /usr/local/mbrola/sources
[Bearbeiten] Die Installation
Lade Dir nun das mbrola-binary und eines oder alle 8 verschiedenen, deutschen Sprachfiles, empfehlen kann ich die weibliche Stimme "de3".
Der Grund wieso wir mbrola downloaden und manuell entpacken ist der, weil wir nur das eine, kleine binary brauchen und nicht das ganze 24 MB-Paket. Und schon gar nicht auch noch festival, welches als Abhängigkeit mitinstalliert werden würde.
cd /usr/local/mbrola/sources wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de1/de1-980227.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de2/de2-990106.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de3/de3-000307.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de4/de4.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de5/de5.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de6/de6.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de7/de7.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de8/de8.zip
Falls der Server nicht erreichbar sein sollte, kann man diesen Mirror verwenden (de7 und de8 sind nicht drauf):
wget http://festvox.org/mbrola/bin/pclinux/mbr301h.zip wget http://festvox.org/mbrola/dba/de1/de1-980227.zip wget http://festvox.org/mbrola/dba/de2/de2-990106.zip wget http://festvox.org/mbrola/dba/de3/de3-000307.zip wget http://festvox.org/mbrola/dba/de4/de4.zip wget http://festvox.org/mbrola/dba/de5/de5.zip wget http://festvox.org/mbrola/dba/de6/de6.zip
Jetzt müssen wir zuerst mbrola entpacken:
unzip mbr301h.zip
...und dann das binary "mbrola-linux-i386" nach /usr/local/mbrola/mbrola kopieren:
cp ./mbrola-linux-i386 ../mbrola
Entpacke nun eines, oder alle der Sprachdateien:
unzip de2-990106.zip -d /usr/local/mbrola/ unzip de3-000307.zip -d /usr/local/mbrola/
Achte dabei darauf, dass in /usr/local/mbrola die Sprachverzeichnisse angelegt werden und diese wiederrum die Sprachdateien enthalten (einige Sprachdateien enthalten nämlich nicht die korrekte Verzeichnisstruktur)
Nun benötigen wir noch das kleine, aber äußerst nützliche Progrämmchen "txt2pho":
wget http://www.ikp.uni-bonn.de/dt/forsch/phonetik/hadifix/txt2pho.zip
Entpacke es:
unzip txt2pho.zip
Es wird ein neues Verzeichnis angelegt. Verschiebe zuerst die Datei txt2phorc nach /etc:
mv txt2pho/txt2phorc /etc/txt2pho
Dann öffne die Datei "/etc/txt2pho" in Deinem editor:
nano -w /etc/txt2pho
...und editiere folgende Variablen, sodass sie wie unten aussehen:
DATAPATH=/usr/local/mbrola/data/ INVPATH=/usr/local/mbrola/data/
Achte darauf, dass die Pfade mit / enden und nicht in "" eingeschlossen sind!
Wechsle in das Verzeichnis /usr/local/mbrola/sources/txt2pho und kopiere einige benötigten Dateien und ein Verzeichnis nach /usr/local/mbrola:
cd txt2pho cp -r data /usr/local/mbrola/ cp txt2pho /usr/local/mbrola/ chmod 755 /usr/local/mbrola/txt2pho
Es sind jetzt noch zwei weitere, kleine Programme notwendig, die sich aber beide schon im Verzeichnis txt2pho befinden und von diesem mitgebracht wurden: Immernoch im /usr/local/mbrola/sources/txt2pho-Verzeichnis:
cd pipefilt/ g++ pipefilt.cc -o pipefilt cp pipefilt /usr/local/mbrola/
Nun muss noch noch preproc, welches im Verzeichnis ../preproc/ liegt, kompiliert werden:
cd ../preproc/ make
Kopiere die binary und die anderen benötigten Dateien noch nach /usr/local/mbrola:
cp preproc /usr/local/mbrola/ cp Rules.lst /usr/local/mbrola/ cp Hadifix.abk /usr/local/mbrola/
Es fehlt uns nun nur noch ein kleines bash-script, das es uns ermöglicht, in der Einleitung beschriebene Befehlszeile auszuführen. Ein Script also, das eine Text-Ausgabe in einer Pipe entgegen nimmt, die Sprachinformationen durch mbrola und zugehörige Programme laufen lässt und alles über die Soundkarte ausgibt.
Fuere einfach folgendes aus, wenn die Konsole nicht auf Unicode eingestellt ist: (neu: jetzt kann man "say -u [<filename>] verwenden, um UTF-8 Text zu sprechen. Dazu muss recode installiert sein.)
cat > /usr/local/mbrola/say << "EOF" #!/bin/bash ROOT=/usr/local/mbrola # Where are the needed files? VOICE=$ROOT/de3/de3 # Path to the mbrola-voice SEX=f # m/f Which sex has your voice? if [ "$1" = "-u" ]; then conversion="| recode UTF-8..lat1" file=$2 else conversion="" file=$1 fi eval "cat $file $conversion |\ sed 's/@/ ät /g' |\ $ROOT/pipefilt |\ $ROOT/preproc $ROOT/Rules.lst $ROOT/Hadifix.abk |\ $ROOT/txt2pho -$SEX -p $ROOT/data/ |\ $ROOT/mbrola $VOICE - -.au |\ play -t au -" EOF
Falls die Konsole auf Unicode eingestellt ist, benutze stattdessen folgenden Befehl, damit die Umlaute richtig ausgesprochen werden:
cat > /usr/local/mbrola/say << "EOF" #!/bin/bash ROOT=/usr/local/mbrola # Where are the needed files? VOICE=$ROOT/de3/de3 # Path to the mbrola-voice SEX=f # m/f Which sex has your voice? eval "cat $file | recode UTF-8..Latin-1 |\ sed 's/@/ ät /g' |\ $ROOT/pipefilt |\ $ROOT/preproc $ROOT/Rules.lst $ROOT/Hadifix.abk |\ $ROOT/txt2pho -$SEX -p $ROOT/data/ |\ $ROOT/mbrola $VOICE - -.au |\ play -t au -" EOF
Optional: Um Textrückmeldungen des Befehls "play" in der Konsole zu unterdrücken, kann in der letzten Zeile des Scripts die Option "--silent" hinzugefügt werden. Das hat z.B. Sinn, wenn ein weiteres Script auf das "say"-Script zugreift. Die letzte Zeile des Scripts sieht dann nach dem Editieren so aus:
play -t au --silent -"
Falls die --silent Option nicht geht, probiere:
play -q -t au -"
Mach das Script noch ausführbar und lege einen Symlink nach /usr/local/bin:
chmod 755 /usr/local/mbrola/say ln -s /usr/local/mbrola/say /usr/local/bin/
[Bearbeiten] Finish!
So. Logge Dich nun als normaler User wieder ein, dreh' deine Lautsprecher auf, unmute den Ausgang und tippe dann folgende Zeile in dein Terminal:
echo "Hallo Computer. Sag was." | say
...und erfreue Dich an der Sprachausgabe! :)
...und wer es noch komfortabler will, kopiert einfach folgendes Script in eine neue Datei "/usr/local/mbrola/sayit":
#!/bin/bash #by vago # if [ "$*" = "" ]; then echo "usage: sayit Hello World " exit 1 else echo $* | say fi
Mach das Script noch ausführbar und lege einen Symlink nach /usr/local/bin:
chmod 755 /usr/local/mbrola/sayit ln -s /usr/local/mbrola/sayit /usr/local/bin/
nun reicht:
sayit Hallo
Bei beiden vorherigen Varianten muss dem "zu sagenden Text" jedes Mal ein Kommando vorangestellt werden.
Wer gerne einfach nur Text in die Konsole tippen und ihn per Eingabetaste anhören möchte, kann hierzu ein weiteres kleines Script erstellen (das Script "say" muss vorhanden sein).
Einfach eine leere Textdatei "/usr/local/mbrola/speak" erstellen und den folgenden Code dort einfügen:
#!/bin/sh #file: /usr/local/mbrola/speak #endless saying - by deft #this script needs the "say"-script to run. #it can be found at http://de.gentoo-wiki.com/Mbrola echo echo "Please enter the words and press <RETURN> to let me say them." echo "Press <RETURN> without entering anything exits this script." echo while :; do read text if [ "$text" = "" ]; then break else echo $text | say fi done exit
Diese Datei z.B mit
chmod +x /usr/local/mbrola/speak
ausführbar machen und einen SymLink erstellen:
ln -s /usr/local/mbrola/speak /usr/local/bin/
Das Script wird gestartet, in dem man in eine Konsole
speak
eingibt. Es erscheint folgende Ausgabe - die sich selbst erklärt:
Please enter the words and press <RETURN> to let me say them. Press <RETURN> without entering anything exits this script.
Die Variation "speak" ist im folgenden Installationsscript nicht enthalten.
[Bearbeiten] Vereinfachte Installation per Script
Alternativ kann zur Installation ein Script benutzt werden, der Einfachheit halber habe ich es einfach hier her gestellt:
#!/bin/sh emerge -av sox mkdir -p /usr/local/mbrola/sources cd /usr/local/mbrola/sources wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de1/de1-980227.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de2/de2-990106.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de3/de3-000307.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de4/de4.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de5/de5.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de6/de6.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de7/de7.zip wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/de8/de8.zip wget http://www.ikp.uni-bonn.de/dt/forsch/phonetik/hadifix/txt2pho.zip unzip mbr301h.zip unzip de2-990106.zip -d /usr/local/mbrola/ unzip de3-000307.zip -d /usr/local/mbrola/ unzip txt2pho.zip cp ./mbrola-linux-i386 ../mbrola sed -e 's/DATAPATH=\/home\/tpo\/txt2pho\/data\//DATAPATH=\/usr\/local\/mbrola\/data\//' \ -e 's/INVPATH=\/home\/tpo\/txt2pho\/data\//INVPATH=\/usr\/local\/mbrola\/data\//'\ <txt2pho/txt2phorc >/etc/txt2pho cd /usr/local/mbrola/sources/txt2pho cp -r data /usr/local/mbrola/ cp txt2pho /usr/local/mbrola/ chmod 755 /usr/local/mbrola/txt2pho cd pipefilt/ g++ pipefilt.cc -o pipefilt cp pipefilt /usr/local/mbrola/ cd ../preproc/ make cp preproc /usr/local/mbrola/ cp Rules.lst /usr/local/mbrola/ cp Hadifix.abk /usr/local/mbrola/ cat > /usr/local/mbrola/say << "EOF" #!/bin/bash ROOT=/usr/local/mbrola # Where are the needed files? VOICE=$ROOT/de3/de3 # Path to the mbrola-voice SEX=f # m/f Which sex has your voice? if [ "$1" = "-u" ]; then conversion="| recode UTF-8..lat1" file=$2 else conversion="" file=$1 fi eval "cat $file $conversion |\ sed 's/@/ ät /g' |\ $ROOT/pipefilt |\ $ROOT/preproc $ROOT/Rules.lst $ROOT/Hadifix.abk |\ $ROOT/txt2pho -$SEX -p $ROOT/data/ |\ $ROOT/mbrola -f 1.5 $VOICE - -.au |\ play -t au -" EOF cat > /usr/local/mbrola/sayit << "EOF" #!/bin/bash #by vago # if [ "$*" = "" ]; then echo "usage: sayit Hello World " exit 1 else echo $* | say fi EOF chmod 755 /usr/local/mbrola/sayit chmod 755 /usr/local/mbrola/say ln -s /usr/local/mbrola/say /usr/local/bin/ ln -s /usr/local/mbrola/say /usr/bin/ ln -s /usr/local/mbrola/sayit /usr/local/bin/ echo "Hallo Computer. Sag was." | say sayit rofl
ich habe das Script unter inst_mbrola.sh abgelegt, anfolgend mit chmod + inst_mbrola.sh ausführbar gemacht und per ./inst_mbrola.sh gestartet.
es lief im Test ohne Problem (unicode-free)
[Bearbeiten] XChat kann sprechen!
Das Script für XChat findest Du hier: http://xchat-speech.sourceforge.net/
Allerdings ist da noch etwas Handarbeit notwendig. Öffne das script in Deinem Editor und scrolle bis Zeile 135
system("bash -c \"/usr/bin/say $textfile ; rm $textfile\" &");
Diese Zeile änderst Du so ab, das Sie so aussieht:
system("bash -c \"cat $textfile | say ; rm $textfile\" &");
Dann nur noch in Dein ~/.xchat2-Verzeichnis kopieren und in xchat mit folgendem Befehl laden:
/LOAD .xchat2/speech.pl
Wie Du es dann benutzt, steht alles hier: http://xchat-speech.sourceforge.net/
[Bearbeiten] irssi kann auch sprechen!
Für irssi habe ich selbst ein Script geschrieben, das man hier findet: http://dma147.linux-stats.org/?s=irssi
[Bearbeiten] Ja, und kvirc auch!
Das Skript für Kvirc findest du hier: http://www.slackrocks.de/linux/kvirc/Kvirc-speech.tar.bz2
Nachdem du das Skript mit tar xjvf Kvirc-speech.tar.bz2 ausgepackt hast, kannst du es laden, in dem du folgendes in die Texteingabe eingibt:
/parse <Verzeichnis_wo_das_Archiv_entpackt_worden_ist>/kvirc_speech_script/install.kvs
Das installiert die Grundfunktionen. Jetzt hast du folgende Befehle zur Verfügung:
| speech_all | Spricht alles aus diesen Channel, inklusive Highlights und Querys. |
| speech_channel | Spricht nur Messages aus diesen Channel. |
| speech_highlight | Spricht nur bei Highlight. |
| speech_query | Spricht nur Querys. |
| speech_action | Spricht nur bei Action andere User in diesen Channel. |
| speech_join | Spricht nur bei Joins andere User in diesen Channel. (Ich halte es für überflüssig alle Joins ausgeben zu lassen, da man das über die Highlightfunktion wesentlich eleganter lösen kann.) |
| speech_off | Schaltet alle Speechfuntionen aus. |
| speech_nochannel | Schaltet die Channel Mesages aus. |
| speech_nohighlight | Schaltet die Highlight Sprachausgabe aus. |
| speech_nojoin | Schaltet die Sprachausgabe bei Joins aus. |
| speech_noaction | Man kriegt keine Action mehr zu hören. |
| speech_noquery | Die Querys bleiben Stumm. |
In dem Verzeichnis befindet sich ein noch install_menus.kvs. Die Menüs sind extra, da sie einen eventuell schon vorhandene angepasste Menüs überschreiben. Wenn du ein Menü integrieren möchte, brauchst du einfach nur in
Scripte -> Aufklappmenüs bearbeiten...
die von der vorherigen Installation vorhandene speechcfg integrieren. Wenn dir das zu Aufwendig ist, installiere einfach das Script.
/parse <Verzeichnis_wo_das_Archiv_entpackt_worden_ist>/kvirc_speech_script/install_menus.kvs
[Bearbeiten] Und Asterisk kanns auch
Auch die Telefonanlage Asterisk kann mit dieser Lösung kombiniert werden. Das Script dazu sieht wie folgt aus:
#!/bin/bash ROOT=/usr/local/mbrola VOICE=$ROOT/de3/de3 SEX=f eval "echo \$* |\ sed 's/@/ ät /g' |\ $ROOT/pipefilt |\ $ROOT/preproc $ROOT/Rules.lst $ROOT/Hadifix.abk |\ $ROOT/txt2pho -$SEX -p $ROOT/data/ |\ $ROOT/mbrola $VOICE - -.au > /tmp/asterisk.au sox /tmp/asterisk.au -r 8000 -c 1 /var/lib/asterisk/sounds/tts.gsm rm /tmp/asterisk.au"
Ein entsprechender Aufruf sähe so aus:
exten => _X.,1,system(/usr/local/bin/sayasterisk \'Drücke die 1 umdies zu tun oder 2 um das zu tun\') exten => _X.,1,Playback(tts)
[Bearbeiten] ESD statt direkten ALSA-Output verwenden
Wer den ESD benutzen will, muss in "/usr/local/mbrola/say" die Zeile
aplay -t au -"
durch
sox -r 44100 -t au - -t raw - |\ esdcat -r 11025"
ersetzen.
[Bearbeiten] Troubleshooting
Wenn Du eine Meldung bekommst, wie:
_-h Concat : PANIC, check your pitch :-)
Dann kopiere als normaler User die /etc/txt2pho nach ~/.txt2phorc:
cp /etc/txt2pho ~/.txt2phorc
Sollte der Fehler immer noch nicht behoben sein, ist die .txt2phorc-Datei nicht korrekt. Das kann entweder ein Syntaxfehler oder ein falscher Path sein. Den führenden Punkt vor txt2phorc im Home-Verzeichnis nicht vergessen, wenn ihr die Datei aus dem Archiv (txt2pho.zip) kopiert!
INVPATH soll nicht auf die mbrola-Stimmen verweisen, sondern auf dasselbe Verzeichnis wie DATAPATH. In diesem Verzeichnis sollten Dateien wie de1.mdp, kons.par und male.dur liegen.
-- Ich glaube bei INPATH in der ~/txt2pho muss "/usr/local/mbrola/sources/txt2pho/data/" eingetragen werden.
---
Wenn du Fehler bekommst wie:
sox: invalid option -- -
Dann liegt das an dem play-Befehl im say-Script. Probiere als letzte Zeile statt dessen:
play -q --type=au -"
[Bearbeiten] Links
Auf http://www.klein-alexander.net ist es möglich sich sämtliche Texte online ohne Zusatzsoftware vorlesen zu lassen.
Eine Online-Umsetzung dieser Howto kann unter http://www.deruwe.de/sprich.html bestaunt werden.
Ebuilds sind hier veröffentlich worden: http://bugs.gentoo.org/show_bug.cgi?id=60262
Eine Oberfläche, geschrieben in Python, findet man hier: http://blog.fwaechter.ch/?p=7
[Bearbeiten] Festival
Irgendwie wäre es auch möglich das ganze mit dem Festival Ebuild zu machen. Jedoch ist leider nirgendwo (bisher) beschrieben, wie man dem festival ebuild die deutschen mbrola hinzufügt. Wäre doch eine Idee ;)
Geht einfach: http://www.cstr.ed.ac.uk/projects/festival/mbrola.html sagt:
The voice itself then needs to be installed in the directory created by installing its festival wrapper. for the us1 voice this is [festival_install_dir]/festival/lib/voices/english/us1_mbrola, unzip the voice zipfile inside this directory. Hopefully that should be it. Run festival and type: (voice_us1_mbrola) to select the new voice.
written by Benutzer:Dma147, additions by tiktak
