Im letzten Artikel wurde bereits ein erster Blick auf die Vorabversion der Java Speech API 2, deren Nutzung und die wesentlichen Unterschiede zur JSAPI 1.0 geworfen. Trotz der Bestrebungen von Conversay, dem Specification Lead, wie den Launch einer Entwicklerplattform Conversations und der Verleihung des Java Rock Star Awards auf der Java One 2007 war es eher ruhig um die zweite Version der Java Speech API. Nun aber wurde der JSR 113 beendet und die Java Speech API 2 finalisiert. Das folgende Listing zeigt noch einmal das zusammengefasste Beispiel aus dem letzten Artikel inklusive der Änderungen, die zur Anpassung nötig waren.
import javax.speech.*;import javax.speech.recognition.*;import javax.speech.synthesis.*;public class Jsapi20Demo implements ResultListener {…public void startApp() {SpeechLocale german = new SpeechLocale("de");try {// Deutschen Erkenner erzeugenRecognizerMode recMode = new RecognizerMode(german);Recognizer rec = (Recognizer) EngineManager.createEngine(recMode);// Erkenner startenrec.allocate();// Grammatik laden und aktivierenString grammarMarkup = "<grammar root='sentence' xml:lang='de'"+ "version='1.0' "+ "xmlns='http://www.w3.org/2001/06/grammar'>"+ "<rule id='sentence' scope='public'>"+ "<one-of><item> Erdbeere </item><item> Vanille </item>"+ "<item> Schokolade </item></one-of>"+ "</rule></grammar>";RuleGrammar gram = rec.loadRuleGrammar("icecream", grammarMarkup);// Listener bekannt machen, um das Ergebnis zu erhaltenrec.addResultListener(this);// Fokus auf den Erkenner und lauschenrec.requestFocus();rec.resume();// Anweisungen ausgeben, sobald der Erkenner soweit istrec.waitEngineState(Engine.RESUMED);// Deutschen Synthesizer erzeugenSynthesizerMode synMode = new SynthesizerMode(german);Synthesizer synth = (Synthesizer)EngineManager.createEngine(synMode);// Bereitmachen, um etwas auszugebensynth.allocate();// Sprich!synth.speakMarkup("<speak version='1.0' xml:lang='de'>"+ "Welches ist Ihr Lieblingseis?></speak>", null);} catch (Exception e) {e.printStackTrace();}}public void resultUpdate(ResultEvent event) {switch (event.getId()) {case ResultEvent.RESULT_ACCEPTED:FinalRuleResult result = (FinalRuleResult) event.getSource();Result r = (Result) (event.getSource());ResultToken tokens[] = r.getBestTokens();// Erkannte Antwort ausgebenfor (int i = 0; i < tokens.length; i++) {System.out.print(tokens[i].getText() + " ");}System.out.println();break;}}}
In diesem Beispiel wird die Benutzerin nach ihrer Lieblingseissorte gefragt, was diese mit einer der gängigen Sorten Erdbeer, Schokolade oder Vanille natürlich sprachlich beantworten kann. Ihre Eingabe wird anschließend auf der Konsole ausgegeben.
Java Speech API: Demo herunterladen
Eine Demo zur Java Speech API im Zip-Format gibt es hier.
Die Änderungen, die mit der finalen Version einhergingen, sind marginal. Dennoch ist seit dem Final Approval Ballot fast ein Jahr ins Land gegangen, bevor die API im JSR 113 die letzte Hürde nahm und nun in der finalen Version vorliegt. Der Final Approval Ballot ist die letzte Stufe im JSR der in der geschlossenen Expertengruppe stattfindet. Innerhalb dieser Runde werden ein TCK (Technology Compatibiltiy Kit) und eine RI (Reference Implementation) entwickelt. Die RI muss entwickelt werden, um zu gewährleisten, dass die API tatsächlich implementierbar ist und dass es keine Lücken in der Spezifikation gibt, die im Allgemeinen als JavaDoc vorliegt. Das TCK stellt eine Testumgebung zur Verfügung, die das Verhalten der Implementierung entsprechend der Spezifikation testet. Anschließend wird das Ergebnis dem PMO (Program Management Office), das ist in der Regel SUN, vorgestellt, um den JSR zu schließen. Genau in dieser Phase scheint es aber Probleme gegeben zu haben. Diese Probleme werden eingefleischte JavaianerInnen beim ersten Blick auf die API-Dokumentation sehen:




