Hallo Leute,
folgendes Szenario:
Ich habe einen Raum, in welchem in jeder Ecke ein Mikrofon angebracht
ist.
Ziel ist es, dass der User später sich frei im Raum bewegen kann und
Sprachbefehle absetzen kann, die von den Mikros aufgenommen werden und
über eine zentrale Recheneinheit ausgewertet wird.
So jetzt ist aber folgendes Problem: Je nachdem wo sich der User grad im
Raum befindet, nimmt ein Mikrofon u.U. das Signal besser auf als ein
Mikrofon in einer anderen Ecke.
Ziel ist es, eine Software zu schreiben, die erkennen kann, welches
Mikrofon "am besten geeignet ist", um das Signal auszuwerten.
Nicht falsch verstehen: Hier geht es nicht darum ein Algorithmus zu
schreiben der Spracherkennung macht, sondern um einen Algorithmus der
erkennen kann welches der 4 Signale am besten geeignet wäre um es in
eine Spracherkennung zu stopfen.
Jetzt hatte ich mir folgende Ansätze überlegt:
1. Man misst von jedem Mikrofon den aktuell anliegenden Pegel und wählt
immer das Mic aus mit dem höchsten Mikrofonpegel.
Problem hierbei: Wird irgendwo in einer Ecke ein Staubsauger aktiviert
führt das quasi zu falschen Informationen.
2. Man nimmt die Signale der 4 Mikrofone und lässt eine FFT darüber
laufen und erkennt evtl. an einzelnen Frequenzpeaks ob es sich bei
diesem Mikrofon um Sprache handelt oder eben nicht.
Eine FFT habe ich schon implementiert dazu, funktioniert auch, nur: Wie
werte ich das sinnvoll aus?
Jetzt wollte ich mich mal fragen was Ihr für Ideen oder Ansätze dazu
hättet?
Erfahrung im Bereich digitaler-audio-Verarbeitung sind da.
Also irr/fir Filter, fft, audiostreaming habe ich alles schonmal
implementiert.
Ich weiß nur nicht so recht wie ich das Signal richtig analysieren soll.
Danke & Gruß
werte doch alle vier Signale mit dem Algorithmus aus, der die
Spracherkennung macht.
Damit kannst sicher am besten erkennen, ob es sich um Sprache handelt.
Schau dir mal an, wie man mit Antennen- oder Mikrofonarrays eine
Richtwirkung erzielen kann. Das ist vermutlich genau das, was du willst.
Grundsätzlich funktioniert das so, dass man ein Modell aufstellt, das
die Signallaufzeit zu den einzelnen Mikrofonen in Abhängigkeit zur
Position der Signalquelle errechnet. Das gemessene Signal wird dann für
jede mögliche Position entsprechend zeitversetzt und mit den anderen
Mikrofonen korreliert. Diejenige Position, welche die höchste
Korrelation ergibt, ist die Position der Signalquelle.
Mathematisch/rechenmässig einfacher als mit 4 Mikrofonen in der Ecke
geht das aber mit 4 Mikrofonen in einem linearen Array.
Ich würde mit folgendem Ansatz beginnen:
Die vier Mikrofone werden so angeordnet, dass sie idealerweise an den
Eckpunkten eines Tetraeders oder – falls dies nicht möglich ist –
zumindest nicht näherungeweise in einer Ebene liegen. Dadurch gibt es zu
jeder Position einer Schallquelle im Raum ein charakeristisches
Quadrupel aus absoluten bzw. ein Tripel aus relativen Laufzeiten.
Wenn du jetzt für eine Position (x,y,z) im Raum für jedes der vier
Mikrofone die Distanz berechnest, die vier empfangenen Schallsignale ei
(i = 1..4) um die entsprechende Laufzeit verschiebst, die verschobenen
Signale unter Berücksichtigung der abstandsabhängigen Schalldruckabnahme
gewichtet zu einem Summensignal s(x,y,z) zusammenaddierst und dieses
über einen bestimmten Zeitbereich quadratisch mittelst, erhältst du ein
Maß p(x,y,z) für den ausgesandten Schallpegel unter der Annahme, dass
nur eine einzige Schallquelle existiert und diese sich genau an der
betrachteten Position befindet.
Existiert tatsächlich nur eine einzige Schallquelle im Raum, wird die
Funktion p(x,y,z) an der Position (x1,y1,z1) der Schallquelle ein
deutliches globales Maximum aufweisen, und das Summensignal s(x1,y1,z1)
entspricht den zeitverschobenen Einzelsignalen multipliziert mit einem
konstanten Faktor. Da das Signal keine Störgeräusche enthält, sollte der
Spracherkennungsalgorithmus problemlos damit zurechtkommen.
Existieren hingegen mehrere Schallquellen an den Positionen (xj,yj,zj)
(für j = 1..n), so wird p(x,y,z) an jeder dieser Positionen ein lokales
Maximum aufweisen. Jedes empfangene Signal ei ist eine gewichtete Summe
der zeitverschobenen Quellensignale. Ist die Anzahlder Quellen kleiner
oder gleich der Anzahl der Mikrofone, kannst du die Quellensignale aus
den Empfangssignalen rekonstruieren. Ist die Anzahl der Quellen größer,
kannst du sie zumindest statistisch schätzen. Eine ganz passable
Schätzung sind schon die Summensignale sj = s(xj,yj,zj), denn sie
enthalten das jeweils von der Quelle j ausgesandte Signal um den Faktor
4 verstärkt, während die Signale der anderen Quellen abgeschwächt
werden. Vermutlich gibt es aber noch bessere Schätzfunktionen.
Über jedes der rekonstruierten bzw. geschätzten Quellensignale lässt du
den Spracherkennungsalgorithmus laufen, der – wenn er ordentlich gemacht
ist – nicht nur den erkannten Text, sondern auch einen zugehörigen
Konfidenzwert liefert. Der Text mit dem höchsten Konfidenzwert ist das
gesuchte Ergebnis.
Als weiteres Ergebnis erhältst du die Position des Sprechers, mit der du
bei der nächsten Signalauswertung die Zuverlässigkeit der Auswahl der
relevanten Schallquelle bei mehreren ähnlichen Konfidenzwerten erhöhen
kannst. Wenn du es ganz toll machen willst, kannst du auch noch eine
Bewegungsschätzung für den Sprecher einbauen für den Fall, dass er im
Raum umhergeht.
Dieser Ansatz ist prinzipiell auch dafür geeignet, zwei oder mehr
gleichzeitig sprechende Personen an verschiedenen Positionen getrennt
voneinander auszuwerten.
Das Ganze hört sich jetzt vielleicht ein Bisschen einfacher an, als es
tatsächlich ist. In der Praxis treten – wie so oft – die verschiedensten
Dreckeffekte auf:
- Die Schallquellen sind nicht punktförmig.
- Der Weg des Schalls ist nicht immer geradlinig, es treten auch
Reflexion und Beugung auf.
- Die Dämpfung der Schallsignale in der Luft ist nicht nur abstands-,
sondern auch frequenzabhängig.
- Die Abtastrate des Auswertesystems ist begrenzt.
- ... (weitere Effekte wirst du spätesten bei der Umsetzung erkennen)
Einen Teil dieser Effekte kannst du dadruch reduzieren, dass du die
betrachetete Bandbreite vor vornherein auf die für die Spracherkennung
relevante beschränkst (ein paar Hundert Hz bis ein paar kHz).
Ansonsten kann man in solchen Fällen viel mit Statistik geradebiegen.
Ich glaube, dass es zu dem Thema auch schon beliebig viel Literatur
gibt. Die zu finden dürfte im Internetzeitalter ja nicht allzu schwer
sein.
Wenn nur 4 Mikrofone in den Raumecken vorhanden sind, dann ist Auswahl
des besten Mikrofons tatsächlich das einzig sinnvolle. Was Yalu
beschreibt funktioniert zwar theoretisch, praktisch in diesem Szenario
aber nicht, hauptsächlich weil ein realer Raum reflektierende Wände hat
und der Sprecher keine omnidirektionale Punktquelle ist. Die
Lokalisierung mit steered response power (so nennt man das beschriebene
Verfahren) wird da ziemlich wild aussehen, und Beamforming (kohärente
Addition der Mikrofonsignale) wird kaum einen messbaren Gewinn gegenüber
dem besten Mikrofon bringen, selbst wenn man die Position der Quelle
genau genug bestimmen könnte.
Leistungsbasierte Auswahl des Mikrofons ist in erster Näherung schon
ganz gut, Gewichtung mit dem Sprachspektrum hilft, es gibt aber
natürlich noch ausgefeiltere Methoden. Literatur dazu solltest du unter
den Begriffen "microphone selection" und "voice activity detection"
finden. Noch besser ist der schon vorgeschlagene Ansatz, die
Konfidenzmaße des Spracherkenners zu verwenden - so man an diese
herankommt. Wichtig beim Spracherkenner ist auch, dass er für das
Erkennen von verhallter Sprache optimiert ist, sonst geht die
Erkennungsrate schnell in den Keller.
Auf jeden Fall sollte man sich bei dem Vorhaben bewusst sein, dass an
dem Problem schon andere mit mehr Ressourcen gearbeitet haben und
arbeiten (z.B. EU-Projekte DICIT, DIRHA), und es noch immer keine
marktreife Lösung gibt. Das Ganze ist also nicht so einfach.