每到饭点都纠结的"吃什么"
你好,我是吴老师。
晚上回家,最头疼的一个问题:今天吃什么? 冰箱里有土豆、鸡蛋、青椒,可就是不知道该怎么搭配。
以前,这是你得翻菜谱、问家人的事。今天,我们把这块板子变成一个随身的小管家——你开口告诉它"冰箱里有什么",它就能按你的要求,给你列出一道道菜,甚至把菜的样子画给你看。
本课一句话:智能菜谱不是"一堆做菜的规矩",而是一条对话链——你说话 → 板子听懂 → 云端大模型按你的要求"编"出一道菜 → 板子把它说/画给你。全程没有一个"厨师",全是"你描述 + AI 生成"。
一、先让板子当一回"小管家"
先别听我讲,让板子演示一遍。
请使用课程的 esp32s3-touchboard-hardware-dev Skill,
烧录本课配套程序 assets/codes/demo01_recipe_voice:
板书显示"按住说话,告诉我冰箱里有什么"。
按住 BOOT 说话,比如"冰箱里有土豆、鸡蛋和青椒,帮我做一道菜",
松开后板子会识别你说的话,请大模型给你一道菜谱,屏幕显示菜名和做法,
然后问你要不要"画出这盘菜的样子"。
烧录前把密钥和 WiFi 填好(见 README)。烧录后告诉我:
你说的话,板子识别成了什么字?它给你出的菜叫什么?
几秒后,屏幕出现"按住说话"的提示。你按住 BOOT 说"冰箱里有土豆、鸡蛋、青椒",松开后,板子先显示一句"我听到:冰箱里有土豆、鸡蛋、青椒",然后"思考中……",接着屏幕上出现菜名和做法(比如"家常土豆青椒炒蛋")。
二、拆开看:这条对话链有几棒?
这个"问吃什么 → 得到菜谱"的过程,其实是四段接力——你之前在别的课都分别见过,这次把它们串起来:
flowchart LR
A[你按住说话] --> B[1 录音+识别<br/>板子·百度STT<br/>把声音变成文字]
B --> C[2 问大模型<br/>板子·火山Ark<br/>把「食材+要求」寄给AI]
C --> D[3 云端生成菜谱<br/>大模型按提示词<br/>给出菜名+做法]
D --> E[4 板子显示/朗读<br/>屏幕显示 或 喇叭播放]
style B fill:#22d3ee,color:#131a22
style E fill:#22d3ee,color:#131a22
style C fill:#f472b6,color:#131a22
style D fill:#f472b6,color:#131a22
看懂这张图的标志:青色的在板子上(录音识别、显示/朗读),粉色的在云端(识别、生成菜谱)。板子负责"听你说话、把你的要求寄出去、把结果给你看",真正"想菜谱"的是云端的大模型。
关键:板子不会做菜。 它只是把你说的"食材 + 要求"翻译成一段话,寄给会"想菜谱"的大模型,再把它想出来的菜谱念/画给你。想菜谱的是 AI,板子是快递员 + 显示屏。
三、四段接力,每段用什么技术?
不深挖代码,但每段接力你用到的技术要清楚:
| 接力棒 | 用到的技术 | 之前在哪学过 |
|---|---|---|
| ① 录音识别 | 麦克风采集 PCM → 百度 STT 转文字 | 第 24 课(ASR) |
| ② 发请求 | HTTP POST + JSON 把"食材+要求"寄给大模型 | 第 19 课(HTTP/JSON) |
| ③ 云端生成菜谱 | 大模型按 system 提示词"编"一道菜(结构化输出) | 第 26 课(大模型) |
| ④ 显示/朗读 | 中文绘制显示(TTS 可选朗读) | 第 9 课 / 第 25 课(TTS) |
| ⑤(可选)画菜 | 用识别文本做生图提示词 → 生图 API → 显示图片 | 第 27 课(生图) |
⚠️ 生图那一段:如果你想让它"画出这盘菜的样子",就要把识别到的文字直接当作生图的个提示词,寄给一个"会画图"的 AI,它返回一张图片的网址,板子再把图片下载下来显示(这一步用到了
TJpg_Decoder解码 JPEG)。你画我猜(第 27 课)的底层就是这个,但反过来——那次是"板子画、AI 猜",这次是"AI 画、板子看"。
四、要让 AI 给出"好菜谱",得把话说清楚
这四段接力里,第③段最值得琢磨——它决定了 AI 给你的是"一道正经菜"还是"一团废话"。
先看一个反例 版本 A:含糊地问
system 提示词:你是一个做菜的助手,请回答用户吃什么。
你问"冰箱有土豆鸡蛋青椒",它可能回:"可以炒土豆,也可以炒鸡蛋。"——不具体、没法做、不知道要啥材料。
再看 版本 B:给足条件、规定格式
system 提示词:你是家常菜谱助手。请按「菜名 / 难易度 / 需时(分钟) / 食材清单(逗号分隔) / 步骤(编号列表)」的格式,给出一道具体的菜。
如果食材或步骤不确定,请标注「仅供参考」。用不超过80字的简体中文回答。
你问同样的话,它可能回:
菜名:青椒土豆炒蛋
难易度:简单
需时:15分钟
食材:土豆1个、青椒1个、鸡蛋2个、盐、油
步骤:1.土豆切丝青椒切块 2.打入鸡蛋炒散 3.下土豆青椒翻炒 4.加盐调味
看出差别了吗? 版本 B 比 A 多了这四样:
| AI "听话"的地方 | 为什么重要 |
|---|---|
| 给角色(家常菜谱助手) | 它才知道自己该"认真做菜",不是闲聊 |
| 给格式(菜名/难易度/食材/步骤) | 它才知道"怎么输出",才能分屏显示 |
| 给要求(具体一道、80字内) | 它才不会乱编一堆、啰嗦 |
| 给兜底(标注"仅供参考") | 菜谱不一定营养均衡,要留个心眼 |
这就是你前面学会的:提示词=角色 + 任务 + 约束 + 负面指令的四要素。第 35 课你练的是"让 AI 说话很像老师",这一课练的是"让 AI 把菜谱按规矩写出来"——关键是给它"格式",它才能输出能分屏显示的结构化结果。
五、动手:加一个条件,看菜谱怎么变
请改 system 提示词里的约束,每种改动先预测再烧录:
| # | 我在提示词里加/改这句 | 我预测 AI 会 | 实际菜谱变化 |
|---|---|---|---|
| 1 | 加上"只挑 15 分钟能做完的" | ||
| 2 | 加上"按时间从短到长排 3 道" | ||
| 3 | 改成"不要放辣的" | ||
| 4 | 加上"告诉我这道菜适合几人吃" |
⚠️ 关键观察:你会发现,约束加得越具体,菜谱越贴近你的真实需求。你说"15 分钟"它就挑快的;说"不要辣"它就避开辣。但如果你只加一个模糊的"简单点",它可能还是给你一道要 40 分钟的——因为你没写清楚"简单"是多少时间。
六、如果它没按你想的来
| 现象 | 先查什么 |
|---|---|
| 录音识别错字 | 说清楚点、安静点;看串口里"她说的话"是不是你想的 |
| 一直"思考中" | 联网/密钥对吗?看串口的"模型 HTTP 状态码" |
| 菜谱不像菜谱(一团话) | 不是 AI 坏了,是提示词没给格式——补上"菜名/食材/步骤" |
| 菜谱明明说"15 分钟"但实际要 1 小时 | AI 估的时间不一定准,菜谱要"仅供参考" |
| 生图那步失败 | 生图 API 密钥/网络对吗?图片下载到 PSRAM 够不够? |
记住:菜谱"看起来很专业"不代表"一定准"。AI 编的是"像菜谱"的话,不是"做过验证"的菜。 吃之前要用常识核对,菜谱上要标注"仅供参考"。
七、下课前,把"对话链"讲给我听
先别看 AI 的回答,自己说一遍:
- 智能菜谱是"板子会做菜"吗?板子真正做了哪几件事?
- 这条对话链有哪几棒?哪几棒在板子、哪几棒在云端?
- 同样"冰箱有土豆鸡蛋青椒",为什么含糊提示词和"给格式"提示词得到的菜谱差那么多?
- 提示词的四要素,在这一课里各起到什么作用?(角色/任务/约束/负面指令)
- 生图那一棒,识别到的文字派上了什么用场?
- 为什么菜谱要标注"仅供参考"?
今天请留下三样东西:你用语音让板子识别到的一句话、AI 给你的一道菜谱(菜名+食材+步骤)、以及一句"我在提示词里加的一个约束和它的效果"。
八、最后留给你:AI 是按"你的话"来"生菜谱"的
这一课你可能觉得"不就是问个菜嘛"。但想深一点:
AI 不是一个固定的"菜谱库",它是一个"按你的要求现编"的助手。 你把话描述到什么程度,它就生到什么程度。这跟第 35 课"改提示词看回答变"、第 36 课"让 AI 生成例句"是同一个道理。
| 你想让 AI 帮你 | 你要给出的"条件" |
|---|---|
| 定今天的晚餐 | 冰箱有什么、几个人吃、多少分钟内、忌口什么 |
| 推荐 3 道菜 | 要几道、按什么排序(时间/难度)、什么范围 |
| 给出健康搭配 | 要不要控制卡路里、是不是主食/荤素搭配 |
| 画一道菜的样子 | 描述清楚"菜长什么样"(颜色、摆盘、盘子) |
摸清这个规律:"AI 生活"的每一课,都是"你说清楚 → AI 按你的话生成"。 下一课的电子宠物不一样——它不是 AI,是一段你写死了的规则,它"活得怎么样"靠的是时间,不是你的语言。
教师备课备注(不作为课堂口播)
课程定位
- 第九章「AI 生活」开篇。把语音(ASR) + 大模型(Ark) + TTS + 生图串成一条完整对话链,落点是"板子不做菜,云端按提示词生成菜谱,板子负责听/寄/显示"。是第 23–28 课"AI 感知/对话"的收束应用。
- 技术与原理并重:讲清楚四段接力各用什么技术(用"零件表"+链路图),不深究代码。提示词训练是主线之一:让 AI 给出"结构化菜谱",核心是给格式 + 约束。
- 与第 27 课"你画我猜"严格对偶:那次"板子画、AI 猜",这次"AI 画、板子看"——同一条生图链路,方向相反。
本课新增的核心知识点
- 对话链:语音识别→HTTP寄给大模型→云端生成→显示/朗读。板子不做内容生成。
- 结构化输出:让 AI 按"菜名/食材/步骤/时间"格式输出,才便于分屏显示。这是提示词里"命令格式"的力量。
- 提示词四要素在"生成"场景:角色+任务+约束+负面指令 → 菜谱变具体。与第 35/36 课呼应。
- 生图链路:识别文本当生图提示词 → 生图API返回URL → 下载到PSRAM → TJpg解码显示。
- AI 素养:菜谱"看起来专业≠一定准",要"仅供参考";AI 估的时间/营养不保证准确。
必须避免的错误
- 不要说"板子会做菜/知道怎么炒菜"。统一口径:"板子把你说的话寄给云端大模型,大模型按提示词编出菜谱,板子再显示。"
- 不要把生图讲得太深(下载、解码细节少讲)。重点让学生理解"文字变成了一张图"这个链路和"识别文本当提示词"。
- 密钥绝不进口播稿/截图;演示机用 config.real.h 覆盖后编译。
- 菜谱不必逐一验证营养,但课堂要强调"仅供参考、用常识核对"。
执行约束
- FQBN:
esp32:esp32:esp32s3:FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,CDCOnBoot=cdc,PSRAM=opi - 依赖:
TFT_eSPI、FT6336、WiFi、WiFiClientSecure、HTTPClient、ArduinoJson、TJpg_Decoder、arduino_base64、es8311(项目内)、font/ChineseFont16.h。 - 音频缓冲(96KB)和生图JPEG(最大2MB)必须放 PSRAM(
ps_malloc),PSRAM=opi必开。 - 屏幕/触摸/音频引脚同第 32/47 课;中文绘制用
font/ChineseFont16.h+drawWrapped。 - 凭证:百度(ASR)+火山(Ark)+生图(Image-2-Lite) 三组密钥,只放
config.real.h,源码顶部占位符,绝不进教案/skill/公开 zip。
课堂执行要点
- 顺序建议:demo01(现象:说话→识别→得菜谱→可选画菜)→ 四段接力链路图 → 提示词 A/B 对比(含糊 vs 给格式)→ 改一个约束实验 → 下课前复述。
- 灵魂追问 ①:"板子会做菜吗?它真正做了哪几件事?"——引出"板子=快递员+显示屏,想菜谱的是云端"。
- 灵魂追问 ②:"同样一句话,为什么给格式的提示词就得到正经菜谱?"——引出"结构化输出"。
- 观察表先预测后实测(五、改约束表)。
- 演示建议:先让学生"含糊地描述"看 AI 给啥,再"给足条件+格式"对比,让学生亲眼见到提示词的力量。
待办与遗留
demo01_recipe_voice源码已写(复用 Example_47 骨架 + 菜谱提示词),尚未实板验证。吴老师实板验收重点:① 录音识别是否准确;② 火山 Ark 是否返回菜品格式;③ 生图链路是否显示图片;④ 三组密钥配置路径。- 生图环节网络要求高(生图几十秒),若教室网络差,可先做"纯菜谱"(去掉生图),生图作为拓展。
- 实机联网数据(识别文字→菜谱→生图耗时)待回填。