Rauschunterdrückung mit parameterarmen neuronalen Netzen

Im Rahmen meiner Bachelorarbeit bei Ingenics Digital habe ich mich intensiv mit dem Thema Rauschunterdrückung beschäftigt. Vergleicht man klassische Algorithmen mit neuronalen Netzen in Bezug auf die Performance, so wird sichtbar, dass es mit neuronalen Netzen möglich ist, auch stark beeinträchtigte Sprachaufnahmen von nahezu allen Störgeräuschen zu befreien. Mit klassischen Algorithmen zur Rauschunterdbückung ist das in vergleichbarer Qualität nicht möglich. Erkenntnis gewonnen, Arbeit fertig!? Nein, so einfach ist es natürlich nicht. Problematisch wird es, wenn der angestrebte Anwendungsbereich der Netzwerke -- wie auch bei meiner Arbeit -- eingebettete Systeme sind. Die höhere Qualität, die die Netzwerke mit sich bringen, kommt nämlich nicht umsonst. Je nach Art des Netzwerkes werden zwischen 20 MB und 120 MB an Speicherplatz belegt. Für übliche Mikrocontroller ist selbst die Belegung von 20 MB schlichtweg unpraktikabel. Insbesondere wenn man beachtet, dass Speicherzugriffe den höchsten Einfluss auf den Energieverbrauch des Controllers haben. Ziel der Arbeit war es daher ein Netz zu entwickeln, das sich von der Größe her im Bereich von unter einem MB bewegt.

Basis der Netzarchitektur

Den Ausgangspunkt für Anpassungen und Verkleinerungen liefert das SkiM Netz. Hierbei handelt es sich um eine Architektur, die bei größer angelegten Vergleichstests hervorragende Ergebnisse erzielt hat, sich von der Größe her mit 24,01 MB aber noch in einem Bereich befindet, der Spielraum für Skalierungen nach unten lässt.

Signalfluss in a nutshell

Abb. 1 zeigt den grundsätzlichen Aufbau des SkiM-Netzes. Das Netz kann in die drei Hauptelemente Encoder, Decoder und Separator unterteilt werden. In der Konfiguration des ursprünglichen Papers nimmt der Encoder eine 1D-Faltung auf die Eingangssequenz vor und erhöht die Kanalanzahl von 1 auf 256. Das heißt, die Daten werden auf 256 verschiedene Arten abgebildet. Jede encodierte Eingangssequenz wird dann in S Segmente unterteilt. Diese Segmente bilden die lokale Information der Audiodatei ab und werden getrennt voneinander durch LSTM-Module (Seg-LSTM) bearbeitet. Die in einer Schicht vorhandenen Seg-LSTM-Module werden gleich parametrisiert. Pro Schicht ist dadurch nur ein Satz an Parametern für eine beliebige Anzahl an Seg-LSTM-Zellen notwendig. Alle Zellstatus der lokalen Seg-LSTM werden dann wiederum als Sequenz zusammengefasst und von einem globalen LSTM-Modul, dem Mem-LSTM verarbeitet. Seine Ausgangsdaten sendet das Mem-LSTM dann an die Eingänge der nächsten Schicht an Seg-LSTM-Modulen. Diese Verarbeitungskette kann nun sequenzeiell in mehreren Blöcken hintereinandergeschaltet werden. Weil das Mem-LSTM-Modul seine Informationen nur weiterleiten kann, wenn eine weitere Schicht Seg-LSTM folgt, ist die Anzahl an Mem-LSTM immer um eins geringer als die Anzahl vorhandener Seg-LSTM-Verarbeitungsblöcke.

SkiM Architektur
SkiM Architektur

Quelle: Umgezeichnet nach: Chenda Li et al. SkiM: Skipping Memory LSTM for Low-Latency Real-Time Continuous Speech Separation. en. arXiv:2201.10800 [cs, eess]. Feb. 2022. url: http://arxiv.org/abs/2201.10800 (visited on 10/01/2023).

Abb. 1: Aufbau des SkiM Netzes. Encoder und Decoder sind jeweils in weiß dargestellt. Der Separator, das heißt der Teil des Netzwerks, der für die Trennung von Sprache und Störgeräusch zuständig ist, ist blau und rot eingefärbt. Für die Bearbeitung wird die encodierte Eingangssequenz e in S Segmente unterteilt.

Für die originale Konfiguration, werden vier solcher Blöcke hintereinander geschaltet. Daraus resultierend werden drei Instanzen von Mem-LSTM erzeugt. Alle LSTM arbeiten mit einer versteckten Dimension von 256. Nach dem Durchlauf der Blöcke werden die Ausgänge der letzten Seg-LSTM-Schicht verkettet. Ähnlich wie der Encoder führt der Decoder eine transponierte Faltung auf die verkettete Sequenz durch, reduziert die Kanalzahl zurück von 256 auf eins und erzeugt eine Sequenz mit derselben Länge der ursprünglichen Eingangssequenz. Die lokalen Segmente werden auf eine Länge von 150 Werten eingestellt. Mit dieser Konfiguration hat das Modell sechs Millionen trainierbare Parameter und belegt 24,01 MB Speicher.

Anpassungen am Netz

Um die Anzahl an Parametern zu reduzieren, gibt es mehrere mögliche Ansätze. Der wohl Intuitivste ist, die Anzahl an versteckten Dimensionen zu reduzieren, mit denen das Netz arbeitet. In den Konfigurationen für meine Arbeit habe ich mit einer Eingangsdimension von 32 Kanälen und einer versteckten Dimension von 64 Kanälen gearbeitet. Dadurch reduziert sich die Größe des SkiM Netzes ohne weitere Anpasungen schon auf 1,37 MB. Die tiefgehenderen und komplexeren Anpassungen betreffen die tatsächliche Netzarchitektur. Der 1D-Encoder belegt bereits relativ viele Parameter. Hier kann man die Anzahl an benötigten Parametern stark reduzieren, wenn man statt regulärer 1D-Faltungen Sinc-Faltungen nutzt. An dieser Art von Faltungen haben bei Ingenics Digital GmbH bereits Ludwig Kürzinger (Einbindung in das ESPNet Framework) und Niklas Günther (Small Footprint Keyword Spotting) gearbeitet. Neben dem Encoder habe ich auch die Architektur des Separators in verschiedenen Experimenten angepasst. Statt der LSTM-Module habe ich untersucht, wie sich das Netz mit dem Einsatz von Transformern und Conformern verhält. Transformer sind auf die Verarbeitung von Sequenzen spezialisiert und werden auch im bekannten ChatGPT (Generative Pre-trained Transformer) für die Textverarbeitung genutzt. Im Kern arbeiten Transformer vorrangig mit Matrixmultiplikationen. Conformer erweitern die Transformer Architektur um ein internes Faltungsmodul, was es ihnen ermöglicht, lokale Informationen besser zu verarbeiten als reguläre Transformer. Sie wurden erstmalig für die Verarbeitung von Audiodateien entworfen. Weil weder der Transformer noch der Conformer Probleme mit längeren Sequenzen haben, habe ich die ursprüngliche Sequenzlänge der Teilsequenzen von 150 auf 200 erhöht und dafür den globalen Pfad (Mem-LSTM) weggelassen. Die vorher erwähnten Sinc-Faltungen habe ich ebenfalls innerhalb des Conformers implementiert, um die Anzahl der Paramenter klein zu halten.

Ergebnisse

Trotz der Bedingung, dass das Netz die Größe von einem MB nicht überschreiten soll, gibt es eine extreme Vielfalt an Kombinationen in denen man das kleinere SkiM Netz aufbauen kann. Um die Performance der jeweiligen Konfigurationen abschätzen zu können, habe ich mehrere Netze auf einem kleinen einstündigen Datensatz mit je zweisekündigen Audioclips trainiert. Dabei kam heraus, dass die vielversprechendsten Ergebnisse mit dem Conformer-basierten SkiM-Netzen (CSkiM) erzielt werden können. Die Transformer-basierten Lösungen waren von der Performance her zu weit weg von der gewünschten Qualität. Für die finale Evaluation der Netze habe ich acht Netzkonfigurationen auf einem Datensatz von 500 Stunden Audio (900.000 zweisekündige Clips) für jeweils 30 Epochen trainiert. Tab. 1 zeigt das Trainingsresultat der Netze mit vier implementierten Schichten (inklusive der originalgetreuen SkiM Architektur).

Netztyp Größe PESQ STOI (%) SNR (dB) SI-SNR (dB)
Originaldateien x 1,44 82,51 8,76 6,62
SkiM (Original) 26,01 MB 2,23 90,52 15,50 14,87
SkiM (klein) 1,37 MB 1,98 88,03 13,68 13
CSkiM (Standard) 256 kB 1,95 87,50 13,55 12,82
CSkiM (Sinc-Encoder) 168 kB 1,67 83,76 10,39 9,22
CSkiM (Sinc-Conformer) 190 kB 1,68 84,56 11,05 10,02

Tab. 1: Vergleich der verschiedenen Netzarchitekturen mit jeweils vier implementierten Schichten.

Weil die Implementierung mit vier Schichten von der Größe her noch Spielraum nach oben lässt, habe ich die CSkiM Architekturen ohne den Sinc-Encoder noch einmal mit sechs Schichten trainiert (Tab. 2). In der Encoder Stufe führte der Einsatz von Sinc-Faltungen zu wahrnehmbaren Verzerrungen in den Audiodateien.

Netztyp Größe PESQ STOI (%) SNR (dB) SI-SNR (dB)
Originaldateien x 1,44 82,51 8,76 6,62
SkiM (Original) 26,01 MB 2,23 90,52 15,50 14,87
SkiM (angepasst) 2,19 MB 2,04 88,86 14,18 13,52
CSkiM (Standard) 369 kB 2,01 88,08 13,80 13,08
CSkiM (Sinc-Conformer) 270 kB 1,81 86,60 12,71 11,92

Tab. 2: Vergleich der verschiedenen Netzarchitekturen mit jeweils sechs implementierten Schichten.

Abschließende Beobachtungen

Zusätzlich zu den Netzen habe ich den 500-stündigen Datensatz zum Vergleich auch mit klasssischen Algorithmen zur Rauschunterdrückung bearbeitet, um besser bewerten zu können, ob sich der Einsatz eines neuronalen Netzes in der Kompaktversion auch wirklich lohnt (Tab. 3).

Netztyp PESQ STOI (%) SNR (dB) SI-SNR (dB)
Originaldateien 1,44 82,51 8,76 6,62
LogMMSE Filter 1,64 83,15 7,65 4,83
Wiener Filter 2,04 79,79 12,31 11,07

Tab. 3: Performancevergleich klassischer Algorithmen zur Rauschunterdrückung.

Neben der offensichtlichen schlechteren objektiven Performance sind auch die subjektiven Ergebnisse der Rauschunterdrückung mit den hier getesteten klassischen Algorithmen qualitativ immer unter den Ergebnissen der neuronalen Netze. Dennoch ist es aber eine Abwägungssache, inwiefern die erhöhte Qualität den größeren Speicherbedarf rechtfertigt und muss insbesondere beim Einsatz auf eingebetteten Systemen im Einzelfall betrachtet werden. Grundsätzlich bin ich aber der Meinung, dass die Umsetzung auf einem Mikrocontroller möglich und im entsprechenden Anwendungsfall auch sinnvoll ist.