PROJECT 001

AI 硬件

ESP32-S3 AI 语音对话原型

制作一套由按钮触发的 AI 语音对话原型:录下使用者的声音并上传服务器,经大语言模型处理后返回语音内容,再由设备通过音箱播放。

进行中35%

七号 制作

暖纸水彩插画:面包板上连接着 ESP32-S3 开发板、显示屏、麦克风、按钮和扬声器
分类
AI 硬件
难度
中等
耗时
持续制作中
相关名称
AI 语音机器人、桌面语音助手

PROJECT OVERVIEW

作品概览

我想把 AI 语音对话从屏幕里的软件变成一套可以实际操作的硬件原型。它目前还不是一台完整的机器人,第一阶段只验证一条最小但完整的交互链路:人按下按钮说话,设备把声音送到服务器处理,再把回答通过音箱播放出来。

最终交互流程

  1. 按下按钮。
  2. 设备开始录音。
  3. 录音上传到服务器。
  4. 服务器调用大语言模型处理对话。
  5. 服务器返回要播放的语音内容。
  6. 设备通过音箱播放回答。

当前进度

目前仍在持续制作,整体进度继续保持 35%。按钮、屏幕和声音输出链路已经接入;新的预焊 INMP441 也完成了原始 I²S 采集验证,但按钮录音还没有形成时长正确的可用音频。

我把 4Ω/3W 腔体喇叭接到 MAX98357A,再用 VIN → 3V3GND → GNDBCLK → GPIO16LRC → GPIO17DIN → GPIO18 五根线连接 ESP32-S3。短时供电没有观察到明显异常,低音量测试程序按预期发出三声;之后,设备又通过 Wi-Fi 连续播放了五条网页生成语音。这些结果证明当前输出链路能够工作,但仍属于已记录环境中的单次播放验证。

网页动态播放的完整链路、5 个任务的闭环证据和当前边界,记录在《网页输入文字,ESP32 就能从喇叭说出来:本地语音平台播放链路实测》中。

平台侧已经把可重复使用的 MP3 与每次设备播放拆成两个对象:相同文字和相同生成配置可以复用已有语音资产,但每次发送仍建立独立播放任务和事件记录。这样既减少重复 TTS 的费用和等待时间,也保留了每次设备行为。数据模型、缓存键和旧数据迁移记录在《同一句话为什么不该重复生成 MP3:拆分语音资产与播放任务》中。

新的预焊 INMP441 已按 SCK → GPIO4WS → GPIO5SD → GPIO6L/R → GND 接入。Gate 1 已验证 16 kHz、左声道 I²S 数据会随声音变化,并在硬复位后复现;GPIO8 按钮也完成 10 次按下和松开回归。Gate 2 已经能够结束录音并导出完整数据,但当前 3.304 秒操作只采到 5120 个样本,按 16 kHz 计算仅约 0.320 秒,说明屏幕传输仍在阻塞采集,因此 Gate 2 尚未通过。

下一步是把 I²S 采集移到独立任务并完成实机复测,先得到时长正确、可回放的录音,再继续录音上传、语音识别和服务器对话处理。当前已经完成的是“让设备说出来”和麦克风原始数据采集,还不是完整的双向语音对话。这一页会随着实物制作继续更新,因此当前记录的是原型状态,不代表最终结构或最终方案。

已经遇到的问题

第一次准备接入麦克风和音响时,我才发现模块是否焊好排针、不同端子能否直接连接,都会让纸面上的硬件清单在实物面前失效。这个过程记录在《AI 给我列了购物清单,但我花了一天时间购买配件》中。

喇叭自带的白色双针插头不能直接接入 MAX98357A 的绿色螺丝端子。我曾买过配套端子座,但当前装配没有位置使用,最后改为把金属端子从白色外壳中退出,再锁入功放端子。完整接线、三声测试和五条网页语音验证记录在《ESP32-S3 接 MAX98357A:5 根线让 4Ω/3W 喇叭播放语音》中。

接入 ST7735 屏幕后,画面右侧和底部曾出现固定彩线。通过保持接线和绘图代码不变,只切换面板初始化参数,最终确认当前屏幕需要使用 INITR_GREENTAB。完整排查过程见《ST7735 屏幕边缘出现彩色花线》

更早接入的 GMT130-V1.0 ST7789 曾经只有背光、没有像素画面,我一度把它判断为损坏。后来保持原引脚、ST7789 驱动和 240×240 分辨率不变,改用真正应用 SPI_MODE3 的 ESP32 硬件 SPI 路径并把频率设为 1 MHz,屏幕完成了五色循环和断电重启复测。完整排查过程见《ST7789 有背光却无画面:GMT130-V1.0 从 SPI_MODE0 改成 MODE3 后点亮》

为了把这块 GMT130 的线路重新整理清楚,我继续弄懂了七根针脚的分工,并把当前接线调整为 SCK → GPIO9SDA → GPIO10RES → GPIO11DC → GPIO12,VCC 和 BLK 接 3V3,GND 接 GND。理解这些基础知识大约用了两天,实际重新走线只用了五分钟;重新上电后,屏幕仍然能够正常循环变换颜色。七根线怎样共同完成显示,整理在《ESP32 接 ST7789 屏幕:7 根线分别是做什么的?》中。

准备接入 INMP441 时,我跳过练习板直接进行了人生中的第一次焊接。六个焊点最终形态不一致,模块能否可靠使用仍待检查。完整过程见《教程看懂了,第一次焊接还是焊成了一坨》

这些问题没有让作品停下来,反而逐渐把一个模糊的“做语音机器人”目标拆成了可以逐项连接、测试和验证的具体任务。

STEP BY STEP

制作步骤

  1. 01

    接入按钮和显示屏

    连接按钮与 ST7735 显示屏,先验证输入触发和画面显示;这部分已经完成。

  2. 02

    接入录音模块

    新的预焊 INMP441 已连接并通过原始 I²S 采集验证;按钮录音仍因屏幕传输阻塞而严重欠采样,尚未形成可用录音。

  3. 03

    上传录音到服务器

    把设备采集的录音上传到服务器,为语音识别和后续对话处理建立稳定的数据通路。

  4. 04

    处理对话并生成语音

    由服务器调用大语言模型处理对话,再生成设备可以播放的语音内容并返回。

  5. 05

    接入功放和喇叭

    MAX98357A 已通过五根线连接 ESP32-S3,并驱动 4Ω/3W 腔体喇叭完成三声测试音和五条网页语音播放;当前只验证了输出链路。

BILL OF MATERIALS

材料与工具

材料型号数量用途
开发板ESP32-S31控制按钮、屏幕、录音和语音播放流程
TFT 显示屏1.8 英寸 128×160 ST77351显示设备状态和交互反馈
按钮1触发录音
数字麦克风INMP4411采集录音
I2S 数字功放MAX98357A1驱动扬声器播放语音
腔体喇叭3525,4Ω/3W1播放服务器返回的语音内容

需要的工具

  • 面包板
  • 杜邦线
  • 电烙铁与焊锡丝
  • 尖头退针工具
  • 小号螺丝刀

MAKING OF

制作日志

按发生时间回看这个作品从想法、试错到当前状态的完整过程。

  1. 教程看懂了,第一次焊接还是焊成了一坨

    第一次给 INMP441 焊排针,我跳过练习板直接上手,20 分钟后留下了六个形状各异的焊点。这次翻车让我明白:教程和 AI 能教知识,但动手能力只能从实践中长出来。

  2. ST7789 有背光却无画面:GMT130-V1.0 从 SPI_MODE0 改成 MODE3 后点亮

    一块有背光却始终没有像素画面的 GMT130-V1.0,驱动芯片和分辨率其实都选对了。本文复盘我如何从软件 SPI Mode 0 黑屏,转向真正应用 SPI_MODE3 的硬件 SPI,并通过五色循环和断电重启完成复测。

  3. ESP32-S3 接 MAX98357A:5 根线让 4Ω/3W 喇叭播放语音

    记录一次已经完成的 ESP32-S3 语音播放实践:先解决喇叭插头无法接入 MAX98357A 的问题,再按 5 根线完成 I²S 接线,经过短时供电检查、三声测试音和五条网页语音验证,确认声音输出链路可用。

  4. 网页输入文字,ESP32 就能从喇叭说出来:本地语音平台播放链路实测

    我把 ESP32-S3 的语音播放从“把固定音频烧进代码”改成了“在网页输入文字后动态播放”。本文记录网页、本地 TTS、任务队列、ESP32、MAX98357A 和喇叭之间怎样连成一条实际可听的链路,以及当前还没有完成的语音输入边界。