第一阶段课程

发布于 2026/6/4

rl-starter 全量课程规划(VOA English with MP3 + LRC)

1. 目标与范围

  • 课程ID:rl-starter
  • 学段:英语入门 A1-A2
  • 总课时规划:24课(每课 6-10 分钟)
  • 每课必须具备:

- 可播放 mp3(可长期访问)
- 对齐 lrc(句级时间戳)
- 课文 sentences 与音频朗读文本逐句一致

2. 上线原则(保证可用)

  • 原则1:未完成 mp3 + lrc + 文本三方一致校验的课,不上线。
  • 原则2:有片头声明的音频,必须处理到“首句即对齐”。
  • 原则3:课程数据只引用可回放、可缓存、可跨端访问的地址。

3. 资源结构规范

3.1 文件路径

  • 课文数据:/src/static/data/lessons/starter/group1.js
  • lrc:/src/static/data/aesop/lrc/lesson-xxx-slug.lrc
  • 推荐本地mp3:/src/static/data/aesop/mp3/lesson-xxx-slug.mp3

3.2 数据字段规范

  • audioSrc:优先本地静态 mp3;过渡期可用 archive.org 直链
  • lrcSrc:固定使用 /static/data/aesop/lrc/lesson-xxx-slug.lrc
  • sentences:作为 lrc 失败时兜底显示,且必须与 lrc 文本一致

4. 音频对齐策略(解决“前面有声音导致错位”)

4.1 统一方案(推荐)

  • 对每课音频做一次片头裁剪,输出 clean mp3。
  • 裁剪后保证第1句在 00:00.00-00:01.00 内开始。
  • lrc 从正文首句开始,不再被片头声明干扰。

4.2 过渡方案(不裁剪)

  • 保留原始 mp3,lrc 首句整体后移到正文实际起点。
  • 缺点:不同音频片头长度不一致,维护成本高。

5. 全 VOA 路线蓝图(对标新概念 1/2/3/4)

5.0 为什么全部用 VOA

  • 许可干净:VOA Learning English 是美国联邦政府作品,全部进入公共领域,可下载 / 裁剪 / 重发布 / 商用,零版权风险。
  • 资源完整:每一集都有真人 mp3 + 完整脈络脚本 + 双语字幕,刚好套项目 mp3 + lrc 结构。
  • CEFR 梯度连续:VOA 内部有皆太梯度从 A1(Let's Learn English L1)一路走到 B2(VOA News)再到 C1(American Stories / VOA Standard English),足以支撑新概念 1―4 的完整学习路径。
  • 不需另外接 OpenStax / ELLLO:OpenStax 所在的学术阈值超出语言课本型能力;ELLLO 虽质量高但许可不允许重发布,不适合打包到 H5 静态资源。全线 VOA 是唯一能同时满足「随便用 + 足水平 + 有音频 + 有脳本」的选择。

5.1 四本书总体架构(类比新概念 1/2/3/4)

本项目 Book对标CEFR主资源(VOA 栏目)课文形态课时长度总课数
rl-book-1新概念 1A1–A2Let's Learn English Level 1(52 集)生活情景剧 / 示范对话5–7 分钟36
rl-book-2新概念 2A2–B1Let's Learn English Level 2(30 集) + Everyday Grammar TV情景剧 + 语法小课5–8 分钟36
rl-book-3新概念 3B1–B2People in America + Education Tips + Words and Their Stories人物传记 / 主题短文3–5 分钟48
rl-book-4新概念 4B2–C1American Stories + VOA Learning English News(1500 词表限定)文学改写 / 新闻长文5–10 分钟48

所有 4 本书共享同一套 lesson 数据结构(sentences / lrc / mp3 / knowledgePoints / quiz),仅是选择的 VOA 栏目不同。

资源主页:

  • Let's Learn English L1: https://learningenglish.voanews.com/p/5644.html
  • Let's Learn English L2: https://learningenglish.voanews.com/p/5828.html
  • People in America: https://learningenglish.voanews.com/z/3613
  • American Stories: https://learningenglish.voanews.com/z/3615
  • VOA Learning English News: https://learningenglish.voanews.com/z/3603
  • Everyday Grammar TV: https://learningenglish.voanews.com/z/4729

5.2 rl-book-1 (= NCE 1) 完整 36 课

从 Let's Learn English Level 1 选 36 集(原 52 集 → 去重 / 合并复习集),按 NCE 1 的语法递进重排序。每 6 课为一个单元,共 6 单元。

#lessonIdVOA主题语法点
单元 1 问候与介绍
001rl-b1-001L1.E1 Welcome初次见面I am / pronouns
002rl-b1-002L1.E2 Hello, I'm Anna!自我介绍This is / my name is
003rl-b1-003L1.E3 I'm Here!位置表达here / there / be 动词
004rl-b1-004L1.E4 Hello! Goodbye!告别see you / nice to meet you
005rl-b1-005L1.E5 Where Is the Bathroom?问路Where is...?
006rl-b1-006L1.E7 What Is It?物品识别It is a / What is...?
单元 2 个人与家庭
007rl-b1-007L1.E8 Are You Busy?yes/no 问句Are you...?
008rl-b1-008L1.E11 This Is My Neighborhood社区there is / there are
009rl-b1-009L1.E12 Meet My Family家庭my/your/his/her
010rl-b1-010L1.E14 I Love People-watching记叙现在be + V-ing
011rl-b1-011L1.E15 I Want to Speak English愿望want + to do
012rl-b1-012L1.E16 How Many?数量How many + 复数
单元 3 日常生活
013rl-b1-013L1.E18 What Do You Want?Wh- 问句What do you...?
014rl-b1-014L1.E19 When Do You Work?时间at + 时间
015rl-b1-015L1.E20 What Can You Do?能力can / can't
016rl-b1-016L1.E21 Can You Come to the Party?邀约can 请求
017rl-b1-017L1.E22 Next Summer将来will / be going to
018rl-b1-018L1.E23 What Do You Like to Do?爱好like + V-ing
单元 4 过去与经历
019rl-b1-019L1.E24 Yesterday Was Amazing!过去时was / were
020rl-b1-020L1.E25 I'm Going to Be a Star!计划be going to
021rl-b1-021L1.E27 Pizza, Pasta, and Music爱好like + V-ing 巩固
022rl-b1-022L1.E28 I Passed It!规则动词过去-ed
023rl-b1-023L1.E29 A Long Time Ago故事叙述不规则动词
024rl-b1-024L1.E31 He Lives in the City三单-s/-es
单元 5 场景与交际
025rl-b1-025L1.E33 Watching Sports体育现在进行
026rl-b1-026L1.E35 What Are You Doing?进行时问答What are you doing?
027rl-b1-027L1.E37 This Land Is Your Land比较bigger / better
028rl-b1-028L1.E39 This Game Is Hard!形容词too / very
029rl-b1-029L1.E41 You're Welcome!礼貌thank / please
030rl-b1-030L1.E43 Made in America被动初体be made in
单元 6 综合输出
031rl-b1-031L1.E45 Help Wanted工作would you mind
032rl-b1-032L1.E46 I'm Not Sure表达不确定I'm not sure if
033rl-b1-033L1.E48 What Do You Suggest?建议should / had better
034rl-b1-034L1.E50 Where Can I Buy...?购物Where can I + V
035rl-b1-035L1.E51 We Have to Save Pete!情态have to / must
036rl-b1-036L1.E52 A Hero of Two Worlds毕业复述综合

5.3 rl-book-2 (= NCE 2) 课程框架

以 Let's Learn English Level 2 为主线(原 30 集),每集拆为 1 课,加 6 课 Everyday Grammar TV 作为语法专项,共 36 课(6 单元)。

单元课次主轴VOA 来源
U1 学习与习惯001–006L2.E1–E5 + Grammar: Present Tenses学习方法 / 习惯
U2 工作与职场007–012L2.E6–E10 + Grammar: Modals面试 / 同事
U3 旅行与交通013–018L2.E11–E15 + Grammar: Prepositions实用旅行
U4 健康与饮食019–024L2.E16–E20 + Grammar: Quantifiers医院 / 餐厅
U5 人际与情感025–030L2.E21–E25 + Grammar: Conditionals友谊 / 冲突解决
U6 社会与文化031–036L2.E26–E30 + Grammar: Reported Speech社会热点

课文路径约定:/static/data/book2/mp3/UNN-LNN-slug.mp3,/static/data/book2/lrc/UNN-LNN-slug.lrc。

5.4 rl-book-3 (= NCE 3) 课程框架

B1–B2 跳跳板。指定人物传记、主题专题、语言背后的文化故事。

单元课次主轴VOA 来源
U1 历史人物001–012People in America(林肯 / 金 / 爱因斯坦等)12 位传记叙事
U2 科技与发明013–024Education Tips + Science in the News 选 12 篇说明文
U3 语言与习语025–036Words and Their Stories(习语背后的文化)12 篇词汇故事
U4 社会与生活037–048Health & Lifestyle + Agriculture Report 12 篇主题论述

5.5 rl-book-4 (= NCE 4) 课程框架

B2–C1。文学改写 + 新闻长文,开始从「听懂」走向「靠语言思考」。

单元课次主轴VOA 来源
U1 美国短篇小说001–016American Stories(欧亨利 / 马克吐温 / 爱伦坡 改写)文学
U2 中级新闻017–032VOA Learning English News(1500 词限定)时事
U3 专题报道033–040Health Report + Science Report 长篇说明
U4 论述与评论041–048Editorials + As It Is 选篇论证

5.6 资产目录约定

static/data/
  book1/mp3/UNN-LNN-slug.mp3
  book1/lrc/UNN-LNN-slug.lrc
  book2/...
  book3/...
  book4/...
  • 文件名中 UNN = 单元号(2 位),LNN = 单元内课号(2 位),例:01-03-im-here.mp3。
  • 原始 mp3 保持 VOA 原名放在 _raw/ 文件夹,不交付上线;发布版需裁剪片头片尾。
  • 每课需带一份 source.json:{ src_url, fetched_at, license: "public-domain", attribution: "Voice of America Learning English" }。

5.7 已上线 Aesop 两课的处理

保留作为「额外经典故事」,迁移到 rl-book-3 的附录单元(U5 Extra Stories),不占用主线课号。

5.8 为什么这个方案会赢

  • 一个资源来源 = 一载风格一致:学习者的耳朵从入门到 C1 一直听 VOA 语速与口音,适应曲线最平滑。
  • 零版权风险:公共领域,可打包进 /static/,可商用。
  • 路径可预测:4 本书同构,后续废弃 / 增补某本不影响其他。
  • 对标新概念:每本书都有明确的 CEFR 级别、词汇量、句型范围,能直接告诉用户「你现在是新概念 X 水平」。

<!-- 以下为旧的 OpenStax 分层与 6 阶段 / 24 课蓝图,已被本节替代,保留供历史回溯

旧版 5.0 关于 OpenStax 的诚实评估

OpenStax 本质是面向英语母语大学生的开源教材(写作、心理学、生物、历史等),它不是 ESL 课本,不含 A1-A2 入门级别内容,也没有为零基础学习者配套的对话音频。

直接拿 OpenStax 替代「新概念」做入门课不合适:

  • 词汇量:OpenStax 起步即 8000+ 词族,远超 A1-A2(~1500 词)。
  • 句长:平均句长 18-25 词,含从句、被动、学术词汇。
  • 体裁:说明文 / 议论文 / 学术叙述,缺乏口语对话。
  • 音频:OpenStax 大部分书无官方朗读音频。

正确用法:把 OpenStax 放到中高级阅读训练层,入门段用更合适的开源 ESL 资源(VOA Learning English)。rl-starter 演化成「开源英语全梯度路径」的入门书。

5.1 分层课程地图(4 本书,rl-starter 仅是入门书)

Book层级主资源CEFR音频许可
rl-starter入门VOA Let's Learn English Level 1A1-A2VOA 官方真人 mp3 + 字幕美国政府作品,公共领域
rl-reader初阶阅读LibriVox 简易故事 + Gutenberg 简写本B1LibriVox mp3CC0 / PD
rl-voa-news时事英语VOA Learning English News(限 1500 词)B1-B2VOA 官方 mp3 + 文本公共领域
rl-openstax学术英语OpenStax 精选教材精读B2-C1项目 Edge TTS 生成CC BY 4.0

本文档后面只详细规划 rl-starterrl-openstax 两本书;rl-reader 与 rl-voa-news 复用同一套资源规范。

5.2 rl-starter(A1-A2)24 课 —— 基于 VOA Let's Learn English

VOA Learning English《Let's Learn English》Level 1 共 52 集,每集 5-7 分钟,官方提供 mp3 + 完整脚本 + 双语字幕,专为 ESL 零基础设计。从中精选 24 集做本课程。

  • 资源主页:https://learningenglish.voanews.com/p/5644.html
  • 许可:美国政府作品,公共领域,可商用、可裁剪、可二次发布
#lessonIdVOA 集标题教学目标mp3lrc
001rl-starter-001L1.E1Welcome问候 / I am.../static/data/starter/mp3/001-welcome.mp3/static/data/starter/lrc/001-welcome.lrc
002rl-starter-002L1.E2Hello, I'm Anna!自我介绍 / This is.../static/data/starter/mp3/002-im-anna.mp3/static/data/starter/lrc/002-im-anna.lrc
003rl-starter-003L1.E3I'm Here!位置 / here, there/static/data/starter/mp3/003-im-here.mp3/static/data/starter/lrc/003-im-here.lrc
004rl-starter-004L1.E4Hello! Goodbye!告别 / see you later/static/data/starter/mp3/004-hello-goodbye.mp3/static/data/starter/lrc/004-hello-goodbye.lrc
005rl-starter-005L1.E5Where Is the Bathroom?问路 / Where is the...?/static/data/starter/mp3/005-where-bathroom.mp3/static/data/starter/lrc/005-where-bathroom.lrc
006rl-starter-006L1.E7What Is It?物品识别 / It is a.../static/data/starter/mp3/006-what-is-it.mp3/static/data/starter/lrc/006-what-is-it.lrc
007rl-starter-007L1.E8Are You Busy?yes/no 问句 / Are you...?/static/data/starter/mp3/007-are-you-busy.mp3/static/data/starter/lrc/007-are-you-busy.lrc
008rl-starter-008L1.E10Stage 1 复习be 动词 / 自我介绍 / 问路整合/static/data/starter/mp3/008-review-1.mp3/static/data/starter/lrc/008-review-1.lrc
009rl-starter-009L1.E11This Is My Neighborhoodthere is / there are/static/data/starter/mp3/009-neighborhood.mp3/static/data/starter/lrc/009-neighborhood.lrc
010rl-starter-010L1.E12Meet My Familymy / your / his / her/static/data/starter/mp3/010-family.mp3/static/data/starter/lrc/010-family.lrc
011rl-starter-011L1.E14I Love People-watching现在进行时 be + V-ing/static/data/starter/mp3/011-people-watching.mp3/static/data/starter/lrc/011-people-watching.lrc
012rl-starter-012L1.E15I Want to Speak Englishwant + to do / would like/static/data/starter/mp3/012-want-speak.mp3/static/data/starter/lrc/012-want-speak.lrc
013rl-starter-013L1.E18What Do You Want?Wh- 问句/static/data/starter/mp3/013-what-do-you-want.mp3/static/data/starter/lrc/013-what-do-you-want.lrc
014rl-starter-014L1.E19When Do You Work?时间表达 / at + 时间/static/data/starter/mp3/014-when-work.mp3/static/data/starter/lrc/014-when-work.lrc
015rl-starter-015L1.E20What Can You Do?can / can't/static/data/starter/mp3/015-what-can-you-do.mp3/static/data/starter/lrc/015-what-can-you-do.lrc
016rl-starter-016L1.E21Can You Come to the Party?can 邀约 / 复习/static/data/starter/mp3/016-come-to-party.mp3/static/data/starter/lrc/016-come-to-party.lrc
017rl-starter-017L1.E24Yesterday Was Amazing!一般过去时 was/were/static/data/starter/mp3/017-yesterday.mp3/static/data/starter/lrc/017-yesterday.lrc
018rl-starter-018L1.E25I'm Going to Be a Star!be going to 将来计划/static/data/starter/mp3/018-going-to-star.mp3/static/data/starter/lrc/018-going-to-star.lrc
019rl-starter-019L1.E27Pizza, Pasta, and Musiclike + V-ing/static/data/starter/mp3/019-pizza-pasta.mp3/static/data/starter/lrc/019-pizza-pasta.lrc
020rl-starter-020L1.E29A Long Time Ago过去时叙述/static/data/starter/mp3/020-long-time-ago.mp3/static/data/starter/lrc/020-long-time-ago.lrc
021rl-starter-021L1.E33Watching Sports现在进行时 / 体育词汇/static/data/starter/mp3/021-watching-sports.mp3/static/data/starter/lrc/021-watching-sports.lrc
022rl-starter-022L1.E37This Land Is Your Land比较级 bigger / better/static/data/starter/mp3/022-this-land.mp3/static/data/starter/lrc/022-this-land.lrc
023rl-starter-023L1.E45Help Wanted工作场景 / would you mind/static/data/starter/mp3/023-help-wanted.mp3/static/data/starter/lrc/023-help-wanted.lrc
024rl-starter-024L1.E52A Hero of Two Worlds综合复述 / 长段听力 / 结课/static/data/starter/mp3/024-hero-two-worlds.mp3/static/data/starter/lrc/024-hero-two-worlds.lrc

已上线两课(Aesop)的处理:保留原 lesson 1-2 作为额外「故事拓展课」迁移到 rl-reader 书内;rl-starter 改以 VOA 24 课为主线,让入门书更聚焦、更循序渐进。

5.3 rl-openstax(B2-C1)—— OpenStax 精读

OpenStax 在体系中是「学术英语 + 精读」层。每本教材选 6-8 章精读。

Unit教材推荐章节学习目标
U1 学术写作Writing Guide with HandbookCh1 The Digital World / Ch2 Language, Identity, and Culture学术写作框架、论证结构
U2 心理学英语Psychology 2eCh1 Introduction to Psychology / Ch3 Biopsychology学科术语 + 定义句式
U3 美国历史U.S. HistoryCh3 Creating New Social Orders / Ch6 War for Independence历史叙述 + 时间链
U4 商业入门Introduction to BusinessCh1 Economic Systems / Ch5 Business Ownership商务词汇 + 数据表达
U5 学习策略College Success ConciseCh4 Thinking / Ch5 Reading and Notetaking元认知 + 学术学习方法

资源准备:

  • 文本:OpenStax 官方下载(CC BY 4.0,需注明出处)
  • 音频:无官方朗读 → 使用项目内置 Edge TTS 生成 + 句级时间戳生成 LRC
  • 路径:/static/data/openstax/mp3/, /static/data/openstax/lrc/
  • 标注:每课页脚显示 Adapted from OpenStax (CC BY 4.0) + 原书链接

5.4 为什么这套方案更好

  • 诚实:OpenStax 不假装能教 A1-A2,避免学习者被劝退
  • 全程开源:VOA + LibriVox + OpenStax 全部 PD 或 CC BY,零版权风险
  • 真人音频优先:入门段全部真人朗读(VOA),不依赖 TTS
  • 可扩展:4 本书共享同一套 mp3 / lrc / sentences 结构
  • 路径清晰:rl-starter → rl-reader → rl-voa-news → rl-openstax,对应 A1 到 C1

附录 A. 旧 6 阶段表

附录 B. 旧 24 课落地清单

#lessonIdlessonTypetitlemp3_locallrcstatus
001rl-starter-001storyThe Lion and the Mouse/static/data/aesop/mp3/lesson-001-lion-mouse.mp3/static/data/aesop/lrc/lesson-001-lion-mouse.lrc已上线(需裁剪修正)
002rl-starter-002storyThe Hare and the Tortoise/static/data/aesop/mp3/lesson-002-hare-tortoise.mp3/static/data/aesop/lrc/lesson-002-hare-tortoise.lrc已上线(需裁剪修正)
003rl-starter-003dialogHello, I am.../static/data/starter-core/mp3/lesson-003-intro.mp3/static/data/starter-core/lrc/lesson-003-intro.lrc待制作
004rl-starter-004drillBe Verbs and Pronouns Review/static/data/starter-core/mp3/lesson-004-be-review.mp3/static/data/starter-core/lrc/lesson-004-be-review.lrc待制作
005rl-starter-005dialogAt a Grocery Store/static/data/starter-core/mp3/lesson-005-grocery.mp3/static/data/starter-core/lrc/lesson-005-grocery.lrc待制作
006rl-starter-006dialogAt a Cafe/static/data/starter-core/mp3/lesson-006-cafe.mp3/static/data/starter-core/lrc/lesson-006-cafe.lrc待制作
007rl-starter-007dialogAsking for Directions/static/data/starter-core/mp3/lesson-007-directions.mp3/static/data/starter-core/lrc/lesson-007-directions.lrc待制作
008rl-starter-008drillStage 2 Mission Dialogue/static/data/starter-core/mp3/lesson-008-stage2-task.mp3/static/data/starter-core/lrc/lesson-008-stage2-task.lrc待制作
009rl-starter-009dialogMy Daily Routine/static/data/starter-core/mp3/lesson-009-routine.mp3/static/data/starter-core/lrc/lesson-009-routine.lrc待制作
010rl-starter-010dialogWhat are you doing now?/static/data/starter-core/mp3/lesson-010-progressive.mp3/static/data/starter-core/lrc/lesson-010-progressive.lrc待制作
011rl-starter-011storyThe Fox and the Grapes/static/data/aesop/mp3/lesson-011-fox-grapes.mp3/static/data/aesop/lrc/lesson-011-fox-grapes.lrc待制作
012rl-starter-012drillTime and Frequency Review/static/data/starter-core/mp3/lesson-012-time-frequency.mp3/static/data/starter-core/lrc/lesson-012-time-frequency.lrc待制作
013rl-starter-013storyThe Boy Who Cried Wolf/static/data/aesop/mp3/lesson-013-boy-cried-wolf.mp3/static/data/aesop/lrc/lesson-013-boy-cried-wolf.lrc待制作
014rl-starter-014dialogYesterday at School/static/data/starter-core/mp3/lesson-014-yesterday-school.mp3/static/data/starter-core/lrc/lesson-014-yesterday-school.lrc待制作
015rl-starter-015storyThe Ant and the Grasshopper/static/data/aesop/mp3/lesson-015-ant-grasshopper.mp3/static/data/aesop/lrc/lesson-015-ant-grasshopper.lrc待制作
016rl-starter-016drillPast Tense Consolidation/static/data/starter-core/mp3/lesson-016-past-review.mp3/static/data/starter-core/lrc/lesson-016-past-review.lrc待制作
017rl-starter-017dialogWeekend Plans/static/data/starter-core/mp3/lesson-017-weekend-plans.mp3/static/data/starter-core/lrc/lesson-017-weekend-plans.lrc待制作
018rl-starter-018dialogCan you help me?/static/data/starter-core/mp3/lesson-018-can-could.mp3/static/data/starter-core/lrc/lesson-018-can-could.lrc待制作
019rl-starter-019storyThe Wind and the Sun/static/data/aesop/mp3/lesson-019-wind-sun.mp3/static/data/aesop/lrc/lesson-019-wind-sun.lrc待制作
020rl-starter-020drillSuggestions and Advice/static/data/starter-core/mp3/lesson-020-suggestions.mp3/static/data/starter-core/lrc/lesson-020-suggestions.lrc待制作
021rl-starter-021storyThe Crow and the Pitcher/static/data/aesop/mp3/lesson-021-crow-pitcher.mp3/static/data/aesop/lrc/lesson-021-crow-pitcher.lrc待制作
022rl-starter-022dialogWhich one is better?/static/data/starter-core/mp3/lesson-022-comparison.mp3/static/data/starter-core/lrc/lesson-022-comparison.lrc待制作
023rl-starter-023taskIntegrated Speaking Task/static/data/starter-core/mp3/lesson-023-integrated-task.mp3/static/data/starter-core/lrc/lesson-023-integrated-task.lrc待制作
024rl-starter-024reviewFinal Shadowing and Retell......已废弃

-->

6. 当前两课修复动作(优先)

6.1 Lesson 001 修复

  • 问题:原始 mp3 有片头,当前 lrc 首句过早出现。
  • 动作:

- 重新测正文首句起点;
- 生成裁剪版 lesson-001-lion-mouse.mp3;
- lrc 首句调整为 00:00.00 对应正文第1句。

6.2 Lesson 002 修复

  • 问题:同样有片头导致句子提前。
  • 动作:同 Lesson 001。

7. 制作流程(每课固定 8 步)

  1. 锁定英文版本:V.S. Vernon Jones(Project Gutenberg #11339)。
  2. 锁定朗读源:LibriVox 对应章节音频。
  3. 下载原始 mp3,保留 src_mp3 记录。
  4. 裁剪片头片尾,导出 mp3_local。
  5. 按句切分课文,生成初版 lrc(句级)。
  6. 人工精调时间轴(目标误差 <= 300ms)。
  7. 在 H5 真机与浏览器各回归一次(播放、拖动、逐句点击)。
  8. 更新 group1.js 或后续组文件并验收后上线。

8. 可用性验收标准(DoD)

  • 播放后 1 秒内出现与朗读一致的第一句文本。
  • 任意抽检 10 句,lrc 高亮与人声误差不超过 300ms。
  • 拖动进度条后,高亮句可在 1 句内恢复同步。
  • 无 mp3 404、无 lrc 404、无跨域失败。
  • sentences、lrc、音频文本一致率 100%。

9. 分批交付计划(全 VOA 路线,对标 NCE 1→4)

  • 批次 A:rl-book-1 单元 1-2(001-012,问候/家庭,打通流程)
  • 批次 B:rl-book-1 单元 3-4(013-024,日常/过去)
  • 批次 C:rl-book-1 单元 5-6(025-036,场景/综合,完结 NCE 1 对标书)
  • 批次 D:rl-book-2 单元 1-3(001-018,进入 A2-B1)
  • 批次 E:rl-book-2 单元 4-6(019-036,完结 NCE 2 对标书)
  • 批次 F:rl-book-3 启动(People in America 12 课,B1-B2 入轨)
  • 批次 G:rl-book-3 续作 + rl-book-4 试点(American Stories 试 4 课)

每批次完成后,统一执行一次「音频与 lrc 对齐回归测试」。

每个批次完成后,统一执行一次“音频与lrc对齐回归测试”。

10. 实施备注

  • 当前线上可以继续使用 archive.org 直链作为过渡。
  • 为保证长期稳定与首句对齐体验,建议逐步切换到本地裁剪版 mp3。
  • 本文档作为 rl-starter 的唯一资产规划来源,后续新增课程按同模板扩展。

11. 管理后台 / 脚本化批量产出流程

目标:今后只要在 plan JSON 里填一行,运行一条命令,就能完成「mp3 下载 + 文稿抽取 + LRC 初稿生成」三件事;剩下只需补中文翻译 + 知识点 + 题目。

11.1 涉及文件

路径作用
backend-record-learn/scripts/voa/voa-fetch.js单课抓取脚本:VOA 页 HTML → mp3 + transcript JSON + LRC
backend-record-learn/scripts/voa/voa-build-from-plan.js批量驱动:读 plan.json,逐课调用 voa-fetch.js,输出 build-report.json
backend-record-learn/scripts/voa/plans/rl-book-1.jsonBook 1 课程计划(id / slug / voaUrl / 元信息)
frontend-record-learn/src/static/data/book1/mp3/产出:本地 mp3
frontend-record-learn/src/static/data/book1/transcript/产出:结构化 JSON(speaker + text)
frontend-record-learn/src/static/data/book1/lrc/产出:自动均匀对齐的 LRC(标 needs hand-tune
frontend-record-learn/src/static/data/lessons/book1/group1.js人工层:基于 transcript 补 cnText / knowledgePoints / quiz / grammar
frontend-record-learn/src/static/data/lessons/index.js注册:把 group1 拼进总 lessons
frontend-record-learn/src/static/data/subjects.js注册:在 books 数组中维护 rl-book-N 入口 + totalLessons

11.2 新增一课的标准 5 步

  1. 填表:在 plans/rl-book-N.jsonlessons 数组追加一行,必填字段:
   {
     "id": "rl-b1-003",          // 唯一 ID,rl-b<册号>-<3位顺序>
     "slug": "classmates",        // 文件名后缀,小写连字符
     "voaUrl": "https://learningenglish.voanews.com/a/.../xxx.html",
     "title": "Classmates",      // 课文标题
     "unit": "L1",                 // 可选:对标 NCE1 哪一单元/课
     "order": 3,                   // 可选:本册中的顺序
     "grammarFocus": "be 动词 + 复数"
   }
  1. 跑脚本(CN 开发环境默认走 PowerShell 后端绕过 DNS 污染):
   cd backend-record-learn
   node scripts/voa/voa-build-from-plan.js scripts/voa/plans/rl-book-1.json
   # 仅重跑一课
   node scripts/voa/voa-build-from-plan.js scripts/voa/plans/rl-book-1.json --only rl-b1-003
   # 覆盖已有产物
   node scripts/voa/voa-build-from-plan.js scripts/voa/plans/rl-book-1.json --force

成功后:frontend-record-learn/src/static/data/book1/{mp3,transcript,lrc}/rl-b1-003-classmates.* 三件套就位。

  1. 补中文层:打开 lessons/book1/group1.js,照前两课模板新增一段 lesson 对象——sentences[]text 直接抄 transcript JSON 的 lines,cnText 手填;同时补 translation 段落、3-6 条 knowledgePointsgrammar.pointsquizsummaryQAsource
  2. 注册数量:在 subjects.jsrl-book-1totalLessons 改成新的实际课数。
  3. 冒烟自测pnpm dev 打开 H5,在「英语 → Record Learn Book 1」中点开新课,确认:mp3 能播、LRC 高亮、CN 翻译/quiz 显示正常。LRC 自动对齐是均匀分布,必要时用 Audacity 微调首尾时间。

11.3 网络环境注意(CN 开发机)

  • 脚本默认 RL_HTTP_BACKEND='powershell'(Win32 自动启用),通过 powershell.exe -Command Invoke-WebRequest 走系统 WinHTTP 栈,规避 Node + UDP DNS 同时被污染的问题。
  • 域名 → IP 静态映射写在 voa-fetch.js 顶部 STATIC_HOST_MAP,目前覆盖:

- learningenglish.voanews.com → 168.143.162.42
- voa-audio.voanews.eu → 23.199.47.88
- gdb.voanews.com → 185.45.6.57

  • 如某天某域名 IP 漂移导致脚本失败,用 Cloudflare DNS 重新解析:
  Resolve-DnsName -Server 1.1.1.1 -Type A learningenglish.voanews.com

然后更新 STATIC_HOST_MAP,或临时通过环境变量覆盖:

  $env:RL_HOST_MAP = "learningenglish.voanews.com=新IP,voa-audio.voanews.eu=新IP"
  node scripts/voa/voa-build-from-plan.js scripts/voa/plans/rl-book-1.json --force
  • 若在海外/不墙环境下,可改用纯 Node 后端:$env:RL_HTTP_BACKEND='node'

11.4 未来可继续做的自动化(不阻塞当前 MVP)

  • transcript→lesson.js 骨架生成器:写一个 gen-lesson-skeleton.js,输入 transcript JSON,输出已经填好 sentences[].textknowledgePoints 候选词列表的 lesson.js 模板,人工只剩 cnText/解释/quiz。
  • GPT 辅助补 cnText / quiz:把 transcript JSON 喂给 LLM,用固定 prompt 输出中文翻译 + 5 道客观题 + 3 个知识点,人工校对后入库。
  • 后台 GUI:在管理端做一个表单,对应 plan JSON 的字段;提交后服务端跑同样脚本并把产物推到 OSS / git PR。当前 MVP 阶段先用 plan JSON + 命令行即可。

11.5 已知小不一致

  • 5.2 表把 VOA L1(Welcome)列为 Book1-001,但该视频只是欢迎片,无对话文稿,实际抓取从 VOA L2 起步:

- rl-b1-001 ← VOA Lesson 2 Hello, I'm Anna!
- rl-b1-002 ← VOA Lesson 3 I'm Here!

  • 后续如要严格对齐 5.2 表,可把 Welcome 当作"零课"独立放在 book1/intro.js,并把后面所有 order 顺移;或者更新 5.2 表说明"Welcome 为前导视频,不计课次"。

总结

根本原因就是 orderedMatchScore 里的一行 bug——未匹配到词时 ci 没回退,导致后续所有词都被阻断。修了这个 + 加了段级匹配 + 位置惩罚后,两课都精准对齐了。

现在项目的对齐工具体系:

工具精度用法
voa-fetch.js★★☆ 比例新建课程时自动生成初版
regenerate-lrc.js★★★ 比例+偏移已有课程快速重置
align-lrc-whisper.js★★★★★ 词级终极精准对齐
align-lrc.js★★☆ 静音检测干净音频(无背景音乐)