Skip to content

Entwicklungsprobleme

Rookfighter edited this page Jul 2, 2014 · 4 revisions

Entwicklungsprobleme

pocketsphinx

ALSA

Pocketsphinx konnte die Mikrofonverstärkung des Audiogeräts nicht einstellen / ändern, wodurch sich die Sprachaufnahmen wohl überschlagen haben. Dadurch konnten Worte nicht korrekt interpretiert werden.

Beispiel:

Es wird "Light" gesagt, ausgegeben wird aber "Light Light Light On On Light On". Dies deutet auf ein stark verrauschtes Signal (zu hohe Verstärkung) oder ein kaum wahrnehmbares Signal (zu niedrige Verstärkung) hin.

Abhilfe hat hier die Installation von libasound2-dev gebracht. Auch wenn diese Bibliothek nicht installiert ist, kompiliert Pocketsphinx anstandslos. Zur Laufzeit kommt jedoch die Warnung, dass die Mikrofonverstärkung nicht eingestellt werden konnte. Nach Installation der Bibliothek, müssen pocketsphinx und sphinxbase komplett gelöscht und die Schritte zu deren Installation wiederholt werden. Der Fehler sollte daraufhin verschwinden.

Trotzdem taucht weiterhin eine Warning auf, die besagt, dass kein Audiogerät gefunden wurde. Dies ist jedoch ein bekannter Bug in pocketsphinx und hat nichts auszusagen. Das Aufnehmen und Interpretieren der Audiodaten wird trotzdem richtig ausgeführt. Die Warning kann ignoriert werden.

Schlechte Spracherkennung

Die Vergrößerung des AudioBuffers, der zur Übertragung der Sprachdaten zwischen InputThread und InterpreterThread genutzt wird, auf 16k mal int16 war notwendig, da der Buffer sonst zu kurz war, um die Befehle aufzunehmen. Aufgrund des kleinen Puffers sind in vorherigen Tests auch einige Befehle verloren gegangen.

Der Aufruf der Funktion ps_process_raw(p_thread->psDecoder, buffer->buffer, buffer->size, 0, 1); sollte als letztes Argument true erhalten. Damit wird Pocketsphinx mitgeteilt, dass der übergebene Puffer sämtliche Audiodaten für die Interpretation des Befehls beinhaltet und nichts weiter dazu kommt. Dadurch wird die Sicherheit und Effizienz der Interpretation erhöht.

Der Pocketsphinxdecoder muss vor den Audiodevices initialisiert werden, damit die Konfigurationen, die nur (!) an den Decoder übergeben werden, auch für die Devices übernommen werden. Es handelt sich laut der Pocketsphinxdokumentation um eine globale Konfigurationseinheit.

Die Sprachaufnahme muss etwas länger stattfinden, als eigentlich gesprochen wird. Durch das loslassen der Aufnahemtaste wird für Pocketsphinx das Aufnehmen beendet. Aufgrund von Verzögerungen durch Treiber und das Betriebsystem sind aber noch nicht alle Audiodaten, die im Mikrofon eingegangen sind, auch in Pocketsphinx angekommen. Daher muss Pocketsphinx etwas länger aufnehmen als gesprochen wird, was sehr unintuitiv ist. Wird dieser Aspekt nicht beachtet, werden Befehle höchstwahrscheinlich gar nicht oder falsch interpretiert. Nachtrag: Die Bedienung per Taste wurde wieder verworfen, da das oben beschriebene Verhalten sehr unintuitiv war. Durch richtige Einstellung der Parameter für Pocketsphinx arbeitet das System in einem Autorecord Modus sowieso viel schneller und präziser als es mit Usereingaben möglich wäre.

Einstellungen

Pocketsphinx registriert Input recht langsam (3,5 bis 6 Sekunden), daher müssen die Einstellungen für pocketsphinx geändert werden. Mit dem Tool pocketsphinx_batch lassen sich alle Argumente für pocketsphinx und deren Default-Werte ausgeben. Für gute Einstellmöglichkeiten, um pocketsphinx schneller zu machen, kann hier nachgeschaut werden. Bei richtiger Einstellung sind Aufnahme und Interpretation in unter 1 Sekunde machbar.

Auf Desktoprechnern ist meist Pulseaudio installiert. Dieses wird von Pocketsphinx vorzugsweise verwendet. Jedoch erfolgt die Sprachaufnahme mit Pulseaudio sehr viel langsamer als mit ALSA. (Sub- ) Realzeit ist nur mit der Verwendung von ALSA möglich. Dazu muss Pulseaudio komplett deinstalliert und Pocketsphinx und Sphinxbase neu kompiliert werden.


Allegro

Allegro legt ein eigenes Signalhandling während allegro_init() an. Daher müssen die eigenen Signale nach dem Aufruf dieser Funktionen gesetzt werden, sonst werden sie von Allegro überschrieben.


Threading

Sphinx legt für jedes Audiodevice einen eigenen Thread an. Damit dieser Thread die gleichen Eigenschaften (z.B. Priorität) wie der Input Thread hat, muss das AudioDevice im InputThread initialisiert werden. Der Sphinx Thread erbt die Eigenschaften vom erzeugenden Thread.

Allegro legt ebenfalls während allegro_init() einen eigenen Thread an. Auch hier muss das Anlegen im Simulation Thread geschehen, damit der Allegro Thread die Eigenschaften erbt.