Mbrola

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung.
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_allSpricht alles aus diesen Channel, inklusive Highlights und Querys.
speech_channelSpricht nur Messages aus diesen Channel.
speech_highlightSpricht nur bei Highlight.
speech_querySpricht nur Querys.
speech_actionSpricht nur bei Action andere User in diesen Channel.
speech_joinSpricht 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_offSchaltet alle Speechfuntionen aus.
speech_nochannelSchaltet die Channel Mesages aus.
speech_nohighlightSchaltet die Highlight Sprachausgabe aus.
speech_nojoinSchaltet die Sprachausgabe bei Joins aus.
speech_noactionMan kriegt keine Action mehr zu hören.
speech_noqueryDie 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

'Persönliche Werkzeuge