05.11.2013 Aufrufe

Entwicklung einer Automatenbedienung mit einer leistungsfähigen ...

Entwicklung einer Automatenbedienung mit einer leistungsfähigen ...

Entwicklung einer Automatenbedienung mit einer leistungsfähigen ...

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.

Hier könnte man auf die Idee kommen, AudioManager im asrLib- Projekt global zu<br />

deklarieren, da<strong>mit</strong> alle Komponente ihn bei Bedarf verwenden können, ohne diese<br />

aufwendige Übergabe machen zu müssen. Es kann aber vorkommen, dass man die<br />

Daten über Mikrofon <strong>mit</strong> 8 kHz aufnehmen möchte, dabei aber nur die 16 kHz- Daten<br />

für die Ausgabe über die Lautsprecher zur Verfügung hat. In diesem Fall müssen<br />

mindestens zwei AudioManager erstellt werden, einen für die Aufnahme und einen für<br />

die Ausgabe. Bei dem Start von jedem Dialogsystem wird StateMachine erstellt und<br />

initialisiert, dabei wird eine Schnittstelle für die Audioausgabe über die Lautsprecher in<br />

der Action „INIT“ (ist in der Funktion „StateMachine::initialize()“ festgelegt, unter<br />

„src/StateMachine/StateMachine.cpp“, muss also in der Konfigurationsdatei nicht extra<br />

angegeben werden) als Property „SOUNDCARD_FRONTEND“ an StateMachine<br />

automatisch angehängt. AudioManager bekommt hier Standardeinstellungen (Frequenz<br />

8000, Datentyp INT16, Abtastwerte 200). Man kann diese Einstellungen jede Zeit in der<br />

Konfigurationsdatei <strong>mit</strong> „INIT“ ändern. „ISDN_FRONTEND“ hat eine höhere Priorität,<br />

„SOUNDCARD_FRONTEND“ wird erst dann für die Audioausgabe verwendet, wenn<br />

die erste Komponente nicht vorhanden ist.<br />

Es ist schon klar, dass man zwei unterschiedliche AudioManager für die Aufnahme und<br />

Audioausgabe verwenden soll. Ein weiteres Problem tritt auf, wenn man zwei, oder<br />

noch schlimmer, mehrere, Spracherkenner <strong>mit</strong> Modellen <strong>mit</strong> unterschiedlichen<br />

Frequenzen bei <strong>einer</strong> parallelen Erkennung einsetzen möchte. Die Lösung ist, bei jedem<br />

Spracherkennungssystem ein eigenes „SOUNDCARD_FRONTEND“ <strong>mit</strong> eigenem<br />

AudioManager zu erstellen. Dabei wird es als Property <strong>mit</strong> dem Namen<br />

„AudioFrontend“ (für die bessere Unterscheidung) dem Spracherkennungssystem<br />

zugewiesen und nicht mehr der StateMachine. Alle Bedingungen bleiben erhalten.<br />

Eine weitere wichtige Einstellung für AudioManager ist der Zeitintervall für einen<br />

iterativen „Wecker“, der wie folgt gesetzt wird („* 1000.0“ für Millisekunden):<br />

audioManager->setTimeStep((float)frameSize / (float)sampleRate * 1000.0);<br />

Bei einem Verhältnis der Anzahl der Abtastwerte zur Frequenz von 1 zu 40 (200/8000)<br />

wird die Funktion „ASRApplication::onTimer()“ unter „src/ASR/ASRApplication.cpp“<br />

alle 25 ms von diesem Wecker aufgerufen. Der Wecker wird zusammen <strong>mit</strong> dem<br />

Spracherkennungssystem gestartet und gestoppt. Das ist ein selbständiger Prozess, der<br />

<strong>mit</strong> Hilfe von POCO ausgeführt wird und parallel zum Dialogsystem läuft. Die von<br />

Seite 35

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!