き ききはじめ日本語ききはじめ

标日中级上

标日中级上 → 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. 可行性验证结果(已完成,非空谈)

#验证点结论证据
1PDF 源文件定位✅ 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)
5genanki 生成 .apkg✅ 已装、可用隔离 venv 内 genanki 安装成功
6乱码中文⚠️ 部分拓展/释义中文乱码集中在老师中文补充,日语部分干净;对策见 §1 下表

发现的风险与对策:

风险表现对策
拓展列中文乱码→ 干す:&'()*+ 这类只保留日语关联词,乱码中文丢弃(对齐 github「关联词」字段本就只要词条+读音)
个别 PDF 字体错误なみだ(涙)①【①】 应为 【名】生成后做一次「词性/释义抽查」,异常项列清单人工校对
多词联合行国際連合/国連 挤一行拆成 2 张卡(主词 + 缩写词)
页内圆数过渡无文字标记第 1 课 P3 中部三圆→二圆空行段(≥3)启发式切分,已验证准确

2. 数据源与溯源(PDF 直接,不靠 md)

  • 源:三圆词汇表.pdf(每课 1 个,8 页,按圆数分 3 段)
  • 提取:pypdf 文本直抽(核心字段无乱码)
  • 圆数:页眉 【第N课 ⭕⭕⭕】/⭕⭕/⭕ = 三圆/二圆/一圆(= A3/A2/A1)
  • 16 课实测词数:
课总数A3A2A1课总数A3A2A1
0113634723009105454614
028249330109035505
0312221693211119465716
041053458131283333614
05118436213138533466
06120436413148127468
0710234581015100264430
08963945121668233411

合计 1612 词(A3=565 / A2=820 / A1=227)


3. 卡片格式对齐 github(5mdld/anki-jlpt-decks)

⚠️ 三次核对结论(README → 模板源码 → 实拍截图,逐级加深):

  1. README 只是使用说明书,不公开数据格式;
  2. 2026-09-07 已用 GitHub API 下载 deck-source/templates/ 全部 4 个卡片模板 HTML + CSS(存于本地 reference/),逐行读过,字段名/结构 100% 来自源码而非猜测;
  3. 用户直接甩了实拍截图(正面+背面)核对视觉,发现关键差异:正面完全不显示假名(只显示汉字见出し语 + 例句原文,无翻译无音频);背面例句是逐句独立展开(每句自己的假名/目标词高亮/翻译/播放按钮),而不是我们最初「所有例句合并成一段文字」的做法。已按此重构数据结构,见 §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 見出し語VocabKanjiPDF✅ 已有
Kana 読みVocabFuriganaPDF✅ 已有(只在背面显示,正面恒定隐藏)
Pitch 音调VocabPitchPDF✅ 已有(默认正面隐藏,背面显示)
Pos 词性VocabPoSPDF✅ 已有(保留标日体系)
Def 释义VocabDefSC/TCPDF + AI补⚠️ 1168 词无例句连带缺高质量释义场景需补
Note 关联词(関/対)VocabPlusPDF✅ A3 拓展(派生词/辨析)
Audio 单词音频背面词旁播放TTS✅ 已生成(1612 段)
SentKanji1-4 例句原文(每句独立)SentKanji1-4PDF + AI补✅ 已拆分独立字段;v2 每卡统一扩至 ≥3 句(PDF 原例句保留,不足 AI 补)
SentFurigana1-4 例句注音(每句独立)SentFurigana1-4规则(sudachi)✅ 4858 句全部词级注音(C 模式)
SentDef1-4 例句翻译(每句独立)SentDefSC/TC1-4AI补✅ 4858 句全部配中文翻译
SentAudio1-4 例句音频(每句独立)SentAudio1-4TTS✅ 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 也都有释义)AIai✅
缺失例句1168 词(A3 缺 123 / A2 缺 818 / A1 缺 227)AIai✅ P2 补齐;v2 再统一扩至每卡 ≥3 句(PDF 例句优先保留)
全部词的例句中文翻译约 1612 词 × 每句一条(SentDef1-4)AIai✅
例句振假名注音约 1612 词 × 每句一条(SentFurigana1-4)规则(sudachi + 常用漢字表过滤)rule✅ C 模式词级
单词音频1612 词TTStts✅ 已生成
例句音频每句独立音频 SentAudio1-4(原合并版 _ex.mp3 作废)TTStts✅ 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 稳定性的根基)

Mermaid 图站内不渲染
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 反馈流程

  1. 卡片背面底部显示 📋 L01-A3-012,你直接复制
  2. 发消息:L01-A3-012 释义应该是「上,登」不是「上,升」
  3. 我读 JSON 定位 → 改该条 → 重新生成 .apkg → 你重新导入(同 ID,Anki 自动更新该卡)
  4. 同时维护 卡片索引.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 一键)
生成音频.pyAzure TTS 批量合成脚本(单词+按句例句音频,断点续传)
reference/github 卡片模板源码本地留存(4 个 HTML + 1 个 CSS,版式对齐依据)
README.md用法 + 反馈约定 + 已知限制

7. 执行步骤(分阶段,不一次性做完)

你说「不用一次性生成,工作量小一点」,所以拆成 6 个 Phase,每阶段独立交付、可中途 review。

Phase做什么产出依赖状态
P1PDF → 结构化数据词汇数据.json(1612 条,含 CardId + src + 页码)无✅ 已完成
P1.5卡片版式重构(对齐 github 实测截图)例句字段拆分(SentKanji1-4 等)+ 新模板(正面无假名、背面逐句展开+高亮)P1✅ 已完成
P2AI 补齐缺失字段(1168 词缺例句 + 全部例句翻译)更新 词汇数据.jsonP1.5✅ 已完成
P3例句振假名注音(C 模式词级 + 目标词高亮)更新 词汇数据.json(SentFurigana1-4)P2✅ 已完成
P4音频合成(TTS,单词 + 例句)音频/{CardId}.mp3 + {CardId}_ex1~4.mp3P2✅ 已完成(6470 段 = 单词 1612 + 例句 4858)
P5生成牌组 + 抽查校对标日中级上_词汇.apkgP1.5–P4✅ 已完成(159.9MB / 1612 卡 / 音频审计 6470/6470)
P6README + 交付README.mdP5✅ 已完成
  • 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 KeyAzure 语音服务密钥(Key 1 或 Key 2 任一)32 位十六进制串
Region资源所在区域,如 eastasia / japaneast决定 API 域名

怎么获取(约 5 分钟):

  1. 登录 Azure Portal(无账号先注册;免费层也需绑卡验证一次,不会扣费)
  2. 顶部搜索「语音服务」(Speech service),点「创建」
  3. 定价层选 F0(免费),区域选 japaneast 或 eastasia,创建
  4. 进资源页 →「密钥和终结点」→ 复制 Key 1 和 区域(Location)

</details>