Audio mit Linux: - Teil 3: Der Werkzeugkasten

Audio mit Linux: - Teil 3: Der Werkzeugkasten

In den ersten beiden Teilen dieser Serie habe ich versucht, dir den Boden zu legen. Teil eins war Geschichte, also die dreissig Jahre, in denen Linux Audio von einem Witz zu einem System wurde, das ich heute jeder anderen Plattform vorziehe. Teil zwei war Architektur, also die fünf Schichten des heutigen Stacks und die Konzepte dahinter, von Sample Rate bis Bluetooth Profil. Wer das verstanden hat, weiss jetzt, was passiert, wenn er einen Ton abspielt. Was er noch nicht weiss, ist, wie er das Ganze im Alltag steuert, repariert und für sich nutzbar macht.

Genau das machen wir jetzt. Wir gehen vom Verstehen zum Anfassen. Ich werde dich nicht mit einer endlosen Liste von Tools zumüllen, sondern dir genau die Werkzeuge zeigen, die ich nach Jahren mit PipeWire wirklich täglich brauche. Drei Kommandozeilen Tools, ein bewährter PulseAudio Veteran, eine Patchbay, eine Effekt Suite, und am Ende zwei Geheimwaffen, die kaum jemand kennt, obwohl sie alles ändern. Den Rest kannst du ignorieren, und ich werde dir auch sagen, warum.

Die Kommandozeile, dein Schweizer Sackmesser

Wenn du nur ein einziges Tool aus diesem Artikel mitnimmst, dann nimm wpctl. Es kommt mit WirePlumber, ist also auf jeder modernen Linux Distribution mit PipeWire schon installiert, und es ist das ergonomischste Werkzeug, um den Audio Stack im Alltag zu steuern.

Der Befehl, den ich am häufigsten benutze, ist wpctl status. Er zeigt dir die komplette Hierarchie deines Audio Systems in einer Baumstruktur. Geräte, Sinks, Sources, aktive Streams, jeweils mit einer numerischen ID und einem Stern für das aktuelle Default Gerät. Das ist die Übersicht, mit der jede Diagnose anfängt. Wenn dein Audio nicht funktioniert, ist wpctl status der erste Reflex.

$ wpctl status
PipeWire 'pipewire-0' [1.6.4, srueegger@DS9, cookie:772730683]
 └─ Clients:
    ...

Audio
 ├─ Devices:
 │      42. Lunar Lake-M HD Audio Controller    [alsa]
 │  
 ├─ Sinks:
 │      49. Lunar Lake-M HD Audio Controller HDMI / DisplayPort 3 Output [vol: 1.00]
 │      50. Lunar Lake-M HD Audio Controller HDMI / DisplayPort 2 Output [vol: 1.00]
 │      51. Lunar Lake-M HD Audio Controller HDMI / DisplayPort 1 Output [vol: 1.00]
 │  *   52. Lunar Lake-M HD Audio Controller Speaker [vol: 0.65]
 │  
 ├─ Sources:
 │      53. Lunar Lake-M HD Audio Controller Stereo Microphone [vol: 1.00]
 │  *   54. Lunar Lake-M HD Audio Controller Digital Microphone [vol: 0.51]
 │  
 ├─ Filters:
 │  
 └─ Streams:
       114. Chromium                                                    
          121. output_FR       > Speaker:playback_FR  [active]
          125. output_FL       > Speaker:playback_FL  [active]


Video
 ├─ Devices:
 │      55. Integrated Camera                   [v4l2]
 │      56. Integrated Camera                   [v4l2]
 │      57. Integrated Camera                   [v4l2]
 │      58. Integrated Camera                   [v4l2]
 │  
 ├─ Sinks:
 │  
 ├─ Sources:
 │  *   82. Integrated Camera (V4L2)           
 │      84. Integrated Camera (V4L2)           
 │  
 ├─ Filters:
 │  
 └─ Streams:

Settings
 └─ Default Configured Devices:

Aus diesem Output liest du alles ab, was du brauchst. Du siehst, dass mein Notebook-Setup eine einzige Soundkarte hat, also den Lunar Lake-M HD Audio Controller mit Device ID 42, und dass diese Karte vier Sinks und zwei Sources bereitstellt. Drei der Sinks sind die HDMI und DisplayPort Outputs, der vierte und mit Stern markierte ist der eingebaute Lautsprecher mit ID 52, der gerade auf 65 Prozent Lautstärke steht. Bei den Sources ist interessant, dass moderne Intel Laptops zwei Mikrofone haben. Das Stereo Microphone mit ID 53 ist das klassische Analogmikrofon, das Digital Microphone mit ID 54 ist das digitale Array Mikrofon, das Intel Smart Sound nutzt. Default ist bei mir das digitale, weil es bei Videocalls schlicht besser klingt. Unten siehst du, dass Chromium gerade einen Stream auf den Speaker schickt, also Stereo, FL und FR aktiv. Das ist die ganze Audio Realität meines Systems in wenigen Zeilen.

Mit diesen IDs kannst du dann arbeiten. Wenn ich gleich einen Vortrag über HDMI auf einen externen Bildschirm halte und der Laptop stur auf den eingebauten Lautsprechern hängenbleibt, schalte ich mit wpctl set-default 49 einfach auf den HDMI Output 3. Will ich vom digitalen Array Mikrofon zurück auf das analoge Stereomikrofon, geht das mit wpctl set-default 53. Lautstärke setzt du mit wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.7. Das Symbol @DEFAULT_AUDIO_SINK@ ist ein Platzhalter, den WirePlumber zur Laufzeit auflöst, was praktisch ist, weil sich numerische IDs zwischen Sessions ändern können. Mute funktioniert mit wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle, und für die Details eines einzelnen Objekts gibt es wpctl inspect 52, was dir alle Properties des Speaker Sinks ausspuckt, von der ALSA Card ID über das verwendete Profil bis zu den Routing Optionen.

Das zweite Tool, das du kennen solltest, ist pw-top. Es ist im pipewire Paket dabei und tut genau das, was der Name verspricht. Es ist htop für deinen Audio Stack. Du startest es, und du siehst eine Tabelle aller laufenden PipeWire Knoten mit ihrer aktuellen Sample Rate, ihrem Quantum, ihrer tatsächlichen Latenz und der Anzahl Buffer Underruns, also die berüchtigten xruns. Wenn dein Audio knackst oder stottert, ist pw-top das Tool, mit dem du herausfindest, welcher Knoten Probleme macht. Steigt die xrun Zahl bei einem bestimmten Stream, hast du den Übeltäter. Ich habe damit schon mehrfach Probleme aufgespürt, die ich sonst nie zugeordnet hätte, etwa eine schlechte WiFi Verbindung, die mein Bluetooth gestresst hat.

Das dritte Tool ist pw-dump, und das benutzt du, wenn dir wpctl status nicht mehr reicht. pw-dump schreibt den kompletten internen Zustand von PipeWire als JSON in die Standardausgabe. Jedes Objekt, jede Verbindung, jede Property, alles. Roh und ungefiltert. Das klingt erst einmal nach Information Overload, ist es auch, aber kombiniert mit jq wird es zur Diagnose Maschine. Willst du etwa wissen, welche Sample Rate dein Headset gerade tatsächlich fährt, ist pw-dump | jq '.[] | select(.info.props."node.name" == "alsa_output.usb-...") | .info.params' der Weg dahin. Brauchst du selten, aber wenn du es brauchst, ist es Gold wert.

Es gibt noch pw-cli, das tiefer ansetzt und direkt mit dem PipeWire Daemon spricht. Das ist die Werkzeugebene für Entwickler, die eigene Module schreiben oder Bugs reproduzieren. Für Anwender ist es selten nötig, und wenn doch, dann meist als Mittel, eine Anweisung aus einem Forum Post nachzustellen. Ich erwähne es der Vollständigkeit halber, aber es ist nicht in der Werkzeugkiste, die ich täglich öffne.

Pavucontrol, der alte Freund, der einfach nicht stirbt

Pavucontrol ist offiziell der PulseAudio Volume Control. Es ist 2007 gestartet, hat ein in die Jahre gekommenes GTK Design, und es ist heute, fast zwei Jahrzehnte später, immer noch das beste Tool für eine bestimmte Klasse von Aufgaben. Das ist eine der schöneren Pointen am PipeWire Übergang. Pavucontrol redet über die PulseAudio API, die PipeWire vollständig nachstellt, und es funktioniert deshalb out of the box weiter, als wäre nichts geschehen.

Bildschirmfoto von pavucontrol

Was kann Pavucontrol, was wpctl nicht kann? Vor allem zwei Dinge. Erstens, es zeigt dir pro Anwendung, also pro Stream, eine eigene Lautstärke und einen eigenen Output. Du kannst Firefox auf 60 Prozent regeln, während dein Musikplayer auf 100 Prozent läuft, und du kannst Spotify gezielt auf das Bluetooth Headset legen, während Discord auf den Lautsprechern bleibt. Das geht über die wpctl Kommandozeile zwar auch, aber niemand will das per Hand machen. Pavucontrol gibt dir dafür einen Schieberegler, und das ist im Alltag einfach das richtige Werkzeug.

Zweitens, Pavucontrol ist exzellent für Sound Card Profile. Wenn du eine Soundkarte mit mehreren Profilen hast, etwa eine HDA Intel mit getrennten Profilen für Lautsprecher und HDMI, oder ein Bluetooth Gerät mit A2DP und HSP, kannst du in Pavucontrol unter dem Reiter Configuration genau einstellen, welches Profil aktiv sein soll. Das ist viel angenehmer als die entsprechenden wpctl set-profile Aufrufe.

Mein Tipp ist deshalb, beides parallel zu nutzen. wpctl für die schnellen Sachen aus der Kommandozeile, Pavucontrol für die Streams und Profile. Die beiden sehen sich gegenseitig, das heisst, was du im einen änderst, ist im anderen sofort sichtbar.

Grafische Patchbays, oder wie man PipeWire wirklich begreift

Im zweiten Teil dieser Serie habe ich PipeWire als Graphenmodell beschrieben. Knoten, Ports, Verbindungen. Diese Beschreibung war abstrakt, und sie wird erst dann wirklich konkret, wenn du den Graphen zum ersten Mal mit eigenen Augen siehst. Genau das tut eine grafische Patchbay.

Das Werkzeug meiner Wahl ist qpwgraph. Es ist Qt basiert, optisch dem alten QjackCtl nachempfunden, und es ist heute das mit Abstand reifste Patchbay Tool für PipeWire. Du startest es, und du siehst deinen kompletten Audio Graphen als ein Netzwerk von Kästchen, jedes Kästchen ein Knoten, jedes Kästchen mit Eingangs und Ausgangs Ports, dazwischen Linien, also die aktiven Verbindungen. Du kannst Verbindungen mit der Maus ziehen, kappen, neu legen. Du kannst eine Konfiguration als Wireset speichern und später wieder laden, was beispielsweise praktisch ist, wenn du für Aufnahmen ein bestimmtes Routing brauchst.

Die Alternative ist Helvum, ein GTK basiertes Tool aus dem freedesktop Umfeld. Es kann das Gleiche, sieht moderner aus, hat aber zwei Nachteile. Es kann keine Wiresets speichern, und es wird seit längerem nur noch sporadisch gepflegt. Wenn du Wayland und GTK pur willst, ist Helvum ok, aber für ernsthafte Arbeit ist qpwgraph die bessere Wahl.

Was eine Patchbay dir gibt, ist nicht nur Routing Macht, sondern Verständnis. Wenn du das erste Mal siehst, wie Firefox einen Knoten erzeugt, wenn er ein Video startet, und wie dieser Knoten mit dem Sink Knoten deiner Soundkarte verbunden wird, und wie dieser Sink Knoten wiederum auf die ALSA Hardware verbunden ist, dann wird das, was ich in Teil zwei beschrieben habe, plötzlich greifbar. Das Graphenmodell ist nicht eine Metapher, es ist die echte Realität deines Systems, und qpwgraph zeigt sie dir live.

Mein Tipp ist deshalb, qpwgraph einmal zu starten, ein Video zu öffnen, ein Spiel zu starten, ein Bluetooth Gerät zu verbinden, und einfach zuzusehen, was passiert. Das ist die beste fünf Minuten Lehrstunde über PipeWire, die du dir geben kannst.

EasyEffects, die Krone der Suite

Jetzt kommen wir zu dem Tool, das ich im Teaser als die nützlichste Audio Software bezeichnet habe, die je für Linux geschrieben wurde. Das ist keine Übertreibung. EasyEffects ist von Wellington Wallace entwickelt, GTK basiert, vollständig PipeWire nativ, und es macht Dinge möglich, die unter Windows oder macOS entweder gar nicht gehen oder hunderte Franken kosten.

Das Konzept ist einfach. EasyEffects schiebt sich zwischen deine Audio Quelle und deinen Audio Ausgang und lässt dich beliebig viele Effekt Plugins in einer Kette auf das Signal anwenden. Es gibt zwei getrennte Ketten, eine für Output, also alles was aus deinem System rausgeht, und eine für Input, also dein Mikrofon.

Auf der Output Seite sind die wichtigsten Effekte ein parametrischer Equalizer, ein Loudness Plugin, das die Lautstärke wahrnehmungsbasiert ausgleicht, ein Bass Enhancer, ein Convolver für Raum Simulationen mittels Impulse Response Files, und ein Auto Gain, das deine gesamte Systemlautstärke auf ein konstantes wahrgenommenes Niveau bringt. Letzteres klingt unscheinbar, ist aber der Grund, warum mein YouTube Volume und mein Spotify Volume und mein Film Volume sich plötzlich gleich anfühlen, ohne dass ich am Regler drehen muss. Wer das einmal hatte, will es nicht mehr missen.

Auf der Input Seite sitzt die eigentliche Killer Funktion. EasyEffects integriert RNNoise, ein neuronales Netz von Jean-Marc Valin, das speziell für Sprach Rauschunterdrückung in Echtzeit trainiert wurde. Du fügst es deiner Mikrofon Kette hinzu, drehst die Intensität auf 60 bis 75 Prozent, und plötzlich klingt dein Billig Headset wie ein professionelles Studio Mikrofon. Lüfter sind weg. Tastatur Klacken ist weg. Verkehrslärm ist weg. Was bleibt, ist deine Stimme. Ich habe daneben einen offenen Ventilator stehen, und meine Gesprächspartner haben es noch nie gehört.

Seit Version 7 gibt es zusätzlich zu RNNoise auch DeepFilterNet, ein neueres und nochmals besseres Modell. Es braucht etwas mehr CPU, aber wenn du auf einem aktuellen System sitzt, ist es das deutlich bessere Modell, vor allem für komplexere Hintergrundgeräusche wie einen laufenden Fernseher im Nachbarzimmer. Beide Modelle laufen lokal auf deinem System, ohne Cloud, ohne Account, ohne dass irgendetwas dein Netzwerk verlässt. Versuch das mal mit Krisp oder NVIDIA Broadcast.

Dazu kommen klassische Studiowerkzeuge. Ein Gate, das alles unter einem Schwellwert komplett stumm schaltet. Ein Compressor, der die Dynamik deiner Stimme einebnet. Ein DeEsser, der scharfe Zischlaute glättet. Ein Limiter, der Übersteuerungen verhindert. Eine typische Mikrofon Kette für Voice Calls oder Podcasts ist Gate, dann RNNoise oder DeepFilterNet, dann Compressor, dann DeEsser, dann Limiter. Das ist die Signal Kette, die du sonst in einem teuren Tool wie iZotope RX ohne sechsstelliges Studio Budget nicht zusammenbekommst.

Und dann gibt es noch die Community Presets. Wallace Wellington hat ein offizielles Repository, in dem Nutzer fertige Konfigurationen für bestimmte Mikrofone und Anwendungsfälle teilen. Wenn du ein Fifine K669 hast und nicht weisst, wo du anfangen sollst, lädst du dir einfach das Preset eines anderen K669 Nutzers herunter, und du hast einen funktionierenden Ausgangspunkt. Das ist Open Source Audio Engineering im besten Sinne.

Eine Kleinigkeit zur Installation. Auf den meisten aktuellen Distributionen reicht ein sudo apt install easyeffects oder das entsprechende Pendant deines Paketmanagers. Auf Ubuntu und Debian würde ich aber persönlich die Flatpak Variante über Flathub vorziehen, weil sie alle Plugins gebündelt mitbringt, einschliesslich der LADSPA und LV2 Module, die in den Distri Paketen manchmal getrennt installiert werden müssen.

Die Geheimwaffen, von denen kaum jemand redet

Ich habe versprochen, dass ich dir am Ende ein, zwei Geheimwaffen zeige. Hier sind sie. Beide sind Tools beziehungsweise Konzepte, die in den meisten PipeWire Tutorials gar nicht vorkommen, obwohl sie in bestimmten Situationen alles ändern.

Die erste ist Coppwr. Das ist ein Rust basiertes Tool von dimtpap, das sich selbst als low level control über PipeWire bezeichnet, und das ist exakt, was es ist. Wenn wpctl und pw-top deine Alltagswerkzeuge sind und qpwgraph deine Hauptwerkzeug Maschine, dann ist Coppwr der professionelle Schraubenkasten für die Tage, an denen wirklich etwas kaputt ist. Es zeigt dir alle Objekte im PipeWire Graphen, alle Properties, alle Metadaten, alle Settings, und es lässt dich Werte direkt ändern. Du kannst die globale Sample Rate zur Laufzeit umschalten. Du kannst Quantum Settings anpassen. Du kannst Settings ausprobieren, die sonst nur über Konfigurationsdateien zugänglich wären, und sehen, ob das Problem weggeht. Coppwr ist nicht für jeden Tag, aber wenn du tief in einem Audio Bug steckst, ist es das Tool, das dich rauszieht. Es gibt ein Flatpak Paket auf Flathub, und ich kann nur empfehlen, es vorbeugend zu installieren, damit es da ist, wenn du es brauchst.

Die zweite Geheimwaffe ist kein Tool, sondern ein Konzept. PipeWire bringt ein Modul namens libpipewire-module-filter-chain mit, mit dem du LADSPA Plugins direkt im Server laden kannst, ohne EasyEffects. Das klingt erst einmal wie eine Spezialität für Audio Nerds, ist aber praktisch hochrelevant. Stell dir vor, du willst RNNoise auf deinem Mikrofon haben, aber du willst kein EasyEffects laufen lassen, weil du jede CPU Sekunde brauchst, oder weil du das auf einem Server ohne Desktop einrichten willst. Du legst eine Datei in ~/.config/pipewire/pipewire.conf.d/ ab, in der du eine Filter Chain definierst, und PipeWire erzeugt dir beim Start eine zusätzliche virtuelle Source mit aktivierter Rauschunterdrückung. Das ist permanent, das ist konfigurierbar, das verbraucht praktisch keinen Overhead, und es funktioniert systemweit für jede Anwendung, die ein Mikrofon nutzt.

Hier ein Beispiel als Vorlage:

context.modules = [
  { name = libpipewire-module-filter-chain
    args = {
      node.description = "Noise Canceling Source"
      media.name = "Noise Canceling Source"
      filter.graph = {
        nodes = [
          { type = ladspa
            name = rnnoise
            plugin = /usr/lib/ladspa/librnnoise_ladspa.so
            label = noise_suppressor_mono
            control = { "VAD Threshold (%)" = 50.0 }
          }
        ]
      }
      capture.props = {
        node.name = "capture.rnnoise_source"
        node.passive = true
        audio.rate = 48000
      }
      playback.props = {
        node.name = "rnnoise_source"
        media.class = Audio/Source
        audio.rate = 48000
      }
    }
  }
]

Du brauchst dafür das Plugin von werman/noise-suppression-for-voice, das in den meisten Distributionen als Paket existiert, beispielsweise auf Ubuntu als rnnoise-ladspa oder ähnlich. Pfad anpassen, PipeWire neu starten, fertig. Du hast jetzt eine virtuelle Mikrofon Source mit Rauschunterdrückung, die du in jeder Anwendung als Mikrofon auswählen kannst. Kein EasyEffects nötig.

Diese zweite Geheimwaffe ist mein persönlicher Favorit, weil sie zeigt, wie elegant das PipeWire Modell ist. Effekte sind nicht ein nachträgliches Aufstecken über eine GUI, sondern erste Klasse Bürger im Audio Graphen, die du wie alles andere konfigurieren kannst.

Was du getrost ignorieren kannst

Damit du nicht in jedem Tutorial neue Tools nachinstallierst, hier kurz, was du im PipeWire Zeitalter nicht mehr brauchst. Pacmd und pactl sind PulseAudio Erbe. Sie funktionieren weiter, weil PipeWire die PulseAudio API nachstellt, aber wpctl ist die nativere und bessere Wahl. Helvum habe ich schon erwähnt, qpwgraph ist überlegen. NoiseTorch war vor EasyEffects das Tool für Mikrofon Rauschunterdrückung, ist heute redundant und wird nicht mehr aktiv gepflegt. Carla ist eine grossartige Audio Plugin Host Suite, aber für reine Desktop Nutzung deutlich zu komplex und nur dann sinnvoll, wenn du in Richtung Musik Produktion gehst. JACK Tools wie qjackctl sind heute überflüssig, weil PipeWire die JACK API nativ spricht und du JACK Anwendungen einfach starten und in qpwgraph routen kannst.

Und schliesslich alsamixer. Das ist ein Sonderfall. Es ist nicht überflüssig, aber selten nötig. Es kommt zum Einsatz, wenn du Hardware Pegel direkt setzen musst, etwa weil deine Soundkarte einen Hardware Mute Schalter hat, den PipeWire nicht sieht, oder weil du auf einer USB Soundkarte ein bestimmtes Mixer Setting brauchst, das nur über ALSA Karten Mixer Controls zugänglich ist. Das passiert vielleicht zweimal im Jahr. Wenn es passiert, ist alsamixer da. Den Rest der Zeit lässt du es in Ruhe.

Zusammenfassung und ein Blick voraus

Wenn du diesen Artikel mit einer Werkzeugkiste verlassen willst, sieht sie so aus. wpctl für die schnelle Steuerung aus der Kommandozeile. pw-top für die Live Diagnose, wenn etwas knackt. Pavucontrol für Streams und Profile. qpwgraph für das Routing und das Verständnis. EasyEffects für alles, was Effekte heisst. Coppwr in der Schublade, falls es brennt. Und das Filter Chain Modul für saubere, persistente Server seitige Effekte.

Mit diesem Set kannst du jedes Audio Problem auf einem Linux System diagnostizieren, jede sinnvolle Routing Anforderung umsetzen, und jede gewöhnliche Effekt Aufgabe lösen. Du brauchst keine kommerzielle Software. Du brauchst keinen Account. Du brauchst kein Studio Budget. Du brauchst nur dieses halbe Dutzend Tools, die alle frei verfügbar und alle im Zusammenspiel mit PipeWire perfekt aufeinander abgestimmt sind.


Im nächsten Teil wird es konkret und praktisch. Ich zeige dir mein eigenes Setup, vom Headset über die EasyEffects Mikrofon Kette bis zu meinem persönlichen wpctl Tastaturshortcut Layout. Ein echtes End to End Tutorial mit Konfigurationsdateien zum Mitnehmen. Wer also bisher mitgelesen hat und sich gefragt hat, ja schön, aber wie sieht das jetzt im Alltag aus, der bekommt im vierten Teil die Antwort.