把开发板变成局域网翻译 API:200 行代码的网关
端侧系列第 5 篇,软件侧开篇。前面四篇把硬件跑通了(树莓派/旧手机/边缘盒子/百元板)——但模型跑在板子上只是「能跑」,要用起来还差一层:一个家里/办公室所有设备都能调的 API 网关。这篇给一个 200 行代码的极简实现:手机、电脑、平板共用一台开发板的翻译能力,全程不出局域网。
要解决的四件事
- HTTP 服务:板子上起一个 API(POST /translate),任何设备 curl 就能调
- 排队:板子算力有限,多个设备同时请求要排队而不是互相踩
- 术语表:全家共用一份自定义术语(人名、产品名、口头禅)
- 缓存:翻过的句子不重算——重复率高的家庭场景(游戏台词、课程资料)收益巨大
架构一览
手机/电脑/平板(局域网内任意设备)
│ HTTP
▼
FastAPI 网关(板子上,~200 行)
├─ 术语预处理:正则替换 + 占位符保护
├─ 缓存查询:SQLite(key=术语归一后的原文哈希)
├─ 请求队列:asyncio.Queue(并发=1,板子单请求最优)
└─ 模型推理:llama.cpp / transformers 本地调用
关键实现取舍(200 行里的三个决定)
- 并发=1 的诚实设计:开发板跑 7B 本来就是单请求最优,假装能并发只会让所有请求都超时。队列 + 「当前排队 N 人」返回头,客户端自己决定等不等
- SQLite 而非 Redis:板子上少一个服务少一份内存开销,SQLite 单机缓存够用(实测 10 万条目以内查询毫秒级)
- 术语占位符而不是直接替换:把「张三」替换成
⟦PERSON_1⟧再送模型,防止模型把人名翻歪——占位符恢复在网关层做,模型无感知
实测数字(百元板 B)
| 指标 | 数值 |
|---|---|
| 首句冷启动 | 3.2s(模型已加载) |
| 热缓存命中 | 40ms |
| 20 词句子 | 3.9s |
| 三设备并发排队 | P2 等待 +4.1s |
| 全天候挂机功耗 | 6.8W |
| 断网可用性 | 完全可用(废话,这就是重点) |
用法场景(真实在用的三个)
- 平板看外刊:平板浏览器配个调用脚本,划词翻译走自家 API——内容不进任何第三方
- 游戏 MOD 汉化:家里主机玩家把 MOD 文本文件丢给 API 批量初翻(上一篇的流程,机翻环节从 2 小时缩到 8 分钟)
- 小孩作业的英文材料:家长手机拍题 → 文本进 API → 双语对照出来,全程内网
安全提醒(必读)
局域网不等于安全:网关至少要做三件事——只绑内网网卡(别暴露公网)、加一个简单 API key(防止邻居蹭)、日志里别存原文(家庭内容隐私)。200 行里有 30 行是干这个的,别省。
系列小结
硬件四篇+本篇,端侧翻译的「攒机指南」齐了:百元板(硬件)+ 系统部署(Armbian)+ 本篇(网关)= 一套完全自主的家用翻译基础设施。下一篇视兴趣二选一:给网关加 OpenAI 兼容层(让所有现成客户端白嫖),或者写手机端的调用器。
写文里这些翻译场景,来自我日常在用的「随心翻译」:Edge/Chrome 浏览器插件,本地优先架构,不用不花钱。官网 suanlinfang.cn/translate?from=cnblogs-wangguan
浙公网安备 33010602011771号