Lärmfilter fürs Mikrofon unter Alsa
Monday, 1. February 2021
Ich möchte hier alsa_rnnoise vorstellen. Aber dafür muss ich erstmal das tolle NoiseTorch erwähnen. Es ist ein Programm, das den Umgebungslärm reduziert der vom Mikrofon aufgenommen wird. Wenn man via dem PC mit anderen Leuten spricht und sie nicht mit beispielsweise dem Tastaturlärm oder anderen Lärmquellen belästigen will ist das praktisch. Und auch wenn man Aufnahmen außerhalb eines isolierten Raums macht könnte es nützlich sein. Ich nutze NoiseTorch während der Arbeit am Laptop für unsere Telefonkonferenzen.
Aber weil es im Kern ein Pulsaudio-Plugin ist funktioniert es für mich nicht am heimischen, mit ALSA eingerichteten PC. NoiseTorch hat auch ein paar Macken, wie die hohe Prozessorlast selbst ohne Sound-Input, die aber an Pulseaudio hängt – was mich darin bestärkt weiterhin kein Pulseaudio zu installieren. Deswegen ist es für mich besonders toll, dass der Entwickler arsen sich die Mühe gemacht hat ein ALSA-Plugin mit der gleichen Kernfunktionalität zu bauen. Eben alsa_rnnoise. Das namensgebende RNNoise ist das neuronale Netzwerk, das auch NoiseTorch benutzt um Lärm wegzufiltern.
Installation
Weder RNNoise noch alsa_rnnoise waren für void gepackt, daher musste ich beides manuell installieren. Was sich zusammen mit der folgenden ALSA-Konfiguration ein bisschen anfühlte wie Linux vor einer Dekade. Aber wer modernen Komfort will könnte sich ja an NoiseTorch mit Pulseaudio halten. Zum Glück beschreibt die jeweilige Readme fast vollständig was zu tun ist.
Stell erstmal sicher, dass alsa-dev installiert ist:
sudo xbps-install alsa-lib-devel
Dann installiere RNNoise:
git clone https://gitlab.xiph.org/xiph/rnnoise.git cd rnnoise ./autogen.sh ./configure make sudo make install
Die Libraries von RNNoise werden so nach /usr/local/lib/ gepackt.
Den Ordner von RNNoise müssen wir bei der Installation von alsa_rnnoise dem Buildsystem mitteilen, ebenso wie den richtigen Ordner für ALSA-Plugins:
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/:/usr/lib/pkgconfig/:/usr/lib64/pkgconfig/ meson build -Dplugin_dir=/usr/lib/alsa-lib/ ninja -C build sudo ninja -C build install
Damit ist das System bereit um ALSA zu konfigurieren. Die Readme schlägt diese Konfiguration vor, die in der $HOME/.asoundrc zu platzieren wäre:
pcm.urnnoise { type rnnoise slave.pcm "sysdefault" } pcm.rnnoise { type plug slave { rate 48000 pcm "urnnoise" } } pcm.!default { type asym playback.pcm "cards.pcm.default" capture.pcm "rnnoise" }
Bei mir muss da aber noch das softvol-Plugin dazwischen, da mein t.bone MB 88U sonst zu leise ist, plus eine manuelle dmix-Konfiguration. Daher sieht die .asoundrc bei mir etwas anders aus:
pcm.!default { type asym playback.pcm { type plug slave.pcm "dmixer" } capture.pcm rnnoise } ctl.!default { type hw card "PCH" } pcm.softvol { type softvol slave.pcm "hw:Device" control { name "Softmaster"; card "Device"; } max_dB 20.0 min_dB -5.0 } pcm.urnnoise { type rnnoise slave.pcm "softvol" } pcm.rnnoise { type plug slave { rate 48000 pcm "urnnoise" } } pcm.dmixer { type dmix ipc_key 1024 slave { pcm "hw:PCH" buffer_size 16384 period_time 0 period_size 1024 } }
Der Filter funktionierte so direkt.
Soundtest
Aber funktioniert er auch gut, lohnt sich der Aufwand? Ich habe ein paar Testaufnahmen gemacht um das einzuordnen. Eingebunden sind unkomprimierte .wav-Dateien, die auf .ogg zurückfallen falls der Browser mit ersteren nicht umgehen kann (mit ffmpeg umgewandelt, maximale Qualität).
Ohne Lärm
Im ersten Test habe ich in einem ruhigen Raum ohne besondere Lärmquelle kurz in das Mikrofon gesprochen. Hier sollte der Filter im Idealfall kaum wahrnehmbar sein, auf jeden Fall sollte er die Stimme nicht abschneiden. Doch hört selbst wie es lief.
Ich fand das Ergebnis gut. Der Raum klingt ein bisschen anders, oder? Aber ich habe nicht den Eindruck, dass es schlechter klingt oder meine Sprache abgehackt wird. Da auch die Prozessorlast nicht hoch war ein erster Hinweis, dass alsa_rnnoise immer anbleiben könnte.
Mit Tastaturlärm
Regulären Lärm wie das Klappern der Tastatur rauszufiltern oder zu reduzieren wäre mir am wichtigsten. So könnte ich guten Gewissens in Gesprächen das jeweilige Programm nicht auf Push-To-Talk stellen. Und wenn sowas funktioniert, dann wird wahrscheinlich auch ein in der Ferne vorbeifahrendes Auto weggefiltert.
Ein gutes Ergebnis! Wenn ich nicht spreche ist die Tastatur weg, wenn ich spreche ist sie leiser. Und sie ist vorher ja sehr laut, gar nicht mal nur das Klicken der Tasten, sondern da wurden auch die Schwingungen des Tisches übertragen. Als ob ich auf die Tastatur hämmern würde, dabei tat ich das gar nicht.
Wenn ich während eines Gespräches mal tippen müsste wäre der Lärmfilter sehr hilfreich.
Mit einem Staubsauger an der Seite
Ich dachte, wenn ich einen Handstaubsauger anmache wäre ich ohne Filter nicht zu hören und mit Filter vielleicht etwas, wobei ich andererseits fürchtete, dass das zuviel erhofft ist. Tatsächlich funktionierte es nicht, aber anders als erwartet.
Die Aufnahme ohne Filter war besser als erwartet, weil trotz des Lärms meine Stimme aufgenommen wurde und sogar verständlich blieb. Mit dem Filter dagegen war zwar der Staubsaugerlärm reduziert, aber war leider auch meine Stimme immer wieder verzerrt. Als ob die Aufnahme übersteuern würde, wobei ich mir ziemlich sicher bin nicht wesentlich lauter geredet zu haben als bei der ersten Aufnahme. Bei solchem extremen Lärm liegt bei alsa_rnnoise wohl eine Grenze, ob es jetzt am Alsaplugin oder am RNNoise-Kern selbst liegt kann ich nicht sagen.
Fazit
NoiseTorch ist derzeit natürlich schon einfacher zu installieren und zu konfigurieren, aber ich sehe großes Potential in der ALSA-Lösung. Sie könnte einfach von Distributionen ausgeliefert werden und wir dann eine Konfigurationsoption davon entfernt sein, automatisch die Sprachaufnahmen aller Linuxnutzer verbessern zu können. Egal ob das Aufnahmen für Podcasts oder VoIP-Gespräche sind. Damit das machbar wird sollte mit Aufnahmen während extremen Umgebungslärms etwas besser umgegangen werden. Andererseits dürfte niemand erwarten bei solchem Lärm gut verstanden zu werden, daher ist das in der Praxis vielleicht ein relativ kleines Problem.
Ich bin gespannt was draus wird. Bei meinem System lasse ich das jetzt einfach erstmal an und schaue, ob es sich bewährt.
artodeto's blog about coding, politics and the world am : Die KW 05/2021 im Link-Rückblick
Vorschau anzeigen
onli blogging am : Sharkoon DAC Pro S V2 in Betrieb genommen
Vorschau anzeigen
onli blogging am : Mit Easy Effects und AutoEq den Kopfhörerklang verbessern
Vorschau anzeigen