DIPLOMARBEIT
DIPLOMARBEIT
DIPLOMARBEIT
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