在 Raspberry Pi 上使用 Python 播放声音
今天,我需要在 Python 脚本中通过树莓派上的 USB 音频设备播放 MP3 或 WAV 文件。“应该很容易吧! ”我想!
好吧,几个小时后,我决定写这篇博客文章来记录最简单的方法,因为我不得不花费相当长的时间才能到达真正通过 USB 音频输出播放声音的地步。
问题在于大多数指南,例如来自 Raspberry Pi 项目站点的这个简单指南,假设有两件事:
您的 Raspberry Pi 有一个已经可以使用的默认声音设备(例如
0
)您正在以交互方式运行代码或以某种方式运行代码,而无需了解底层 API 的工作原理
就我而言,问题是,在无头 Raspberry Pi Zero 上运行 USB 声音设备,这些假设都不是真的。
让 USB 音频正常工作
第一步是检测 USB 音频设备,并告诉您的系统将其用作默认音频设备。还有其他方法可以在 Python 代码本身中检测和/或选择特定设备,但如果您可以在系统范围内设置默认值并让 Python 使用该默认值,这是最简单的。
首先,您需要确保您的声音设备(在我的例子中是一个 9 美元的 Vantec NBA-120U 适配器)被识别。运行以下命令,您应该会看到它列为名称中带有“USB”的设备:
$ cat /proc/asound/modules 1 snd_usb_audio
一些 Pi 模型也会显示一个0
内置设备(例如模型 B 版本上的声音输出)。默认情况下,ALSA(Advanced Linux Sound Architecture)音频系统0
无论如何都会尝试使用 device 。要告诉它使用设备1
(snd_usb_audio
设备),您可以配置全局/etc/asound.conf
文件或用户本地~/.asoundrc
文件。
在这两个文件之一(我选择配置 Pi 用户的~/.asoundrc
文件)中,放入以下内容:
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 }
这告诉 ALSA 默认card 1
使用 USB 设备。现在,要测试它是否正常工作,请将耳机或扬声器插入输出,然后运行:
$ speaker-test -c2 -twav -l7
您应该开始通过扬声器或耳机听到“左前”和“右前”之类的声音。
播放声音pygame.mixer
对于我的Raspberry Pi Bell Slapper项目,我有一个简单的“ding.wav”文件,它是铃声的声音。我想设置它,这样树莓派不仅会发出带有连接到树莓派 GPIO 的螺线管的物理铃铛,而且还会通过扬声器发出叮当声,因此有人可以在另一个房间听到叮当声。
这是播放文件所需的最少 Python 代码pygame
:
import pygame pygame.mixer.init() sound = pygame.mixer.Sound('/home/pi/ding.wav') playing = sound.play() while playing.get_busy(): pygame.time.delay(100)
这需要pygame
,它可以与pip3 install pygame
. 如果没有所需的混音器库,Pygame 也会失败,因此您还需要运行apt-get install libsdl2-mixer-2.0-0
.
完成此操作后,您应该能够运行脚本 ( python3 play-sound.py
),并且它应该会播放文件。
最后的while
循环很重要——没有它,脚本将在声音有机会播放之前退出!