3. 音效功能
在本示例中,我们将使用 PiCrawler(更准确地说,是 Robot HAT)的音效功能。它分为三个部分: Muisc 、 Sound 、 Text to Speech 。
安装i2samp
在使用这些功能之前,需要先启用扬声器,使其能够发声。
运行 i2samp.sh 脚本,该脚本会安装使用 i2s 放大器所需的所有依赖。
cd ~/picrawler/
sudo bash i2samp.sh
系统会出现多次提示以确认请求。请对所有提示输入 Y 进行确认。完成对 Raspberry Pi 系统的修改后,需要重新启动计算机,使这些更改生效。
重启完成后,再次运行 i2samp.sh 脚本来测试功放。如果扬声器能够成功播放声音,则说明配置已经完成。
运行代码
cd ~/picrawler/examples
sudo python3 3_sound_effect.py
当程序启动时,终端中会显示一个控制菜单。
按下键盘按键会立即触发对应的功能。
q:切换背景音乐的开启或关闭。1:依次播放多个音效(阻塞模式)。2:使用线程播放相同的音效(非阻塞模式)。t:系统使用文本转语音功能朗读单词 “Hello”。
程序会持续运行并等待键盘输入。
按下 Ctrl+C 可以停止程序。 在程序退出之前,所有背景音乐会自动停止。
代码
from time import sleep
import readchar
from robot_hat import Music, TTS
music = Music()
tts = TTS()
manual = '''
Press a key to trigger actions (no Enter needed):
q: Play/Stop background music
1: Play sound effect (blocking)
2: Play sound effect (threading)
t: Text to speak
Ctrl^C: quit
'''
def main():
print(manual)
flag_bgm = False
music.music_set_volume(20)
tts.lang("en-US")
try:
while True:
# Real-time key input (no Enter required)
key = readchar.readkey().lower()
if key == "q":
flag_bgm = not flag_bgm
if flag_bgm:
music.music_play('./musics/sports-Ahjay_Stelino.mp3')
else:
music.music_stop()
elif key == "1":
music.sound_play('./sounds/talk1.wav')
sleep(0.05)
music.sound_play('./sounds/talk3.wav')
sleep(0.05)
music.sound_play('./sounds/sign.wav')
sleep(0.5)
elif key == "2":
music.sound_play_threading('./sounds/talk1.wav')
sleep(0.05)
music.sound_play_threading('./sounds/talk3.wav')
sleep(0.05)
music.sound_play_threading('./sounds/sign.wav')
sleep(0.5)
elif key == "t":
tts.say("Hello")
except KeyboardInterrupt:
print("\nquit")
finally:
# Stop music before exit to reduce error messages
try:
music.music_stop()
except Exception:
pass
if __name__ == "__main__":
main()
它是如何工作的?
与背景音乐相关的函数包括:
music = Music(): 声明对象music.music_set_volume(20): 设置音量,范围为 0~100music.music_play(./musics/sports-Ahjay_Stelino.mp3): 播放音乐文件,此处播放的是./musics路径下的 sports-Ahjay_Stelino.mp3 文件music.music_stop(): 停止播放背景音乐
备注
你可以通过 FileZilla 软件 将不同的音效或音乐文件添加到 musics 或 sounds 文件夹中。
与音效相关的函数包括:
music = Music()music.sound_play('./sounds/talk1.wav'): 播放音效文件,此处为./musics路径下的 talk1.wavmusic.sound_play_threading('./sounds/talk1.wav'): 以多线程模式播放音效,不会阻塞主线程
与文本转语音相关的函数包括:
tts = TTS()tts.say(words): 将文本转换为语音tts.lang("en-US"): 设置语言
备注
可以通过设置 lang("") 的参数来指定语言,支持以下选项:
zh-CN |
普通话(中文) |
en-US |
英语-美国 |
en-GB |
英语-英国 |
de-DE |
德语-德国 |
es-ES |
西班牙语-西班牙 |
fr-FR |
法语-法国 |
it-IT |
意大利语-意大利 |