mbrola.gif

Lesestunde

MBROLA

01.04.2002
Es heißt, Lesen bildet. Doch nicht alles muss unbedingt selbst gelesen werden. Oftmals genügt es schon, wenn Information aus dem "Mund" eines Sprachsynthesizers auf ein Ohrenpaar trifft.

Sie besprechen Ihren Anrufbeantworter nur widerwillig mit einem neuen Spruch? Kein Problem, lassen Sie einfach Ihren Computer ein gutes Wort für Sie einlegen. Sie möchten sich Ihre elektronische Post lieber einmal vorlesen lassen, so dass Sie zugleich nebenan Tee kochen können? Vielleicht hätten Sie auch gern eine akustische Bestätigung, wenn Ihr Rechner erfolgreich den On- bzw. Offline-Modus erreicht? Mit einem Sprachsynthesizer ist all dies und noch viel mehr möglich.

Babel

Doch ganz so trivial ist diese Aufgabe nicht: Man denke nur an die Folgen der babylonischen Sprachverwirrung (Gen 11,9): Während der Engländer zur Buchstabenfolge "new" in etwa "nju" sagt, spricht sie ein Deutscher gänzlich anders, nämlich Buchstabe für Buchstabe aus. Auch senkt der Insulaner am Ende einer Frage seine Stimmfrequenz, während hierzulande die Stimme angehoben wird. Will man also ein sprechendes Programm erstellen, so muss es recht umfangreiche Informationen abhängig von der zu verwendenden Sprache erhalten.

Für echte Linuxer kommt eine weitere Anforderung hinzu: Das Ganze sollte kostenlos erhältlich und ebenso legal einzusetzen sein. Hervorgetan hat sich auf diesem Sektor bislang ein Projekt: der Sprachsynthesizer MBROLA [1]. Es ist zwar nicht frei (im Sinne von Open Source und GPL) erhältlich, aber doch immerhin für Privatpersonen frei von Kosten oder Beschränkungen verfügbar.

Arbeitsteilung

Das TCTS Lab der Faculté Polytechnique de Mons in Belgien bemühte sich, bei der Umsetzung Nägel mit Köpfen zu machen: MBROLA ist Teil eines modular aufgebauten und ausgeklügelten Baukastens, mit dem praktisch alle Anforderungen rund um die synthetische Stimme erfüllt werden können. Wer tief in die Materie einsteigt, kann seinen Rechner beispielsweise selbst Lieder trällern lassen. Allerdings verlangen zunehmende Funktionalität und Modularität auch mehr und mehr Entscheidungen von Seiten des Users, was – typisch für Unix-Software – oftmals in (scheinbar) kryptischer Bedienung mündet.

Macht man sich jedoch einmal die Mühe, den Aufbau einer solchen Befehlsfolge zu verstehen, scheint sie am Ende doch wieder ganz simpel. Und so nähern wir uns in diesem Artikel schrittweise unserem Ziel. Grundvoraussetzung ist eine fix und fertig eingebundene Soundkarte, über die erfolgreich Sound-Dateien ausgegeben werden können.

Ein weiter Weg

Haben Sie Ihre Soundkarte bereits einsatzbereit, so muss Ihr zu lesender Text zunächst der jeweiligen Sprache entsprechend in Diphone umgesetzt werden: So wird im Deutschen z. B. aus der Buchstabenfolge "sch" ein eigenständiger "Buchstabe" (Laut). Zwei "s" sind klanglich etwas anderes als ein einsames "s", während zwei "a" den Laut nicht wie das gedoppelte "s" verkürzen, sondern sogar verlängern.

Von all diesen sprachspezifischen Besonderheiten weiß MBROLA allerdings nichts. Stattdessen schaltet man ein TTS-("text to speech"-)Tool [4] vor, das dem Synthesizer lediglich die phonematisch relevanten Informationen inklusive Betonung mitteilt (z. B. wann die Stimmlage abhängig vom Satzbau angehoben oder abgesenkt wird). Deutschsprachige MBROLA-User nutzen dazu txt2pho [2]. Dieses Werkzeug setzt Text in eine Zwischensprache um, die MBROLA dann (sprachunabhängig) in Töne und Frequenzen verwandelt.

Die müssen noch ausgegeben werden, und dazu braucht MBROLA eine von Ihnen ausgewählte und zum TTS-Werkzeug passende Stimme [3] (die mit txt2pho verwendete sollte also deutsch sein). Diese kann von MBROLA und txt2pho über Aufrufparameter beeinflusst werden. Statt das Ergebnis über Lautsprecher auszugeben, lässt es sich in Dateien schreiben (die Sie nochmals nachbearbeiten können) oder aber per Pipe an nachfolgende Anwendungen weiterleiten.

Gepäck

Die Installation der benötigten Pakete gestaltet sich recht einfach, und da es sich nicht um Open-Source-Programme handelt, kommt Kompilieren gar nicht in Frage. Statt dessen bekommen Sie fertig gepackte Pakete, die Sie dafür aber noch händisch installieren müssen.

Zunächst ist es ratsam, den MBROLA-Tools ein eigenes Verzeichnis zu spendieren. Benötigt werden minimal etwa 15 MB Plattenplatz (eine einzige Stimme) bis zu etwa 36 MB für alle drei verfügbaren deutschen Stimmen. Prädestinierter Aufbewahrungsort für distributionsfremde Software ist der Verzeichniszweig /usr/local, so dass Sie dort auch Ihr MBROLA-Verzeichnis einrichten sollten. Alle Installationsarbeiten müssen vom User root erledigt werden:

mkdir /usr/local/mbrola

Die dort zu installierenden Pakete (MBROLA, txt2pho und die Stimmdateien) haben zudem die unangenehme Eigenschaft, als zip-Datei – und nicht als unter Linux übliches tar-Archiv – aufzutreten, so dass Sie zum Entpacken unzip installiert haben müssen. Ein Blick in Ihre Distributions-CDs sollte dieses herbeizaubern, sofern es Ihre Festplatte nicht längst für Sie parat hält. Dann geht es ans Entpacken der Pakete:

unzip -d /usr/local/mbrola/ mbr301h.zip
unzip -d /usr/local/mbrola/ txt2pho.zip
unzip -d /usr/local/mbrola/ de1-980227.zip
unzip -d /usr/local/mbrola/ de2-990106.zip
unzip -d /usr/local/mbrola/ de3-000307.zip

Dabei entfallen ein bis zwei der letzten drei Schritte, wenn Sie nicht alle de-Stimmenpakete installieren. de1 ist eine weibliche Stimme mit einer Sampling-Rate von 16.000 Hz und mittelprächtiger Qualität, de2 ist männlich bei ebenfalls 16.000 Hz und de3 wieder weiblich, jedoch bei einer Sampling-Rate von 22.050 Hz von recht guter Qualität.

Nachhilfe

Die Stimmdateien werden in separaten Verzeichnissen gepackt geliefert, und so entsteht auch beim Entpacken für jede Stimme ein eigenes Directory. Gesucht werden sie später aber im sogenannten data-Verzeichnis von txt2pho, weshalb sich der Einsatz symbolischer Links anbietet. Hierbei verweist lediglich ein Verzeichniseintrag auf eine anderswo existierende Datei; das File ist somit doppelt verfügbar, aber nur einmal real auf der Festplatte vorhanden:

ln -s /usr/local/mbrola/de1/de1 /usr/local/mbrola/txt2pho/data/de1
ln -s /usr/local/mbrola/de2/de2 /usr/local/mbrola/txt2pho/data/de2
ln -s /usr/local/mbrola/de3/de3 /usr/local/mbrola/txt2pho/data/de3

Nun ist eigentlich alles Nötige vorhanden. Doch ist es etwas mühselig, die Programme immer mit kompletter Pfadangabe aufzurufen. Daher erstellen Sie für diese am besten noch ein paar weitere Symlinks in /usr/local/bin, einem Verzeichnis, das sicherlich bereits im Suchpfad enthalten ist (was sich mit echo $PATH überprüfen lässt):

ln -s /usr/local/mbrola/mbrola-linux-i386 /usr/local/bin/mbrola
ln -s /usr/local/mbrola/txt2pho/txt2pho /usr/local/bin/txt2pho
ln -s /usr/local/mbrola/txt2pho/pipefilt /usr/local/bin/pipefilt

Da das MBROLA-Paket diverse Programmdateien für verschiedene Rechnerarchitekturen beinhaltet, ist es wichtig, das zur PC-Architektur (i386) passende Binary mbrola-linux-i386 nach /usr/local/bin/mbrola zu verlinken.

Feinschliff

Doch noch immer fehlen ein paar Angaben: Im neu angelegten MBROLA-Verzeichnis /usr/local/mbrola finden Sie eine Beispiel-Konfigurationsdatei für das Tool txt2pho (.txt2phorc), die Sie nun als unprivilegierter User (root-Rechte werden fortan keine mehr benötigt) in Ihr Home-Verzeichnis kopieren sollten:

cp /usr/local/mbrola/.txt2phorc $HOME

Anschließend müssen Sie in dieser Datei die Pfadangaben entsprechend Ihrer Installation abändern. Für den hier geschilderten Fall gilt:

DATAPATH=/usr/local/mbrola/txt2pho/data/
INVPATH=/usr/local/mbrola/txt2pho/data/

Ihr TTS-System ist nun einsatzbereit. Die Stimmpakete liefern fertige Kostproben ihres Könnens in Form übersetzter pho-Dateien mit, so dass Sie MBROLA einem ersten Test unterziehen können. Dessen Aufruf folgt folgendem Muster:

mbrola stimmdatei pho-datei.pho ausgabe.wav

Die Ausgabe können Sie alternativ mit den Dateiendungen raw, au oder aiff versehen; je nachdem, welches Audioformat Sie bevorzugen. Um dem mitgelieferten Wetterbericht unter /usr/local/mbrola/de3/TEST/wetter.pho zu lauschen, wandeln Sie diese pho-Datei mit MBROLA in eine wav-Datei um, die sich wiederum zum Abspielen mit jedem Audioplayer (wie bplay [5] oder play aus dem sox-Paket) eignet:

jo@planet ~> mbrola /usr/local/mbrola/txt2pho/data/de3 /usr/local/mbrola/de3/TEST/wetter.pho wetter.wav
jo@planet ~> bplay wetter.wav
Playing WAVE : 16 bit, Speed 22050 Mono …

Stimmung

Fügen Sie dem mbrola-Aufruf die Option -v 0.5 hinzu, so erfolgt die Ausgabe in halber Lautstärke ("volume"). Der Defaultwert liegt bei 1; höhere Werte empfehlen sich nicht, da sie allzu leicht gängige und genormte Pegel der Analog-Audiotechnik überschreiten. Vielmehr ist dann der Griff zum Pegelregler oder Audiomixer gefragt.

Mit der Option -f 1.5 (für "Frequenz") wird die Stimme etwas heller und mit -f 0.5 dunkler. Ist es noch früh am Morgen, bekommen Sie Ihren Wetterbericht über -t 1.5 (für "time") in Mitmeißelgeschwindigkeit vorgetragen. Bei Termindruck hingegen macht ein -t 0.5 aus der Sprecherin eine wahre Zungenakrobatin.

Interessant ist an diesen Möglichkeiten, dass sie beim Abspielen von wav-Files nicht mehr bestehen: Verlangsamen Sie das Abspielen einer wav-Datei, so sinken zwangsläufig die Stimmfrequenzen (Frequenzen werden einzig über die Zeit bestimmt). MBROLA behandelt Frequenz und Zeit unabhängig voneinander, da die Töne erst vom Synthesizer selber erzeugt werden. Sie können also die Stimmlage beibehalten, aber die Geschwindigkeit erhöhen.

Selbstverwirklichung

wetter.pho kennen Sie nun auswendig? Kein Problem, nehmen Sie eine E-Mail, und speichern Sie diese als einfache Textdatei ab (z. B. unter email.txt). txt2pho übersetzt sie Ihnen in eine pho-Datei, und diese können Sie wiederum an MBROLA verfüttern:

jo@planet ~> txt2pho -i email.txt -o email.pho
jo@planet ~> mbrola /usr/local/mbrola/txt2pho/data/de3 email.pho email.wav 
jo@planet ~> bplay email.wav
Playing WAVE : 16 bit, Speed 22050 Mono …

Neben den hier verwendeten txt2pho-Optionen -i (für "input") und -o (für "output") ist es ratsam, künftig immer die Option -f für weiblich ("female") bzw. -m für männlich ("male") mit anzugeben. Zwar sieht auch die Konfigurationsdatei ~/.txt2phorc eine solche Voreinstellung vor, doch Auswirkung hatte das Abändern der Datei in diesem Falle nicht – es blieb immer bei der weiblichen Besetzung. Per Kommandozeilenaufruf lässt sich dieser Mangel aber beheben.

Hingegen entfaltet der Eintrag SPEECHRATE in der Konfigurationsdatei tatsächlich seine korrekte Wirkung als Äquivalent zu MBROLAs Parameter -t: Er lässt die Sprechgeschwindigkeit frequenzunabhängig an- oder absteigen. Damit setzen Sie in ~/.txt2phorc einen Grundwert, von dem Sie noch immer durch den nachfolgenden MBROLA-Aufruf abweichen können.

Abkürzung

Das war dann auch schon alles, um MBROLA über txt2pho zu beschicken. Nur leider sind damit mehrere Schritte sowie das Erstellen einiger Dateien nötig, um eine Textdatei vernünftig zur Soundkarte zu schleusen. Viel zu umständlich für verwöhnte Linuxer, die es sich gerne möglichst einfach und bequem machen. Den Umweg über diverse Dateien spart man sich, wenn man aus der mehrzeiligen Befehlsfolge einen einzigen, langen Befehl bastelt, bei dem ein Werkzeug sein Ergebnis direkt dem nachfolgenden Tool weitervererbt.

Zu diesem Zweck sind txt2pho und MBROLA in der Lage, sowohl von der Standardeingabe (stdin) zu lesen, als auch auf die Standardausgabe (stdout) zu schreiben. Somit können sogenannte Pipelines für die Konversation der beteiligten Tools herangezogen werden. Hierbei werden die jeweiligen Kommandos in der Shell durch das Zeichen verbunden. Der Aufruf der einzelnen Befehle geschieht nun etwas anders – schließlich soll zwischendurch keine neue Datei mehr erstellt oder gelesen werden.

Pipeline

Wer txt2pho nicht über den Parameter -i mit einer ASCII-Textdatei füttern möchte, muss dafür sorgen, dass der zu lesende Text auf der Standardausgabe erscheint, beispielsweise mit dem Befehl echo Das ist ein Test! Über die Pipe nimmt txt2pho ihn als Eingabe entgegen:

echo Das ist ein Test! | txt2pho

Dessen Ausgabe sollte MBROLA lesen. Allerdings kann das Programm nicht wie txt2pho ohne Zutun von stdin lesen. Auch der Wunsch nach einer Ausgabe auf stdout muss ihm explizit mitgeteilt werden: Soll die Standardeingabe als Quelle bzw. die Standardausgabe als Ziel zum Einsatz kommen, setzt man statt eines Argument-Dateinamens jeweils einen einfachen Bindestrich (-) ein. Die Ausgabe könnte zwar über die entsprechende Device-Datei direkt auf die Soundkarte gehen, doch nicht immer ist dies ohne Zuhilfenahme spezieller Tools möglich. bplay kann von stdin lesen (nicht alle Soundplayer können dies) und ist somit als Ausgabe-Tool erste Wahl. Allerdings fehlen bplay dann einige Informationen, die in einer Audiodatei stünden: So sollten Sie sowohl die Sample-Rate (16000 bei de1 und de2, 22050 bei de3) als auch die Auflösung (16 Bit) mit angeben:

jo@planet ~> echo Das ist ein Test! | txt2pho -f | mbrola /usr/local/mbrola/txt2pho/data/de3 - - | bplay -s 22050 -b 16
Playing raw data : 16 bit, Speed 22050 Mono …

Verwertung

Haben Sie einmal die Einstellungen Ihrer Wahl gefunden, möchten Sie sich den obigen Einzeiler sicher nicht jedesmal aus den Fingern saugen. So bietet sich seine Verlagerung in ein kleines Skript namens txt2snd an, das einen String oder eine ASCII-Datei gesprochen an Ihre Schallwandler weiterreicht (Listing 1).

Listing 1

Was auf die Ohren – txt2snd

#!/bin/bash
if [ $# = 0 ]
then
  echo "Usage: `basename $0` -f [filename]
       `basename $0` -s \"Text, den Sie vorgelesen bekommen wollen\"
`basename $0` jagt ein Textargument oder den Inhalt einer Datei durch txt2pho
und mbrola und spielt die entsprechende Audioumsetzung mit bplay ab."
  exit 1
elif [ $1 = -f ]
then
  txt2pho -i $2 -f | mbrola /usr/local/mbrola/txt2pho/data/de3 - - \
  | bplay -s 22050 -b 16
elif [ $1 = -s ]
then
  echo $2 | txt2pho -f | mbrola /usr/local/mbrola/txt2pho/data/de3 - - \
  | bplay -s 22050 -b 16
fi
    @KE:

In der ersten Zeile eines Skriptes muss immer der zuständige Interpreter stehen – in diesem Fall wurde mit der Bash die Standard-Shell gängiger Linux-Distributionen gewählt, so dass es sich im Skript so wie in der gewohnten Shell walten und schalten lässt. Mit if-elif-(also "if-else if"-)Bedingungen überprüft es, ob und mit welchen Optionen es aufgerufen wird. Wurden keine überreicht, gibt echo einen Hilfetext aus. Hat der Benutzer jedoch die Option -f gesetzt, erwartet txt2snd eine Dateiangabe und lässt die Stimme den Dateiinhalt sprechen. Beim Schalter -s hingegen wird der nachfolgend übergebene Text akustisch dargeboten. Einfache Sprachmeldungen sind so sehr leicht in bestehende, bislang einzig optisch zu lösende Ausgaben integrierbar.

Komfort²

Noch schöner und komfortabler wird es, wenn man den Inhalt des cut buffer (dieser beinhaltet einen mit der Maus selektierten Text) auf Knopfdruck um die Ohren bekommt. Haben Sie den beliebten Window Manager Window Maker [6] auf Ihre Festplatte gepackt, so besitzen Sie auch das zugehörige Tool wxpaste. Alternativ finden Sie es als Einzelgänger auch auf der Heft-CD, sowohl im Quelltext als auch als fertig übersetztes Binary, das Sie nur noch nach /usr/local/bin/wxpaste kopieren müssen.

Dort angekommen schickt es bei jedem Aufruf alles von Ihnen mit der Maus Markierte nach stdout. Was dort landet, ist wie gesehen ein potenzieller Kandidat zur weiteren Verwertung durch MBROLA:

wxpaste | txt2pho -f | mbrola /usr/local/mbrola/txt2pho/data/de3 - - | bplay -s 22050 -b 16

Sobald Sie diesen Befehl (oder auch eine erneut hierfür angelegte Skriptdatei) in Ihrem Startmenü unterbringen oder als Icon ablegen, bekommen Sie den markierten Bereich einer Web-Seite auf Mausklick vorgelesen. In Abbildung 1 sehen Sie das Desktop Environment XFce [7], bei dem hierzu lediglich ein auserkorenes Plätzchen mit der rechten Maustaste angestoßen werden muss. Schon öffnet sich eine Dialogbox, in der Sie obigen Mammutbefehl bequem unterbringen. Noch ein passendes Icon auswählen, dem Kind einen Namen spendieren (hier select2snd), und fertig ist Ihr vollautomatischer Sprecher.

Abbildung 1: TTS integriert in die Toolbar von XFce

Leider wissen nicht alle Programmierer um die Vorzüge des X-Clipboards (das zwischen einfach selektiertem Text und mehreren Speichern, genannt (primary) selection, unterscheidet). Und so gibt es wenige Anwendungen, bei denen Sie zusätzlich zum Markieren mit der Maus aus dem Pulldown-Menü den Eintrag Copy wählen müssen, damit der Text auch im relevanten Teil des Clipboards landet. wxpaste kann sich seine Informationen allerdings auch aus jedem anderen Winkel der Zwischenablage holen, wie ein Blick in die Manpage oder der Aufruf wxpaste --help verraten.

Kasten 1: Zeitansage@KL:Öffentliche Plätze beherbergen meist eine Uhr. Fehlt diese, wird man prompt angesprochen: "Entschuldigung, könnten Sie mir sagen, wie spät es ist?". In der Regel wird der Zeitlose daraufhin eine Antwort an seine Lauscher, und nicht ein Ziffernblatt vor seine Photozellen bekommen.

Solcherlei bewährtes Verhalten lässt sich mit Hilfe von MBROLA auch dem Desktop beibringen: Ist Ihre Desktop-Uhr einmal vom Fensterdschungel überwuchert, könnten Sie zwar das Unkraut mit unzähligen Fingerbewegungen jäten, doch einfacher ist es sicherlich, die Zeit auf einen einzigen Mausklick hin gesprochen zu bekommen.

date ist der Shell-Befehl, der sämtliche Informationen zu Datum und Uhrzeit parat hat. So gibt ein date +%H die aktuelle Stunde aus und ein date +%M die überzähligen Minuten. Damit alleine ist es jedoch nicht getan: Zusätzlich sollte die Ansage mitteilen, dass es sich bei diesen Zahlen um Stunden und Minuten handelt (der date-Befehl liefert schließlich nur nackte Zahlen). Der erwünschte Wortlaut lässt sich daher mit folgendem Konstrukt zusammenstricken:

jo@planet ~> echo `date +"%H"` "Uhr und" `date +"%M"` "Minuten"
17 Uhr und 08 Minuten

Diese Ausgabe kann nun wie gewohnt per Pipe oder in einem Skript an txt2pho und MBROLA geschickt werden, womit das Ganze wiederum in ein Startmenü eintragbar bzw. als Programm-Icon auf dem Desktop ablegbar wird.

Die Zahl "17" spricht MBROLA hierbei bemerkenswerter Weise nicht als "eins sieben", sondern wirklich als "siebzehn" aus. Anders die "08" – diese wird wirklich als "null acht" betrachtet. Allerdings stellt dies in unserem Anwendungsfall eher einen Schönheitsfehler als einen echten Mangel dar. Versierte Anwender können selbst ein Skript basteln, das mit if-Abfragen und dem Tool sed Kosmetik betreibt.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare