Python搭建中英俚语知识库:支持TTS发音与Anki导出

发布时间:2026/8/31 1:49:31
Python搭建中英俚语知识库:支持TTS发音与Anki导出 “add salt to the wound”和“往伤口上撒盐”对上的那一刻确实容易让人产生一个错觉这个英语俚语是不是中国人发明的其实不是它只是英语里一个和中文俗语高度平行的表达。先不说词源这类“跨语言巧合”对学英语的人非常有用因为这意味着你可以直接用中文已有的语感去映射英文表达不需要从零死记硬背。不过很多人刷到这类短视频时当时觉得记住了过两天又忘了。原因不是记性差而是学习流程没有闭环只看到了“对照”没有沉淀词条、没有听发音、没有放进复习系统。这篇文章不讨论“哪个俚语谁发明”而是把过程工程化用 Python 搭一个本地中英俚语对照知识库支持批量录入、关键词检索、TTS 发音、Anki 卡片导出和本地 API 查询。看完之后你可以把零散收集的俚语全部变成一套可持续使用的个人学习工具链。1. 核心能力速览能力项说明项目类型个人知识库 / 英语学习工具链核心功能中英俚语对照存储、关键词检索、批量发音、Anki 闪卡导出、本地 API 查询数据格式JSON / CSV可迁移到 SQLite硬件要求普通 PC / Mac 即可不需要 GPU显存占用不涉及本地模型推理显存占用为 0支持平台Windows / macOS / Linux启动方式命令行脚本 可选 FastAPI 服务API 支持支持提供本地 HTTP 查询接口批量任务支持 CSV/JSON 批量导入、批量 TTS 生成、批量卡片导出适合场景英语学习、口语练习、英语教学内容整理、自媒体选题积累这套方案没有复杂的模型依赖核心就是把“输入、检索、发音、复习”四个环节打通。如果后续想用大模型 API 来自动生成例句和释义也可以接到第 8 节的接口层但基础版本完全不需要 GPU。2. 适用场景与使用边界这个工具链适合下面几类人英语学习者尤其是喜欢通过中英对照学俚语的人。把关键词条结构化之后搜索和复习效率会高很多。英语老师或课程内容制作者可以快速整理一批主题俚语统一生成发音文件再通过 Anki 分发给学生。英语类自媒体作者在选题阶段需要批量筛选“中文有对应说法”的英语俚语。用检索脚本可以直接按中文关键词反查英文俚语。对本地笔记和知识库有偏好的技术用户不依赖云端平台数据文件自己掌握。使用边界也要说清楚它不是词典释义和例句的准确性取决于录入内容。俚语在不同语境下可能有不同语气建议每条都记录“使用场景”字段而不是只记一句翻译。不要盲目相信“中文俗语 英文俚语”的完全等价。很多只是意象相近语域、褒贬、使用频率未必相同。如果从词典、教材、网站复制例句要注意版权。个人使用问题不大但公开发布或商用前需要确认来源授权。TTS 生成的语音是机器合成音适合辅助记忆不适合替代真实发音学习。涉及他人声音特征时更需要获得明确授权。3. 中英俚语学习工具链环境准备先准备一个干净的 Python 3.9 以上环境。推荐用虚拟环境隔离依赖避免和系统 Python 冲突。这里以 Linux/macOS 命令为例Windows 下的激活命令会单独标注。python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activate建议把脚本和数据分开存放目录结构如下slang-toolkit/ ├── venv/ ├── data/ │ └── slangs.json ├── audio/ ├── scripts/ │ ├── import_csv.py │ ├── search.py │ ├── tts_batch.py │ ├── api_server.py │ └── anki_export.py └── templates/ └── slangs_template.csv核心依赖只需要几个requests用于 HTTP 调用fastapi和uvicorn用于本地 APIedge-tts用于生成英语发音。如果网络环境访问外部在线 TTS 服务不稳定可以退回到pyttsx3它使用系统内置语音引擎不需要联网。pip install requests fastapi uvicorn edge-tts pip install pyttsx3 # 可选离线 TTS 备用安装完毕后跑一下 Python 版本确认python --version这一步没有问题再继续。整套环境对磁盘空间要求很低100MB 以内足够和动辄几个 GB 的本地模型完全是两个量级。4. 搭建中英俚语对照知识库学习工具链的核心是数据模型。俚语不是单词除了拼写和中文翻译还需要记录语境、例句和标签。我建议用一条结构化 JSON 表示一个俚语。4.1 词条数据模型以标题里的add salt to the wound为例一条完整词条可以这样设计{ id: add-salt-to-the-wound, english: add salt to the wound, chinese: 往伤口上撒盐, meaning: 在对方已经很不好受的情况下继续打击对方让情况更糟, example_en: Telling her she failed again just added salt to the wound., example_zh: 再告诉她一次失败的消息简直就是往伤口上撒盐。, tags: [idiom, emotion], source: manual }字段含义id唯一标识用英文短语转小写加连字符方便生成音频文件名。english英语俚语原文。chinese中文对应说法。meaning释义尽量写清楚使用语境而不是简单直译。example_en/example_zh中英文例句用于复习时理解上下文。tags主题标签比如 emotion、business、time。source来源可以是manual、book-isbn、website-url等便于追溯。在data/slangs.json里先放 3 到 5 条示例词条把数据结构跑通。除了这个例子还可以放两条常见的中英高度对应短语比如break the ice对应中文语境里的“打破僵局/破冰”once in a blue moon对应“千载难逢”。这些条目不用追求数量先验证整条链路。4.2 用 Python 读取和校验数据数据文件写好后写一个简单的加载脚本确保 JSON 格式没有错误并检查必填字段是否完整import json with open(data/slangs.json, r, encodingutf-8) as f: data json.load(f) required {english, chinese, meaning, example_en, example_zh} errors [] for item in data: missing required - set(item.keys()) if missing: errors.append((item.get(english, unknown), missing)) if errors: print(存在缺少字段的词条) for e in errors: print(e) else: print(f数据校验通过共 {len(data)} 条词条)如果以后数据量大了可以换成 SQLite字段结构不变只是把读取逻辑从 JSON 换成sqlite3。刚开始几百条词条用 JSON 完全够用还方便用文本编辑器直接修改。5. 批量导入与数据管理手动在 JSON 里加词条效率太低。更实际的做法是整理一个 CSV 模板一次性批量导入。5.1 CSV 批量导入模板在templates/slangs_template.csv中按下面的格式准备数据english,chinese,meaning,example_en,example_zh,tags add salt to the wound,往伤口上撒盐,让对方本已难过的心情更糟,Telling her she failed again just added salt to the wound.,再告诉她失败的消息简直是往伤口上撒盐。,idiom|emotion break the ice,打破僵局,在尴尬场合主动说话让大家放松下来,He told a joke to break the ice at the meeting.,他在会上讲了个笑话来打破僵局。,idiom|social once in a blue moon,千载难逢,非常罕见极少发生,He only visits his hometown once in a blue moon.,他极少回老家。,idiom|frequency英文、中文、释义、例句这几个字段建议都填。tags用竖线分隔方便脚本切分。5.2 去重与自动生成 ID写一个导入脚本读取 CSV、自动生成id并去重后写回 JSONimport csv import json import re CSV_PATH templates/slangs_template.csv JSON_PATH data/slangs.json def make_id(english: str) - str: s english.strip().lower() s re.sub(r[^a-z0-9], -, s) return s.strip(-) with open(CSV_PATH, r, encodingutf-8) as f: rows list(csv.DictReader(f)) with open(JSON_PATH, r, encodingutf-8) as f: data json.load(f) existing {item[english].strip().lower() for item in data} added 0 for row in rows: english row[english].strip() if not english: continue if english.lower() in existing: continue tags [t.strip() for t in row.get(tags, ).split(|) if t.strip()] item { id: make_id(english), english: english, chinese: row[chinese].strip(), meaning: row.get(meaning, ).strip(), example_en: row.get(example_en, ).strip(), example_zh: row.get(example_zh, ).strip(), tags: tags, source: csv-import } data.append(item) existing.add(english.lower()) added 1 with open(JSON_PATH, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) print(f新增 {added} 条当前总数 {len(data)} 条)这个脚本是整条工具链里最值得复用的部分。之后看到好的俚语只需要往 CSV 里追加一行再跑一次脚本。注意 CSV 文件必须用 UTF-8 编码保存Windows 下用 Excel 另存时很容易默认存成 GBK会导致中文乱码。6. 关键词检索中英互查词条多了以后命令行直接搜是最快的。写一个search.py支持输入中文或英文关键词模糊匹配所有文本字段import json def search(keyword: str, data_pathdata/slangs.json): keyword keyword.strip().lower() with open(data_path, r, encodingutf-8) as f: data json.load(f) result [] for item in data: text .join([ item.get(english, ), item.get(chinese, ), item.get(meaning, ), item.get(example_en, ), item.get(example_zh, ) ]).lower() if keyword in text: result.append(item) return result if __name__ __main__: kw input(输入中文或英文关键词).strip() items search(kw) print(f共找到 {len(items)} 条结果) for item in items: print() print(item[english], -, item[chinese]) print(释义, item[meaning]) print(例句, item[example_en]) print(翻译, item[example_zh])比如想筛“哪些英文俚语对应中文‘伤口撒盐’”直接输入“撒盐”就能定位。这在做双语教学素材和内容选题时非常好用。数据量超过几千条以后线性扫描会变慢。到那时可以换成 SQLite 的 FTS5 全文索引或者继续用 JSON 但每次启动先加载到内存。对个人学习场景线性扫描在三千条以内都是可以接受的。7. 批量发音与口语练习俚语光看不听很难形成语感。这里用edge-tts批量生成英文例句发音输出到audio目录文件名和词条id保持一致。import asyncio import json import edge_tts VOICE en-US-AriaNeural async def make_audio(text: str, output_file: str): communicate edge_tts.Communicate(text, VOICE) await communicate.save(output_file) async def main(): with open(data/slangs.json, r, encodingutf-8) as f: data json.load(f) for item in data: audio_path faudio/{item[id]}.mp3 await make_audio(item[english], audio_path) print(已生成:, audio_path) if __name__ __main__: asyncio.run(main())这里的edge-tts会请求微软在线服务第一次使用前先确认当前网络能正常访问。如果在线服务不可用可以用pyttsx3生成离线音频音色会偏机械但用来记单词足够import pyttsx3 engine pyttsx3.init() engine.setProperty(rate, 150) engine.save_to_file(add salt to the wound, audio/add-salt-to-the-wound.mp3) engine.runAndWait()生成后用一个支持本地播放的播放器逐条听或者按词条分组混音。这样每个俚语都有“文本 音频 中文语境”三个锚点比单纯看中英对照记得牢很多。8. 本地俚语查询 API命令行查已经很好用了但如果想做成网页端、接入自己的学习工具或者后面让大模型 API 自动补全词条可以给知识库加一个本地 HTTP 接口。这里用 FastAPI 实现。8.1 启动 FastAPI 服务import json from fastapi import FastAPI, Query app FastAPI() def load_data(): with open(data/slangs.json, r, encodingutf-8) as f: return json.load(f) app.get(/api/search) def search(q: str Query(..., description中文或英文关键词)): data load_data() q q.strip().lower() result [] for item in data: text .join([ item.get(english, ), item.get(chinese, ), item.get(meaning, ), item.get(example_en, ), item.get(example_zh, ) ]).lower() if q in text: result.append(item) return {count: len(result), results: result} app.get(/api/random) def random_item(): import random data load_data() item random.choice(data) return item启动命令uvicorn api_server:app --host 127.0.0.1 --port 8000注意这里绑定的是127.0.0.1不接收外部网络请求。如果只是自己本机用不要改成0.0.0.0避免把本地查询接口暴露到局域网或公网。8.2 curl 与 Requests 调用示例启动后用 curl 测试curl http://127.0.0.1:8000/api/search?q%E6%92%92%E7%9B%90%E6%92%92%E7%9B%90是“撒盐”两个字的 URL 编码。如果返回 JSON说明接口正常。Python 侧调用也很简单import requests resp requests.get( http://127.0.0.1:8000/api/search, params{q: 撒盐}, timeout10 ) data resp.json() for item in data[results]: print(item[english], -, item[chinese])这个接口最大的价值是可以被其他脚本调用。比如把“每日一句”的素材批量拉下来配合定时任务自动生成当天要复习的俚语列表。9. 生成 Anki 闪卡建立复习闭环学俚语最怕“只收藏不复习”。Anki 是很多人都在用的间隔重复工具这里通过 AnkiConnect 插件直接往 Anki 里批量写入卡片。首次使用需要先安装 AnkiConnect 插件并把 Anki 打开否则连不上本地8765端口。import json import urllib.request ANKI_URL http://127.0.0.1:8765 def invoke(action: str, **params): payload json.dumps({ action: action, version: 6, params: params }).encode(utf-8) req urllib.request.Request(ANKI_URL, datapayload) with urllib.request.urlopen(req) as resp: return json.loads(resp.read().decode(utf-8)) invoke(createDeck, deckEnglishIdioms) note { deckName: EnglishIdioms, modelName: Basic, fields: { Front: add salt to the wound, Back: 往伤口上撒盐brTelling her she failed again just added salt to the wound. }, options: {allowDuplicate: False}, tags: [idiom] } print(invoke(addNote, notenote))如果字段想同时显示音频可以在 Anki 模板里添加音频字段并把audio目录里的 mp3 文件名写入卡片。这里的关键点是AnkiConnect 的协议本身就是公开的JSON 字段结构按上面示例写就行。每天复习时先看英文俚语想中文意思再翻面看例句和音频。这套流程把“录入 - 发音 - 复习”闭环起来了。10. 资源占用与性能观察这套工具链和常见本地 AI 模型完全不同资源占用非常低。可以分两种情况看纯本地脚本阶段运行import_csv.py、search.py时CPU 占用几乎可以忽略内存占用取决于 JSON 文件大小。几千条词条加载到内存也就几十 MB。FastAPI 服务阶段单个 uvicorn worker 占用内存大约 50 到 100 MB 左右取决于数据量。启动后一直挂着也不会有明显负担。TTS 阶段edge-tts主要耗时在网络请求和音频合成服务端本地 CPU 占用不高但批量生成时建议加一点间隔避免触发服务端限流。显存占用为 0因为不需要跑 GPU 推理。如果后续接入大模型 API 做自动扩充资源消耗就到了模型服务那边本机只负责发送请求和保存返回结果。数据量增长后最需要关注的是 JSON 读写效率。几千条以内无所谓到一两万条时启动脚本和每次写入都会明显变慢。届时有两条路换 SQLite 做持久化或者启动时只 load 一次并常驻内存。对个人学习工具来说先优先保证数据文件结构化再考虑性能优化。11. 常见问题与排查方法问题现象可能原因排查方式解决方案CSV 导入后中文乱码文件编码不是 UTF-8用文本编辑器打开看是否乱码另存为 UTF-8 编码JSON 文件无法加载多了逗号或引号不配对用 json.load 报错信息定位行号用编辑器格式化 JSON或删除多余逗号TTS 生成 mp3 失败网络无法访问在线 TTS 服务手动执行一条命令看报错使用 pyttsx3 离线语音生成的语音是英文朗读但没声音输出文件路径不存在检查 audio 目录是否存在先创建 audio 目录AnkiConnect 连不上Anki 未启动或插件未安装浏览器访问 http://127.0.0.1:8765打开 Anki安装并启用 AnkiConnectAnki 卡片显示为空模板字段名不是 Front/Back查看 Anki 笔记类型字段自定义模板字段名端口 8000 被占用其他服务占用了端口检查端口监听状态换端口启动 uvicorn关键词搜不到中文脚本匹配时编码不一致检查终端编码统一所有文件使用 UTF-8批量导入一部分丢失CSV 缺列或列名不匹配打印 rows 前几行检查字段名确保 csv 表头和模板一致接口返回 422缺少 q 参数看 FastAPI 文档 /docs在 URL 中补上 q 参数这里面最容易忽略的问题是编码。Linux 和 macOS 终端默认 UTF-8但 Windows 下用 Excel 编辑 CSV 很容易把文件保存成 GBK导致中文乱码。建议所有数据文件统一用 VS Code 或文本编辑器保存为 UTF-8。12. 最佳实践与合规提醒实践经验下来有几个习惯值得一开始就养成。第一先小批量跑通流程再大规模录入。先手工维护 20 条质量高的词条把导入、搜索、TTS、Anki 导出全部跑一遍再开始批量整理历史素材。不要上来就导几千条出了问题很难定位。第二数据文件和脚本分开管理。data目录只放数据scripts目录只放脚本audio目录只放生成的音频。这样备份时只需要备份data目录重新生成音频也不需要动脚本。第三每条词条都要备注来源。手动录入就写manual从书籍或网站整理的写清楚来源出处。这样以后如果需要公开分享或商用可以清楚判断哪些素材有版权风险。例句最好自己改写不要整段照抄付费词典或教材。第四接口服务默认只监听本机。如果确实需要局域网使用也要加访问控制避免接口被无关人员批量调用。第五合规范畴需要特别强调。如果是个人学习TTS 合成自己的复习音频没有问题。如果要做公开课程、自媒体视频、有声内容就要确认例句素材的版权、TTS 平台的使用条款以及是否涉及真实人物的声音或肖像。涉及声音克隆、名人配音这类场景必须获得明确授权否则有法律风险。这个工具链本身是安全的但内容来源要守住底线。13. 总结与下一步这个方案最有价值的地方是把一个看似“随便记记就行”的英语俚语学习需求变成了可检索、可复习、可自动化的本地知识库工具链。核心不是知识库本身而是“中英对照 结构化数据 TTS Anki”这套组合真正解决了看视频当时记住、过后忘记的问题。建议最先验证这样一条链路手工准备 3 条词条写入 JSON跑通导入脚本搜索一次生成一条 TTS 音频再通过 AnkiConnect 添加一张卡片。整条链路通了之后再逐步增加词条量。最大的坑集中在编码问题和 TTS 网络访问遇到就先查这两块。下一步可以尝试给 FastAPI 服务加一个“随机一词”接口或者接入大模型 API让模型从英文语料中自动发现和中文高度对应的俚语再人工确认入库。这样一来这个工具就不只是复习卡片而是一个可以持续增长的双语俚语挖掘系统。