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安装即可。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐