ESP32小智音乐助手:为智能音箱添加音乐播放和微信留言功能

开发日期:2025年11月6日
项目地址:https://github.com/xiaojieyahuhu/-xiaozhi-esp32-music-wechat
演示视频:点击观看

📖 项目背景

最近在折腾 ESP32 智能音箱,发现原版小智虽然功能强大,但缺少两个实用的功能:

  1. 音乐播放:无法播放在线音乐
  2. 微信留言:无法通过语音留言推送到微信

于是基于 Maggotxy/xiaozhi-esp32-music 进行了二次开发,添加了这两个核心功能。

✨ 核心功能

🎵 1. 音乐播放功能

集成了在线音乐播放能力,支持:

  • 语音点歌:"播放周杰伦的晴天"
  • 歌词显示(如果设备支持屏幕)
  • 播放控制:暂停、继续、切歌
  • 基于 MCP 协议的 self.music.play_song 工具

使用示例:
用户:"小智小智,播放周杰伦的晴天"
小智:"好的,正在为您播放《晴天》"

💬 2. 微信留言推送

通过 WxPusher 实现语音留言推送到微信,支持:

  • 智能识别留言意图
  • 自动提取留言内容
  • 实时推送到微信(秒级送达)
  • 支持 WiFi 和 ML307 4G 网络

使用示例:
用户:"给小杰说,今天晚上不回家了"
小智:"好的,已经发送留言"
[微信收到推送] "今天晚上不回家了"

🔧 技术实现

架构设计

项目采用 ESP-IDF 框架开发,主要模块包括:
xiaozhi-esp32-music-wechat/
├── main/
│ ├── boards/ # 硬件适配层
│ │ └── common/
│ │ ├── esp32_music.cc # 音乐播放实现
│ │ └── music.h # 音乐接口定义
│ ├── message_pusher.cc # 微信推送实现
│ ├── message_pusher.h
│ ├── mcp_server.cc # MCP 服务器
│ └── application.cc # 应用主逻辑
└── README.md

关键代码

1. 微信推送实现

最大的挑战是 ML307 4G 模块不支持标准的 ESP-IDF HTTP 客户端。解决方案是使用 Board 提供的网络接口:

// message_pusher.cc
bool MessagePusher::SendMessage(const std::string& content) {
    // 获取网络接口(兼容 WiFi 和 ML307)
    auto network = Board::GetInstance().GetNetwork();
    if (!network) {
        return false;
    }
    
    // 创建 HTTP 客户端
    auto http_client = network->CreateHttp();
    
    // URL 编码中文内容
    std::string encoded_content = UrlEncode(content);
    
    // 构建推送 URL
    std::string url = "http://wxpusher.zjiecode.com/api/send/message"
                      "?appToken=" + app_token_ +
                      "&uid=" + uid_ +
                      "&content=" + encoded_content;
    
    // 发送请求
    return http_client->Get(url);
}

2. MCP 工具注册

在 MCP 服务器中注册微信推送工具:

// mcp_server.cc
#ifdef CONFIG_ENABLE_MESSAGE_PUSHER
{
    "name": "send_to_wechat",
    "description": "发送留言到微信。参数:content(留言内容)",
    "inputSchema": {
        "type": "object",
        "properties": {
            "content": {"type": "string", "description": "留言内容"}
        },
        "required": ["content"]
    }
}
#endif

技术难点与解决

难点 1:ML307 HTTP 兼容性

  • 问题:ML307 使用 AT 命令,不支持标准 HTTP 客户端
  • 解决:抽象网络接口,统一 WiFi 和 ML307 的 HTTP 调用

难点 2:中文 URL 编码

  • 问题:微信推送需要正确编码中文字符
  • 解决:实现完整的 URL 编码函数,支持 UTF-8

难点 3:音乐播放集成

  • 问题:需要在不影响原有功能的前提下添加音乐播放
  • 解决:使用 MCP 协议扩展,保持架构清晰

📱 配置指南

1. 微信推送配置

编辑 sdkconfig 文件:

CONFIG_ENABLE_MESSAGE_PUSHER=y
CONFIG_MESSAGE_PUSHER_APP_TOKEN="你的AppToken"
CONFIG_MESSAGE_PUSHER_UID="你的UID"

获取 AppToken 和 UID:

  1. 访问 WxPusher 官网
  2. 注册并创建应用,获取 AppToken
  3. 在"我的"页面获取 UID

2. 编译和烧录

# 配置环境
export IDF_PATH="$HOME/esp/esp-idf"
export PATH="$HOME/.espressif/python_env/idf5.4_py3.9_env/bin:$PATH"

# 编译固件
cd xiaozhi-esp32-music-wechat
idf.py build

# 烧录到设备
idf.py -p /dev/tty.usbmodem2101 flash monitor

🎬 效果演示

演示内容:音乐播放和微信留言推送功能

📊 项目数据

  • 开发周期:1 天
  • 代码变更:753 个文件
  • 新增模块

    • message_pusher.cc/h:微信推送
    • esp32_music.cc/h:音乐播放
  • 支持设备:所有基于 ESP32-S3 的小智设备
  • 网络支持:WiFi / ML307 4G

🚀 后续计划

  • [ ] 添加歌单管理功能
  • [ ] 支持本地音乐播放
  • [ ] 优化留言识别准确率
  • [ ] 添加更多语音指令
  • [ ] 支持多人留言推送

💡 开发心得

  1. 抽象是关键:通过网络接口抽象,成功解决了 ML307 兼容性问题
  2. MCP 协议的威力:基于 MCP 扩展功能,不需要修改核心代码
  3. 文档很重要:完善的中英日三语文档,让项目更易用
  4. 测试要充分:WiFi 和 4G 都要测试,避免遗漏

🔗 相关链接

📝 总结

这次开发让我深刻体会到 ESP32 的强大和 MCP 协议的优雅。通过合理的架构设计,成功在不破坏原有功能的前提下,添加了音乐播放和微信推送两大实用功能。

如果你也在使用小智 ESP32 设备,欢迎试用这个项目!有任何问题或建议,欢迎在 GitHub 提 Issue 或 PR。


License: MIT
Author: 小杰呀呼呼
Date: 2025-11-06


💡 提示:如果觉得这个项目有帮助,别忘了给个 Star ⭐ 哦!
最后修改:2025 年 11 月 07 日
如果觉得我的文章对你有用,请随意赞赏