很多朋友在后台问我,家里养了牡丹鹦鹉之后,为什么我特意留了一台天猫精灵给它们用。听起来像是“宠物与智能硬件”的小趣味,但背后其实是一套完整的宠物陪伴音频播放方案。本文就把这个项目从需求到落地完整拆开,讲清楚如何用“天猫精灵 + 树莓派 + Python 定时任务”打造一个会唱歌、能定时、可远程控制的“鹦鹉陪伴音箱”。
如果你是养鸟爱好者,或者想给宠物做一套自动音乐播放系统,又或者只是对智能音箱的二次开发感兴趣,这篇文章都能给你一个可以直接复制运行的参考。
1. 背景与场景拆解
1.1 牡丹鹦鹉为什么需要“声音陪伴”
牡丹鹦鹉是一种非常粘人、感情丰富的鸟类。它们会通过鸣唱表达情绪,也会因为孤单、环境变化而出现拔羽、拒食等应激行为。很多人以为只要给足食物和水就可以了,但事实上,声音环境对鹦鹉的心理健康非常关键。
鸟类对声音极其敏感,尤其是同类鸟的鸣叫声。一只从小人工喂养的牡丹鹦鹉,如果长期听不到同类声音,可能会变得沉默、焦虑。反过来,如果让它听到舒缓的音乐或者同类清晰、健康的鸣叫声,它更容易放松下来,并逐渐模仿、学习,甚至重新建立起活泼的鸣唱状态。
这个项目就是从这个场景出发:把天猫精灵当作“会唱歌的陪伴伙伴”,通过定时播放音频,让牡丹鹦鹉在主人上班时也能感受到“家里有声音、有互动”,从而缓解孤独感。很多实践者反馈,坚持播放两周后,鹦鹉开始主动回应音频里的鸟鸣,状态明显变好。
1.2 天猫精灵在这个方案中的角色
天猫精灵本身可以有多种用法:
- 直接让天猫精灵播放音乐,但语音点播无法精准控制播放时长和曲目顺序;
- 通过天猫精灵App设置闹钟和提醒,只能触发简单铃声,无法自定义音频包;
- 把天猫精灵当作高品质蓝牙音箱,由外部设备(树莓派/电脑)控制播放内容。
这个项目采用第三种方案。原因很简单:我们需要的不是“在线曲库”,而是“可编排的音频计划”。把天猫精灵当作蓝牙音频输出端,把树莓派当作“大脑”,可以精确到哪天、几点、播放什么声音、播放多久,还能自动重连、断网保护、记录日志。
最终的效果,就是一台看起来普普通通的天猫精灵,每天早上九点自动开始播放鸟鸣,下午四点再播放一段轻音乐,像是一个真正会唱歌的“电子鸟友”。
1.3 项目目标与最终效果
通过这个项目,你将实现:
- 树莓派(或普通电脑)开机后自动连接天猫精灵蓝牙;
- 使用 Python 脚本检测当前日期、播放列表和播放时长;
- 通过 cron 定时任务触发,无需人工干预;
- 所有播放记录写入日志,方便查看鹦鹉对哪些音频反应更好;
- 支持手动远程执行脚本,临时决定给鹦鹉播一段声音。
这套系统不仅适用于牡丹鹦鹉,也可以扩展到其他宠物、绿植环境背景音、白噪音助眠场景。它是一次典型的“语音硬件 + 物联网 + 自动化脚本”组合,非常适合入门级智能家居项目。
2. 方案选型与系统架构
2.1 三种方案对比
| 方案 | 优点 | 缺点 | 适合人群 |
|---|---|---|---|
| 天猫精灵App定时播放 | 配置简单,无需额外硬件 | 音频源受平台限制,无法自定义本地文件,定时精度有限 | 不想折腾,只要固定闹钟 |
| 手机蓝牙 + 手机闹钟 | 不需要额外硬件 | 手机必须一直在旁边,播放内容受手机闹钟限制,无法自动切换曲目 | 临时使用 |
| 树莓派 + 天猫精灵蓝牙 + 定时任务 | 可编程、可自定义、可扩展 | 需要一定动手能力 | 想真正做一套智能陪伴系统的玩家 |
本项目选择第三种方案,因为它把“天猫精灵”变成了一个通用的音频输出终端,而不是一个封闭的语音音箱。这样我们既保留天猫精灵的外观和音质,又能通过代码完全掌控播放行为。
2.2 系统架构
整体架构可以用下面这条链路来描述:
树莓派(Python脚本 + cron) ↓ 蓝牙 A2DP 音频连接 ↓ 天猫精灵(蓝牙音箱模式) ↓ 牡丹鹦鹉听到声音整个流程中,树莓派负责“什么时候播、播什么、播多久”;天猫精灵负责“把数字信号变成实际声音”。二者之间通过蓝牙传递音频。
如果后续想扩展,还可以在树莓派上接一个摄像头,观察鹦鹉对音频的行为反应,做成一个“视频 + 音频”的闭环陪伴系统。这就是后话了。
3. 环境准备与硬件清单
3.1 硬件准备
- 牡丹鹦鹉一只,饲养环境需要保证安全、安静;
- 天猫精灵音箱任意型号(支持蓝牙即可,我用的是常见款);
- 树莓派 3B/4B 或者一台运行 Linux 的电脑(带蓝牙模块),如果没有树莓派,也可以用闲置笔记本装 Ubuntu;
- 电源线和基础网络(局域网即可,不需要连接公网也能播放本地音频);
- 3.5mm 音频线可选,但蓝牙方案更方便。
需要说明的是,树莓派的具体型号不影响本文的核心逻辑,只需要它能正常播放音频、支持蓝牙A2DP协议。
3.2 软件环境
- 操作系统:Raspberry Pi OS(Debian 11/12)或 Ubuntu 20.04/22.04
- Python 版本:3.8 及以上
- 依赖软件:
bluez、pulseaudio或pipewire、mpv、cron - Python 依赖:无额外第三方库,只用了标准库
subprocess、logging、datetime
版本不需要完全一致,因为本文的核心是配置思路和脚本逻辑。不同系统之间的差异,我会在常见问题里说明。
3.3 项目目录结构
建议在树莓派上创建如下目录:
/home/pi/bird-sound/ ├── audio/ │ ├── bird_morning.mp3 │ ├── bird_afternoon.mp3 │ └── music_relax.mp3 ├── scripts/ │ ├── play_sound.py │ └── bt_connect.sh ├── logs/ └── config.ini其中,audio/存放所有音频文件,scripts/存放核心脚本,logs/存放运行日志,config.ini用于配置播放时段和时长。
4. 核心配置步骤
4.1 准备音频文件
音频文件是整套系统的灵魂。对于牡丹鹦鹉来说,最好选择以下两类音频:
- 同类的牡丹鹦鹉清晰鸣叫声,也就是“同类鸟”的声音;
- 自然环境音频,例如溪流、雨声、轻柔钢琴曲。
音频来源需要注意版权问题。不要直接下载来路不明的商业音乐,推荐使用公有领域音效、自己录制的鸟叫声,或者从正规音效平台购买授权。为了测试,你可以先准备两三个3分钟左右的MP3文件。
4.2 将天猫精灵切换为蓝牙音箱
虽然天猫精灵型号不同,菜单会略有差异,但基本流程是一致的:
- 打开天猫精灵App;
- 进入“设备”页面,选择你的音箱;
- 找到“蓝牙设置”或“蓝牙音箱”;
- 开启“蓝牙发现”,让天猫精灵进入可被搜索状态;
- 保持页面打开,等待外部设备连接。
这里建议把天猫精灵放得离树莓派近一些,避免蓝牙信号不稳。蓝牙连接成功后,天猫精灵会语音提示“蓝牙已连接”。
4.3 树莓派蓝牙连接天猫精灵
在树莓派终端中,先打开蓝牙控制界面:
bluetoothctl然后依次执行:
power on scan on此时让天猫精灵保持在蓝牙搜索状态,在扫描结果中找到类似TmallGenie或音箱名称的设备,记下它的 MAC 地址,格式是AA:BB:CC:DD:EE:FF。接下来继续执行:
pair AA:BB:CC:DD:EE:FF trust AA:BB:CC:DD:EE:FF connect AA:BB:CC:DD:EE:FF如果看到Connection successful,说明蓝牙已经连上。最后可以用scan off结束扫描,并用quit退出。
为了后续脚本自动执行,我们需要把这组连接命令保存成一个 Shell 脚本。因为蓝牙连接偶尔会断开,所以脚本要具备“未连接就重连”的能力。
创建scripts/bt_connect.sh:
#!/bin/bash # 文件路径:/home/pi/bird-sound/scripts/bt_connect.sh MAC="AA:BB:CC:DD:EE:FF" # 如果已经连接,直接退出 if bluetoothctl info $MAC | grep -q "Connected: yes"; then echo "bluetooth already connected" exit 0 fi echo "try to connect $MAC" bluetoothctl power on bluetoothctl trust $MAC bluetoothctl connect $MAC sleep 2 # 再次确认 if bluetoothctl info $MAC | grep -q "Connected: yes"; then echo "bluetooth connect success" else echo "bluetooth connect failed" fi给脚本加执行权限:
chmod +x /home/pi/bird-sound/scripts/bt_connect.sh4.4 测试蓝牙音频是否正常输出
连接好蓝牙后,可以先手动播放一次音频,确认声音从天猫精灵出来,而不是树莓派自带音箱。
安装 mpv:
sudo apt update sudo apt install -y mpv然后手动播放:
mpv --volume=80 /home/pi/bird-sound/audio/bird_morning.mp3如果声音从树莓派发出,而不是从蓝牙音箱发出,需要检查 PulseAudio/PipeWire 的默认输出设备。不同系统的处理方法差异较大,最常见的做法是安装pavucontrol,在图形界面的“回放”标签里把音频输出切换到蓝牙设备:
sudo apt install -y pavucontrol如果没有桌面环境,可以用pactl命令列出输出设备:
pactl list sinks short然后把默认输出设备设置成蓝牙音箱对应的 sink。由于设备名因系统而异,这里不写死命令,你可以在常见问题里找到排查思路。
4.5 编写 Python 播放脚本
Python 脚本是整个控制逻辑的核心。它负责以下几个事情:
- 读取配置文件中的播放时段和音频路径;
- 调用 mpv 播放音频,并设置音量和时长;
- 把播放记录写入日志;
- 在播放结束后输出状态。
创建scripts/play_sound.py:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 文件路径:/home/pi/bird-sound/scripts/play_sound.py import subprocess import configparser from datetime import datetime import logging import os import argparse # 配置日志 LOG_DIR = "/home/pi/bird-sound/logs" LOG_FILE = os.path.join(LOG_DIR, "play.log") os.makedirs(LOG_DIR, exist_ok=True) logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[ logging.FileHandler(LOG_FILE, encoding="utf-8"), logging.StreamHandler() ] ) CFG_FILE = "/home/pi/bird-sound/config.ini" def load_config(): """读取配置文件,返回音频列表和播放时长""" config = configparser.ConfigParser() config.read(CFG_FILE, encoding="utf-8") audio_dir = config.get("audio", "audio_dir", fallback="/home/pi/bird-sound/audio") duration = config.getint("play", "duration_seconds", fallback=600) volume = config.getint("play", "volume", fallback=70) # 返回需要播放的文件列表,按逗号分隔 files = config.get("audio", "files", fallback="bird_morning.mp3").split(",") paths = [os.path.join(audio_dir, f.strip()) for f in files if f.strip()] return paths, duration, volume def play_audio(file_path, duration, volume): """调用 mpv 播放指定音频,duration 单位秒,volume 范围 0-100""" if not os.path.exists(file_path): logging.error(f"音频文件不存在: {file_path}") return False # 使用 timeout 限制播放时长,避免脚本卡死 cmd = [ "timeout", str(duration), "mpv", "--no-terminal", f"--volume={volume}", file_path ] logging.info(f"开始播放: {file_path}, 时长: {duration}s, 音量: {volume}") try: result = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) logging.info(f"播放结束, 返回码: {result.returncode}") return result.returncode == 0 except Exception as e: logging.exception(f"播放异常: {e}") return False def main(): parser = argparse.ArgumentParser(description="牡丹鹦鹉陪伴音频播放器") parser.add_argument("--tag", default="manual", help="本次播放的来源标记,方便日志分析") args = parser.parse_args() paths, duration, volume = load_config() if not paths: logging.error("配置文件中没有可用音频文件") return logging.info(f"本次播放标记: {args.tag}, 共 {len(paths)} 个文件") success_count = 0 for path in paths: ok = play_audio(path, duration, volume) if ok: success_count += 1 logging.info(f"播放完成,成功 {success_count}/{len(paths)}") if __name__ == "__main__": main()这段脚本用到了标准库,没有任何第三方依赖,非常稳。timeout命令用来限制每个音频的播放时长,防止某个文件异常导致卡住。
4.6 配置文件示例
创建config.ini:
# 文件路径:/home/pi/bird-sound/config.ini [audio] audio_dir = /home/pi/bird-sound/audio files = bird_morning.mp3, bird_afternoon.mp3, music_relax.mp3 [play] duration_seconds = 900 volume = 70这里的duration_seconds = 900表示每个文件最多播放 900 秒,也就是 15 分钟。你可以根据鹦鹉的状态和家庭作息调整。
4.7 设置定时任务
定时任务使用 cron 来实现。编辑当前用户的 crontab:
crontab -e加入以下内容:
# 每天 9:00 播放清晨鸟鸣 0 9 * * * /home/pi/bird-sound/scripts/bt_connect.sh && /usr/bin/python3 /home/pi/bird-sound/scripts/play_sound.py --tag morning >> /home/pi/bird-sound/logs/cron.log 2>&1 # 每天 16:00 播放下午音乐 0 16 * * * /home/pi/bird-sound/scripts/bt_connect.sh && /usr/bin/python3 /home/pi/bird-sound/scripts/play_sound.py --tag afternoon >> /home/pi/bird-sound/logs/cron.log 2>&1保存后,可以用下面的命令检查定时任务是否生效:
crontab -l如果系统里没有/usr/bin/python3,可以通过which python3查看实际路径并替换。
4.8 手动运行验证
先不要等定时任务,先手动执行一次:
/home/pi/bird-sound/scripts/bt_connect.sh /usr/bin/python3 /home/pi/bird-sound/scripts/play_sound.py --tag test观察日志输出:
2025-01-18 09:00:31 [INFO] 本次播放标记: test, 共 3 个文件 2025-01-18 09:00:31 [INFO] 开始播放: /home/pi/bird-sound/audio/bird_morning.mp3, 时长: 900s, 音量: 70同时确认天猫精灵有没有发出声音。如果音箱出声,就说明整个链路已经通了。
4.9 结果说明
整套系统运行后,每天会在固定时间触发蓝牙连接,确认天猫精灵在线后播放设定好的音频。即使当时蓝牙断开了,bt_connect.sh也会自动重连一次,避免因为临时信号波动导致播放失败。
日志文件logs/play.log会记录每一次播放的开始、结束和返回码。你可以通过查看日志判断音频是否正常、鹦鹉是否喜欢,以及哪个时段的播放效果最好。
5. 常见问题与排查思路
5.1 蓝牙连接失败
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
connect后提示Device not available | 天猫精灵不在配对模式,或距离过远 | 重新开启蓝牙发现,把音箱靠近树莓派 |
Pairing failed | 旧配对信息冲突 | bluetoothctl remove <MAC>后重新配对 |
| 树莓派重启后自动连接失败 | 系统没有 persist 蓝牙连接 | 在 crontab 中加入开机任务,或使用 network dispatcher 脚本 |
最常见的原因是天猫精灵一段时间后会自动关闭蓝牙搜索。所以每次重连前,要确认天猫精灵还在“蓝牙音箱”页面。如果长时间使用,建议把天猫精灵固件升级到最新版,蓝牙稳定性会好很多。
5.2 音频从树莓派自带音箱输出
这是因为默认音频输出设备不是蓝牙音箱。解决方法:
- 安装
pavucontrol; - 查看“回放”标签页,把 mpv 的输出设备切换到天猫精灵;
- 或者用
pactl set-default-sink设置默认输出设备。
在无桌面环境下,可以先用pactl list sinks short列出设备名,然后:
pactl set-default-sink <蓝牙设备名>由于不同 Linux 发行版的蓝牙音频后端不一样,建议把操作步骤固化到bt_connect.sh中,每次连接后自动设置默认输出。
5.3 定时任务没有执行
可能原因:
- crontab 没有保存成功;
- Python 脚本路径或者 mpv 路径不对;
- 环境变量缺失,比如
PATH中没有/usr/bin; - 脚本执行权限不够。
排查方法:在 crontab 开头临时加一行* * * * * echo test >> /tmp/test.log,看是否每分钟写入。如果写入正常,再检查脚本路径。
更稳妥的方式是在脚本里使用绝对路径,并且不要在 Python 脚本中依赖相对路径。上面示例中已经把所有文件路径都写成了绝对路径,可以避免大多数问题。
5.4 音量过大或过小
mpv 的--volume=70只是 mpv 内部音量,并不是系统音量的上限。如果觉得声音太小,可以调到 90;如果担心吓到鹦鹉,建议先从 50 开始,观察鹦鹉反应后逐步调整。
这里特别提醒一句:鹦鹉的听觉比人类敏感很多,过大的音量会造成强烈应激。不要追求“响”,要追求“清晰、柔和、稳定”。
5.5 鹦鹉对声音没有反应
这是最需要耐心的一点。牡丹鹦鹉不一定立刻对新声音有反应,通常需要 3 到 7 天的适应期。
如果连续两周都没有任何反应,建议换一种音频类型。有些鹦鹉更喜欢同类幼鸟的叫声,有些则对轻柔的钢琴曲更感兴趣。你可以通过日志观察播放时段,尝试在上午和下午分别播放不同的音频,对比鹦鹉的精神状态和鸣叫频率。
6. 最佳实践与工程建议
6.1 音频选择与版权
音频文件的版权很容易被忽略。建议优先使用自己录制的鸟鸣声,或者从可商用素材库获取。不要直接传播他人的原创音乐。如果只是自己家里使用,不公开传播,一般问题不大,但养成好习惯总没错。
文件格式推荐 MP3,码率 128kbps 以上即可。不要使用体积过大的无损格式,因为蓝牙传输和树莓派解码都会增加不必要的负担。
6.2 定时策略
牡丹鹦鹉的作息和人类不同,它们通常在清晨和傍晚比较活跃。所以定时播放建议安排在这两个时段。
另外,播放时长不要过长,15 到 30 分钟比较合适。长时间播放会让鹦鹉逐渐适应并忽略声音,反而失去陪伴效果。定时任务建议固定时间,让鹦鹉形成稳定的生物钟。
6.3 日志与可观测性
日志是这套系统最重要的“眼睛”。我建议除了play.log,再给bt_connect.sh增加输出到独立日志的能力,这样连接失败和播放失败可以分开排查。
# bt_connect.sh 中可改成 ./bt_connect.sh >> /home/pi/bird-sound/logs/bt.log 2>&1日志文件要定期清理,避免撑满树莓派的存储卡。可以通过 logrotate 实现,也可以在 crontab 中加一条清理命令。
6.4 安全与法律合规
- 只播放合法获取的音频;
- 播放音量控制在安全范围,避免损伤鹦鹉听力;
- 不要用这一套系统去录制、上传他人音频到公共平台;
- 树莓派如果暴露在公网,请务必设置防火墙和强密码,避免被远程控制后乱播放声音。
本项目没有接入任何外部 API,也不需要公网端口,整体安全性较高。
6.5 代码健壮性建议
上面的 Python 脚本已经处理了“文件不存在”和“播放异常”的情况。在实际项目中,还可以增加以下能力:
- 检测蓝牙连接状态,断开时重试;
- 根据星期几播放不同音频;
- 通过 MQTT 或 HTTP 接口远程触发播放;
- 在配置中支持多个播放列表。
例如,要为工作日和周末设置不同音频,可以在play_sound.py中读取datetime.now().weekday(),根据结果选择不同的files。这部分作为扩展方向,实现起来并不复杂。
7. 总结与下一步扩展
到目前为止,我们已经完成了一套从零到一的“牡丹鹦鹉陪伴音频播放系统”。它不仅让天猫精灵变得“会唱歌”,更重要的是让播放行为变得可控、可计划、可观察。你可以通过修改config.ini调整音频列表,通过 cron 调整播放时段,通过日志判断效果。
下一步有三个扩展方向:
第一,接入运动传感器或摄像头,当鹦鹉靠近天猫精灵时自动播放,距离远时停止,形成更智能的交互。
第二,接入语音识别,让天猫精灵通过 App 技能或第三方平台识别“播放鸟鸣”“停止播放”等指令,把野生玩法升级成完整语音交互方案。
第三,把音频播放与智能照明联动,比如傍晚播放音乐时同步调暗灯光,模拟日落环境,帮助鹦鹉稳定情绪。
如果你也养了一只牡丹鹦鹉,不妨从最基础的蓝牙连接和定时播放开始试。先连续运行一周,记录鹦鹉的行为变化,再根据实际情况迭代。技术只是工具,真正让宠物感受到“被陪伴”的,是我们愿意为它花的心思。
希望这篇文章能给你带来一些灵感。动手搭建过程中遇到问题,欢迎在评论区留言,我会尽量根据实际经验给出建议。