27.01.2015 Aufrufe

Java-Speech-Spezifikation

Java-Speech-Spezifikation

Java-Speech-Spezifikation

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 />

}

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!