31.10.2012 Aufrufe

DIPLOMARBEIT

DIPLOMARBEIT

DIPLOMARBEIT

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

3.4 Verbinden der Komponenten<br />

Die Warteanweisung muss vor jedem Zugriff auf den Puffer ausgeführt werden. Deshalb wird sie in<br />

der Methode readSamples() der Klasse JAudio unmittelbar vor dem Zugriff auf den Puffer<br />

eingefügt:<br />

Solange keine Daten im Puffer vorliegen, wird eine Schleife ausgeführt. Bei jedem Durchgang wird<br />

das Betriebssystem angewiesen, die Ausführung für 100 Millisekunden zu unterbrechen. Wurden in<br />

dieser Zeit Daten in den Puffer geschrieben, so wird die Schleife beim nächsten Durchgang abgebro‐<br />

chen und es kann mit dem Einlesen der Audiodaten begonnen werden. Die Methode<br />

Thread.sleep() kann die Ausnahme InterruptedException auslösen, wenn der Warte‐<br />

vorgang frühzeitig beendet wird. Deshalb ist es hier nötig den Aufruf mit einem try‐catch‐Block zu<br />

umgeben, um die potentielle Ausnahme abzufangen.<br />

Das Problem des leeren Puffers ist damit behoben.<br />

3.4.1.3.2 Unterschiede im Audio‐Format<br />

Das zweite Problem besteht darin, dass die empfangen Audiodaten in einem anderen Format vorlie‐<br />

gen als in dem, welches der Spracherkenner erwartet und dieser somit das Audiosignal falsch zu‐<br />

sammensetzt.<br />

Codierung Vorzeichen Byte‐Reihenfolge Abtastrate Auflösung Kanäle<br />

Spracherk. Linear PCM Signed Big Endian 16000 Hz 16 bit Mono<br />

VoIP‐Client Linear PCM Signed Little Endian 8000 Hz 16 bit Mono<br />

Tabelle 12: Audioformate von Spracherkenner und VoIP‐Client<br />

Die Formate unterscheiden sich in der Byte‐Reihenfolge (Little/Big Endian) und in der Abtastrate<br />

(8000/16000 Hz). Bei der Byte‐Reihenfolge kann entweder das niedriger‐wertige Byte an der letzten<br />

Position stehen (Little Endian) oder das höher‐wertige Byte (Big Endian). Wird die Reihenfolge falsch<br />

interpretiert, so erhält man einen anderen Zahlenwert.<br />

Beispiel: Interpretation der Byte‐Folge A3 04<br />

70<br />

byte[] data = new byte[BUFFSIZE];<br />

while (aBuffer.dataAvailable() == 0){<br />

try {<br />

Thread.sleep(100);<br />

} catch (InterruptedException e) {<br />

// TODO Auto-generated catch block<br />

e.printStackTrace();<br />

}<br />

}<br />

numBytesRead = aBuffer.read( data, 0, data.length );<br />

Little Endian: �3 04 � �10 � 16 � �3�16 � � � �0 �16 � �4�16 � � � 41732<br />

Big Endian: �3 04 � �10 � 16 � �3�16 � � � �0 �16 � �4�16 � � � 1187

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!