PipeWire
PipeWire 是一個新的底層多媒體框架。 它旨在以最低的延遲為音頻和視頻提供錄製和播放功能,並支持基於 PulseAudio、JACK、ALSA 和 GStreamer 的應用程式。
基於該框架的守護進程可以配置為音頻伺服器(具有 PulseAudio 和 JACK 特性)和視頻錄製伺服器。
PipeWire 還支持像 Flatpak 這樣的容器,不依賴於 audio 和 video 用戶組。 相反,它採用了類似於 Polkit的安全模式,向 Flatpak 或 Wayland 請求許可以錄製屏幕或音頻。
安裝
可以從官方軟體庫安裝 pipewire包 程序。 也有lib32-pipewire包 的32位庫對於 multilib 進行支持
可以選擇安裝 pipewire-docs包 來查看文檔。
Pipewire 可以作為其他音頻伺服器的直接替代品。更多詳細信息請參見#聲音。
會話(Session)管理
像 JACK一樣,PipeWire 內部沒有實現連接邏輯。 監視新 streams 並將其連接到適當的輸出設備或應用程式的負擔留給稱為會話管理器的外部組件。
WirePlumber
WirePlumber 是推薦的會話管理器,採用模塊化設計,通過 Lua 插件實現實際管理功能。
默認配置文件位於 /usr/share/wireplumber。推薦通過在 /etc/wireplumber 或 ~/.config/wireplumber 中添加片段配置來覆蓋特定設置。[1]
WirePlumber 在 0.5 版本中將配置格式從 .lua 改為 .conf。遷移指南參見:https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/migration.html#config-migration
PipeWire Media Session
pipewire-media-session包 已棄用且不再推薦使用,該組件主要作為測試用例和會話管理器開發參考。
啟動
Pipewire 使用 systemd/用戶 來管理伺服器,並利用套接字激活在需要時自動啟動。
要在登錄時啟動 PipeWire,請啟用 pipewire.service, pipewire-pulse.service and wireplumber.service user units.
GUI圖形界面
- Cable — 一款可在運行時動態修改 PipeWire 與 WirePlumber 配置的 PyQt 應用程式
- coppwr — PipeWire 底層控制與診斷工具
- Helvum — 基於 GTK 的 PipeWire 接插板工具,靈感源自 JACK 的 catia。不支持連線保存
- pwvucontrol — PipeWire 音量控制工具,可作為 pavucontrol 替代品
- qpwgraph — 基於 Qt 的 PipeWire 路由接插板,靈感源自 JACK 的 QjackCtl。支持連線保存
- Simple Wireplumber GUI — 一個簡單的 PipeWire GTK4 圖形界面工具。如果使用 PipeWire 作為音頻伺服器,並使用 WirePlumber 作為會話和策略管理器,則可以通過此工具輕鬆重命名音頻設備並查看其屬性。
- sonusmix — PipeWire 音頻路由工具
- Pipewire Control Center — 基於 GTK4/libadwaita 的 PipeWire 控制中心,支持通過效果鏈將應用程式的音頻信號路由至任意輸出設備,並提供參數均衡器、實時電平表、麥克風降噪、音頻接線板、音頻監測、虛擬設備、濾波器鏈、HRIR 環繞聲及附加配置文件等功能。
TUI
- pipemixer — 一個使用ncurses構建的、用於PipeWire的TUI音量控制應用程式。
- wiremix — 一個用於PipeWire的簡單TUI音頻混音器。
配置
PipeWire 軟體包在 /usr/share/pipewire 中提供了一組初始配置文件。不應直接編輯這些文件,因為包更新將覆蓋所做的更改。要配置 PipeWire,可以將文件從 /usr/share/pipewire 複製到備用系統配置目錄位置 /etc/pipewire或用戶目錄 ~/.config/pipewire。具有較高優先級的目錄中的同名文件會使類似文件被忽略。 [2]
Pipewire 帶來了一個PulseAudio 配置以外的自定義的 "Pro Audio" 配置文件(不要與專業音頻 混淆), 可通過 pavucontrol進行選擇。其效果如下所述:https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile
用法
聲音
PipeWire 可以用作音頻伺服器,類似於 PulseAudio 和 JACK,它旨在通過為JACK客戶端提供PulseAudio兼容的伺服器實現和ABI兼容庫來取代PulseAudio和JACK。有關詳細信息,請參閱博客文章PipeWire Late Summer Update 2020。
首先,安裝 pipewire-audio包。然後根據音頻客戶端的類型,可能還需要執行一些額外的步驟。您可能需要為您的音頻設備安裝額外的固件,請參閱ALSA#固件。
ALSA 客戶端
安裝 pipewire-alsa包 (如果安裝了pulseaudio-alsa包需要刪掉它) 以使用 ALSA API 通過 PipeWire 路由所有應用程式。
PulseAudio 客戶端
安裝 pipewire-pulse包。它將代替 pulseaudio包 和 pulseaudio-bluetooth包。重新啟動、重新登錄或 start pipewire-pulse.service user unit 以查看效果。
通常,不需要進一步的操作,應用應作為用戶服務自動啟用pipewire-pulse.socket。要檢查替換是否正常工作,請運行以下命令並查看輸出:
$ pactl info
...
Server Name: PulseAudio (on PipeWire x.y.z)
...
Default Sink: alsa_output.{bus}device}.{profile}
Default Source: alsa_input.{bus{device}.{profile}
...
pactl(1) 命令由 PulseAudio 客戶端庫(libpulse包)提供,該庫會作為依賴項隨 pipewire-pulse 自動安裝。
調節全局或獨立聲道音量
調節輸出聲道音量時,需通過 pactl get-sink-volume {sink} 指定目標設備,可使用:
- 上文 Default Sink: 或下文 Name: 的值
- 默認設備占位符 @DEFAULT_SINK@
- 設備編號 Sink #(如下例中的 1)
$ pactl list sinks | grep -B1 -A9 State:
Sink #1
State: RUNNING
Name: alsa_output.pci-0000_2d_00.4.analog-surround-51
...
Driver: PipeWire
...
Mute: no
Volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB, rear-left: 65536 / 100% / 0.00 dB, rear-right: 65536 / 100% / 0.00 dB, front-center: 65536 / 100% / 0.00 dB, lfe: 65536 / 100% / 0.00 dB
balance 0.00
提示:若當前有音頻播放,可通過 grep(1) 篩選 RUNNING(運行中)狀態設備,其他設備通常顯示為 SUSPENDED(已掛起)。
balance(聲道平衡)數值會自動計算。設置默認設備的整體音量:
pactl set-sink-volume @DEFAULT_SINK@ 75%
獨立設置各聲道音量(需提供每個聲道的百分比):
pactl set-sink-volume @DEFAULT_SINK@ 100% 75% 100% 75% 100% 100%
Source(輸入設備)的操作方式類似。更多配置(如模塊加載)請參考上游維基: Migration from PulseAudio Pipewire-Pulse Configuration.
JACK 客戶端
安裝 pipewire-jack包 以獲取 JACK 支持。還有 lib32-pipewire-jack包 用於 multilib 支持。
pw-jack(1) 可以用來啟動 JACK 客戶端, 但從技術上講它不是必需的, 因為它只用作 PIPEWIRE_REMOTE、PIPEWIRE_DEBUG 和 PIPEWIRE_LATENCY 環境變量的包裝器。
可以通過設置 緩衝區大小/採樣率 的商(等於以秒為單位的塊延遲)來請求自定義緩衝區大小:
PIPEWIRE_LATENCY="128/48000" application
藍牙設備
如果安裝了 pipewire-pulse包 軟體包,PipeWire 將自動處理藍牙音頻設備。
自動化 profile 切換
pipewire-media-session包 和 WirePlumber 都可以在檢測到輸入流時自動在 HSP/HFP 和 A2DP 配置文件之間切換。
WirePlumber 默認啟用了配置文件自動切換。每當檢測到輸入流時,它可以自動在 HSP/HFP 和 A2DP 配置文件之間切換。可以使用以下命令禁用它:
$ wpctl settings --save bluetooth.autoswitch-to-headset-profile false
pipewire-media-session包 默認禁用,可以設置 bluez5.autoswitch-profile 屬性為 true 以啟用:
/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf)
...
rules = [
{
...
actions = {
update-props = {
...
bluez5.autoswitch-profile = true
...
用於命令行的 PipeWire 補丁集
qpwgraph包 可用於可視化和創建連接,以及保存和加載補丁集。 對於非 GUI 需求,以下是用於保存線集、加載線集和解除所有連接的 bash 腳本。 要保存和加載,請使用命令行參數作為文件名。
pw-savewires
#!/bin/bash if [[ "$#" -ne 1 ]]; then echo echo 'usage: pw-savewires filename' echo exit 0 fi rm $1 &> /dev/null while IFS= read -r line; do link_on=`echo $line | cut -f 4 -d '"'` link_op=`echo $line | cut -f 6 -d '"'` link_in=`echo $line | cut -f 8 -d '"'` link_ip=`echo $line | cut -f 10 -d '"'` echo "Saving: " "'"$link_on:$link_op"','"$link_in:$link_ip"'" echo "'"$link_on:$link_op"','"$link_in:$link_ip"'" >> $1 done < <(pw-cli dump short link)
pw-loadwires
#!/bin/python
import sys
import csv
import os
if len(sys.argv) < 2:
print('\n usage: pw-loadwires filename\n')
quit()
with open(sys.argv[1], newline='') as csvfile:
pwwreader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in pwwreader:
print('Loading: ' + row[0] + ' --> ' + row[1])
process = os.popen('pw-link ' + row[0] + ' ' + row[1])
pw-dewire
#!/bin/bash
while read -r line; do
echo 'Dewiring: ' $line '...'
pw-link -d $line
done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')
與網絡上的計算機共享音頻設備
PipeWire 支持使用多種機制通過網絡共享音頻,包括:
- AES67
- RTP
- Apple Airplay (without DRM features)
- JACK (netjack2)
- Roc
- PipeWire Native RTP
- PulseAudio's network protocol
- Snapcast
PipeWire維基上有一個頁面,概述並比較了不同的網絡協議。
下文將介紹 Pulse Tunnel(Pulse 音頻隧道) 方案。PipeWire 的 PulseAudio 兼容層支持 網絡音頻串流。在網絡上的計算機之間共享音頻的一種簡單方法是使用 Avahi 守護程序進行發現。要啟用此功能,請安裝 pipewire-zeroconf包 軟體包。
確保所有要共享聲音的計算機上的 avahi-daemon.service 正在運行(如果使用 firewall,則要保證 UDP 埠 5353 已打開)。
要共享本地音頻設備,在主機上加載適當的模塊(確保使用本地 IP 地址):
$ pactl load-module module-native-protocol-tcp listen=192.168.1.10 $ pactl load-module module-zeroconf-publish
然後在客戶端上加載發現模塊:
$ pactl load-module module-zeroconf-discover
還可以通過創建專用配置文件自動加載模塊。
主機:
/etc/pipewire/pipewire-pulse.conf.d/50-zeroconf-publish.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/50-zeroconf-publish.conf)
pulse.cmd = [
{ cmd = "load-module" args = "module-native-protocol-tcp listen=192.168.1.10" }
{ cmd = "load-module" args = "module-zeroconf-publish" }
]
客戶端:
/etc/pipewire/pipewire-pulse.conf.d/50-zeroconf-discover.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/50-zeroconf-discover.conf)
pulse.cmd = [
{ cmd = "load-module" args = "module-zeroconf-discover" }
]
將音頻串流到 AirPlay 接收器
可以將音頻串流到冒充 AirPlay 接收器的設備。 要啟用此功能,請加載 RAOP Discover 模塊:
$ pactl load-module module-raop-discover
還可以通過創建專用配置文件自動加載此模塊:
/etc/pipewire/pipewire.conf.d/raop-discover.conf (or ~/.config/pipewire/pipewire.conf.d/raop-discover.conf)
context.modules = [
{
name = libpipewire-module-raop-discover
args = { }
}
]
某些揚聲器的 AirPlay 實現(例如 Sonos AirPlay 2 揚聲器)可能需要為源設備上的傳入 UDP 流量打開埠 6001 和 6002。
通過 Roc 實現設備間音頻串流
Roc streaming 是一套支持前向糾錯的實時音頻網絡傳輸協議。PipeWire 默認內置對它的支持,配置十分簡便。 首先 安裝 pipewire-roc包 軟體包。
接收端 / 主機 / DAC 配置:
~/.config/pipewire/pipewire.conf.d/
context.modules = [
{ name = libpipewire-module-roc-source
args = {
local.ip = 0.0.0.0
roc.resampler.backend = default
roc.resampler.profile = default
roc.latency-tuner.backend = default
roc.latency-tuner.profile = default
fec.code = default
sess.latency.msec = 100
local.source.port = 10001
local.repair.port = 10002
local.control.port = 10003
}
}
]
更多參數可查閱 PipeWire 官方文檔。
發送端 / 客戶端配置:
~/.config/pipewire/pipewire.conf.d/roc-sink.conf
context.modules = [
{ name = libpipewire-module-roc-sink
args = {
fec.code = default
remote.ip = <主機 IP 地址>
remote.source.port = 10001
remote.repair.port = 10002
remote.control.port = 10003
sink.props = {
node.name = "my-roc-sink"
node.description = "my-roc-sink"
}
}
}
]
更多參數可查閱 PipeWire 官方文檔。
node.description 用於設置 pulsemixer 顯示的設備名稱;node.name 供 pactl 工具讀取。建議兩項均進行配置。在兩台設備上 重啟 pipewire.service 用戶單元。
在本地 JACK 上運行 PipeWire
如果需要,PipeWire 也可以作為 JACK 客戶端在本機 JACK 守護程序之上運行。
請參閱 JACK 和 PipeWire (PipeWire wiki) 和 -JACK#jack-bridge JACK 橋(PipeWire wiki) 了解更多信息和附加配置(例如可用通道)。
要使用它,請安裝 pipewire-jack-client包 並啟動 JACK。Pipewire 應該會被自動橋接。
它可以在啟動 jack 之前像 PulseAudio 模塊一樣手動加載(在pactl(1)解釋):pactl load-module module-jackdbus-detect。
使用 ALSA dmix 設備作為 PipeWire 接收器
可以通過 ALSA dmix devices 將 PipeWire 伺服器(或每個用戶多個)輸出到 ALSA。這允許您使用 ALSA 作為主要音頻輸出系統,同時能夠使用非 ALSA 設備,例如藍牙耳機。
ALSA dmix 設置
假設您有兩張卡:PCH 和 HDMI:
/proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xdff40000 irq 146
1 [HDMI ]: HDA-Intel - HDA ATI HDMI
HDA ATI HDMI at 0xdfe60000 irq 147
你的 PCM 看起來長這樣:
/proc/asound/pcm
00-00: ALC1220 Analog : ALC1220 Analog : playback 1 : capture 1 00-02: ALC1220 Alt Analog : ALC1220 Alt Analog : capture 1 01-03: HDMI 0 : HDMI 0 : playback 1 01-07: HDMI 1 : HDMI 1 : playback 1 01-08: HDMI 2 : HDMI 2 : playback 1 01-09: HDMI 3 : HDMI 3 : playback 1 01-10: HDMI 4 : HDMI 4 : playback 1 01-11: HDMI 5 : HDMI 5 : playback 1
假設您的 ALSA 配置如下所示:
/etc/asound.conf
ctl.!default {
type hw
card PCH
}
pcm.!default {
type plug
slave.pcm "dmix:PCH,0"
}
pcm.dhdmi {
type plug
slave.pcm "dmix:HDMI,9"
}
在此特定示例中,dmix 設備為 dmix:PCH,0 和 dmix:HDMI,9。
PipeWire dmix 設置
首先,通過禁用 monitor.alsa 來阻止 wireplumber 監控和添加硬體 ALSA 設備:
/etc/wireplumber/wireplumber.conf.d/disable-alsa-monitor.conf (or ~/.config/wireplumber/wireplumber.conf.d/disable-alsa-monitor.conf)
wireplumber.profiles = {
main = {
monitor.alsa = disabled
}
}
現在,配置 pipewire 以使用 dmix 設備。 默認配置文件(/usr/share/pipewire/pipewire.conf)包含一個注釋掉了的示例,您可以將其用作模板。
將您自己的元素添加到 context.objects 數組中:
/etc/pipewire/pipewire.conf.d/alsa-dmix.conf (or ~/.config/pipewire/pipewire.conf.d/alsa-dmix.conf)
context.objects = [
# We do not start with dmix, but with an input device.
# Do not forget to add an input device.
# On a friend's Laptop, I saw Zoom having a nervous
# breakdown and endlessly crying because no input device
# was configured! You have been warned.
{ factory = adapter
args = {
factory.name = api.alsa.pcm.source
node.name = "alsa-mic-internal" # name of pulse device (mpv)
node.description = "Mic Internal" # name of pulse device (pavucontrol)
media.class = "Audio/Source"
api.alsa.path = "hw:PCH,0"
}
}
# Okay, now we add our dmix PCMs
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink # sink for dmix
node.name = "alsa-dmix-internal" # name of pulse device (mpv)
node.description = "PCM Internal" # name of pulse device (pavucontrol)
media.class = "Audio/Sink" # Sink for dmix
api.alsa.path = "dmix:PCH,0"
}
}
{ factory = adapter
args = {
factory.name = api.alsa.pcm.sink # sink for dmix
node.name = "alsa-dmix-hdmi" # name of pulse device (mpv)
node.description = "PCM HDMI" # name of pulse device (pavucontrol)
media.class = "Audio/Sink" # Sink for dmix
# remember this is a non-default dmix from /etc/asound.conf
api.alsa.path = "dmix:HDMI,9"
}
}
]
作為用戶(非 root),檢查 wpctl status 的輸出,並使用wpctl set-default ID根據您的喜好設置默認輸入(源)和輸出(接收器)設備。ID 是接收器/源名稱之前的數字。
現在,您可以全面測試您的配置。
在設備配置之間切換
某些硬體音頻設備(例如 snd_hda_intel)的功能會有所不同,具體取決於設備運行的配置文件。對於 snd_hda_intel,HDMI 和模擬輸出有單獨的配置文件。
使用 WirePlumber 切換到 HDMI:
$ wpctl set-profile <device-ID> 3 $ wpctl status
... ├─ Sinks: │ * 53. Built-in Audio Digital Stereo (HDMI) [vol: 1.00] ...
使用 WirePlumber 切換到模擬:
$ wpctl set-profile <device-ID> 1 $ wpctl status
... ├─ Sinks: │ * 51. Built-in Audio Analog Stereo [vol: 0.60] ...
多用戶音頻共享
有時允許其他用戶連接到當前用戶的 PipeWire 實例會很實用。例如,你通過 Xephyr 登錄另一個用戶帳戶,希望 Xephyr 會話內播放的音頻從外部用戶管理的揚聲器輸出。
實現該需求的一種方式是配置外部用戶的 pipewire-pulse,使其監聽本地 TCP 連接。
在外部用戶家目錄下新建如下配置文件:
~/.config/pipewire/pipewire-pulse.conf.d/pulse-server.conf
pulse.properties = {
server.address = [
"unix:native"
"tcp:127.0.0.1:4713" # 此時外部用戶的 pipewire 服務會監聽 IPv4 本地迴環地址
]
}
之後在內層用戶會話中設置環境變量 PULSE_SERVER=tcp:127.0.0.1:4713。比如以內層用戶身份啟動 Xephyr 前執行導出該變量。更多說明與其他配置方案可參閱該論壇帖子
WebRTC 屏幕共享
大多數應用程式過去依賴 X11 來捕獲桌面(或單個應用程式),例如在網絡瀏覽器中使用 WebRTC 時(例如在 Google Hangouts 上)。 在 Wayland 上,屏幕共享機制由 XDG Desktop Portal 配合 PipeWire 實現,能夠通過細粒度的訪問控制在 Wayland 下共享內容
Firefox (84+) 默認支持此方法,而在 Chromium (73+) 上,需要通過設置啟用 WebRTC PipeWire 支持 URL chrome://flags/#enable-webrtc-pipewire-capturer 處的相應(實驗)標誌,或者使用CLI參數 --enable-features=WebRTCPipeWireCapturer。
obs-studio包 (27+) 通過使用新的 PipeWire 捕獲源支持此方法。
視頻
儘管該軟體尚未準備好投入生產,但可以安全地使用。大多數依賴 GStreamer 處理視頻流的應用程式應該使用 PipeWire GStreamer 插件開箱即用,請參閱 GStreamer#PipeWire。因此,像 cheese包 這樣的應用程式已經能夠使用它來共享視頻輸入。
使用 pipewire-v4l2包,還應該可以使用 pw-v4l2 腳本來預加載庫 (/lib/pipewire-0.3/v4l2/libpw-v4l2 .so)攔截 v4l2 調用並通過管道路由視頻。
音頻後期處理
Pipewire 模塊過濾鏈(module-filter-chain)
Pipewire 有一個名為過濾鏈(filter-chain)的內部模塊,可以創建節點來處理音頻輸入和輸出。有關均衡、虛擬環繞聲、LADSPA 插件和通道混合的示例,請參閱 /usr/share/pipewire/filter-chain/。
LADSPA
你可以從官方軟體倉庫安裝各種 LADSPA 插件,並在 PipeWire 濾波器鏈中使用它們。
要列出特定文件提供的插件標籤及可用控制參數,可以使用 ladspa包 軟體包中的 analyseplugin:
$ analyseplugin /usr/lib/ladspa/lsp-plugins-ladspa.so
全系統參數均衡
PipeWire 的濾波器鏈支持參數均衡器(Parametric EQ)[4]。在 /etc/pipewire/pipewire.conf.d/(或 ~/.config/pipewire/pipewire.conf.d/)目錄中創建配置文件,然後參考以下示例,根據需要設置參數:
context.modules = [
{
name = libpipewire-module-filter-chain
args = {
node.description = "Equalizer Sink"
media.name = "Equalizer Sink"
filter.graph = {
nodes = [
{
type = builtin
name = eq
label = param_eq
config = {
filters = [
{ type = bq_peaking, freq = 100, gain = 0.0, q = 1.0 },
{ type = bq_peaking, freq = 500, gain = 0.0, q = 1.0 },
{ type = bq_peaking, freq = 2000, gain = 0.0, q = 1.0 },
]
}
}
]
links = []
}
audio.channels = 2
audio.position = [ FL FR ]
capture.props = {
node.name = "effect_input.eq"
media.class = Audio/Sink
}
playback.props = {
node.name = "effect_output.eq"
node.passive = true
}
}
}
]
你可以使用任意數量的濾波器。
如果需要前置放大器(Pre-amp),可以在頻率為 0 的位置應用 bq_highshelf 濾波器,例如:
{ type = bq_highshelf, freq = 0, gain = -5.0, q = 1.0 },
重啟 PipeWire,然後將「Equalizer Sink」設置為默認音頻輸出設備。此後,均衡器效果應會應用於所有應用程式。
或者,你也可以不指定 filters 數組,而是提供 filename 屬性,指向由 AutoEq 項目或 Squiglink 生成的參數均衡器配置文件,例如:
config = {
filename = "/path/to/parametric.txt"
}
EasyEffects
EasyEffects(以前的 PulseEffects)是一個 Qt 實用程序,它為各個應用程式輸出流和麥克風輸入流提供大量音頻效果和濾波器。值得注意的效果包括輸入/輸出均衡器、輸出響度均衡和低音增強、輸入嘶聲消除器和降噪插件。有關效果的完整列表,請參閱 GitHub 頁面。
為了使用 EasyEffects,請安裝 easyeffects包。有關預設配置的集合,請參閱社區預設。對於算法生成的耳機 EQ 預設的集合,請參閱 AutoEq。
NoiseTorch
NoiseTorch 是一種噪聲抑制的替代方法,與 noisetorchAUR 打包在一起。另外還有-git版本noisetorch-gitAUR。
啟動後,可以為所選麥克風加載模塊。可以調整語音激活閾值,應將其設置為最高級別,而不是過濾掉任何實際語音。
您可以使用 systemd 自動啟動音頻處理,請參閱 [5]。請注意,如果從 AUR 安裝,noisetorch 二進制路徑會有所不同。
語音噪聲抑制
安裝 noise-suppression-for-voice包 軟體包,以使用適配 LADSPA 濾波器鏈的 librnoise,並安裝 swh-plugins包 軟體包以提供噪聲門(Noise Gate)功能。
GitHub 上提供的說明基本仍然適用,但部分內容已經過時。在 PipeWire 1.6.3 中,濾波器鏈模塊改為在預定義位置搜索插件,並更改了插件格式。
capture.props 和 playback.props 部分末尾分別添加以下兩行來實現:
~/.config/pipewire/pipewire.conf.d/99-input-denoising.conf
audio.channels = 1 audio.position = [ MONO ]
JamesDSP
JamesDSP for Linux (jamesdspAUR) 為 PipeWire 和 PulseAudio 提供開源的音效實現。JamesDSP 使用自己的效果引擎,不依賴 LADSPA 或是 Calf 之類的東西。起初它被用於安卓設備的音效處理。
LADSPA, LV2 和 VST 插件
如果你希望從所有可用的 LADSPA、LV2 和 VST 插件中自由選擇,可以通過 carla包 配合 pipewire-jack包 來使用這些插件。
啟動 Carla,進入 Settings > Configure Carla > Engine(設置 > 配置 Carla > 引擎)。確保將 Audio driver(音頻驅動)設置為 JACK,並根據需要選擇合適的處理模式。你也可以通過特定命令啟動 Carla 來選擇處理模式,例如使用 carla-rack 啟動 Continuous Rack(連續機架)模式。
你可以手動將應用程式的音頻輸出連接到 Carla,但如果希望讓多個應用程式的音頻都經過 Carla 處理,在應用程式和 Carla 之間創建一個虛擬音頻設備可能更加方便,並且可以選擇將其設置為默認設備。首先,創建一個名為 default_null_sink 的空輸出設備(null sink)。
/etc/pipewire/pipewire.conf.d/10-default-null-sink.conf (或 ~/.config/pipewire/pipewire.conf.d/10-default-null-sink.conf)
context.objects = [
{
factory = adapter
args = {
factory.name = support.null-audio-sink
node.name = "default_null_sink"
media.class = Audio/Sink
audio.position = [ FL FR ]
monitor.channel-volumes = true
monitor.passthrough = true
}
}
]
重啟 PipeWire 以使更改生效。
或者,你也可以使用 pw-cli(1) 臨時創建虛擬設備。如果安裝了 pipewire-pulse包,也可以使用 pactl(1)。詳情參見 PipeWire Wiki。
在 Rack(機架)選項卡中,添加你需要的任意插件。確保這些插件為 stereo(立體聲)類型。你可以調整插件的排列順序。在 Continuous Rack(連續機架)處理模式下,列表頂部的插件會最先接收音頻流,與 EasyEffects 中的處理順序相同。隨後,進入 Patchbay(接線板)選項卡,將 default_null_sink 的左右聲道(L/R)監聽埠連接到 Carla 的輸入埠,再將 Carla 的輸出埠連接到目標設備(揚聲器、耳機、HDMI 等)的播放埠。將配置保存到本地文件,例如 ~/Documents/carla_sink_effects.carxp。之後打開該文件時,Carla 會自動恢復這些連接。
你可以在多媒體應用程式播放音頻時測試效果,例如使用 Firefox 觀看網頁視頻。有兩種方法可以實現。第一種是在 Carla 的 Patchbay(接線板)選項卡中,斷開 Firefox 的所有連接,並將其左右聲道輸出連接到 default_null_sink 的播放埠。第二種是通過 pavucontrol包 找到 Firefox 的音頻流,並將其重定向到 default_null_sink(系統應會記住該連接,以便下次啟動該應用程式時自動將其重定向到相同的輸出設備)。
要在啟動時以 Continuous Rack(連續機架)處理模式運行 Carla 並加載保存的配置文件,可以創建一個 systemd 用戶服務:
~/.config/systemd/user/jack-carla-rack.service
[Unit] Description=Load Carla Rack JACK host [Service] Environment=PIPEWIRE_LINK_PASSIVE=true Type=exec ExecStart=/usr/bin/carla-rack --no-gui %h/Documents/carla_sink_effects.carxp [Install] WantedBy=default.target
然後啟用 jack-carla-rack.service 用戶單元。
注意,如果你將 default_null_sink 設置為了系統默認設備,所有的應用聲音都會被重定向至它,並且音量鍵也會改變它的音量而不是回放設備的。如果想控制回放設備的音量,需要把回放設備設成默認設備,然後將所需應用在 pavucontrol 裡重定向到 default_null_sink(PipeWire兼容層應該會記住應用的連接關係)。
參閱
- Wiki——Freedesktop GitLab 上的 PipeWire Wiki
- Pipewire Update Blog Post——一篇 2018 年 1 月的描述當時 PipeWire 狀態的博文
- PipeWire Late Summer Update 2020——2020 年 9 月的一篇博文