本帖最后由 云天 于 2026-2-19 12:43 编辑
【项目背景】
你有没有想过,有一天你的画框不仅能展示静态的画作,还能“听懂”你的描述,甚至“看懂”你拍下的照片,然后立刻画出一幅独一无二的简笔画?更酷的是,它使用的电子墨水屏具有断电后图案长期保存的特性——画作完成后即使拔掉电源,画面依然清晰保留,让这个画框真正成为一个零功耗的永久数字艺术品。 今天我就和大家分享一个基于树莓派、电子墨水屏和AI语音生图的项目,它实现了按住A键录音 → 语音识别 → 文生图 → 墨水屏显示,以及按住B键录音 + 拍照 → 图生图 → 墨水屏显示的双模式功能。整个过程在树莓派上本地运行,隐私安全,交互有趣,而墨水屏的低功耗与断电保存特性,让作品可以随时悬挂展示,无需持续供电。 【项目演示】A键(文生图):按住A键说“一只穿着宇航服的猫”,松开后约30秒,墨水屏上就会显示出一幅黑白简笔画的宇航猫。断电后,这幅猫依然挂在屏幕上。 B键(图生图):按住B键说“把桌上的杯子变成卡通风格”,同时摄像头自动拍照,AI会根据照片和你的描述生成新的图像并显示。即使关闭树莓派,新画作也会永久保留。 定时任务:每天上午8点,系统会自动获取北京天气,生成“晴天,22度,简笔画风格”的天气主题画,自动刷新。每天的天气画都会一直保留到第二天被新画覆盖。
【硬件清单】
树莓派Raspberry Pi 4B:作为主控板,性能足以运行整个程序。 电子墨水屏:250×128分辨率的黑白墨水屏,通过SPI接口与树莓派通信;其最大特点是断电后仍能保持图像,无需持续供电维持画面。 USB麦克风:免驱,用于捕捉用户的语音指令。 USB摄像头:免驱,用于在按下B键时拍摄照片,作为图生图的输入。 按键:电子墨水屏板载两个按键,分别作为A键(连接GPIO21)和B键(连接GPIO20),用于触发功能。 MicroSD卡:16GB或更大容量,用于烧录操作系统。
【软件架构】编程语言:Python 3,代码采用模块化设计,各功能独立封装。 核心功能模块:
录音模块:基于 sounddevice 实时捕获麦克风输入,结合 numpy 处理音频数据,最终转换为 Base64 编码的 WAV 数据 URI。 语音识别模块:通过 SiliconFlow API 调用 Qwen/Qwen3-Omni-30B-A3B-Instruct 模型,将音频直接转录为文本。 拍照模块:使用 OpenCV(cv2)调用 USB 摄像头拍照,并编码为 JPEG 格式的 Base64 数据 URI。 文生图模块:利用 SiliconFlow API 的 Kwai-Kolors/Kolors 模型,根据文本提示生成图像。 图生图模块:通过 SiliconFlow API 的 Qwen/Qwen-Image-Edit-2509 模型,结合输入图片和文本提示生成新图像。 图像处理模块:借助 Pillow 库对生成图像进行灰度化、尺寸调整、二值化,并转换为墨水屏专用的 1 位 BMP 格式。 墨水屏驱动:使用 DFRobot 官方库 devices.dfrobot_epaper 通过 SPI 接口控制屏幕,实现图像显示。 按键控制:基于 RPi.GPIO 库轮询 A、B 键电平变化,触发对应流程。 定时任务:采用 APScheduler 库,每日固定时间自动执行天气绘画任务。 天气获取:通过 pyowm 库调用 OpenWeatherMap API,获取实时天气数据。
依赖库清单:openai, requests, sounddevice, numpy, Pillow, opencv-python, RPi.GPIO, apscheduler, pyowm, 以及墨水屏专用驱动。 运行环境:树莓派 OS(基于 Debian),Python 虚拟环境管理依赖,所有 AI 请求通过互联网发送至 SiliconFlow 云服务。
【程序代码】 核心代码解析1. 按键录音(按住录,松开停) 这是实现“按住A/B键录音”的关键函数,利用 sounddevice 的流式读取,并在循环中检测按键电平:
2. 语音识别(SiliconFlow Omni 模型)将 Base64 音频直接发送给多模态模型,返回纯文本: 3. 文生图(Kwai-Kolors/Kolors)标准文生图调用,注意保存图片: 4. 图生图(Qwen-Image-Edit-2509)由于 OpenAI SDK 不支持 image 参数,改用 requests 直接调用,并通过 extra_body 传递图片 Data URL: 5. 墨水屏显示(含比例自适应)250×128 的屏幕比例特殊,直接拉伸会变形。使用 fit_mode='contain' 保持比例,剩余部分填充白色。而墨水屏的双稳态特性意味着图像显示后无需电力维持,即使树莓派关机,画面也永久可见。 6. 双按键轮询 + 定时任务主循环同时检测 A/B 键,并使用 BackgroundScheduler 添加每天8点的天气任务:
【调试中的坑与解决方案】
❌ 坑1:录音超时,PortAudioError: Wait timed out❌ 坑2:Image generation failed: ... unexpected keyword argument 'image'❌ 坑3:墨水屏显示变形❌ 坑4:按键检测报错 Please set pin numbering mode 感谢 DF 创客社区提供的交流平台,以及硅基流动(SiliconFlow)提供的免费 API 额度,让创客项目用上工业级 AI 模型变得如此简单。墨水屏技术,让我们的作品可以脱离电源长久展示。
【代码分享】
树莓派墨水屏.zip
|