6浏览
查看: 6|回复: 0

[项目] 旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话

[复制链接]
本帖最后由 云天 于 2026-7-27 20:51 编辑

【项目背景】
        一台落满灰尘的旧式电话机,除了怀旧,还能做什么?在创客手里,它可以“摇身一变”,成为一台能跟你对话的AI智能电话。
        本文将带你完整复刻这个项目:利用ESP32-S3主控、I2S数字麦克风和功放模块,结合开源的小智AI项目,让老电话重获新生。拿起听筒,就能和AI聊天;挂断电话,对话自动结束。整个改造过程无需破坏电话外观,完美保留了复古韵味。
       项目涉及ESP-IDF开发环境搭建、小智AI源码编译、GPIO引脚配置、音频驱动调试等环节,软硬件结合紧密,适合有一定嵌入式开发基础的创客进阶学习。
旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图7
【硬件清单】

组件
型号/规格
数量
作用
主控板ESP32-S3-DevKitC-1(Flash≥8MB,PSRAM≥2MB)1核心运算与联网
I2S麦克风模块INMP441(或其他I2S数字麦克风)1采集用户语音
I2S功放模块MAX983571音频信号放大
扬声器8Ω 3W(或电话原装喇叭)1播放AI语音回复
旧式电话机任意款式,带听筒1项目载体
导线、铜条若干用于内部连接和摘机开关
USB数据线Type-C1供电与烧录

【制作过程】
       1. 电话机拆解与改造
       打开电话机底盖,取出内部原装的电路板和接线。保留听筒的四根线——原本是两根麦克风线和两根喇叭线。将听筒拆开,把原装的碳精麦克风取下,替换为I2S麦克风模块(如INMP441)。模块体积小巧,可以完美放入原麦克风的位置。
       电话外放喇叭保留不动,后续由MAX98357功放驱动。听筒中的小喇叭则不再使用。
       摘机检测开关是本次改造的一个亮点。在电话机内部,听筒压住的两条铜质弹片原本用于接通/断开电话线路。现在将这两条铜片分别连接到ESP32-S3的GPIO_NUM_8和GND引脚。当听筒放下时,铜片接触(低电平);当听筒拿起时,铜片分离(高电平)。配合软件逻辑,即可实现“拿起唤醒、放下退出”的类电话交互体验。
       2. 硬件接线
       本项目采用以下引脚分配方案(可在config.h中自定义修改):
旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图5

旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图6
       I2S麦克风(INMP441)接线:
  • WS → GPIO_NUM_4(字选择)
  • SCK → GPIO_NUM_5(时钟)
  • DIN → GPIO_NUM_6(数据输入)
  • L/R → GND(左声道选择)
  • VDD → 3.3V(可以不接)
  • GND → GND(可以不接)

        注意:INMP441的VDD和GND绝对不能接反,否则会烧毁麦克风。
旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图2
       I2S功放(MAX98357)接线:
  • BCLK → GPIO_NUM_15(位时钟)
  • LRC → GPIO_NUM_16(左右声道时钟)
  • DIN → GPIO_NUM_7(数据输入)
  • GAIN → GND(音量控制,若音量太大可接3.3V)
  • SD → 3.3V(使能)
  • VIN → 3.3V或5V
  • GND → GND

旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图3


旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图4

       摘机检测开关接线:
  • 铜条1 → GPIO_NUM_8
  • 铜条2 → GND
  • 启用内部上拉电阻(代码中配置active_high = false)

        提示:所有接线建议使用杜邦线或直接焊接,确保接触可靠。功放的GND和VIN接线隐藏在元件下方,焊接时需注意。
        3.核心代码实现
       本项目基于开源的小智AI项目二次开发。核心的按钮/摘机检测逻辑在compact_wifi_board.cc中实现。
关键代码片段:
  1. // 在构造函数中初始化触摸按钮(摘机检测)
  2. CompactWifiBoard() :
  3.     boot_button_(BOOT_BUTTON_GPIO),
  4.     touch_button_(TOUCH_BUTTON_GPIO, false, 3000, 1000),  // 低电平有效,长按3秒触发
  5.     // ... 其他按钮初始化
  6. {
  7.     InitializeDisplayI2c();
  8.     InitializeSsd1306Display();
  9.     InitializeButtons();
  10.     InitializeTools();
  11. }
  12. // 在InitializeButtons中注册事件
  13. void InitializeButtons() {
  14.     // 摘机(拿起听筒)→ 唤醒小智
  15.     touch_button_.OnClick([this]() {
  16.         auto& app = Application::GetInstance();
  17.         app.WakeWordInvoke("你好小智");
  18.         GetDisplay()->ShowNotification("正在唤醒...");
  19.     });
  20.     // 挂机(放下听筒)→ 退出对话
  21.     touch_button_.OnLongPress([this]() {
  22.         auto& app = Application::GetInstance();
  23.         app.WakeWordInvoke("退出");
  24.         GetDisplay()->ShowNotification("正在退出...");
  25.     });
  26. }
复制代码
       关键参数说明:
  • active_high = false:因为摘机开关闭合时接GND(低电平),断开时通过内部上拉为高电平。
  • long_press_time = 3000:长按判定时间为3000ms(3秒),防止误触。
  • OnClick对应“拿起”(电平由低变高),OnLongPress对应“持续放下”(电平持续为低)。

        4.软件编译与烧录
       本项目使用ESP-IDF v5.3或更高版本进行开发。
       步骤一:设置目标芯片
  1. cd xiaozhi-esp32
  2. idf.py set-target esp32s3
复制代码
        步骤二:配置项目
  1. idf.py menuconfig
复制代码
       在菜单中进入 Xiaozhi Assistant → Board Type,选择对应的开发板类型。如果引脚分配与默认不同,需要同步修改GPIO配置。
  1. #define AUDIO_I2S_MIC_GPIO_WS   GPIO_NUM_4
  2. #define AUDIO_I2S_MIC_GPIO_SCK  GPIO_NUM_5
  3. #define AUDIO_I2S_MIC_GPIO_DIN  GPIO_NUM_6
  4. #define AUDIO_I2S_SPK_GPIO_DOUT GPIO_NUM_7
  5. #define AUDIO_I2S_SPK_GPIO_BCLK GPIO_NUM_15
  6. #define AUDIO_I2S_SPK_GPIO_LRCK GPIO_NUM_16
  7. #define BOOT_BUTTON_GPIO        GPIO_NUM_0
  8. #define TOUCH_BUTTON_GPIO       GPIO_NUM_8
复制代码
       步骤三:编译与烧录
  1. idf.py build
  2. idf.py flash -p [你的串口号]
复制代码
       烧录完成后,设备上电会自动进入配网模式。用手机连接WiFi热点Xiaozhi-xxxx,访问http://192.168.4.1配置WiFi。连接成功后,喊一声“你好,小智”即可测试。
旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图8


旧电话机“智”变:用ESP32-S3和小智AI打造复古智能电话图9

【技术原理】
       1. 语音链路
       用户的语音经听筒中的I2S麦克风(INMP441)采集,通过I2S总线传输给ESP32-S3。ESP32-S3将音频数据通过WebSocket发送至小智AI云端服务器,服务器调用大语言模型(如Qwen、DeepSeek等)进行理解和生成回复。回复的语音数据流式传回ESP32-S3,经MAX98357功放放大后,从电话的外放喇叭播放出来。
       2. 摘机检测逻辑
       GPIO_NUM_8配置为输入模式并启用内部上拉电阻。听筒放下时,铜条接触GND,引脚为低电平;听筒拿起时,铜条分离,引脚被上拉为高电平。
       Button库根据active_high参数判断“按下”和“释放”:
  • active_high = false时,低电平视为“按下”。
  • 因此,“放下听筒”= 持续按下 → 触发OnLongPress → 发送“退出”。
  • “拿起听筒”= 释放 → 触发OnClick → 发送“你好小智”。

【让小智帮你整理电脑照片】
       除了语音对话,你还可以为这台复古电话赋予“生产力”属性——通过和小智聊天,让它自动整理电脑里的照片。
       实现原理
       小智AI的后端(Python服务)支持自定义工具(Tools)。我们编写了一个文件整理函数,并注册为AI可调用的能力。当你说出“帮我整理D盘照片文件夹”时,小智会调用该函数,按日期、扩展名或图片尺寸分类移动文件。
       核心代码(后端部分)
       在 mcp-calculator-main/pic.py中添加以下函数和注册信息:
  1. # 文件整理工具函数
  2. def organize_images(source_dir, target_base_dir="", mode="date"):
  3.        # ...(完整代码见文末源码链接)
  4.        return {"moved": moved_count, "errors": errors}
  5.        # 注册为AI工具
  6.        TOOLS = [
  7.        {
  8.        "type": "function",
  9.        "function": {
  10.        "name": "organize_images",
  11.        "description": "整理指定文件夹中的图片,按日期/扩展名/尺寸分类",
  12.        "parameters": {
  13.        "source_dir": {"type": "string"},
  14.        "mode": {"enum": ["date", "ext", "size"]}
  15.                             }
复制代码


下载附件mcp-calculator-main.zip

【功能演示】
   设备上电,播放初始化成功提示音。
  • 拿起听筒,屏幕显示“正在唤醒...”,小智播报“你好,我在”。
  • 对着听筒说话(如“今天天气怎么样”),小智通过外放喇叭语音回复。
  • 对着听筒说话“帮我整理D盘照片文件夹”,小智通过MCP功能,整理照片。
  • 放下听筒,屏幕显示“正在退出...”,对话结束。


【注意事项】
  • 供电要求:ESP32-S3、MAX98357和INMP441,使用3.7V锂电池供电。
  • 麦克风极性:INMP441的VDD和GND绝对不能接反,否则会永久损坏模块,本项目可以不接。
  • 功放增益:如果外放声音太大或太小,可以调整MAX98357的GAIN引脚——接GND为低增益,接3.3V为高增益。
  • PSRAM容量:ESP32-S3需要至少2MB PSRAM,推荐8MB。如果使用2MB PSRAM,需要在配置中修改相关参数。
  • 网络环境:设备需要稳定的WiFi连接才能与小智AI服务器通信。
  • 安全提醒:改造过程中涉及焊接和电路连接,请注意用电安全,避免短路。

【项目总结】
       这个项目的魅力在于“旧物新生”——一台几十年前的固定电话,通过ESP32-S3和小智AI的加持,变成了一台能对话的智能设备。对于小朋友来说,这是一个了解“爸爸妈妈小时候用什么打电话”的实物教具;对于创客来说,这是一个融合了硬件改造、嵌入式开发、AI应用的综合性项目。
       整个项目成本可控(主控+麦克风+功放约百元),改造难度中等,非常适合作为创客教育的实践案例。如果你也有闲置的老电话,不妨动手试一试,让它重新“开口说话”。
       项目源码:基于xiaozhi-esp32开源项目二次开发




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail