Java-Speech-Spezifikation
Java-Speech-Spezifikation
Java-Speech-Spezifikation
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Java</strong>-<strong>Speech</strong>-<strong>Spezifikation</strong><br />
Hans-Peter Cugialy Markus Lülsdorf Matthias Otto<br />
März 2000
INHALTSVERZEICHNIS 1<br />
Inhaltsverzeichnis<br />
1 Einleitung 4<br />
2 Einführung in die Sprachsynthese 6<br />
2.1 Direkte Sprachsynthese . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
2.2 Anwendungsmöglichkeiten der Sprachsynthes . . . . . . . . . . . . . . 6<br />
3 <strong>Speech</strong> 7<br />
3.1 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.1.1 AudioListener . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.1.2 AudioManager . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.1.3 EngineCentral . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.1.4 EngineCreate . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
3.1.5 Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
3.1.6 EngineListener . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
3.1.7 EngineProperties . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
3.1.8 VocabManager . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
3.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
3.2.1 AudioAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
3.2.2 AudioEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
3.2.3 Central . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
3.2.4 EngineAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
3.2.5 EngineErrorEvent . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2.6 EngineEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2.7 EngineList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2.8 EngineModeDesc . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
3.2.9 <strong>Speech</strong>Permission . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3.2.10 Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3.3 Ausnahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3.4 Fehler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
4 <strong>Java</strong>-<strong>Speech</strong>-Synthesize 22<br />
4.1 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.1.1 Speakable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.1.2 SpeakableListener . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
4.1.3 Synthesizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
4.1.4 SynthesizerListener . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.1.5 SynthesizerProperties . . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.2.1 SynthesizerAdapter . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.2.2 SynthesizerEvent . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.2.3 SynthesizerModeDesc . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.2.4 SynthesizerQueueItem . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.2.5 Voice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
INHALTSVERZEICHNIS 2<br />
Vorwort<br />
<strong>Java</strong>-<strong>Speech</strong> ist eines der neueren Erweiterungspakete für die Programmiersprache<br />
<strong>Java</strong>. Es suggeriert, daß man mit einem Programm, daß unter anderem mit Hilfe des<br />
<strong>Speech</strong>-Paketes programmiert wurde, direkt auf Sprache reagieren kann oder Sprache<br />
erzeugen kann. Betrachtet man das Paket jedoch etwas genauer, so wird man einen<br />
wesentlichen Unterschied zu (fast) allen anderen Erweiterungspaketen von <strong>Java</strong> (z.B.<br />
<strong>Java</strong>3D, <strong>Java</strong>-Sound, ...) erkennen. Auf diesen wesentlichen Unterschied wollen wir<br />
nun etwas näher eingehen.<br />
<strong>Java</strong>-<strong>Speech</strong> ist ein Erweiterungs-Paket zur Programmiersprache <strong>Java</strong>, daß von<br />
Sun entwickelt wurde, um auf Spracheingabe in bestimmter Weise reagieren zu können.<br />
Leider ist es den Entwicklern von Sun nicht bzw. noch nicht gelungen, das Paket<br />
unabhängig von Fremdprodukten zu halten. Dies bedeutet, daß es mit <strong>Java</strong>-<strong>Speech</strong><br />
nicht möglich ist, direkt irgendwelche Hardware, wie z.B. eine Soundkarte oder ein<br />
Mikrofon, anzusprechen. Um dies zu erreichen muß man auf diverse Fremdprodukte<br />
ausweichen. Diese Fremdprodukte stellen diese Funktionen dann zur Verfügung, und<br />
kümmern sich um die Aufnahme und die Ausgabe von Sprache. Einige dieser Fremdprodukte<br />
sind für die verschiedensten Betriebssysteme erhältlich. Eines der bekanntesten<br />
Fremdprodukte ist das bekannte Spracherkennungssysteme von IBM ViaVoice.<br />
Dieses Programm stellt z.B. die Schnittstelle zwischen der Programmierspache und<br />
dem Betriebssystem (in diesem Fall MS Windows 9x/NT/2000) dar.<br />
Grundsätzlich ist nun dazu zu bemerken, daß man bei einem <strong>Java</strong>-Programm, das<br />
auf Sprache reagieren soll oder das auch Sprache ausgeben soll, im eigentlichen Sinne<br />
auf den Fremdprogrammen aufsetzt. Die eigentliche Verarbeitung und Nutzung der<br />
Hardware wird dann durch das entsprechende Fremdprogramm gemacht.<br />
Zunächst einmal muß man sich klarmachen, daß das <strong>Speech</strong>-Paket in drei große<br />
Gruppen unterteilt ist. Diese drei Gruppen sind die allgemeinen <strong>Speech</strong> - Pakete<br />
(<strong>Java</strong> - <strong>Speech</strong>), die Pakete der Spracherkennung (<strong>Java</strong> - <strong>Speech</strong> - Recognition) und<br />
die Pakete der Sprachausgabe (<strong>Java</strong> - <strong>Speech</strong> - Synthesis). Wir wollen versuchen,<br />
die Struktur der Original <strong>Java</strong> - <strong>Speech</strong> - <strong>Spezifikation</strong> zu erhalten, damit man sich<br />
leichter in der <strong>Speech</strong> - <strong>Spezifikation</strong> orientieren kann.<br />
Trotzdem sind wir der Meinung, es ist sicherlich sinnvoller, die Sprachausgabe vor<br />
der Spracherkennung zu bearbeiten.<br />
Außerdem werden wir eine weitere Unterteilung der <strong>Java</strong> - <strong>Spezifikation</strong> übernehmen.<br />
• Interfaces<br />
• Classes<br />
• Exceptions<br />
• Errors<br />
Wir möchten als letztes noch bemerken, daß wir keinerlei Garantie auf Vollständigkeit<br />
geben. Wir versuchen, die wichtigsten und meist genutzten Pakete, Klassen und
INHALTSVERZEICHNIS 3<br />
Interfaces zu beschreiben und uns weniger in Einzelheiten zu verlaufen. Dies würde<br />
auch das Lesen und Verstehen erschweren.<br />
Falls es innerhalb von bestimmten Klassen auch noch besonders wichtige Methoden<br />
gibt, werden wir diese hier auch ansprechen. Es sei allerdings bemerkt, daß es<br />
zu fast jeder Methode auch Ausnahme- und Fehlerbehandlungen gibt. Diese werden<br />
wir immer am Ende des entsprechenden Abschnitts auflisten. Dabei wird aber<br />
nicht auf die Details eingegangen. Diese können bei Bedarf direkt in der <strong>Java</strong>-<strong>Speech</strong>-<br />
<strong>Spezifikation</strong> (http://www.java.sun.com) nachgelesen werden.<br />
Wir hoffen, wir halten unsere Strukur wirklich ein und bleiben verständlich...
1 EINLEITUNG 4<br />
1 Einleitung<br />
<strong>Java</strong>-<strong>Speech</strong> ist eines der neueren Erweiterungspakete für die Programmiersprache<br />
<strong>Java</strong>. Es suggeriert von der Bezeichnung, daß man mit einem Programm, daß unter<br />
anderem mit Hilfe des <strong>Speech</strong>-Paketes programmiert wurde, direkt auf Spracheingaben<br />
reagieren kann oder Sprache erzeugen kann. Betrachtet man das Paket jedoch<br />
etwas genauer, so wird man einen wesentlichen Unterschied zu (fast) allen anderen<br />
Erweiterungspaketen von <strong>Java</strong> (z.B. <strong>Java</strong>3D, <strong>Java</strong>-Sound, ...) erkennen. Auf diesen<br />
wesentlichen Unterschied wollen wir nun etwas näher eingehen.<br />
<strong>Java</strong>-<strong>Speech</strong> ist ein Erweiterungs-Paket zur Programmiersprache <strong>Java</strong>, daß von<br />
Sun entwickelt wurde, um auf Spracheingabe in bestimmter Weise reagieren zu können.<br />
Leider ist es den Entwicklern von Sun nicht bzw. noch nicht gelungen, das Paket<br />
unabhängig von Fremdprodukten zu halten. Dies bedeutet, daß es mit <strong>Java</strong>-<strong>Speech</strong><br />
nicht möglich ist, direkt irgendwelche Hardware, wie z.B. eine Soundkarte oder ein<br />
Mikrofon, anzusprechen. Um dies zu erreichen muß man auf diverse Fremdprodukte<br />
ausweichen. Diese Fremdprodukte stellen diese Funktionen dann zur Verfügung, und<br />
kümmern sich um die Aufnahme und die Ausgabe von Sprache. Einige dieser Fremdprodukte<br />
sind für die verschiedensten Betriebssysteme erhältlich – die meisten leider<br />
nicht kostenlos. Eines der bekanntesten Fremdprodukte ist das bekannte Spracherkennungssysteme<br />
von IBM, ViaVoice. Dieses Programm stellt die Schnittstelle zwischen<br />
der Programmierspache <strong>Java</strong> und dem Betriebssystem (in diesem Fall MS Windows<br />
9x/NT/2000) dar.<br />
Als weitere Voraussetzung benötigt man von IBM nach ein Development Kid für<br />
<strong>Java</strong>. Mit Hilfe dieses Development Kits kann man dann eine Programm in <strong>Java</strong><br />
auf Spracheingaben reagieren lassen. Dies könnte z.B. so aussehen, daß man mit<br />
bestimmten Befehlen eine Menü öffnen kann oder bestimmte Audio-Dateien abspielen<br />
läßt. Natürlich gibt es noch viele andere Möglichkeiten auf Spracheingabe zu reagieren.<br />
Anders als man es erwarten würde, ist das Programm ViaVoice auch noch für die<br />
Sprachausgabe zuständig. Dies liegt wahrscheinlich daran, daß sich das Fremdprogramm<br />
sowieso mit der Hardware auseinandersetzt. Daher kann man sich vorstellen,<br />
daß es einfacher ist, das Ansprechen von Hardware-Ressourcen an eine Programm weiterzugeben,<br />
daß diese Ressourcen schon verwaltet. Dies ist wahrscheinlich der Grund<br />
dafür, daß sowohl die Sprachaufnahme als auch die Sprachausgabe durch das entsprechende<br />
Fremprogramm getätigt wird.<br />
Zu bemerken ist nun außerdem noch, daß es neben IBM ’s ViaVoice natürlich noch<br />
andere Programm gibt. Eines dieser Programm ist z.B. Festival oder Conversa. Diese<br />
beiden Programm sind zwar teilweise frei verfügbar, laufen aber nur unter Linux.<br />
Daher werden wir sie hier außen vor lassen.<br />
Wir möchten desweiteren bemerken, daß es uns nicht bekannt ist, ob es noch<br />
weitere Fremdprogramm gibt, auf denen <strong>Java</strong>-<strong>Speech</strong> aufsetzen kann.<br />
Im folgenden Tutorial wollen wir uns dann in gewisser Weise mit <strong>Java</strong>-<strong>Speech</strong><br />
beschäftigen:<br />
Zunächst werden wir versuchen, einen kurzen Abriß über die Sprachsynthese zu<br />
geben. Dabei werden wir uns bemühen, vorzustellen, wie Sprachsynthese im Allgemeinen<br />
funktioniert und versuchen dabei, auf unteschiedliche Arten der Sprachsynthese
1 EINLEITUNG 5<br />
einzugehen. Danach wollen wir direkt näher auf <strong>Java</strong>-<strong>Speech</strong> eingehen. Dabei werden<br />
wir kurz das grundlegende Prinzip der wichtigsten Interface und Klassen geben. Danach<br />
spezialisieren wir das grundlegende Prinzip auf die Sprachausgabe, die in <strong>Java</strong><br />
Synthesizer genannt wird. Die Spracherkennung werden wir in diesem Tutorial vernachlässigen,<br />
da diese Kapitel den Rahmen sprengen wird. Nähere Informationen zur<br />
Spracherkennung (<strong>Java</strong>-Recognizer) kann man aber auf den Internetseiten von Sun –<br />
http://www.java.sun.com/products/java-media/speech/ – entnehmen. Dort findet<br />
man zum gesamten <strong>Speech</strong>-Paket eine <strong>Spezifikation</strong>, eine Dokumentation und<br />
einen Programmier-Leitfaden.<br />
Am Ende dieses Tutorials werden wir eine Auflistung der vorhandenen <strong>Speech</strong>-<br />
Interface und Klassen geben. Dabei bemühen wir uns die grundlegende Funktion<br />
dieser Interface und Klasse zu beschreiben. Am Ende eines solchen Kapitels werden<br />
dann noch die möglichen Fehler und Ausnahmen aufgelistet, aber nicht näher<br />
beschrieben. Auch in dieser Auflistung wird man das Kapitel der Spracherkennung<br />
vergeblich suchen.<br />
Nun wollen wir uns aber näher mit der Sprachsynthese auseinandersetzen ...
2 EINFÜHRUNG IN DIE SPRACHSYNTHESE 6<br />
2 Einführung in die Sprachsynthese<br />
Sprachsynthese ermöglicht es, einen Text in gesprochener Sprache auszugeben. Es gibt<br />
mehrere Methoden, der Sprachsynthese, von denen wir allerdings nur Eine genauer<br />
vorstellen werden.<br />
2.1 Direkte Sprachsynthese<br />
Bei der direkten Sprachsynthese werden Teilstücke des Sprachsignals gespeichert. Die<br />
Teilstücke können einzelne Wörter, ganze Sätze oder Phoneme. Phoneme sind kleinste<br />
bedeutungsunterscheidende sprachliche Einheiten, so unterscheiden sich die Wörter<br />
Maus und Haus durch die Phoneme /m/ und /h/. Diese Teilstücke werden dann zu<br />
Wörtern und Sätzen zusammengesetzt. Diese Methode kann eine sehr gute Sprachqualität<br />
ergeben, wenn z.B. ganze Sätze abgespeichert werden.<br />
Ihre Anwendung findet diese Methode, wenn nur ein begrenztes Vokabular vorliegt,<br />
da der Speicherbedarf sehr groß ist. Problematisch bei der direkten Sprachsynthese<br />
ist, daß die Betonung eines Wortes unterschiedlich sein kann. So wird ein einzeln<br />
gesprochenes Wort anders betont, als das selbe Wort in einem zusammenhängenden<br />
Satz oder einer Frage. Daraus resultiert ein recht unnatürlicher Klang der Sprache.<br />
2.2 Anwendungsmöglichkeiten der Sprachsynthes<br />
Die Anwendungsmöglichkeiten der Sprachsynthese sind äußerst vielfältig. So ist zum<br />
Beispiel ein sprechender Bankautomat denkbar, der einen bittet seine Geheimzahl<br />
einzugeben. Oder eine sprechende Uhr, mit einem festem Trägersatz ”<br />
Es ist ... Uhr ...“.<br />
Die freien Slots werden dann mit den entsprechenden Zahlwörtern aufgefüllt. Auch<br />
ein fernabfragbarer Anrufbeantworter ist denkbar, welches nicht nur die Möglichkeiten<br />
der Sprachsynthese nutzt, sonder auch die der Spracherkennung.
3 SPEECH 7<br />
3 <strong>Speech</strong><br />
Alle Interfaces, Klassen, Fehler und Ausnahmen des allgemeinen <strong>Speech</strong>-Paketes sind<br />
in der Implementation Unterzweig von javax.speech.<br />
3.1 Interface<br />
3.1.1 AudioListener<br />
Der AudioListener ist ein Interface in einem Programm. Dieses Interface reagiert<br />
auf Ereignisse, die mit Audio-Files zu tun haben. Dabei kann es sich zum Beispiel<br />
um das Abspielen einer Audio-Datei handeln, das Anhalten oder das regelmäßige<br />
Wiederholen einer Ausgabe.<br />
Der AudioListener arbeitet immer mit einer Engine (Maschine) zusammen. Bei<br />
dem <strong>Speech</strong>-Paket gibt es bis heute nur die beiden Engines der Spracherkennung<br />
(Recognizer) und der Sprachausgabe (Synthesizer).<br />
Da <strong>Java</strong> immer weiterentwickelt wird, dient dieses Interface wie auch andere Klassen<br />
als Platzhalter, bis die <strong>Java</strong>-Sound-API bzw. die <strong>Java</strong>-<strong>Speech</strong>-API komplett implementiert<br />
wurden.<br />
3.1.2 AudioManager<br />
Der AudioManager ist die eigentliche (interne) Schaltzentrale in Bezug auf Audio-<br />
Files. Er übergibt die Kontrolle von Audio-Dateien an Anwendungen. Außerdem<br />
überwacht der AudioManager Ereignisse, die vom AudioListener erkannt und an ihn<br />
zur weiteren Verarbeitung übergeben werden. Einem AudioManager können verschiedene<br />
AudioListener hinzugefügt und wieder entfernt werden (addAudioListener,<br />
removeAudioListener).<br />
3.1.3 EngineCentral<br />
Dieses Interface sorgt dafür, daß für jede verwendete Engine eine Beschreibungsliste<br />
vorhanden ist, in der man die Betriebsart ersehen kann. Diese Beschreibung ist vom<br />
Typ EngineModeDesc und erhält alle möglichen Betriebsarten dieser entsprechenden<br />
Engine.<br />
Um sich eine Liste von Engines zu erzeugen, kann eine Methode createEngineList<br />
benutzt werden. Dabei kann man als Übergabewert eine Voraussetzung mitliefern, die<br />
diese Engine haben muß. Die genaue Syntax dieser Methode lautet dann:<br />
public EngineList createEngineList(EngineModeDesc required)<br />
Als Ausgabe erhält man dann eine Liste der Engines, die auf diese Voraussetzung<br />
zutreffen.<br />
Ausnahmen und Fehler<br />
• SecurityException
3 SPEECH 8<br />
3.1.4 EngineCreate<br />
Die meisten Anwendungen brauchen dieses Interface eigentlich nicht. Man kann sich<br />
mit Hilfe der Methode createEngine() eine bestimmte Engine explizit erzeugen. Die<br />
damit erzeugte Methode hat eine Betriebsart, die abhängig von der erzeugten Engine<br />
ist. Beim Erzeugen von Engines können natürlich auch Fehler auftreten, die dann<br />
durch eine entsprechende Ausnahmebehandlung bearbeitet werden müssen.<br />
Ausnahmen und Fehler<br />
• IllegalArgumentException<br />
• EngineException<br />
• SecurityException<br />
3.1.5 Engine<br />
Wie schon zuvor öfter erwähnt gibt es zum momentanen Zeitpunkt nur die beiden<br />
Engines Recognize und Synthesize. Diese beiden Engines sind Unterklassen der<br />
javax.speech.Engine. Einer Engine sind Methoden zugeordnet, mit der man auf<br />
Engines arbeiten kann. Beispiele für solche Methoden sind folgende:<br />
• allocate und deallocate<br />
• pause und resume<br />
• Zugriff auf den AudioManager und VocabManager<br />
• Zugriff auf die Engine-Eigenschaften<br />
• Zugriff auf die EngineModeDesc<br />
• hinzufügen und entfernen von AudioListener<br />
Nun werden wir der Reihe nach die Punkte erläutern:<br />
Allocate und Deallocate Allocate und Deallocate sind Zustände, die eintreten,<br />
wenn eine Engine etwas macht. So wird z.B. der Zustand auf allocated geändert,<br />
wenn eine Audio-Datei abgespielt wird. Ebenso wird eine Engine auf deallocated<br />
gesetzt, wenn eine Engine eine Aufgabe beendet hat und danach die Systemressourcen<br />
wieder freigeben soll. Ändert eine Engine ihren Zustand von allocated in<br />
deallocated, so ist leicht vorstellbar, daß für diesen Vorgang einige Zeit benötigt<br />
wird. In dieser Zeit wird ein Zwischenzustand eingenommen. Der Zwischenzsutand<br />
beim Übergang von allocated zu deallocated heißt Deallocated ressource und<br />
der Zustand beim Übergang von Deallocated zu Allocated wird mit Allocated ressource<br />
bezeichnet.<br />
Erzeugt man eine Engine, so hat diese den Anfangszustand deallocated.
3 SPEECH 9<br />
Unterzustände Als Unterzustände werden Zustände bezeichnet, die immer nur in<br />
Beziehung mit einem anderen Zustand eintreten können. Z.B. hat allocate zwei<br />
Unterzustände, pause und resume. Man kann sich vorstellen, daß eine Audiodatei<br />
abgespielt wird und dann angehalten wird. Eine solche Engine wird dann den Zustannd<br />
allocate und pause haben. Dies sind die beiden einzigen Unterzustände von<br />
allocate.<br />
Deallocate hat keine Unterzustände.<br />
Methoden zur Statusabfrage Um Zustände abzufragen oder zu testen, benötigt<br />
man noch einige Methoden. In Engine-Klassen heißen die Methoden getEngineState,<br />
waitEngineState und testEngineState.<br />
Dabei ist schon aus dem Namen der Methoden zu ersehen, was sie bewirken.<br />
Die Methode getEngineState gibt als Ausgabe den akutellen Zustand der Engine<br />
aus. Die Methode waitEngineState blockiert eine arbeitende Engine solange, bis ein<br />
bestimmter Zustand erreicht wurde und setzt dann die Engine fort. Als letzte Methode<br />
testet testEngineState eine bestimmte Eninge auf einen bestimmten Zustand und<br />
gibt entsprechend true oder false zurück.
3 SPEECH 10<br />
Tab. 1: Methodenzusammenfassung des Engine<br />
void addEngineListener(EngineListener<br />
listener)<br />
fügt einen EngineListener zu einer bestimmten<br />
Engine hinzu<br />
void allocate()<br />
setzt den Zustand auf Allocated und reserviert<br />
alle Ressourcen, die zur Ausführung<br />
gebraucht werden<br />
void deallocate()<br />
setzt den Zustand auf Deallocated und<br />
gibt alle benutzten Ressourcen wieder frei<br />
AudioManager getAudioManager() man erhält als Ausgabe eine Objekt<br />
vom Typ AudioManager, der die Audio-<br />
Ereignisse dieser Engine verwaltet<br />
EngineModeDesc getEngineModeDesc() man erhält eine Liste der Betriebseigenschaften<br />
einer bestimmten Engine<br />
EngineProperties getEngineProperties() gibt die Eigenschaften einer bestimmten<br />
Engine aus<br />
long getEngineState()<br />
gibt den aktuellen Zustand dieser Engine<br />
aus<br />
VocabManager getVocabManager()<br />
man erhält ein Objekt als Ausgabe, das die<br />
unterstützten Vokabeln der Engine liefert<br />
void pause()<br />
hält eine Engine an (Der Vorgang kann<br />
später fortgeführt werden<br />
void removeEngineListener(EngineListener entfernt einen EngineListener von der entsprechenden<br />
lsitener)<br />
Engine<br />
void resume()<br />
nimmt die Arbeit einer angehaltenen Engine<br />
wieder auf<br />
boolean testEngineState(long state) testet, obe eine Engine in einem bestimmten<br />
Zustand ist<br />
void waitEngineState(long state) wartet bzw. blockiert eine Ausführung einer<br />
Engine solange, bis ein bestimmter Zustand<br />
erreicht wurde<br />
3.1.6 EngineListener<br />
Ein solches Interface muß zu einem EngineManager hinzugefügt werden, wenn dieser<br />
Manager auf Zustandsänderungen einer Engine reagieren soll. Der EngineListener<br />
registriert solche Zustandsänderungen und leitet diese dann an den EngineManager<br />
weiter. Der Manager reagiert dann entsprechend auf solche Zustandsänderung. Man<br />
könnte sich z.B. vorstellen, daß sich der Zustand eines Synthesizers von pause auf<br />
resume ändert. Der EngineListener registriert nun diese Zustandsänderung und gibt<br />
sie an den EngineManager weiter. Dieser beginnt die Audiodateien dann wieder abzuspielen.
3 SPEECH 11<br />
Tab. 2: Methodenzusammenfassung des EngineListener<br />
void engineAllocated(EngineEvent e)<br />
ändert den Zustand dieser Engine<br />
auf Allocated<br />
void engineAllocatingResources(EngineEvent e) bereitet eine Engine darauf vor,<br />
den Zustand Allocated zu erhalten<br />
void engineDeallocated(EngineEvent e)<br />
ändert den Zustand dieser Engine<br />
auf Deallocated<br />
void engineDeallocatingResources(EngineEvent e) bereitet eine Engine darauf vor,<br />
den Zustand deallocate zu erhalten<br />
void enginePaused(EngineEvent e)<br />
hält die Ausführung einer Engine<br />
an<br />
void engineResumed(EngineEvent e)<br />
nimmt die Ausführung einer Engine<br />
wieder auf<br />
3.1.7 EngineProperties<br />
ist meines Erachtens eigentlich nicht so wichtig (auf den ersten Blick zumindest) und<br />
wird daher auch zunächst nicht behandelt.<br />
3.1.8 VocabManager<br />
Der VocabManager verwaltet Wörter, die einer <strong>Speech</strong>-Engine bekannt sind bzw. von<br />
der eine Engine weiß, wie diese Wörter betont werden, welche Stellung sie in einem<br />
Satz haben und weitere Informationen über das entsprechende Wort. Es ist allerdings<br />
nicht zwingend, daß ein VocabManager mit einer bestimmten Engine verbunden ist.<br />
Wörter werden vom VocabManager als Tokens behandelt. Diese Token sind dem<br />
VocabManager bekannt. Außerdem sind ihm auch noch weitere Informationen – z.B.<br />
Betonung, grammatikalische Bedeutung im Satz und die Aussprache – zu den entsprechenden<br />
Token bekannt.<br />
Meist wird dieser Manager verwendet, wenn eine Engine nicht in der Lage ist,<br />
die Betonung eines Tokens zu erraten¨. Dies sind meist aber dann schon schwierigere<br />
Worte, die intern in einer bestimmten Liste verarbeitet werden.<br />
Eine weitere Möglichkeit der Unterstützung des VocabManagers ist das hinzufügen<br />
oder Löschen von bestimmten Token. So kann der VocabManager neue Token lernen,<br />
in dem man das Token mit den entsprechenden Informationen neu eingibt. Außerem<br />
kann man sich eine Liste der Problem-Tokenäugeben lassen. Dazu nutzt man die<br />
Funktion listProblemWords().
3 SPEECH 12<br />
Tab. 3: Methodenzusammenfassungdes VocabManagers<br />
void addWords(Word[] w)<br />
fügt mehrere Worte dem VocabManager hinzu<br />
void addWord(Word w)<br />
fügt eine Wort dem VocabManager hinzu<br />
Word[] getWords(String text) man erhält alle Worte aus dem Vokabular des<br />
VocabManagers, die den String text enthalten<br />
Word[] listProblemWords()<br />
Man erhält eine Liste mit den Token, die dem<br />
VocabManager nicht bekannt sind<br />
void removeWords(Word[] w)<br />
löscht mehrere Worte aus dem Vokabular des<br />
VocabManager heraus<br />
void removeWord(Word w) löscht ein Wort aus dem Vokabular des<br />
VocabManagers heraus
3 SPEECH 13<br />
3.2 Klassen<br />
3.2.1 AudioAdapter<br />
Ein AudioAdapter ist eine Abwandlung des AudioListeners. Auch er reagiert auf<br />
Audio-Ereignisse. Der eigentliche Unterschied zwischen AudioAdapter und AudioListener<br />
besteht darin, daß man den AudioAdapter nach eigenen Bedürfnissen anpassen kann.<br />
Dazu muß man die Methode(n) des AudioAdapters überschreiben. Außerdem wird<br />
der AudioAdapter durch den RecognizerAudioAdapter erweitert. Dieser fügt dem<br />
AudioAdapter entsprechende Funktionalitäten hinzu, die die Spracherkennung benötigt.<br />
3.2.2 AudioEvent<br />
Ein AudioEvent ist ein Ereignis, daß mit Audio-Eingabe bzw. -Ausgaben zu tun hat.<br />
Die Syntax des entsprechenden Konstruktors lautet exakt:<br />
AudioEvent(Engine source, int id)<br />
Damit ist gemeint, daß source die Engine ist, die das entsprechende Ereignis<br />
ausführen soll. Der Paramter id beschreibt einen Typ des Audio-Ereignisses (z.B.<br />
das Abspielen einer Audio-Datei)<br />
Außerdem existiert in der Klasse AudioEvent noch die Methode paramString.<br />
Diese Methode erzeugt einen String, der den entsprechenden Ereignis-Typ charakterisiert.<br />
Man könnte z.B. damit Ereignisse protokollieren.<br />
3.2.3 Central<br />
Die Klasse Central ist die Initialisierungklasse einer Engine. Sie hat die Möglichkeit,<br />
eine bestimmte Engine zu finden, auszuwählen oder zu erzeugen. Dies hat den Grund,<br />
daß man nicht eine Engine erzeugen muß, die schon die geforderten Eigenschaften<br />
aufweist. Diese kann die Aufgabe dann auch übernehmen.<br />
Erzeugen eines Recognizers und Synthesizer Um eine Engine zu erzeugen, benutzt<br />
man die Methode createEngine, createRecognizer oder createSynthesizer.<br />
Diesen Methoden muß man einen Parameter übergeben, der den Typ EngineModeDesc,<br />
RecognizerModeDesc oder SynthesizerModeDesc hat. So kann man einer Engine beispielsweise<br />
mitteilen, daß der Synthesizer eine Ausgabe als englische Frauenstimme<br />
erzeugt.<br />
Auswahl eines Recognizers oder Synthesizer Diese Funktion ermöglicht es,<br />
eine Engine mit geforderten Eigenschaften auszuwählen. Dadurch kann man vermeiden,<br />
daß Engines mit bestimmten Eigenschaften vermehrt erzeugt werden. Wird eine<br />
Engine mit geforderten Eigenschaften gefunden, so wird diese für entsprechende Ereignisse<br />
genutzt. Findet man keine entsprechende Engine, so kann eine entsprechende<br />
Engine erzeugt werden.
3 SPEECH 14<br />
Registrierung eines Recognizers und Synthesizers Damit die Engine gesucht<br />
und gefunden werden kann, muß sie sich selber registrieren. Dazu wird eine interne<br />
Liste geführt, in der die angemeldeten Engines enthalten sind.<br />
Bemerkung: Eine Engine, die mit createEngine o.ä. erzeugt wurde, ist nicht<br />
unbedingt registriert.<br />
Tab. 4: Methodenzusammenfassung Central<br />
static EngineList<br />
availableRecognizers(EngineModeDesc<br />
require)<br />
static EngineList<br />
availableSynthesizers(EngineModeDesc<br />
require)<br />
static Recognizer<br />
createRecognizer(EngineModeDesc<br />
require)<br />
static Synthesizer createSynthesizer<br />
(EngineModeDesc require)<br />
static void registerEngineCentral(String<br />
className)<br />
Listet alle EngineModeDesc Objekte von<br />
Recognizer-Engines auf, die die geforderten<br />
Eigenschaften besitzen<br />
Listet alle EngineModeDesc Objekte von<br />
Sythesizer-Engines auf, die die geforderten<br />
Eigenschaften besitzen<br />
erzeugt einen Recognizer mit angegebenen<br />
Eigenschaften<br />
erzeugt einen Synthesizer mit angegebenen<br />
Eigenschaften<br />
registriert die <strong>Speech</strong>-Engine für die laufende<br />
Anwendung<br />
Bemerkung: Wenn bei der Engine-Erzeugung keine Engine erzeugt werden konnte<br />
(z.B. weil ein Recognizer eine ausgewählte Sprache nicht unterstützt), wird der<br />
Rückgabewert null ausgegeben.<br />
Ausnahmen und Fehler<br />
• IllegalArgumentException<br />
• EngineException<br />
• SecurityException<br />
3.2.4 EngineAdapter<br />
Ein EngineAdapter ist eine Abwandlung des EngineListeners. Auch er reagiert auf<br />
Zustandsänderungen einer Engine. Der eigentliche Unterschied zwischen EngineAdapter<br />
und EngineListener besteht darin, daß man den EngineAdapter nach eigenen Bedürfnissen<br />
anpassen kann, genau wie den AudioAdapter. Dazu muß man die Methode(n)<br />
des EngineAdapters einfach überschreiben. Außerdem wird der EngineAdapter<br />
durch den RecognizerAdapter und den SynthesizerAdapter erweitert. Diese fügen<br />
dem EngineAdapter entsprechende Funktionalitäten hinzu, die die Spracherkennung<br />
bzw. die Sprachausgabe benötigen.
3 SPEECH 15<br />
Tab. 5: Methodenzusammenfassung EngineAdapter<br />
void engineAllocated(EnigneEvent e)<br />
die Engine wurde auf Allocate<br />
gesetzt<br />
void engineAllocatingResources(EngineEvent e) die Engine wird auf Allocate gesetzt<br />
void engineDeallocated(EngineEvent e)<br />
die Engine wurde auf Deallocate<br />
gesetzt<br />
void engineDeallocatingResources(EngineEvent die Engine wird auf Deallocate<br />
e)<br />
gesetzt<br />
void EngineError(EngineErrorEvent e)<br />
Eine Fehler wurde ausgelöst und<br />
die Engine könnte nicht normal<br />
weiterarbeiten<br />
void EnginePaused(EngineEvent e)<br />
die Engine wurde angehalten<br />
void EngineResumed(EngineEvent e)<br />
die Engine wurde wieder gestartet<br />
3.2.5 EngineErrorEvent<br />
Diese Klasse gibt Auskunft, ob eine interner Fehler einer Engine aufgetreten ist,<br />
der das normale Weiterarbeiten dieser Engine beeinträchtigt. Das Ereignis löst ein<br />
Throwable-Objekt aus, welches die Informationen zu diesem Fehler enthält. Diese<br />
Informationen kann man durch Aufruf der Methode getEngineError erhalten. Die<br />
genaue Syntax dieser Methode lautet:<br />
Throwable getEngineError()<br />
Desweiteren kann man mit der zuvor schon einmal erwähnten Methode paramString<br />
einen String erhalten, der das Ereignis identifiziert.<br />
3.2.6 EngineEvent<br />
Diese Klasse EngineEvent meldet Statusveränderungen einer Engine an den entsprechenden<br />
EngineListener.<br />
Folgende Methoden sind in dieser Klasse enthalten:<br />
Tab. 6: Methoden von EngineEvent<br />
long getNewEngineState()<br />
gibt den neuen Status einer Engine aus<br />
long getOldEngineState()<br />
gibt den letzten Status einer Engine aus<br />
String paramString()<br />
gibt eine String aus, der das Event identifiziert<br />
3.2.7 EngineList<br />
Die Klasse EngineList enthält eine Liste von Beschreibungen aller genutzter Engines.<br />
Man erhält eine Liste von Objekten von Typ EngineModeDesc. Für jeden Enginetyp<br />
wird eine eigene Liste erzeugt.
3 SPEECH 16<br />
Tab. 7: Methodenzusammenfassung von EngineList<br />
boolean anyMatch(EngineModeDesc gibt true aus, wenn die Eigenschaft in der<br />
require)<br />
Liste enthalten ist<br />
void orderByMatch(EngineModeDesc Sortiert die Liste, daß die gesuchten Elemente<br />
require)<br />
am Kopf der Liste stehen<br />
void rejectMatch(EngineModeDesc Entfernt Einträge aus der Liste, die den angegebenen<br />
Bedingungen entsprechen<br />
require)<br />
void requireMatch(EngineModeDesc Entfernt die Einträge aus der Liste, die auf<br />
require)<br />
die angegebene Eigenschaft nicht haben<br />
3.2.8 EngineModeDesc<br />
Die Klasse EngineModeDesc verwaltet die Informationen über die Betriebsart einer<br />
benutzten <strong>Speech</strong>-Engine. Mit Hilfe der Methode availableSynthesizer und<br />
availableRecognizer kann man die Informationen über die gerade benutzten Engine<br />
abrufen.<br />
Im Objekt EngineModeDesc kann man die folgenden Attribute setzen:<br />
• engine name<br />
• mode name<br />
• Locale<br />
• Running<br />
• Selecting<br />
Engine name Das Attribut Engine Name wird genutzt, wenn man einer Engine<br />
einen bestimmten Namen geben will.<br />
Mode name Das Attribut Mode Name kann dazu genutzt werden, den aktuellen<br />
Modus der <strong>Speech</strong>-Engine zu benennen.<br />
Locale Das Attribut Locale repräsentiert die benutzte Sprache nach dem ISO-<br />
Standard. Hier müssen die Angaben immer in Anführungszeichen gesetzt werden.<br />
Außerdem kann man den Ländercode optionall eingeben, falls die entsprechende Engine<br />
dies unterstützt. Auch dieser Code wird nach dem ISO-Standard und auch in<br />
Anführungszeichen eingesetzt. Z.B. würde man für das Land Canada CAëinsetzen.<br />
Running Boolscher Wert, der angibt, ob die <strong>Speech</strong>engine zur Zeit läuft. True falls<br />
sie läuft, False, falls nicht.<br />
Selection Man kann ein EngineModeDesc durch eine Anwendung auswählen lassen,<br />
wenn dies gemacht wurde, besteht die Möglichkeit die EngineModeDesc Attribute zu<br />
testen.
3 SPEECH 17<br />
Tab. 8: Constructorenzusammenfassung<br />
EngineModeDesc()<br />
Erzeugt ein EngineModeDesc Objekt und<br />
setzt alle Parameter auf null<br />
EngineModeDesc(Locale locale)<br />
Erzeugt ein EngineModeDesc mit der Eigenschaft<br />
locale<br />
EngineModeDesc(String engineName, Erzeugt ein EngineModeDesc mit den übergebenen<br />
Eigenschaften<br />
String modeName, Locale locale,<br />
Boolean running)<br />
Tab. 9: Methodenzusammenfassung EngineModeDesc<br />
booldean equals(Object anObject) gibt true aus, wenn die Parameter nicht null<br />
sind und eine Engine mit den entsprechenden<br />
Eigenschaften gefunden wurde<br />
String getEngineName()<br />
Gibt den Namen der Engine zurück<br />
Locale getLocal()<br />
Gibt die Locale-Eigenschaften der Engine<br />
zurück<br />
String getModeName()<br />
Gibt die Bezeichnung des Modus der entsprechenden<br />
Engine aus<br />
Boolean getRunning()<br />
Gibt den Status, ob die Engine läuft oder<br />
nicht<br />
boolean match(EngineModeDesc require) Bestimmt, ob EngineModeDesc alle Eigenschaften<br />
des Übergabeparameters definiert<br />
hat<br />
void setEngineName(String engineName) Setzt den Namen der Engine<br />
void setLocale(Locale locale)<br />
Setzt die Attribute für Locale der Engine<br />
void setModeName(String modeName) Setzt die Bezeichnung des Modus<br />
void setRunning(Boolean running) Setzt den Status der Engine auf True oder<br />
False
3 SPEECH 18<br />
3.2.9 <strong>Speech</strong>Permission<br />
Diese Klasse enthält eine Art Liste aus der man entnehmen kann, ob man bestimmte<br />
Aktionen ausführen kann. Wenn einer Anwendung der Zugriff gewährt wurde, erhält<br />
sie Zugriff auf alle Resourcen, die die Engine benötigt. Wenn die Erlaubnis erteilt<br />
wurde, kann z. B. einen Recognizer erzeugen oder Attribute einer bestehenden Engine<br />
verändern.<br />
Tab. 10: Construktorenzusammenfassung<br />
<strong>Speech</strong>Permission(String name)<br />
Erzeugt eine Erlaubnis mit name als Namen<br />
3.2.10 Word<br />
Die Klasse Word verwaltet folgende Information zu sprechbaren Wörtern:<br />
• geschriebene Form<br />
• gesprochene Form<br />
• Betonung<br />
• Informationen zur Grammatik<br />
Bemerkung Die Information über die geschriebene Form sind erforderlich. Die restlichen<br />
Eigenschaften sind optional. Üblicherweise sind mehr Eigenschaften angegeben.<br />
Es wird erlaubt mehrere Betonungen und grammatische Formen.<br />
• abbreviation – Beispiel: Mr., USA<br />
• adjective – Beispiel: rot, erster, hübsch<br />
• adverb – Beispiel: langsam, laut<br />
• auxiliary – Beispiel: haben, sein<br />
• cardinal – Beispiel: eins, zwei<br />
• conjunction – Beispiel: und, oder, wenn<br />
• contraction – Beispiel: don´t, can´t, (im Deutschen meist nur Umgangssprachlich)<br />
• determiner – Beispiel: der, die, das, einige<br />
• dont care<br />
• noun – Beispiel: Haus, Hund, Auto<br />
• other
3 SPEECH 19<br />
• preposition – Beispiel: für, mit, als<br />
• pronoun – Beispiel: mich, dich, uns<br />
• proper adjective – Beispiel: britisch, deutsch<br />
• proper noun – Beispiel: Singapur, England<br />
• unknown<br />
• verb – Beispiel: reiten, lachen, laufen<br />
Tab. 11: Methodenzusammenfassung<br />
long getCatagories()<br />
Gibt die grammatikalische Kategorie eines<br />
Wortes an<br />
String[] getPronunciations()<br />
Fragt die Betonungen eines Wortes ab<br />
String getSpokenForm()<br />
Fragt die gesprochene Form eines Wortes ab<br />
String getWrittenForn()<br />
Fragt die geschriebene Form eines Wortes ab<br />
void setCatagories(long cat)<br />
Setzt die grammatikalische Typ eines Wortes<br />
void setPronunciations(String[] pron) Legt die Betonungsarten eines Wortes fest<br />
void setSpokenForm(String text) Legt die Aussprache eines Wortes fest<br />
void setWrittenForm(String text) Bestimmt die geschriebene Form eines Wortes
3 SPEECH 20<br />
3.3 Ausnahmen<br />
AudioException<br />
EngineException<br />
<strong>Speech</strong>Exception<br />
VendorException<br />
Tab. 12: Liste der Ausnahmen<br />
fängt Fehler ab, die bei der Verbindung zur Engine<br />
auftreten können<br />
zeigt an, daß bei Erzeugung einer Engine oder beim<br />
Zugriff auf eine Engine ein Fehler aufgetreten ist<br />
signalisiert, wenn ein Fehler in Bezug auf <strong>Speech</strong><br />
(allgemein) aufgetreten ist<br />
zeigt an, wenn ein Fehler beim Laden / Speichern<br />
von Hersteller-Spezifischen Daten auftritt (Import-<br />
Daten)
3 SPEECH 21<br />
3.4 Fehler<br />
EngineStateError<br />
<strong>Speech</strong>Error<br />
Tab. 13: Fehler in <strong>Java</strong>-<strong>Speech</strong><br />
wird ausgelöst, wenn eine Methode einer Engine<br />
falsch aufgerufen wird<br />
wird ausgelöst, wenn ein allgemeiner Fehler in <strong>Java</strong>-<br />
<strong>Speech</strong> aufgetreten ist
4 JAVA-SPEECH-SYNTHESIZE 22<br />
4 <strong>Java</strong>-<strong>Speech</strong>-Synthesize<br />
4.1 Interfaces<br />
4.1.1 Speakable<br />
Ein Objekt dieses Interfaces unterstützt die speak-Methode des Synthesizer. Der Text<br />
wird durch die getJSML Methode erreicht und durch diese so umgeformt, so daß er<br />
gesprochen werden kann. Fast alle <strong>Java</strong>-Objekte können mit diesem Interface implementiert<br />
werden.<br />
Bemerkung: <strong>Java</strong><strong>Speech</strong>MarkupLanguage (JSML) hält sich an den Unicode und<br />
enthält Texte aus einfachen Sprachen, wie die Sprache vom Synthesizer. Der Text ist<br />
unabhängig von der Ausgabe des Synthesizers, das heíßt zum Beispiel das ein Satz<br />
oder eine bestimmte Redewendung als ein Objekt behandelt wird. Mit Hilfe der <strong>Java</strong><strong>Speech</strong>MarkupLanguage<br />
ist es unter anderem möglich die Betonung einzelner Wörter,<br />
sowie die Geschwindigkeit mit der sie gesprochen werden zu manipulieren. Von der<br />
Syntax ist sie mit Html zu vergleichen, da sie beide von der StandardGeneralized-<br />
MarkupLanguage (SGML) abstammen. Wer näheres über JSML wissen will, sollte auf<br />
der <strong>Java</strong>-<strong>Speech</strong> Homepage http://java.sun.com/products/java-media/speech/<br />
vorbeischauen. Dort findet man die <strong>Spezifikation</strong> von JSML.<br />
Tab. 14: Methodenzusammenfassung<br />
String getJSMLText()<br />
Gibt einen Text im JSML-Format zurück.<br />
getJSMLText Diese Methode wird sofort aufgerufen, wenn ein Speakable-Objekt<br />
vom Synthesizer ausgesprochen werden soll. Der entsprechende Text wird in der Warteschlange<br />
des Synthesizers hinterlegt.<br />
4.1.2 SpeakableListener<br />
Der SpeakableListener reagiert auf Ereignisse während der Ausgabe eines Speakable.<br />
Ereignisse können z. B. sein:<br />
• Aufruf der Methode speak oder speakPlainText<br />
• Hinzufügen eines SpeakableListener zu einem Synthesizer
4 JAVA-SPEECH-SYNTHESIZE 23<br />
Tab. 15: Methodenzusammenfassung des SpeakableListener<br />
void markerReached(SpeakableEvent e)<br />
Eine Markierung wurde erreicht<br />
void speakableCancelled(SpeakableEvent e) Eine Ausgabe wurde abgebrochen<br />
void speakableEnded(SpeakableEvent e)<br />
Die Ausgabe wurde beendet<br />
void speakablePaused(SpeakableEvent e) Die Ausgabe wurde angehalten<br />
void speakableResumed(SpeakableEvent e) Eine angehaltene Ausgabe wurde<br />
fortgestzt<br />
void speakableStarted(SpeakableEvent e) Die Ausgabe wurde gestartet<br />
void topOfQueue(SpeakableEvent e) Ein bestimmtes Element ist am<br />
Kopf der Warteschlange angekommen<br />
void wordStarted(SpeakableEvent e)<br />
Die Ausgabe eines Wortes wurde angefangen<br />
Methoden Genauere Angaben zu den Methoden auf Seite <br />
4.1.3 Synthesizer<br />
Die Synthesizer-Schnittstelle macht erst möglich Sprache zu erzeugen. Der Synthesizer<br />
ist eine Erweiterung des Engine Interface mit entsprechend zusätzlichen Fähigkeiten.<br />
Außerdem kontrolliert die Ausgabe von Objekten aus der Queue.<br />
Erzeugen eines Synthesizer Üblicherweise wird ein Synthesizer durch die createSynthesizer<br />
Methode des Central Interface. Desweiteren werden diverse Klassen einer Engine um<br />
bestimmte Eigenschaften erweitert:<br />
• EngineModeDesc wird zu SynthesizerModeDesc erweitert<br />
• EngineListener wird zu SynthesizerListener erweitert<br />
• Methoden wie allocate, deallocate, pause, resume können analog genutzt<br />
werden<br />
Text sprechen<br />
Es gibt drei Möglichkeiten Text als Sprache auszugeben:<br />
1. speakPlainText<br />
2. Ausgabe eines JSML-Objektes<br />
3. Ausgabe eines Speakable-Objektes von einer URL<br />
Beispiel für speakPlainText<br />
synthesizer.speakPlainText( "<br />
The Computer can speak on Jan. 1999\, null);
4 JAVA-SPEECH-SYNTHESIZE 24<br />
Beispiel für speak<br />
synthesizer.speak( "<br />
The Computercan speak \, null);<br />
Das Tag ... kennzeichnet einen Satz. Mit Hilfe von ...<br />
kann einem Wort eine stärkere Betonung verliehen werden. Hierbei kann man auch<br />
angeben wie stark das Wort betont werden soll. Für die Bedeutung der einzelnen Tags<br />
und ihrer Attribute sollte man auch in die JSML-<strong>Spezifikation</strong> schauen.<br />
Ein Synthesizer ist einsprachig, d.h. er kann Text nur in einer Sprache ausgeben.<br />
Benötigt eine Anwendung mehr als eine Sprache, so müssen mehrere Synthesizer<br />
erzeugt werden. Die Sprache die der Synthesizer nutzt, sollte bei der Erzeugung ausgewählt<br />
werden. Jedes Objekt wird unabhängig von anderen Objekten ausgesprochen.<br />
Synthesizer-Zustände<br />
Die vier Grundzustände sind:<br />
• allocate<br />
• deallocate<br />
• queue empty<br />
• queue not empty<br />
Desweiteren gibt es ebenfalls die zwei Unterzustände von allocate (pause, resume).<br />
<strong>Speech</strong> Output Queue Der Status der Warteschlange wird durch queque empty<br />
bzw. queque not empty angegeben.<br />
4.1.4 SynthesizerListener<br />
Das Interface SynthesizerListener erweitert den EngineListener um zwei Methoden:<br />
• queueEmptied (SynthesizerEvent e) [Typ void]<br />
• queueUpdated (SynthesizerEvent e) [Typ void]<br />
Ein Queue Emptied Ereignis zeigt an, wenn dei Text-Queue leergelaufen ist, ein<br />
Queue Updated Ereignis zeigt an, ob sich die Warteschlange geändert hat.<br />
4.1.5 SynthesizerProperties<br />
Das Interface SynthesizerProperties erweitert EngineProperties um weitere runtime-Eigenschaften.<br />
Die Eigenschaften eines Synthesizers sind folgende:<br />
• Speaking voice
4 JAVA-SPEECH-SYNTHESIZE 25<br />
• Baseline pitch<br />
• Pitch range<br />
• Speaking rate<br />
• Volume<br />
Tab. 16: Methodenzusammenfassung des SynthesizerProperties<br />
float getPitchRange()<br />
ermittelt den Pegelbereich zur Synthese<br />
float getPitch()<br />
ermittelt den Grundpegel<br />
float getSpeakingRate()<br />
ermittelt die aktuelle Sprechrate<br />
voice getVoice()<br />
bestimmt die aktuelle Stimme des Synthesizer<br />
float getVolume()<br />
ermittelt die aktuelle Lautstärke<br />
void setPitchRange (float hertz) Setzt den Pegelbereich des Synth. in Hertz<br />
void setPitch (float hertz) Setzt den Grundpegel in Hertz<br />
void setSpeakingRate (float wpm) Setzt die Sprechgeschwindigkeit zur Synthese in<br />
Wörtern p. Minute<br />
void setVoice(Voice voice) Setzt die aktuelle Stimmlage<br />
void setVolume(float volume) Setzt die Lautstärke des Synthesizer (zwischen 0.0<br />
und 1.0). 0.0 bedeutet kein Ton
4 JAVA-SPEECH-SYNTHESIZE 26<br />
4.2 Klassen<br />
4.2.1 SynthesizerAdapter<br />
Der SynthesizerAdapter erweitert den EngineAdapter und implementiert<br />
SynthesizerListener. Es handelt sich um einen Adapter, der Ereignisse empfängt,<br />
die mit Synthesizer zusammenhängen. Die Methoden in dieser Klasse sind leer und<br />
nur dazu gedacht, auf einfache Art und Weise Listeners zu schaffen und die Klasse zu<br />
erweitern.<br />
Tab. 17: Methodenzusammenfassung des SynthesizerAdapter<br />
void queueEmptied(SynthesizerEvent e) Die Text-Warteschlange ist leer<br />
void queueUpdated(SynthesizerEvent e) Die Text-Warteschlange hat sich geändert<br />
4.2.2 SynthesizerEvent<br />
Die Klasse SynthesizerEvent erweitert die Klasse EngineEvent um einige Ereignisse,<br />
die speziell für Sprachsynthese verwandt werden. Es werden zwei Methoden<br />
aungegeben: zum einen getTopOfQueueChanged() [Typ boolean], die angibt, ob<br />
sich der Anfang der Warteschlange verändert hat oder nicht. Die zweite Methode<br />
ist param.String() [Typ java.lang.String]. Diese gibt einen Parameterstring<br />
zurück, der den entspr. Event beschreibt. Zu den beiden Methoden kommen noch<br />
drei Felder: Queue Emptied (Typ static int), Queue Updated (static int) und<br />
topOfQueueChanged (boolean). Der erste Wert zeigt an, ob die Queue leer ist, der<br />
zweite ob die sich verändert hat und der dritte Wert zeigt an, ob sich das erste Element<br />
der Queue verändert hat.<br />
4.2.3 SynthesizerModeDesc<br />
SynthesizerModeDesc erweitert EngineModeDesc um zwei Eigenschaften:<br />
• Eine Liste der vom Synthesizer zur Verfügung gestellten Stimmen<br />
• Die Definition der Stimme, die der Synthesizer beim Start lädt
4 JAVA-SPEECH-SYNTHESIZE 27<br />
Tab. 18: Methodenzusammenfassung der SynthesizerModeDesc<br />
void addVoice(Voice v)<br />
Fügt eine Stimme zu der Liste der bestehenden<br />
Stimmen hinzu<br />
boolean equals(java.lang.Object Liefert den Wert true zurück, wenn der Parameter<br />
nicht NULL ist<br />
anObject)<br />
Voice[] getVoices()<br />
Gibt eine Liste der verfügbaren Stimmen<br />
zurück<br />
boolean match(EngineModeDesc require) Bestimmt, ob ein SynthesizerModeDesc alle<br />
Features besitzt, die vom require-Objekt<br />
benötig werden<br />
void setVoices(Voice[] v)<br />
Bestimmt eine Liste von Stimmen<br />
4.2.4 SynthesizerQueueItem<br />
Die Klasse SynthesizerQueueItem repräsentiert ein Objekt in der Sprachausgabe-<br />
Queue eines Synthesizer. Das Quellobjekt wird von der speak methode zur Verfügung<br />
gestellt. Dabei kann es sich um ein ¨speakable-Object¨, eine URL oder einen String<br />
handeln.<br />
Tab. 19: Methodenzusammenfassung für SynthesizerQueueItem<br />
java.lang.Object getSource()<br />
Gibt das Quelle eines in der Sprach-Queue<br />
des Synthesizer befindlichen Objekts zurück<br />
SpeakableListener<br />
Gibt das SpeakableLinstener objekt<br />
getSpeakableListener()<br />
zurück, oder null, falls in der Speak Method<br />
keines definiert ist.<br />
java.lang.String getText()<br />
Gibt einen sprechbaren Text zurück<br />
boolean isPlainText()<br />
Gibt true zurück, falls es sich um reinen Text<br />
(kein <strong>Java</strong> <strong>Speech</strong> Markup Language) handelt<br />
4.2.5 Voice<br />
Die umfassenste Klasse innerhalb des Synthesizers ist die Klasse<br />
javax.speech.synthesis.Voice. Bei ihr handelt es sich um eine Beschreibung einer<br />
Ausgabestimme des Sprachsynthesizer. Eine aus 11 Feldern bestehende Liste<br />
ermöglicht es, die Stimme, die der Synthesizer annehmen soll, gezielt zu bestimmen.<br />
Es ist möglich, die Stimmcharakteristik des Synthesizers auf ein Kind im Alter von 12<br />
Jahren einzustellen, (AGE CHILD), auf einen Erwachsenen zwischen 40 und 60 Jahren,<br />
einen alten Erwachsenen, männlich oder weiblich, oder neutral einzustellen.
4 JAVA-SPEECH-SYNTHESIZE 28<br />
Beispiel<br />
import javax.speech.*;<br />
import javax.speech.synthesis.*;<br />
import java.util.Locale;<br />
}<br />
class sprachsynthese {<br />
static Synthesizer synthesizer;<br />
static AudioListener audioListener;<br />
static EngineListener engineListener;<br />
public static void main(String[] args) throws Exception {<br />
//mache eine neue EngineModeDesc<br />
SynthesizerModeDesc desc = new SynthesizerModeDesc();<br />
//mache neues Voice-Objekt<br />
Voice voice = new Voice();<br />
//setzte das geschlecht (weiblich) und das alter (sehr alt)<br />
voice.setGender(2);<br />
voice.setAge(69);<br />
//füge voice zu den bestehenden Voice-Objekten hinzu<br />
desc.addVoice(voice);<br />
//setzte als Locale Deutsch<br />
desc.setLocale(Locale.GERMAN);<br />
//Erzeuge den Synthesizer<br />
Synthesizer synthesizer = Central.createSynthesizer(desc);<br />
synthesizer.allocate();<br />
synthesizer.speakPlainText( "<br />
Das ist ein Test\, null);<br />
synthesizer.waitEngineState(synthesizer.QUEUE EMPTY);<br />
synthesizer.deallocate();<br />
}