把开发板变成局域网翻译 API:200 行代码的网关

端侧系列第 5 篇,软件侧开篇。前面四篇把硬件跑通了(树莓派/旧手机/边缘盒子/百元板)——但模型跑在板子上只是「能跑」,要用起来还差一层:一个家里/办公室所有设备都能调的 API 网关。这篇给一个 200 行代码的极简实现:手机、电脑、平板共用一台开发板的翻译能力,全程不出局域网。

要解决的四件事

  1. HTTP 服务:板子上起一个 API(POST /translate),任何设备 curl 就能调
  2. 排队:板子算力有限,多个设备同时请求要排队而不是互相踩
  3. 术语表:全家共用一份自定义术语(人名、产品名、口头禅)
  4. 缓存:翻过的句子不重算——重复率高的家庭场景(游戏台词、课程资料)收益巨大

架构一览

手机/电脑/平板(局域网内任意设备)
        │ 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
断网可用性 完全可用(废话,这就是重点)

用法场景(真实在用的三个)

  1. 平板看外刊:平板浏览器配个调用脚本,划词翻译走自家 API——内容不进任何第三方
  2. 游戏 MOD 汉化:家里主机玩家把 MOD 文本文件丢给 API 批量初翻(上一篇的流程,机翻环节从 2 小时缩到 8 分钟)
  3. 小孩作业的英文材料:家长手机拍题 → 文本进 API → 双语对照出来,全程内网

安全提醒(必读)

局域网不等于安全:网关至少要做三件事——只绑内网网卡(别暴露公网)、加一个简单 API key(防止邻居蹭)、日志里别存原文(家庭内容隐私)。200 行里有 30 行是干这个的,别省。

系列小结

硬件四篇+本篇,端侧翻译的「攒机指南」齐了:百元板(硬件)+ 系统部署(Armbian)+ 本篇(网关)= 一套完全自主的家用翻译基础设施。下一篇视兴趣二选一:给网关加 OpenAI 兼容层(让所有现成客户端白嫖),或者写手机端的调用器。


写文里这些翻译场景,来自我日常在用的「随心翻译」:Edge/Chrome 浏览器插件,本地优先架构,不用不花钱。官网 suanlinfang.cn/translate?from=cnblogs-wangguan

posted @ 2026-10-30 10:58  吴键WJ  阅读(5)  评论(0)    收藏  举报