在docker中调用宿主机音频设备并用pygame库在docker上播放音频
我来解释这段代码的含义:这是一个音频配置文件(通常是 asound.conf ),用于配置 ALSA(高级 Linux 声音架构)。card 0 是 HDA Intel PCH,其设备号 device 0 对应的是 ALC257 Analog。这是你的集成声卡,它通常与耳机接口(或者是内建的扬声器)相关联。我查了一下PCH开头的这个设备是在耳机上输出声音的,了解这些设备为第3步做准备。PS:大家根
1.新建一个容器,用参数将宿主机的设备挂载到容器中
sudo docker run --privileged --env="DISPLAY" --net=host -v /dev/snd:/dev/snd --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --env="QT_X11_NO_MITSHM=1" -v /tmp/.X11-unix:/tmp/.X11-unix:ro -it --name audio1 -v /home/gyj/exchange:/exchange new:latest /bin/bash
PS:这个 Docker 命令用于启动一个容器并配置图形和音频支持。让我们逐一解析每个参数的作用:
1.sudo docker run:
使用 sudo 以管理员权限运行 Docker 命令。
2.--privileged:
赋予容器更高的权限,允许其访问更多宿主机资源和设备。
3.--env="DISPLAY":
设置环境变量 DISPLAY,用于 X11 窗口系统显示设置,使容器能够访问宿主机的显示服务器。
4.--net=host:
使容器共享宿主机的网络栈,这样容器和宿主机可以使用相同的网络接口和 IP 地址。
5.-v /dev/snd:/dev/snd:
将宿主机的音频设备 /dev/snd 挂载到容器中的相同路径,使容器能够访问和使用宿主机的音频设备。
6.--volume="$HOME/.Xauthority:/root/.Xauthority:rw":
将宿主机用户的 .Xauthority 文件挂载到容器的 /root/.Xauthority,以便容器可以访问宿主机的 X11 服务器进行图形显示。rw 表示读写权限。
7.--env="QT_X11_NO_MITSHM=1":
设置环境变量 QT_X11_NO_MITSHM=1,禁用 Qt 应用程序中的 MIT-SHM(共享内存),解决一些 X11 图形兼容性问题。
8.-v /tmp/.X11-unix:/tmp/.X11-unix:ro:
将宿主机的 X11 UNIX 套接字目录 /tmp/.X11-unix 挂载到容器中,并设置为只读(ro),以便容器可以与宿主机的 X11 服务器进行图形通信。
9.-it:
以交互模式(-i)和伪终端(-t)运行容器,使用户可以与容器进行交互。
10.--name audio1:
指定容器名称为 audio1,方便对该容器进行管理和识别。
11.-v /home/gyj/exchange:/exchange:
将宿主机的 /home/gyj/exchange 目录挂载到容器中的 /exchange 目录,以便在宿主机和容器之间共享文件。
12.new:latest:
使用 new 镜像的 latest 标签来创建容器。
13./bin/bash:
容器启动后运行 Bash shell,这样用户可以在容器内与系统交互。
只需修改10和12即可,容器名称自己起。
2.安装声卡驱动。
apt-get update
apt-get install -y vim alsa-util
3.用aplay -l查看在 Linux 系统上所有可用声卡和设备,我的输出如下:
(base) gyj:~/exchange/oopt$ aplay -l
**** PLAYBACK 硬體裝置清單 ****
card 0: PCH [HDA Intel PCH], device 0: ALC257 Analog [ALC257 Analog]
子设备: 1/1
子设备 #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
子设备: 1/1
子设备 #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
子设备: 1/1
子设备 #0: subdevice #0
card 1: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
子设备: 1/1
子设备 #0: subdevice #0
card 1: NVidia [HDA NVidia], device 9: HDMI 3 [HDMI 3]
子设备: 1/1
子设备 #0: subdevice #0
card 1: NVidia [HDA NVidia], device 10: HDMI 4 [HDMI 4]
子设备: 1/1
子设备 #0: subdevice #0
我查了一下PCH开头的这个设备是在耳机上输出声音的,了解这些设备为第3步做准备。
4.打开这个音频配置文件vim /etc/asound.conf,写入以下内容:
pcm.!default{
type hw
card 0
device 0
}
ctl.!default{
type hw
card 0
device 0
}
timer.!default{
type hw
card 0
device 0
}
我来解释这段代码的含义:这是一个音频配置文件(通常是 asound.conf ),用于配置 ALSA(高级 Linux 声音架构)。其中定义了 pcm、ctl 和 timer 设备的默认硬件设置。具体来说:
pcm.!default 设置默认的音频播放设备。
ctl.!default 设置默认的控制设备。
timer.!default 设置默认的定时器设备。
这些配置确保 ALSA 使用指定的硬件设备进行音频处理。
card 0 是 HDA Intel PCH,其设备号 device 0 对应的是 ALC257 Analog。这是你的集成声卡,它通常与耳机接口(或者是内建的扬声器)相关联。
PS:大家根据自己电脑的情况修改音频配置文件中写入的内容。
5.我运行的python文件如下:
import asyncio
import edge_tts
# from playsound import playsound
import pygame
TEXT = "you are my sunshine,my pretty sunshine!I always will be there."
VOICE = "en-GB-SoniaNeural"
OUTPUT_FILE = "test.mp3"
async def amain() -> None:
"""Main function"""
communicate = edge_tts.Communicate(TEXT, VOICE)
await communicate.save(OUTPUT_FILE)
# playsound(OUTPUT_FILE)
# Initialize pygame mixer
pygame.mixer.init()
# Load and play the sound
pygame.mixer.music.load(OUTPUT_FILE)
pygame.mixer.music.play()
# Wait until the sound finishes playing
while pygame.mixer.music.get_busy():
await asyncio.sleep(1)
if __name__ == "__main__":
loop = asyncio.get_event_loop_policy().get_event_loop()
try:
loop.run_until_complete(amain())
finally:
loop.close()
pygame.mixer.quit()
其中edge_tts和pygame,用pip install安装即可。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)