Mein Smartphone hat einen IR-Sender. Mit diesem habe ich bereits eine Fernsteuerung für mein Fernsehgerät entwickelt. Ziel ist es, die per Sprachbefehl anzusteuern. Der MIT App Inventor besitzt die Komponente SpeechRecognizer. Dieser arbeitet aber leider nicht kontinuierlich und gibt beim Start und am Ende einen nervigen Ton aus. Die hier gezeigte Extension arbeitet kontinuierlich und man kann die Töne abschalten.
Version | Anpassungen |
---|---|
1.0 (2021-03-13) | Initiale Version |
1.1 (2022-02-16 | Fehler bei Android 11 behoben. Property isRecognitionAvailable hinzugefügt. Methode Stop korrigiert. |
1.2 (2022-09-01) | Eigenschaft Language hinzugefügt. |
Inhaltsverzeichnis
Das ZIP-Archiv UrsAI2ContinuousSpeech zum Download. Das Archiv enthält den Quellcode, das kompilierte Binary zum Upload in den App Inventor und eine Beispiel-Anwendung.
Über die Eigenschaft SoundEnabled kann der Ton ab- und angestellt werden. Dazu wird der Audio-Stream für System-Signale stumm geschaltet bzw. die Lautstärke zurück gesetzt. Wenn der Screen, der die Komponente enthält, gelöscht wird (onDestroy), wird automatisch die Spracherkennung abgeschaltet und der Ton wieder angeschaltet. Der Ende-Ton des Android SpeechRecognizer wird verzögert ausgegeben. Es kann sein, dass Android das Wiederanschalten des Tons vor dem Auslösen des Ende-Tons ausführt. Man hört dann den Ende-Ton.
Start und Stop starten und stoppen die Spracherkennung. Die Android SpeechRecognizer-Komponente bietet leider keinen kontinuierlichen Betrieb. Intern wird die Spracherkennung noch jedem Abbruch solange direkt wieder neu gestartet, bis der Aufruf der Funktion Stop diese Schleife abbricht. Bis zum Neustart können kurze, wenige Millisekunden dauernde Erkennungspausen entstehen. Diese habe sich aber in den Tests nicht nachteilig ausgewirkt.
Das Ereignis OnResult liefert das Ergebnis der Spracherkennung. Es wird ausgelöst, wenn der der Sprecher eine Sprechpause macht. OnPartialResult liefert Zwischenergebnisse der Spracherkennung. Es wird in etwa nach jedem erkannten Wort ausgelöst.
Intern ist der Ablauf in etwa folgender:
Das Beispiel erkennt Sprachbefehle und setzt sie in IR-Codes zur Bedienung meines Fernsehgeräts um. Benutzte Komponenten:
|
Gleich beim Initialisieren werden KeepAlive ein-, der Ton ab- und die Spracherkennung eigeschaltet:
Die eigentliche Sprachauswertung erfolgt im Ereignis OnPartialResult. Dieses Ereignis liefert die notwendigen Daten etwas früher als OnResult.
Es ist nicht der gesamte Befehlssatz aus dem Fernbedienungsbeispiel implementiert, sondern nur einige Beispielbefehle.
Die Prozedur CheckCommand übernimmt die Auswertung der Spracherkennung:
Text ist das Ergebnis der Spracherkennung, Command das Sprachkommando, gegen das geprüft werden soll und Code ein Index in eine Liste mit IR-Codes. Wurde ein Treffer gefunden, wird zuerst die Spracherkennung abgeschaltet. Dies ist notwendig, weil gleich darauf eine Sprachausgabe erfolgt, die nicht als eigener Input dienen soll. Die Prozedur CallAction sendet den mit Code verbundenen IR-Code. Zuletzt wird "ok" über die Sprachausgabe ausgegeben.
Die globale Variable IsSpeaking regelt das Wiederanschalten der Spracherkennung. Meist wird das Ereignis OnResult, bei dem die Spracherkennung wieder gestartet werden muss, vor dem Ende der Sprachausgabe ausgelöst. Bei einem erkannten Kommando soll die Spracherkennung aber erst nach dem Ende der Sprachausgabe erfolgen.
Für die Erstellung eigener Extensions habe ich einige Tipps zusammengestellt: AI2 FAQ: Extensions entwickeln. Auf der Seite findet man noch weitere Hinweise.