本地跑得挺舒服的一个小工具:双击 run.bat,浏览器打开 127.0.0.1:8765,把有道词典里收藏的生词编成英文段落来复习。
但用久了就冒出一个念头——能不能把它搬到服务器上?这样手机、公司电脑,打开浏览器就能复习,不用非得开着那台装了有道词典的电脑。
搬之前我把账算了一遍:哪些文件必须带、哪些依赖得在服务器上装、装完到底能不能用、磁盘会涨多少。这篇就是这份清单,顺便把唯一一个大坑记下来。
一、先给结论
| 问题 | 答案 |
|---|---|
| 必须传上去的 | 代码 + 几个 json,一共 2.5 MB 左右 |
| 微软那套朗读(edge-tts) | 要装,但大陆机房不一定连得上,装了也可能合成失败 |
| 豆包语音 | ✅ 只填一个 API Key,什么都不用装,服务器上最稳 |
| Piper 离线语音 | ❌ 最重(175 MB 模型 + 120 MB 包),服务器上建议直接跳过 |
| 空间会涨多少 | 精简部署 个位数 MB,音频缓存随用随涨 |
| 最大的坑 | 服务器上读不到有道的词库(那是 Windows 本机的 SQLite) |
二、实测:要搬上去的东西有多重
本地实测(2026-09-26,词库 904 词、雅思 7755 词、130 条段落缓存):
| 内容 | 体积 | 建议 |
|---|---|---|
代码(*.py + web/) |
~0.2 MB | ✅ 必带 |
data/vocab.json(有道生词) |
0.63 MB | ✅ 必带(原因见第四节) |
data/lexicons/(雅思两套词库) |
0.87 MB | ✅ 建议带(服务器下不动,见下) |
data/paragraphs.json(段落缓存) |
0.6 MB | 建议带,能省一笔大模型的钱 |
data/progress.json(复习进度) |
0.01 MB | 建议带 |
data/audio/(236 个音频文件) |
25.6 MB | 可不带,用的时候自己会长出来 |
data/piper/(ONNX 音色模型) |
175 MB | 不打算在服务器用 Piper 就别带 |
必须的部分加起来不到 3 MB。 真正占地方的是音频缓存和 Piper 模型,而它们都是「可再生」的。
雅思词库建议直接拷,别在服务器下载
新加的「一键下载雅思词库」是从 GitHub 的 raw.githubusercontent.com 拉数据的,大陆机房经常不通或极慢。本地先把词库下好(页面上点一下按钮就行),再一起把 data/lexicons/ 传上去最省事。
三、三条朗读通道,在服务器上各是什么命运
这个工具里有三条互相独立的朗读链路(当初就是为了对比才做的),搬到服务器上的表现完全不一样:
| 通道 | 要装什么 | 服务器上能不能用 | 建议 |
|---|---|---|---|
| edge-tts(微软) | pip install edge-tts,连同依赖约 3 MB |
⚠️ 要连微软的 speech.platform.bing.com,大陆机房经常超时/失败 |
可装可不装,失败会自动回退浏览器朗读,不会崩 |
| 豆包(火山引擎) | 什么都不用装,config.json 里填一个 API Key |
✅ 国内接口,公网 HTTPS 直连,最稳 | 服务器上的主力通道 |
| Piper(本地离线) | piper-tts + onnxruntime + numpy ≈ 120 MB,再加音色模型 |
✅ 完全离线,反而是最可靠的 | ❌ 除非特别在意离线,否则别在服务器装 |
顺带说一句:Windows 上 pip install edge-tts 会因写 Scripts\*.exe 报 WinError 2 而整体回滚(得用 --no-deps --target 绕),这个坑在 Linux 上不存在,服务器上一条命令就装好了。
结论:服务器上用「豆包 + 有道真人发音(单词) + 浏览器兜底」的组合就够了。
四、最大的坑:服务器上没有有道词典
这个工具的词库来源,是直接读有道词典桌面版在本机的数据库:
%LOCALAPPDATA%\Yodao\DeskDict\WbData\<账号>\newlocal ← SQLite
它是 Windows 上的文件。Linux 服务器上不存在这个东西,于是:
data/vocab.json必须一起传上去,否则启动时会提示「未找到有道词典单词本数据库」(服务还是能起来,但一个词都没有)- 页面上那个「↻ 同步词库」按钮在服务器上会失败 —— 这是预期行为,不是坏了
- 以后新增收藏词的正确流程变成了「本地导出 → 传上去」:
# 在装了有道词典的那台 Windows 上
python youdao.py
# 传到服务器覆盖
scp data/vocab.json root@<服务器IP>:/opt/word-review/data/
传完刷新页面就行,不用重启服务——服务端每次请求都会重新读盘。
五、部署清单(以 Ubuntu 22.04 为例)
flowchart LR
subgraph L[本地 Windows]
A[有道桌面版<br/>SQLite 词库] -->|python youdao.py| B[data/vocab.json]
B -->|scp| C[data/ 词库 · 进度 · 段落缓存]
end
subgraph S[腾讯轻量服务器]
C --> D["python3 server.py<br/>--host 0.0.0.0 --port 8765"]
D -->|HTTPS| E[DeepSeek<br/>编段落]
D -->|HTTPS| F[豆包<br/>语音合成]
D -->|dict.youdao.com| G[音标 · 例句 · 真人发音]
D --> H[手机 / 公司电脑<br/>浏览器直接访问]
end
# 1. 本地打包(只带必须的,不带 audio 和 piper)
tar -czf word-review.tar.gz \
*.py web data/vocab.json data/lexicons \
data/paragraphs.json data/progress.json
# 2. 传上去、解开
scp word-review.tar.gz root@<服务器IP>:/opt/
ssh root@<服务器IP>
mkdir -p /opt/word-review && tar -xzf /opt/word-review.tar.gz -C /opt/word-review
# 3. 装可选的朗读通道(豆包不用装,只要 Key)
cd /opt/word-review
python3 -m pip install edge-tts
# 4. 起服务(想常驻就配 systemd / screen)
python3 server.py --host 0.0.0.0 --port 8765
几个容易忘的点:
run.bat在 Linux 上不能用(它是 Windows 批处理,chcp、%~dp0那套),直接跑python3 server.py --host 0.0.0.0- Python 要 3.9+:Ubuntu 22.04 自带 3.10 可以直接用;CentOS 7 自带的 3.6 不行,得另装
- 腾讯轻量要在「安全组」里放行 8765(服务器上再放行一次 ufw/firewalld),否则手机连不上
- 没有 HTTPS,自己用够了;要域名/证书就 nginx 反代一层
- 从大陆服务器访问这几家都没问题:有道在线接口 ✅、DeepSeek ✅、豆包 ✅,只有 GitHub raw ❌
六、数据全在服务器上,意味着什么
当初在本地跑,所有东西都在自己电脑上,没什么感觉;搬到服务器之后有几件事得想清楚:
- 复习进度会变成两份。
data/progress.json是进度的唯一真源,本地一份、服务器一份,不会自动同步。要么以后固定在一头用,要么手动传。 data/就是全部个人数据。 词库、段落缓存、进度、音频缓存都在里面,定期tar一份下来就是完整备份。- 音频缓存会慢慢涨。 每个单词的真人发音、每段朗读都会缓存成小文件(现在 236 个文件 25 MB),几百个词也就几十 MB,不用太担心,真要清就删
data/audio/里对应的子目录。 - ⚠️ 这个服务没有任何登录。 谁扫到 IP + 端口,就能看到你的词库和段落、能用你配置的 Key 去调大模型(花你的钱)——当然 Key 本身是打码返回的,读不走。真要放到公网,建议至少做一件事:安全组只放行自己常用 IP、或者 nginx 加一层 Basic Auth、或者换个不常见的端口。
七、小结
| 结论 | |
|---|---|
| 要传的 | 代码 + vocab.json + lexicons/ + paragraphs.json + progress.json ≈ 2.5 MB |
| 要装的 | edge-tts(3 MB,可选) |
| 不用装的 | 豆包(只要一个 Key) |
| 别装的 | Piper(175 MB 模型 + 120 MB 包) |
| 要注意的 | 有道的词库读不到,靠 vocab.json 传;同步按钮在服务器上会失败 |
| 要留心的 | 没有登录鉴权,别裸奔在公网 |
整体比想象中轻——真正需要动脑的地方不是空间,而是「词库从哪来」。想清楚这条链路,剩下的就是一条 scp 和一条 python3 server.py。
本文章永久链接: 把生词复习工具搬到腾讯轻量服务器:每一处缓存和依赖我都算了一遍
