In den letzten drei Teilen (Teil 1, Teil 2 und Teil 3) habe ich dir Geschichte, Architektur und Werkzeuge an die Hand gegeben. Jetzt wird es konkret. Wenn du bis hier mitgelesen hast, weisst du genug, um den Stack zu verstehen, und du kennst die Werkzeuge, mit denen man ihn steuert. Was noch fehlt, ist die Antwort auf die Frage, die mir am häufigsten gestellt wird, wenn ich über Linux Audio rede. Wie sieht das jetzt im Alltag aus, also wirklich, an einem normalen Arbeitsgerät, mit dem man jeden Tag Calls macht, Musik hört und manchmal auch streamt.
Ich nehme dich heute mit zu meinem Setup. Das ist ein ThinkPad T14s Gen 6 mit Intel Lunar Lake CPU, eingebauten Lautsprechern und dem digitalen Mikrofon Array im Tastaturrahmen. Daneben hängt das Gerät an einer Dockingstation mit mehreren Monitoren, und im selben Netz wohnen ein paar Sonos Speaker und ein ClickShare im Sitzungsraum nebenan. Kein Studio Headset, kein USB Audio Interface, kein Mischpult, kein DAC. Also genau das Setup, das viele von uns auf der Arbeit haben, und dazu eine ganz normale Heim Audio Umgebung. Und trotzdem werde ich dir zeigen, wie du aus dieser scheinbar profanen Ausgangslage ein Audio Setup zaubern kannst, das in Calls professionell klingt, beim Musikhören Spass macht und im Notfall auch einen Stream tragen kann. Das Ganze ohne Kommandozeilen Akrobatik, aber mit ein paar bewussten Eingriffen, die in der Summe einen riesigen Unterschied machen.
Die Ausgangslage, oder warum Default oft schon reicht
Bevor ich anfange, dir Konfigurationen zu zeigen, will ich eine Sache klarstellen. Mein Setup ist auf dem T14s zu einem grossen Teil das, was Fedora standardmässig liefert. Ich habe weder die WirePlumber Konfiguration umgeschrieben noch eigene PipeWire Module geladen. Das ist Absicht, und es ist auch ein Statement.
PipeWire und WirePlumber sind in den letzten zwei Jahren so gut geworden, dass die meisten Laptops aus der Box heraus brauchbar funktionieren. Wenn du den ersten Teil dieser Serie gelesen hast, weisst du, warum das nicht selbstverständlich ist. Wir reden hier über ein System, das vor zehn Jahren noch ein Synonym für Frust war. Heute steckst du ein Bluetooth Headset ein, und es wird automatisch im richtigen Profil gemounted, kommt im Mute Toggle an und behält seine Verbindung über den Suspend hinweg. Das ist Magie auf den Schultern von zehn Jahren Engineering.
Was ich dir in diesem Teil zeige, sind also nicht Reparaturen an einem kaputten System, sondern bewusste Erweiterungen, die du dir oben drauf bauen kannst. Drei Bereiche, in denen sich der Aufwand lohnt. Erstens, die Mikrofon Kette für Calls. Zweitens, ein paar Tastaturshortcuts für die Aktionen, die ich täglich brauche. Drittens, das gezielte Routing von Audio Strömen für Fälle, die mit dem normalen Sound Menu nicht abgedeckt sind. Den Rest lasse ich auf Default stehen, und ich empfehle dir, das auch zu tun.
Den eigenen Stack inventarisieren
Bevor du irgendetwas konfigurierst, solltest du wissen, was dein System überhaupt sieht. Auf dem T14s liefert mir wpctl status folgendes Bild.
PipeWire 'pipewire-0' [1.6.4, srueegger@fedora, cookie:...]
Audio
├─ Devices:
│ 67. Lunar Lake-M HD Audio Controller [alsa]
│
├─ Sinks:
│ 104. sclmini [vol: 1.00]
│ 114. macbook-buero [vol: 1.00]
│ 116. clickshare-sitzungsraum [vol: 1.00]
│ 132. Lunar Lake-M HDMI / DisplayPort 2 [vol: 1.00]
│ * 133. Lunar Lake-M HDMI / DisplayPort 1 [vol: 0.40]
│ 134. Lunar Lake-M HDMI / DisplayPort 3 [vol: 1.00]
│ 135. Lunar Lake-M Headphones [vol: 1.00]
│ 151. Sonos Play 2 [vol: 1.00]
│
├─ Sources:
│ 81. Lunar Lake-M Stereo Microphone [vol: 1.00]
│ * 118. Lunar Lake-M Digital Microphone [vol: 1.00]
│
└─ Streams:
Das interessante Detail hier ist, wie viel WirePlumber schon ohne mein Zutun zusammengetragen hat. Acht Sinks, zwei Sources, alle automatisch eingehängt. Drei davon sind HDMI Ausgänge, die über die Dockingstation an die Monitore gehen, einer ist die Klinkenbuchse für Kopfhörer am Laptop selbst. Die restlichen vier kommen aus dem Netzwerk und nicht aus dem Gerät, also zwei Sonos Speaker, ein freigegebener Audio Output von einem MacBook im selben Netz, und der ClickShare im Sitzungsraum nebenan. Keine Konfigurationsdatei, kein Treiber, kein einziger Klick. WirePlumber hat das alles via mDNS gefunden und als ganz normale Audio Senken in den Graphen gehängt.
Bei den Sources steht ein Detail, das viele übersehen. Mein T14s zeigt zwei Mikrofone, einmal Stereo Microphone und einmal Digital Microphone. Das Stereo Microphone ist der analoge Pfad, das Digital Microphone ist die DSP nachbearbeitete Variante mit Beamforming, also genau die, die du in jedem modernen Business Laptop willst. WirePlumber hat sie auch korrekt als Default markiert. Falls du auf deinem Laptop mit zwei Mikrofonen das schlechtere als Default hast, kannst du das mit wpctl set-default 118 umstellen, wobei du die 118 durch die ID des gewünschten Mikrofons ersetzt.
Der mit dem Stern markierte Sink ist mein aktueller Default, also derjenige, an den jede Anwendung standardmässig ihr Audio schickt. Bei mir ist das gerade DisplayPort 1, weil ich am Dock arbeite und der Ton aus dem Hauptmonitor kommt. In wenigen Stunden, wenn ich mit dem Laptop in die Küche wechsle, wird das automatisch der Sonos Play 2 sein, denn WirePlumber merkt sich solche Routings pro Hardware Kontext und stellt sie wieder her, sobald derselbe Kontext erneut auftritt.
Ein zweiter Befehl, den ich dir als Routine empfehle, ist pw-top. Lass den im Hintergrund laufen, wenn du das nächste Mal eine Anwendung startest, die Audio macht. Du wirst sehen, wie sie als Stream im Graphen auftaucht, mit ihrer Buffer Grösse und ihrer aktuellen Quote. Das ist der schnellste Weg, ein Gefühl dafür zu entwickeln, was eigentlich gerade läuft, ohne dass du gleich tief in die Konfiguration einsteigen musst.
Die Mikrofon Kette, das wichtigste Investment
Wenn ich nur eine Sache aus diesem Artikel mitgeben dürfte, dann diese. Das interne Mikrofon eines Business Laptops klingt von Haus aus okay, aber nicht gut. Es nimmt zu viel Raum auf, betont die untere Mitte, lässt deine Stimme hohl klingen, und es verzeiht keinen Lüfter und keine Tippgeräusche. Mit fünf Plugins in EasyEffects, die ich dir gleich zeige, machst du daraus eine Stimme, die in Zoom oder Teams plötzlich besser klingt als die der meisten Kollegen mit teuren Headsets.
Die Reihenfolge ist entscheidend. Audio Plugins arbeiten seriell, also was am Anfang der Kette schräg läuft, kannst du am Ende nur noch begrenzt retten. Die Reihenfolge, die ich für ein Laptop Mikrofon empfehle, ist Noise Suppression, dann Gate, dann Compressor, dann Equalizer, dann Limiter. Jedes Plugin macht genau eine Sache, und sie bauen aufeinander auf.
Erstens, die Noise Suppression. Du fügst in EasyEffects das Plugin Noise Reduction hinzu und wählst RNNoise als Modell. RNNoise ist ein neuronales Netzwerk, das auf typischen Hintergrundgeräuschen trainiert wurde, also Tastaturklacken, Lüfterrauschen, Strassenverkehr, Hundegebell. Es schneidet diese Geräusche aus deinem Signal heraus, ohne deiner Stimme weh zu tun. In der Standardeinstellung mit einem Voice Detection Threshold zwischen 0.45 und 0.50 funktioniert es bei den meisten Stimmen, ohne dass du etwas anpassen musst. Stellst du leichte Verschluckungen fest, gehst du in 0.05 Schritten runter, ist es zu zaghaft, gehst du hoch.
Zweitens, das Gate. Auch wenn RNNoise schon viel weggenommen hat, bleiben in Pausen kleine Restgeräusche. Ein Gate macht das Signal in Pausen einfach komplett still. Sinnvolle Werte für ein Laptop Mikrofon sind ein Threshold von etwa minus 45 dB, ein Range von 10 bis 15 dB, ein Attack von 5 ms und ein Release von 200 ms. Das heisst, sobald du redest, geht das Gate sofort auf, und wenn du eine Sekunde nicht redest, schliesst es sanft. Aggressivere Werte schneiden dir gerne mal Wortanfänge ab, also fang konservativ an und arbeite dich von dort aus.
Drittens, der Compressor. Das ist der Teil, der die meisten Leute anfangs überfordert, aber er ist tatsächlich das Plugin, das deine Stimme professionell klingen lässt. Ein Compressor macht laute Stellen leiser und gleicht damit den Lautstärkeunterschied zwischen deinem Geflüster und deinem Lachen aus. Für Sprache nehme ich einen Threshold von minus 20 dB, eine Ratio von 3 zu 1, einen Attack von 10 ms und einen Release von 100 ms. Das Make Up Gain stellst du so ein, dass das Signal nach dem Compressor wieder ungefähr so laut ist wie davor. Du wirst hören, dass deine Stimme plötzlich voller wirkt und im Pegelmesser viel ruhiger anliegt.
Viertens, der Equalizer. Hier formst du den Klang, statt ihn nur zu kontrollieren. Bei Laptop Mikrofonen mache ich drei Eingriffe. Einen Hochpassfilter bei etwa 100 Hz, der das ganze Brummen und Rumpeln unter der Sprache abschneidet. Eine leichte Absenkung von minus 2 bis 3 dB rund um 250 Hz, weil dort das Mumpfige sitzt. Und einen Boost von plus 2 bis 3 dB rund um 4 kHz, denn dort sitzen die Konsonanten, also die Verständlichkeit. Diese drei Eingriffe sind die Grundkur, mit der jedes mediokre Mikrofon klingt, als wäre es zwei Klassen besser.
Fünftens, der Limiter. Das ist die Versicherung am Ende der Kette. Du stellst ihn auf einen Threshold von minus 3 dB, und ab dort lässt er einfach nichts mehr durch. Wenn du also versehentlich gegen das Mikrofon rülpst oder lachst, klippt nichts, sondern es wird sauber begrenzt. Ohne Limiter würde dein Compressor unter Umständen Spitzen nicht mehr einfangen können, mit Limiter ist das ausgeschlossen.
EasyEffects speichert die ganze Kette als Preset. Ich nenne meines schlicht Calls und kann es so in einem Klick aktivieren oder deaktivieren. Genau dafür gibt es nämlich gleich einen Tastaturshortcut.
Tastaturshortcuts für die Aktionen, die du wirklich brauchst
Im dritten Teil habe ich dir gezeigt, was wpctl alles kann. Jetzt zeige ich dir, wie du daraus ein Set von Shortcuts machst, das wirklich im Alltag taugt. Die meisten Desktop Umgebungen haben eigene Custom Shortcut Einstellungen, in GNOME unter Settings, Keyboard, View and Customize Shortcuts, Custom Shortcuts.
Der Shortcut, der mir am meisten Zeit spart, ist der Mikrofon Mute Toggle. Standardmässig hat GNOME zwar bereits einen, aber er hängt manchmal mit der Hardware FN Taste zusammen und reagiert verzögert. Ich lege deshalb einen eigenen auf Super plus M, mit folgendem Befehl.
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
Das @DEFAULT_AUDIO_SOURCE@ ist ein Alias, den WirePlumber automatisch auf das aktuell aktive Mikrofon zeigt. Egal ob du das interne Mikrofon, ein USB Headset oder Bluetooth nutzt, der Shortcut funktioniert immer auf dem richtigen Gerät. Genau das ist der Vorteil gegenüber harter Verkabelung auf eine bestimmte Source ID, die du dir nach jedem Reboot neu raussuchen müsstest.
Den zweiten Shortcut, den ich empfehle, ist ein Sink Toggle, der zwischen den verschiedenen Audio Ausgängen wechselt. Bei mir mit acht Sinks ist das die Funktion, die ich am häufigsten benutze, also vom Monitor Audio zum Headset, dann zum Sonos im Wohnzimmer, dann zurück zur Klinkenbuchse, wenn ich mich mit dem Laptop aufs Sofa setze. Das Sound Menu jedes Mal aufzuklicken ist nach dem dritten Wechsel zermürbend. Dafür gibt es kein eingebautes Kommando, aber ein winziges Bash Skript reicht.
#!/usr/bin/env bash
# ~/.local/bin/sink-toggle.sh
SINKS=$(wpctl status | awk '/Sinks:/,/Sources:/' | grep -oP '^\s+\K[0-9]+')
CURRENT=$(wpctl status | awk '/Sinks:/,/Sources:/' | grep -oP '\*\s+\K[0-9]+')
NEXT=""
TAKE_NEXT=false
for ID in $SINKS; do
if $TAKE_NEXT; then NEXT=$ID; break; fi
if [ "$ID" = "$CURRENT" ]; then TAKE_NEXT=true; fi
done
if [ -z "$NEXT" ]; then NEXT=$(echo "$SINKS" | head -n1); fi
wpctl set-default "$NEXT"
notify-send "Audio Output" "$(wpctl inspect "$NEXT" | grep node.description | cut -d'"' -f2)"
Das Skript holt sich die Liste aller Sinks, findet den aktuell aktiven, schaltet auf den nächsten weiter und zeigt eine Notification mit dem Namen des neuen Outputs. Auf Super plus O gelegt hast du damit ein Hardware Switching auf Tastendruck, das zuverlässiger funktioniert als jede Sound Menu Klickerei.
Den dritten Shortcut nutze ich für EasyEffects. Wenn ich nicht in einem Call bin, will ich die ganze Kette nicht über meiner Stimme liegen haben, weil sie für Sprachaufnahmen kalibriert ist und für andere Zwecke unpassend wäre. Mit dem Befehl easyeffects --bypass 2 schalte ich den globalen Bypass um, also Kette an oder aus. Der Wert 2 bedeutet Toggle. Das ist auf Super plus E gelegt und ist für mich der psychologische Schalter, der das Gerät zwischen Arbeitsmodus und Privatmodus umlegt.
Der vierte Shortcut ist eher eine Spielerei, aber ich nutze ihn täglich. Mit wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- und seinem 5%+ Pendant bekommst du eine sehr feine Lautstärkesteuerung in Fünf Prozent Schritten. Die Standard Lautstärketasten gehen meistens in Zehn Prozent Sprüngen, und gerade beim Musikhören merke ich, dass ein Schritt mir dann zu viel oder zu wenig ist. Auf Super plus Pfeil hoch und runter gelegt, lässt sich Lautstärke plötzlich chirurgisch dosieren.
Streams gezielt routen, wenn das Sound Menu nicht reicht
Im zweiten Teil habe ich vom Graphenmodell von PipeWire gesprochen, und im dritten Teil von qpwgraph als grafischer Patchbay. Hier zeige ich dir den einen Anwendungsfall, in dem das im Alltag wirklich Gold wert ist, auch wenn du kein Streamer bist.
Stell dir folgende Situation vor. Du hast einen Kollegen am Telefon über Discord, gleichzeitig läuft Spotify, und während des Calls willst du dem Kollegen einen kurzen Audio Schnipsel vorspielen, also den Spotify Stream auch durch dein Mikrofon Signal in Discord schicken. Auf Windows wäre das eine Bastelei mit virtuellen Audiokabeln. In PipeWire ist es ein einziger Klick.
Du öffnest qpwgraph und siehst den Graphen. Spotify hat zwei Output Ports, die normalerweise zum Sink gehen. Discord hat einen Input Port, an dem normalerweise dein Mikrofon hängt. Du ziehst eine zusätzliche Linie vom Spotify Output zum Discord Input, und ab sofort hört dein Kollege beides, deine Stimme und die Musik. Wenn du fertig bist, klickst du die Linie weg, und alles ist wieder normal. Kein Restart, keine Neukonfiguration, keine Race Condition.
Den gleichen Trick nutzt du, wenn du eine Sprachaufnahme machen willst, in der nicht nur dein Mikrofon, sondern auch ein YouTube Video als Quelle drin ist. Oder wenn du Spotify gleichzeitig auf zwei Sonos Speaker schicken willst, ohne den Sonos eigenen Multi Room Mechanismus zu benutzen, weil der ja nur Sonos eigene Quellen unterstützt und nicht den Browser deines Laptops. Oder wenn du in OBS ohne Studio Soundkarte mehrere Audio Quellen separat aufnehmen willst, also Spielsound und Mikrofon auf getrennten Spuren, damit du sie später unabhängig mischen kannst. Das ist genau der Workflow, für den Profis früher Hardware Mischpulte gekauft haben, und auf Linux ist es heute eingebaut.
Wichtig ist, dass diese Verbindungen nach einem Reboot nicht überleben, ausser du speicherst sie. qpwgraph hat dafür eine Save und Restore Funktion, die einen Patch als Datei ablegt und beim nächsten Start automatisch wiederherstellt. Ich habe einen Patch namens streaming.qpwgraph und einen weiteren namens podcast.qpwgraph, und je nachdem, was ich tue, wende ich den passenden an.
Die Default Werte, die ich trotzdem einmal anfassen würde
Auch wenn ich gesagt habe, dass die meisten Defaults heute funktionieren, gibt es zwei Stellen, an denen ich auch auf einem T14s einmal einen Eingriff mache, weil er sich auszahlt.
Die erste betrifft die Sample Rate. PipeWire ist in den meisten Distributionen auf 48 kHz gesetzt, was für 95 Prozent aller Anwendungen perfekt ist. Wenn du allerdings viel Musik in höherer Auflösung hörst, also FLAC Files in 96 kHz, dann setzt PipeWire intern auf 48 kHz und resampelt deine Musik runter. Das ist nicht schlimm, aber wenn du qualitätsbewusst bist, kannst du das Resampling überspringen, indem du in ~/.config/pipewire/pipewire.conf.d/ eine kleine Override Datei anlegst.
context.properties = {
default.clock.rate = 48000
default.clock.allowed-rates = [ 44100 48000 88200 96000 ]
}
Diese Konfiguration sagt PipeWire, dass die normale Sample Rate 48 kHz bleibt, aber dass der Server bereit ist, on the fly auf andere Raten umzuschalten, wenn ein Stream das verlangt. So hörst du die FLAC Datei nativ in 96 kHz, ohne dass deine YouTube Videos schlechter werden.
Die zweite Stelle ist die Buffer Grösse. PipeWire bietet im Vergleich zu PulseAudio eine sehr aggressive Default Latency, was für Pro Audio Anwendungen super ist, für Bluetooth Verbindungen mit schwachem Empfang aber gelegentlich zu Stottern führt. Wenn dir das passiert, kannst du die Quantum Range erhöhen, ebenfalls über eine Override Datei.
context.properties = {
default.clock.quantum = 1024
default.clock.min-quantum = 32
default.clock.max-quantum = 8192
}
Die Range von 32 bis 8192 lässt PipeWire die Buffer Grösse je nach Stream dynamisch wählen. Anwendungen, die niedrige Latenz brauchen, bekommen sie, und Anwendungen, die einfach nur stabil laufen müssen, dürfen sich die grösseren Buffer holen. Das ist der Mittelweg, der bei mir unter allen denkbaren Szenarien sauber funktioniert.
Beide Files legst du in ~/.config/pipewire/pipewire.conf.d/ als zwei separate .conf Dateien ab, also keine Notwendigkeit, irgendwas Globales zu überschreiben. Nach einem systemctl --user restart pipewire sind sie aktiv.
Der Stand, der bleibt
Wenn du bis hierher mitgekommen bist, hast du einen Setup Stack, der dich durch fast jeden Audio Alltag bringt. Du hast eine Mikrofon Kette, die das interne Laptop Mikrofon weit über sein Erwartbares hebt. Du hast Tastaturshortcuts, die dir Klick Wege ersparen und im Call zu Lebensrettern werden, wenn der Hund bellt. Du hast Patches in qpwgraph, die dir das Routing einer kleinen Studio Hardware geben. Und du hast zwei behutsame Anpassungen an den Defaults, die in der Tiefe der Konfiguration sitzen, aber im Alltag spürbar sind.