时光日历卡片生成:每天早晨在智能相框上重温当年的今天
整理完两万多张家庭老照片后,如果只是把它们静静地塞在 NAS 的磁盘阵列里,它们依然只是一堆冰冷的数字文件。
记忆最迷人的地方,在于在不经意的日常瞬间与过去的岁月产生重逢与回响。
老妈每天早晨起床走到客厅,第一件事就是撕一张挂在墙上的老式日历牌;老爸总喜欢在喝早茶的时候念叨一句:"十年前的今天,咱们全家好像刚搬进这个新房子。"
为了让沉睡在硬盘里的两万张照片重新活过来,我在客厅电视柜旁的智能电子墨水相框上,上线了一个每日时光胶囊(On This Day Daily Capsule)生成流水线:
每天早晨 6:30,系统自动从两万张照片中检索出历史上所有在 9 月 11 日拍摄的照片,结合当时的 Exif 地点、人脸标签与老照片题字,利用大模型自动排版生成一张排版雅致的"那年今日水彩记忆卡片"。
flowchart LR Scheduler[每日清晨 06:30 定时触发] --> QueryToday[SQLite 检索: Month=09 & Day=11 的所有历史照片] QueryToday --> StoryPrompt[时光故事编排 Prompt:\n结合当年天气/地点/人物生成 50 字温情图说] StoryPrompt --> RenderEngine[HTML/Canvas 渲染为 16:9 低饱和水彩电子日历卡片] RenderEngine --> FramePush[无线推送至客厅电子墨水屏/智能相框呈现]时光胶囊 Agent 的三大生成原则
- 跨年份代际时间折叠(Multi-Year Folding):
- 如果历史上有多张同一天的照片(如 2005 年在杭州、2015 年在北京、2022 年在老家院子),系统按 5 年/10 年整数倍大事件优先推荐。
- 拒绝空洞煽情,突出生活事实细节(Factual Life Vignette):
- 图说不写空洞的感叹,而是精准点出当年的具体生活细节(如"十年前的今天,老爸在院子里种下了第一株茉莉花,Token 还是个刚满月的小奶狗")。
- 低功耗离线电子墨水屏渲染(E-Ink Optimized Rendering):
- 前端生成高对比度、黑白灰三阶或低饱和水彩优化的 PNG 图片,通过 HTTP 一键刷写到墨水屏上,整天待机功耗为零。
基于 Python 的时光胶囊抽取与图说生成器
import sqlite3 import datetime import httpx import json from dataclasses import dataclass from typing import List, Optional @dataclass class VintageMemoryCard: year: int location: str people: List[str] image_path: str poetic_caption: str class DailyTimeCapsuleGenerator: def __init__(self, db_path: str, llm_api_base: str, llm_api_key: str): self.db_path = db_path self.api_base = llm_api_base self.api_key = llm_api_key def fetch_photos_on_this_day(self, month: int, day: int) -> List[dict]: with sqlite3.connect(self.db_path) as conn: conn.row_factory = sqlite3.Row cur = conn.cursor() query = """ SELECT id, file_path, capture_year, location, visual_summary, people_names FROM family_photos WHERE capture_month = ? AND capture_day = ? ORDER BY capture_year DESC """ cur.execute(query, (month, day)) rows = cur.fetchall() return [dict(r) for r in rows] async def generate_daily_capsule(self) -> Optional[VintageMemoryCard]: today = datetime.date.today() candidates = self.fetch_photos_on_this_day(today.month, today.day) if not candidates: print("今日历史上暂无照片记录。") return None # 选取最具有代表性的一张老照片 (如 10 年前或 20 年前) target = candidates[0] years_ago = today.year - target["capture_year"] prompt = f"""你是一个温暖的家庭时光记录官。 请根据以下老照片信息,生成一段 40 字以内的温情图说: - 年代:{target['capture_year']} 年(距今 {years_ago} 年前) - 拍摄地:{target['location']} - 画面人物:{target['people_names']} - 画面细节:{target['visual_summary']} 要求:语言温润平实,像在老爸老妈耳边轻声讲起当年的故事,绝不出现假大空的口号。""" headers = {"Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json"} payload = { "model": "qwen2.5-7b-instruct", "messages": [{"role": "user", "content": prompt}], "temperature": 0.7 } async with httpx.AsyncClient(timeout=15.0) as client: resp = await client.post(f"{self.api_base}/v1/chat/completions", json=payload, headers=headers) caption = resp.json()["choices"][0]["message"]["content"].strip() return VintageMemoryCard( year=target["capture_year"], location=target["location"], people=target["people_names"].split(",") if target["people_names"] else [], image_path=target["file_path"], poetic_caption=caption )清晨客厅里的温馨重逢
今天清晨 7 点,老妈起床走到客厅,一眼看到电视柜旁的墨水屏相框亮起了一张拍摄于 2011 年 9 月 11 日的老照片:
画面里老爸正站在老家阳台上修剪一盆吊兰,老妈在后面笑着端着洗好的葡萄。相框下方写着一行温润的小字:
"十五年前的今天,老家的秋风刚刚吹黄了阳台的吊兰叶子,葡萄很甜,日子很长。"
老妈站在相框前看了好久,眼角带笑,拉着老爸讲起了十五年前搬家的趣事。
技术的最高境界,不是把人类带向虚无缥缈的元宇宙,而是把那些沉睡在岁月深处的美好时光,重新温柔地擦拭干净,稳稳地递到今天的餐桌前。