背景:
尝试在云上运行的 docker 镜像中使用 python3 进行一些音频处理。
问题:
PyAudio 寻找 ALSA 和 JACK 音频服务器,ALSA 至少需要有一个设备。
没有解决方案:
我最初尝试仅使用 PulseAudio Sound Server 来实现这一点,但这还不够。
共享 /dev/snd/ 不可扩展,即使云服务恰好安装了声卡,也只能为有限数量的用户提供服务。这是大多数其他问题最终推荐的方法。
我希望得到建议的可能解决方案:
我了解到您可以使用 snd-aloop 模块在 ALSA 中创建虚拟声卡。这引发了许多进一步的问题:
- 要访问此模块,需要拥有权限,但我不确定我是否会在云服务上拥有这些权限,例如访问主机和将模块 modprobing 到内核中
- 我可以尝试构建模块来自源头
JACK 声音服务器作为替代声音服务器。这就是我现在要研究的内容,我只是希望它不会像 ALSA 虚拟服务器那样有问题。
其他需要考虑的事情:
也许我需要完全放弃 PyAudio?
我的传入音频流可以看到 pulseaudio,所以也许https://pypi.org/project/pulsectl/
可能更有用,或者类似https://github.com/kubikb/py-audio-docker
最相似的问题:
答案1
解决方案
使用PySoundIo库我设法在没有 /dev/snd 的 docker 容器中设置虚拟声卡,并在 python3 中处理传入的音频流(来自 SIPclient)。
不起作用的事情:
PyAudio 寻找设备,因此基本上需要 ALSA 和 /dev/snd。注意:你可以将 ALSA 与snd-aloop这可能是一个解决方案,但需要将一些模块放入图像所在主机的内核,这 a) 非常困难,b) 不完全符合容器化的精神。
可能可以使用 JACK 设置虚拟声音设备,但这也需要特权 docker 镜像和大量的设置调整。
做过的事:
这库这个库真是天赐之物,它开箱即用,无需任何设备,甚至不需要 pulseaudio。与我尝试过的其他所有东西不同,当你没有 /dev/snd 时,它在启动时不会出现段错误。
Pulseaudio 也很棒,因为 Linux 上大多数使用声音的设备都乐意连接到它并认真执行它的指令。与 libsoundio 结合使用,它几乎不费吹灰之力,只需很少的摆弄(对于其他任何真正尝试这样做的人,专业提示:RUN sed -i 's/; exit-idle-time = 20/exit-idle-time = -1/' /etc/pulse/daemon.conf
在您的 Dockerfile 中,然后pulseaudio --daemonize
在您的 startup.sh 中,您需要做的所有工作就是让 pulseaudio 服务)。
我认为对于某些应用程序,您甚至不需要 pulseaudio,pysoundio 无需它就可以完成一些基本任务。但是,如果您想在不同的源和接收器之间传输音频流(其中一个是一些 Python 代码),那么除了 pulseaudio 和 pysoundio 之外,您不需要再寻找其他东西了。