.. _py_sound:
3. 音效功能
=====================
在本示例中,我们将使用 PiCrawler(更准确地说,是 Robot HAT)的音效功能。它分为三个部分: **Muisc** 、 **Sound** 、 **Text to Speech** 。
.. .. image:: img/tts.png
**安装i2samp**
在使用这些功能之前,需要先启用扬声器,使其能够发声。
运行 ``i2samp.sh`` 脚本,该脚本会安装使用 i2s 放大器所需的所有依赖。
.. raw:: html
.. code-block::
cd ~/picrawler/
sudo bash i2samp.sh
系统会出现多次提示以确认请求。请对所有提示输入 **Y** 进行确认。完成对 Raspberry Pi 系统的修改后,需要重新启动计算机,使这些更改生效。
重启完成后,再次运行 ``i2samp.sh`` 脚本来测试功放。如果扬声器能够成功播放声音,则说明配置已经完成。
**运行代码**
.. raw:: html
.. code-block::
cd ~/picrawler/examples
sudo python3 3_sound_effect.py
当程序启动时,终端中会显示一个控制菜单。
按下键盘按键会立即触发对应的功能。
* ``q``:切换背景音乐的开启或关闭。
* ``1``:依次播放多个音效(阻塞模式)。
* ``2``:使用线程播放相同的音效(非阻塞模式)。
* ``t``:系统使用文本转语音功能朗读单词 “Hello”。
程序会持续运行并等待键盘输入。
按下 Ctrl+C 可以停止程序。
在程序退出之前,所有背景音乐会自动停止。
**代码**
.. code-block:: python
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~100
* ``music.music_play(./musics/sports-Ahjay_Stelino.mp3)`` : 播放音乐文件,此处播放的是 ``./musics`` 路径下的 **sports-Ahjay_Stelino.mp3** 文件
* ``music.music_stop()`` : 停止播放背景音乐
.. note::
你可以通过 :ref:`filezilla` 将不同的音效或音乐文件添加到 ``musics`` 或 ``sounds`` 文件夹中。
与音效相关的函数包括:
* ``music = Music()``
* ``music.sound_play('./sounds/talk1.wav')``: 播放音效文件,此处为 ``./musics`` 路径下的 **talk1.wav**
* ``music.sound_play_threading('./sounds/talk1.wav')``: 以多线程模式播放音效,不会阻塞主线程
与文本转语音相关的函数包括:
* ``tts = TTS()``
* ``tts.say(words)`` : 将文本转换为语音
* ``tts.lang("en-US")`` : 设置语言
.. note::
可以通过设置 ``lang("")`` 的参数来指定语言,支持以下选项:
.. list-table:: Language
:widths: 15 50
* - zh-CN
- 普通话(中文)
* - en-US
- 英语-美国
* - en-GB
- 英语-英国
* - de-DE
- 德语-德国
* - es-ES
- 西班牙语-西班牙
* - fr-FR
- 法语-法国
* - it-IT
- 意大利语-意大利