标日中级上
标日中级上 → Anki 牌组生成 PLAN
- 13对照表
- 19小节
状态:全部 Phase 已完成 ✅ | 牌组已生成可交付 生成时间:2026-09-07 | 更新:2026-09-07(P2 补例句完成 + P3 例句词级注音完成 + P4 例句音频完成 + P5 生成 apkg 完成 + 词级注音对齐 github + v2 例句扩至每卡 3 句(4858 句)并重合成音频、重打包) 配套文档:
01_RULE.md(生成规范,字段/注音/音频/反馈的具体规则)
0. 一句话结论
可行性已打通(已实测从 PDF 直接解析出 1612 词,圆数分层准确)。方案 = 对齐 github 卡片格式 + 补齐缺失字段(释义/例句/翻译)+ 例句振假名词级注音 + TTS 音频 + 快速反馈 ID。6 个 Phase 已全部完成。
当前进度速览:
- ✅ P1(PDF→JSON,1612 条)已完成
- ✅ P1.5(卡片版式重构:例句拆成独立 4 组字段 + 正面无假名 + 背面逐句展开)已完成
- ✅ P2(AI 补 1168 词缺例句 + 例句中文翻译)已完成
- ✅ P2.5(v2:例句扩至每卡 ≥3 句 —— 1590 卡 3 句 + 22 卡 4 句 = 4858 句,全部带翻译)已完成
- ✅ P3(例句振假名注音,C 模式词级
出会[であ]+ 目标词高亮)已完成 - ✅ P4(音频合成:单词 1612 段 + 例句 4858 段 = 6470 段)已完成
- ✅ P5(生成 .apkg 159.9MB + 音频引用审计 6470/6470 无缺失)已完成
- ✅ P6 README + 交付(本步)已完成
1. 可行性验证结果(已完成,非空谈)
| # | 验证点 | 结论 | 证据 |
|---|---|---|---|
| 1 | PDF 源文件定位 | ✅ 16 课全部找到 | 【圆圆老师】新标日中级上册系统精讲课/文件网盘分享WPFX.LINK/【标日中级上-第N课】文件/ 下每课 2 个 PDF |
| 2 | 文本可提取 | ✅ pypdf extract_text 直接抽 | 实测第 1 课 8 页全部可读 |
| 3 | 词条字段解析 | ✅ 词/假名/声调/词性/释义/例句全部干净 | 解析出 136 词,与笔记 03_词汇.md(34+71+30)一致 |
| 4 | 圆数分层(A1/A2/A3) | ✅ 页眉圆圈数 + 空行启发式 | 16 课圆数分布合理(见 §2) |
| 5 | genanki 生成 .apkg | ✅ 已装、可用 | 隔离 venv 内 genanki 安装成功 |
| 6 | 乱码中文 | ⚠️ 部分拓展/释义中文乱码 | 集中在老师中文补充,日语部分干净;对策见 §1 下表 |
发现的风险与对策:
| 风险 | 表现 | 对策 |
|---|---|---|
| 拓展列中文乱码 | → 干す:&'()*+ 这类 | 只保留日语关联词,乱码中文丢弃(对齐 github「关联词」字段本就只要词条+读音) |
| 个别 PDF 字体错误 | なみだ(涙)①【①】 应为 【名】 | 生成后做一次「词性/释义抽查」,异常项列清单人工校对 |
| 多词联合行 | 国際連合/国連 挤一行 | 拆成 2 张卡(主词 + 缩写词) |
| 页内圆数过渡无文字标记 | 第 1 课 P3 中部三圆→二圆 | 空行段(≥3)启发式切分,已验证准确 |
2. 数据源与溯源(PDF 直接,不靠 md)
- 源:
三圆词汇表.pdf(每课 1 个,8 页,按圆数分 3 段) - 提取:pypdf 文本直抽(核心字段无乱码)
- 圆数:页眉
【第N课 ⭕⭕⭕】/⭕⭕/⭕= 三圆/二圆/一圆(= A3/A2/A1) - 16 课实测词数:
| 课 | 总数 | A3 | A2 | A1 | 课 | 总数 | A3 | A2 | A1 |
|---|---|---|---|---|---|---|---|---|---|
| 01 | 136 | 34 | 72 | 30 | 09 | 105 | 45 | 46 | 14 |
| 02 | 82 | 49 | 33 | 0 | 10 | 90 | 35 | 50 | 5 |
| 03 | 122 | 21 | 69 | 32 | 11 | 119 | 46 | 57 | 16 |
| 04 | 105 | 34 | 58 | 13 | 12 | 83 | 33 | 36 | 14 |
| 05 | 118 | 43 | 62 | 13 | 13 | 85 | 33 | 46 | 6 |
| 06 | 120 | 43 | 64 | 13 | 14 | 81 | 27 | 46 | 8 |
| 07 | 102 | 34 | 58 | 10 | 15 | 100 | 26 | 44 | 30 |
| 08 | 96 | 39 | 45 | 12 | 16 | 68 | 23 | 34 | 11 |
合计 1612 词(A3=565 / A2=820 / A1=227)
3. 卡片格式对齐 github(5mdld/anki-jlpt-decks)
⚠️ 三次核对结论(README → 模板源码 → 实拍截图,逐级加深):
- README 只是使用说明书,不公开数据格式;
- 2026-09-07 已用 GitHub API 下载
deck-source/templates/全部 4 个卡片模板 HTML + CSS(存于本地reference/),逐行读过,字段名/结构 100% 来自源码而非猜测;- 用户直接甩了实拍截图(正面+背面)核对视觉,发现关键差异:正面完全不显示假名(只显示汉字见出し语 + 例句原文,无翻译无音频);背面例句是逐句独立展开(每句自己的假名/目标词高亮/翻译/播放按钮),而不是我们最初「所有例句合并成一段文字」的做法。已按此重构数据结构,见 §3.3。
3.1 README 明确写到的格式要点(已核对,据此修正)
| 要点 | github 原文做法 | 对我们的影响 |
|---|---|---|
| 音调 | 正面默认不显示(模板里 VocabPitch 被空 <span> 占位,需手动补 <span class="mb-box">作答区</span>) | 默认隐藏,可一键开启 |
| 假名标注 | 只对「常用漢字表」外的汉字注假名,表内汉字不注 | 采用(比「全注音」更省、更贴读法习惯) |
| 双模板 | 卡1「日→中」默认开;卡2「中→日」默认关(Alt2 字段 <span class="mb-box">作答区</span>/<span class="mb-box">作答区</span> 切换) | 沿用 |
| 词性标签 | 动词 [他動1]/[自1],1=五段 2=一段 3=カ変・サ変;另有 [補] カタカナ語 オノマトペ | 与标日动1/动2/动3 一一对应(动1=五段、动2=一段、动3=カ変・サ変),无需换体系 |
| 例句/关联/反义 | 每个词条至少给一条「例句 / 关联词 / 反义词」;高亮:橙黄=当前词、青绿=关联词、蓝=反义词 | A1 一圆词「三样全无」,必须至少补一条(→ 补例句,最实用) |
| 音频 | 单词真人录音 + 例句 VOICEPEAK 合成;在线 TTS 默认 never | 我们走 TTS 合成,见 §9 |
| 词典跳转 | dictOptions 跳 moji/欧路/GoldenDict/Weblio/Jisho | 可选低成本加(模板塞链接) |
| 简繁 | 内建繁体 zh-Hant,可切 zh-Hans | 我们直接用简体 |
| 版本号 | 每卡带 v25.01.01(最后更新日期) | 映射为 CardId 旁的生成日期 |
3.2 卡片模板源码核对结论(读 deck-source/templates/*.html 后,2026-09-07)
| 维度 | github 源码实际做法 | 我方对齐方案 |
|---|---|---|
| 正面结构 | 🔍查词图标 + VocabKanji(词,<span class="mb-box">作答区</span> 但 display=default 时默认显示注音,用户实拍显示不带注音——因为该词在常用漢字表内不触发注音)+ 例句列表(SentKanji1-4,纯文字无翻译无音频) | 正面:🔍 + Word(恒定不显示 Kana,比 github 更彻底去提示)+ SentKanji1-4 纯文字列表 |
| 背面结构 | VocabFurigana(全假名)+VocabPitch(音调) + VocabPoS(词性)+VocabDefSC(释义) + VocabPlus(补充) + 每句 SentFurigana(假名+目标词高亮)+SentDef(翻译)+SentAudio(独立播放) | 背面:Kana+Pitch + [Pos]Def + Note(关联) + 每句独立展开(假名占位/高亮/翻译/独立播放) |
| 例句字段设计 | 每句独立 4 组字段:SentKanji1-4 + SentFurigana1-4 + SentDefSC1-4 + SentAudio1-4,最多展示 4 句 | 已重构(2026-09-07):合并字段 Example/ExampleFurigana/ExampleDef/ExampleAudio → 拆成 SentKanji1-4/SentFurigana1-4/SentDef1-4/SentAudio1-4,逐句独立展示 |
| 目标词高亮 | JS 用正则匹配当前词在例句中的出现(含 ruby 形式),包一层 <strong> 橙色高亮 | 简化版 JS:对例句文本做当前 Word 子串匹配后加粗高亮(P3 注音完成前先用纯文本匹配,注音后需升级为 ruby-aware 匹配,见 §10 待办) |
| 单词音频位置 | 背面词旁内嵌播放按钮;正面 VocabAudio 留空 div(默认不出声,可选开启) | 一致:正面无播放按钮,背面词旁播放([sound:<span class="mb-box">作答区</span>],Anki 原生渲染圆形按钮,无需自绘) |
| 音频引用方式 | [sound:file.mp3] 本地 mp3,Anki 原生播放 UI | 一致,Azure TTS 生成的 mp3 走同一套引用方式 |
3.3 字段映射(含 2026-09-07 例句字段拆分重构)
github 源文件是 notes.csv(Tab 分隔、无表头),核心字段与我们数据的映射:
| 我们字段 | github 对应 | 来源 | 状态 |
|---|---|---|---|
CardId | (新增,github 内部为 NoteID) | 生成 | ✅ 反馈 ID + Anki 首字段(唯一性修复见 01_RULE.md) |
Word 見出し語 | VocabKanji | ✅ 已有 | |
Kana 読み | VocabFurigana | ✅ 已有(只在背面显示,正面恒定隐藏) | |
Pitch 音调 | VocabPitch | ✅ 已有(默认正面隐藏,背面显示) | |
Pos 词性 | VocabPoS | ✅ 已有(保留标日体系) | |
Def 释义 | VocabDefSC/TC | PDF + AI补 | ⚠️ 1168 词无例句连带缺高质量释义场景需补 |
Note 关联词(関/対) | VocabPlus | ✅ A3 拓展(派生词/辨析) | |
Audio 单词音频 | 背面词旁播放 | TTS | ✅ 已生成(1612 段) |
SentKanji1-4 例句原文(每句独立) | SentKanji1-4 | PDF + AI补 | ✅ 已拆分独立字段;v2 每卡统一扩至 ≥3 句(PDF 原例句保留,不足 AI 补) |
SentFurigana1-4 例句注音(每句独立) | SentFurigana1-4 | 规则(sudachi) | ✅ 4858 句全部词级注音(C 模式) |
SentDef1-4 例句翻译(每句独立) | SentDefSC/TC1-4 | AI补 | ✅ 4858 句全部配中文翻译 |
SentAudio1-4 例句音频(每句独立) | SentAudio1-4 | TTS | ✅ 4858 句全部合成 _ex1~4.mp3(v2 重跑) |
卡片模板(2 张,对齐 github 双模板):
- 卡1「日→中」(默认开):正面 =
Word+ 例句原文列表(无假名无翻译无音频);背面 = 假名+音调+词性+释义+逐句例句(假名/高亮/翻译/音频)+关联词+CardId - 卡2「中→日」(默认关):正面 =
Def;背面 =Word+Kana+ …(暂未实现,P5 补)
词性体系:保留标日教材的 动1/动2/动3/形2/…。已核对:github 的 [他動1] 里 1=五段 正是标日的 动1,2=一段=动2,3=カ変・サ変=动3——两套只是叫法不同,概念完全一致,无需转换。
4. 缺失字段补齐方案(区分 PDF 溯源 / AI 补 / 规则生成 / TTS)
用户要求:三圆词汇表里所有词,只要缺释义/例句/翻译等、与 github 格式不一致的,全部补齐。
| 补什么 | 规模(P1 实测) | 谁补 | 来源标记 | 状态 |
|---|---|---|---|---|
| 缺失释义 | 仅 1 词(A2/A1 也都有释义) | AI | ai | ✅ |
| 缺失例句 | 1168 词(A3 缺 123 / A2 缺 818 / A1 缺 227) | AI | ai | ✅ P2 补齐;v2 再统一扩至每卡 ≥3 句(PDF 例句优先保留) |
| 全部词的例句中文翻译 | 约 1612 词 × 每句一条(SentDef1-4) | AI | ai | ✅ |
| 例句振假名注音 | 约 1612 词 × 每句一条(SentFurigana1-4) | 规则(sudachi + 常用漢字表过滤) | rule | ✅ C 模式词级 |
| 单词音频 | 1612 词 | TTS | tts | ✅ 已生成 |
| 例句音频 | 每句独立音频 SentAudio1-4(原合并版 _ex.mp3 作废) | TTS | tts | ✅ 4858 句独立合成 |
📌 P1 实测修正认知:三圆词汇表结构 = A3(词+假名+声调+词性+释义+拓展+例句,最全)/A2、A1(词+假名+声调+词性+释义,无例句)。所以「补例句」是大头(1168 词),而非之前以为的「补 A1 释义」。
来源标记铁律:数据层每个字段记录 src ∈ {pdf, ai, rule, tts}。PDF 抽出的标 pdf(可溯源),AI 补的标 ai,注音标 rule,音频标 tts。卡片本身保持干净不堆标记,溯源信息放在「索引文件 + 数据层 JSON」,你随时能查「这张卡的释义是 PDF 原文还是 AI 补的」。
5. 快速反馈 ID 机制(核心)
5.1 ID 设计
- 格式:
L{课号2位}-{圆数}-{序号3位} - 例:
L01-A3-012(第 1 课三圆第 12 词)、L16-A1-030(第 16 课一圆第 30 词) - 特点:稳定(基于 课号+圆数+PDF 内出现顺序,不随重生成变化)、可读、唯一
5.2 三层数据架构(ID 稳定性的根基)
flowchart LR
A["PDF 源文件<br/>(权威·不可编辑·溯源)"] -->|"pypdf 提取"| B["词汇数据.json<br/>(主数据·可编辑<br/>含 CardId+全字段+src标记+页码)"] -->|"genanki 生成"| C["标日中级上_词汇.apkg<br/>(产物·可重生成)"]
U["你发 ID+问题"] -->|"定位"| B
B -->|"改完重新生成"| C- PDF:溯源根基,不动
- 词汇数据.json:主数据,ID 是主键,所有字段含
src标记 + 溯源坐标(PDF文件名+页码) - .apkg:由 JSON 生成,可无限重生成
5.3 反馈流程
- 卡片背面底部显示
📋 L01-A3-012,你直接复制 - 发消息:
L01-A3-012 释义应该是「上,登」不是「上,升」 - 我读 JSON 定位 → 改该条 → 重新生成 .apkg → 你重新导入(同 ID,Anki 自动更新该卡)
- 同时维护
卡片索引.tsv(ID / 课 / 圆 / 词 / 假名 / 释义 / 例句 / 翻译 / src / 页码),我 grep 秒定位
5.4 反馈约定(写入 README)
- 反馈格式:
<ID> <问题类型> <具体内容>,问题类型 ∈ {释义, 例句, 翻译, 词性, 声调, 关联词, 注音, 音频, 其他} - 例:
L03-A2-005 释义 应该是「商量」不是「会议」
6. 交付物清单
放 标日中级上/Anki牌组/:
| 文件 | 作用 |
|---|---|
00_PLAN.md | 本方案 |
01_RULE.md | 生成规范(字段/注音/音频/反馈的具体规则) |
词汇数据.json | 主数据(1612 条,含 CardId + src + 溯源坐标;例句已拆分 SentKanji1-4 等独立字段) |
卡片索引.tsv | 快速反馈索引(ID → 词 → 溯源) |
音频/ | 单词 + 每句例句独立音频({CardId}.mp3 / {CardId}_ex1~4.mp3) |
config.local.json | 本地凭证(TTS API Key 等,不进 git) |
标日中级上_词汇.apkg | 最终牌组(Anki 导入) |
生成Anki.py | 生成脚本(PDF→JSON→apkg 一键) |
生成音频.py | Azure TTS 批量合成脚本(单词+按句例句音频,断点续传) |
reference/ | github 卡片模板源码本地留存(4 个 HTML + 1 个 CSS,版式对齐依据) |
README.md | 用法 + 反馈约定 + 已知限制 |
7. 执行步骤(分阶段,不一次性做完)
你说「不用一次性生成,工作量小一点」,所以拆成 6 个 Phase,每阶段独立交付、可中途 review。
| Phase | 做什么 | 产出 | 依赖 | 状态 |
|---|---|---|---|---|
| P1 | PDF → 结构化数据 | 词汇数据.json(1612 条,含 CardId + src + 页码) | 无 | ✅ 已完成 |
| P1.5 | 卡片版式重构(对齐 github 实测截图) | 例句字段拆分(SentKanji1-4 等)+ 新模板(正面无假名、背面逐句展开+高亮) | P1 | ✅ 已完成 |
| P2 | AI 补齐缺失字段(1168 词缺例句 + 全部例句翻译) | 更新 词汇数据.json | P1.5 | ✅ 已完成 |
| P3 | 例句振假名注音(C 模式词级 + 目标词高亮) | 更新 词汇数据.json(SentFurigana1-4) | P2 | ✅ 已完成 |
| P4 | 音频合成(TTS,单词 + 例句) | 音频/{CardId}.mp3 + {CardId}_ex1~4.mp3 | P2 | ✅ 已完成(6470 段 = 单词 1612 + 例句 4858) |
| P5 | 生成牌组 + 抽查校对 | 标日中级上_词汇.apkg | P1.5–P4 | ✅ 已完成(159.9MB / 1612 卡 / 音频审计 6470/6470) |
| P6 | README + 交付 | README.md | P5 | ✅ 已完成 |
- P1 已完成:脚本已解析 1612 词,CardId/src/page 已落地 JSON。
- P1.5 版式重构:因用户实拍截图核对发现例句应逐句独立展示(非合并成一段),已重构数据结构 + 模板,本次任务重点。
- P2 是接下来最大的一块重活(决定卡片"例句丰富度"),做完后 P3/P4 才能产出完整效果。
- 每完成一个 Phase 停下来给你看产出,确认后再进下一个。
8. 最终决定(已拍板)
| # | 决策 | 结论 | 说明 |
|---|---|---|---|
| 1 | 音频 | ✅ 要(TTS 合成) | 单词 + 例句都要;引擎三选一见 §9、§11 |
| 2 | 例句注假名 | ✅ 要 | 只对「常用漢字表外」汉字注音,见 §10 |
| 3 | 词性体系 | 保留标日(动1/动2/动3) | 与 github [他動1] 完全对应 |
| 4 | 范围 | 只三圆词汇表 | 考研高频词后续可加(约 +900 词) |
| 5 | 音调正面 | 默认隐藏 | 可一键开启 |
9. 音频方案(单词 + 例句,TTS 合成)
github 是「单词真人录音 + 例句 VOICEPEAK 合成」。我们没有真人录音,全部走 TTS 合成。
| 项 | 做法 | 状态 |
|---|---|---|
| 单词音频 | TTS 读「假名读音」(保证发音准,非读汉字),输出 音频/{CardId}.mp3 | ✅ 已生成 1612 段 |
| 例句音频 | TTS 读每句例句原文,按句独立输出(非合并) 音频/{CardId}_ex1.mp3~_ex4.mp3 | ✅ 4858 句全部合成(v2 重跑,断点续传) |
| 音频命名 | {CardId}.mp3(单词)/ {CardId}_ex{N}.mp3(第 N 句例句,N=1~4) | 已更新(原合并版 _ex.mp3 作废) |
| 关联到卡片 | Anki 音频字段指向文件名,导入时随 apkg 一起打包;已知坑:Anki 双击导入偶发只写笔记不写媒体文件,需要时可绕过导入直接解压 apkg 的 media 映射写入 collection.media/(见 01_RULE.md) | 已验证可行 |
| 音质 | Azure TTS(已用,ja-JP-NanamiNeural) | ✅ |
引擎(已定 ✅):Azure TTS(github 同款音色体系)。endpoint=eastasia.tts.speech.microsoft.com,格式 audio-24khz-48kbitrate-mono-mp3。
10. 例句振假名注音规则
对齐 github:例句全注音(词级)。github 数据实拍显示例句里每个汉字词都注音(妹[いもうと]は高校[こうこう]に通[かよ]っています),注音粒度是词级(出会[であ],而非逐字 出[で]会[あ])。
| 项 | 规则 | 状态 |
|---|---|---|
| 注音范围 | 例句里所有汉字词全注音(对齐 github SentFurigana);片假名词/纯假名词不注 | ✅ 已实现 |
| 注音粒度 | 词级:Sudachi C 模式(最长单位)分词,复合词整词注音 出会[であ]、高校[こうこう]、受け取る[うけとる] | ✅ 已实现(2026-09-07 用户要求从 A 模式改 C 模式) |
| 送假名剥离 | 上る → 上[のぼ]る(汉字注音,送假名假名保留在外面) | ✅ 已实现 |
| 技术实现 | sudachi 形态素分析(C 模式)→ 取读音 → 送假名剥离 → 生成 漢字[かな] | ✅ 已实现 |
| 词间分隔 | 注音字段内词间加空格(Anki <span class="mb-box">作答区</span> 靠空格阻断,防止「假名+汉字」被错误合并注音),渲染后由模板 JS removeSpaces 删除 | ✅ 已实现 |
| Anki 格式 | 字段内写 漢字[かな](SentFurigana1-4),模板用 <span class="mb-box">作答区</span> filter 原生渲染振假名(带 <rb>,对齐 github) | ✅ 已实现 |
| 目标词高亮 | 数据预标注:注音时若 token 汉字序列 == 目标词汉字序列(覆盖活用形,如 出会い→出会った),该 token 注音包 <strong> 橙色高亮(对齐 github 数据里的 <b> 预标注) | ✅ 已实现(v2 例句:4232/4858 句命中,87.1%) |
| 片假名词 | 不注音(本来就是音) | ✅ 已实现 |
| 例句翻译 | 每条例句配一句中文翻译(SentDef1-4,每句独立) | ✅ P2 已完成 |
11. 音频——Azure Key 已提供并验证 ✅
状态:已完成,本节仅留存记录。 用户已提供 Azure Speech 服务 Key + Region(eastasia),已写入 config.local.json(不进 git)。已实测 HTTP 200 合成成功,单词音频 1612 段已全部生成完毕。例句音频待 P2 补完例句内容后,按新的按句拆分字段重新合成(_ex1~4.mp3)。
<details> <summary>历史记录:Key 获取方式(已完成,折叠保留)</summary>
| 项 | 值 | 说明 |
|---|---|---|
| API Key | Azure 语音服务密钥(Key 1 或 Key 2 任一) | 32 位十六进制串 |
| Region | 资源所在区域,如 eastasia / japaneast | 决定 API 域名 |
怎么获取(约 5 分钟):
- 登录 Azure Portal(无账号先注册;免费层也需绑卡验证一次,不会扣费)
- 顶部搜索「语音服务」(Speech service),点「创建」
- 定价层选 F0(免费),区域选
japaneast或eastasia,创建 - 进资源页 →「密钥和终结点」→ 复制 Key 1 和 区域(Location)
</details>