我之前是使用 ROC 来做这件事的。手机上安装 roc-droid,电脑上安装 pipewire-roc 然后执行 pactl load-module module-roc-source source_name=roc-source
就行。
但是这样会有一个问题:手机上的 roc-droid 会被休眠。换手机之前用的 Android 10 还好一点,可以设置半小时的「超长」关屏时间,并且屏幕关闭之后 roc-droid 还能活跃一段时间。现在换 Android 14 了,关屏之后 roc-droid 会立刻被休眠,也不能把 roc-droid 切到后台,否则录音会停止。为了让录音不中断,只能让手机「喝点咖啡因」来保持亮屏,于是不光网络和录音费电,屏幕也要费电。其实这个问题不是不能解决,放个持久通知就可以了,但是我不会 Android 开发呀。
ROC 方案另外的小问题有:网络会持续占用,即使没在使用。手机要么录音、要么播放,需要手工切换。roc-droid 时不时会崩溃。
后来从群友那里了解到可以在 termux 里跑 PulseAudio,我试了试,比 ROC 方案好用多啦。
手机上除了需要安装 termux 和 pulseaudio 外,还需要安装 Termux:API。为了方便启动,我还安装了 Termux:Widget。记得给 Termux:API 话筒权限。然后编辑 PulseAudio 配置文件 /data/data/com.termux/files/usr/etc/pulse/default.pa.d/my.pa
:
load-module module-sles-source load-module module-native-protocol-tcp auth-ip-acl=电脑的IP地址 auth-anonymous=true
这里的 sles 模块是用来录音的。
编辑 /data/data/com.termux/files/usr/etc/pulse/daemon.conf
文件,设置一小时不用才自动退出(默认20秒太短了):
exit-idle-time = 3600
然后在需要的时候执行 pulseaudio
命令就可以了。
电脑上的话,其实设置 PULSE_SERVER
环境变量就可以用上了。不过为了更好的集成,我们创建个 tunnel:
pactl load-module module-tunnel-source server=tcp:手机的IP地址
source 就是把手机当话筒用,改成 sink 的话则是把手机当音箱用了。
执行之后,在 PulseAudio / PipeWire 里就会多出来相应的 source(或者 sink)设备了。想怎么用就可以怎么用了~
但若是要同时使用另外的音箱来播放声音的话,手机话筒会把音箱播放的声音录进去,造成「回声」。这时候,就需要设置一下回声消除了。我参考了 ArchWiki,PipeWire 配置如下:
context.modules = [ { name = libpipewire-module-echo-cancel args = { monitor.mode = true source.props = { node.name = "source_ec" node.description = "Echo-cancelled source" } } } ]
然后去 pavucontrol 里设置一下它生成的两个录音操作的设备(一个是选话筒,另一个是选外放的音箱的 monitor 设备),并把消除了回声的 source 设备设置为默认音频输入设备就好了。