第一阶段课程
发布于 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 | 新概念 1 | A1–A2 | Let's Learn English Level 1(52 集) | 生活情景剧 / 示范对话 | 5–7 分钟 | 36 |
| rl-book-2 | 新概念 2 | A2–B1 | Let's Learn English Level 2(30 集) + Everyday Grammar TV | 情景剧 + 语法小课 | 5–8 分钟 | 36 |
| rl-book-3 | 新概念 3 | B1–B2 | People in America + Education Tips + Words and Their Stories | 人物传记 / 主题短文 | 3–5 分钟 | 48 |
| rl-book-4 | 新概念 4 | B2–C1 | American 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 单元。
| # | lessonId | VOA | 主题 | 语法点 |
|---|---|---|---|---|
| 单元 1 问候与介绍 | ||||
| 001 | rl-b1-001 | L1.E1 Welcome | 初次见面 | I am / pronouns |
| 002 | rl-b1-002 | L1.E2 Hello, I'm Anna! | 自我介绍 | This is / my name is |
| 003 | rl-b1-003 | L1.E3 I'm Here! | 位置表达 | here / there / be 动词 |
| 004 | rl-b1-004 | L1.E4 Hello! Goodbye! | 告别 | see you / nice to meet you |
| 005 | rl-b1-005 | L1.E5 Where Is the Bathroom? | 问路 | Where is...? |
| 006 | rl-b1-006 | L1.E7 What Is It? | 物品识别 | It is a / What is...? |
| 单元 2 个人与家庭 | ||||
| 007 | rl-b1-007 | L1.E8 Are You Busy? | yes/no 问句 | Are you...? |
| 008 | rl-b1-008 | L1.E11 This Is My Neighborhood | 社区 | there is / there are |
| 009 | rl-b1-009 | L1.E12 Meet My Family | 家庭 | my/your/his/her |
| 010 | rl-b1-010 | L1.E14 I Love People-watching | 记叙现在 | be + V-ing |
| 011 | rl-b1-011 | L1.E15 I Want to Speak English | 愿望 | want + to do |
| 012 | rl-b1-012 | L1.E16 How Many? | 数量 | How many + 复数 |
| 单元 3 日常生活 | ||||
| 013 | rl-b1-013 | L1.E18 What Do You Want? | Wh- 问句 | What do you...? |
| 014 | rl-b1-014 | L1.E19 When Do You Work? | 时间 | at + 时间 |
| 015 | rl-b1-015 | L1.E20 What Can You Do? | 能力 | can / can't |
| 016 | rl-b1-016 | L1.E21 Can You Come to the Party? | 邀约 | can 请求 |
| 017 | rl-b1-017 | L1.E22 Next Summer | 将来 | will / be going to |
| 018 | rl-b1-018 | L1.E23 What Do You Like to Do? | 爱好 | like + V-ing |
| 单元 4 过去与经历 | ||||
| 019 | rl-b1-019 | L1.E24 Yesterday Was Amazing! | 过去时 | was / were |
| 020 | rl-b1-020 | L1.E25 I'm Going to Be a Star! | 计划 | be going to |
| 021 | rl-b1-021 | L1.E27 Pizza, Pasta, and Music | 爱好 | like + V-ing 巩固 |
| 022 | rl-b1-022 | L1.E28 I Passed It! | 规则动词过去 | -ed |
| 023 | rl-b1-023 | L1.E29 A Long Time Ago | 故事叙述 | 不规则动词 |
| 024 | rl-b1-024 | L1.E31 He Lives in the City | 三单 | -s/-es |
| 单元 5 场景与交际 | ||||
| 025 | rl-b1-025 | L1.E33 Watching Sports | 体育 | 现在进行 |
| 026 | rl-b1-026 | L1.E35 What Are You Doing? | 进行时问答 | What are you doing? |
| 027 | rl-b1-027 | L1.E37 This Land Is Your Land | 比较 | bigger / better |
| 028 | rl-b1-028 | L1.E39 This Game Is Hard! | 形容词 | too / very |
| 029 | rl-b1-029 | L1.E41 You're Welcome! | 礼貌 | thank / please |
| 030 | rl-b1-030 | L1.E43 Made in America | 被动初体 | be made in |
| 单元 6 综合输出 | ||||
| 031 | rl-b1-031 | L1.E45 Help Wanted | 工作 | would you mind |
| 032 | rl-b1-032 | L1.E46 I'm Not Sure | 表达不确定 | I'm not sure if |
| 033 | rl-b1-033 | L1.E48 What Do You Suggest? | 建议 | should / had better |
| 034 | rl-b1-034 | L1.E50 Where Can I Buy...? | 购物 | Where can I + V |
| 035 | rl-b1-035 | L1.E51 We Have to Save Pete! | 情态 | have to / must |
| 036 | rl-b1-036 | L1.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–006 | L2.E1–E5 + Grammar: Present Tenses | 学习方法 / 习惯 |
| U2 工作与职场 | 007–012 | L2.E6–E10 + Grammar: Modals | 面试 / 同事 |
| U3 旅行与交通 | 013–018 | L2.E11–E15 + Grammar: Prepositions | 实用旅行 |
| U4 健康与饮食 | 019–024 | L2.E16–E20 + Grammar: Quantifiers | 医院 / 餐厅 |
| U5 人际与情感 | 025–030 | L2.E21–E25 + Grammar: Conditionals | 友谊 / 冲突解决 |
| U6 社会与文化 | 031–036 | L2.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–012 | People in America(林肯 / 金 / 爱因斯坦等)12 位 | 传记叙事 |
| U2 科技与发明 | 013–024 | Education Tips + Science in the News 选 12 篇 | 说明文 |
| U3 语言与习语 | 025–036 | Words and Their Stories(习语背后的文化)12 篇 | 词汇故事 |
| U4 社会与生活 | 037–048 | Health & Lifestyle + Agriculture Report 12 篇 | 主题论述 |
5.5 rl-book-4 (= NCE 4) 课程框架
B2–C1。文学改写 + 新闻长文,开始从「听懂」走向「靠语言思考」。
| 单元 | 课次 | 主轴 | VOA 来源 |
|---|---|---|---|
| U1 美国短篇小说 | 001–016 | American Stories(欧亨利 / 马克吐温 / 爱伦坡 改写) | 文学 |
| U2 中级新闻 | 017–032 | VOA Learning English News(1500 词限定) | 时事 |
| U3 专题报道 | 033–040 | Health Report + Science Report 长篇 | 说明 |
| U4 论述与评论 | 041–048 | Editorials + 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 1 | A1-A2 | VOA 官方真人 mp3 + 字幕 | 美国政府作品,公共领域 |
| rl-reader | 初阶阅读 | LibriVox 简易故事 + Gutenberg 简写本 | B1 | LibriVox mp3 | CC0 / PD |
| rl-voa-news | 时事英语 | VOA Learning English News(限 1500 词) | B1-B2 | VOA 官方 mp3 + 文本 | 公共领域 |
| rl-openstax | 学术英语 | OpenStax 精选教材精读 | B2-C1 | 项目 Edge TTS 生成 | CC BY 4.0 |
本文档后面只详细规划 rl-starter 与 rl-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
- 许可:美国政府作品,公共领域,可商用、可裁剪、可二次发布
| # | lessonId | VOA 集 | 标题 | 教学目标 | mp3 | lrc |
|---|---|---|---|---|---|---|
| 001 | rl-starter-001 | L1.E1 | Welcome | 问候 / I am... | /static/data/starter/mp3/001-welcome.mp3 | /static/data/starter/lrc/001-welcome.lrc |
| 002 | rl-starter-002 | L1.E2 | Hello, I'm Anna! | 自我介绍 / This is... | /static/data/starter/mp3/002-im-anna.mp3 | /static/data/starter/lrc/002-im-anna.lrc |
| 003 | rl-starter-003 | L1.E3 | I'm Here! | 位置 / here, there | /static/data/starter/mp3/003-im-here.mp3 | /static/data/starter/lrc/003-im-here.lrc |
| 004 | rl-starter-004 | L1.E4 | Hello! Goodbye! | 告别 / see you later | /static/data/starter/mp3/004-hello-goodbye.mp3 | /static/data/starter/lrc/004-hello-goodbye.lrc |
| 005 | rl-starter-005 | L1.E5 | Where Is the Bathroom? | 问路 / Where is the...? | /static/data/starter/mp3/005-where-bathroom.mp3 | /static/data/starter/lrc/005-where-bathroom.lrc |
| 006 | rl-starter-006 | L1.E7 | What Is It? | 物品识别 / It is a... | /static/data/starter/mp3/006-what-is-it.mp3 | /static/data/starter/lrc/006-what-is-it.lrc |
| 007 | rl-starter-007 | L1.E8 | Are You Busy? | yes/no 问句 / Are you...? | /static/data/starter/mp3/007-are-you-busy.mp3 | /static/data/starter/lrc/007-are-you-busy.lrc |
| 008 | rl-starter-008 | L1.E10 | Stage 1 复习 | be 动词 / 自我介绍 / 问路整合 | /static/data/starter/mp3/008-review-1.mp3 | /static/data/starter/lrc/008-review-1.lrc |
| 009 | rl-starter-009 | L1.E11 | This Is My Neighborhood | there is / there are | /static/data/starter/mp3/009-neighborhood.mp3 | /static/data/starter/lrc/009-neighborhood.lrc |
| 010 | rl-starter-010 | L1.E12 | Meet My Family | my / your / his / her | /static/data/starter/mp3/010-family.mp3 | /static/data/starter/lrc/010-family.lrc |
| 011 | rl-starter-011 | L1.E14 | I Love People-watching | 现在进行时 be + V-ing | /static/data/starter/mp3/011-people-watching.mp3 | /static/data/starter/lrc/011-people-watching.lrc |
| 012 | rl-starter-012 | L1.E15 | I Want to Speak English | want + to do / would like | /static/data/starter/mp3/012-want-speak.mp3 | /static/data/starter/lrc/012-want-speak.lrc |
| 013 | rl-starter-013 | L1.E18 | What Do You Want? | Wh- 问句 | /static/data/starter/mp3/013-what-do-you-want.mp3 | /static/data/starter/lrc/013-what-do-you-want.lrc |
| 014 | rl-starter-014 | L1.E19 | When Do You Work? | 时间表达 / at + 时间 | /static/data/starter/mp3/014-when-work.mp3 | /static/data/starter/lrc/014-when-work.lrc |
| 015 | rl-starter-015 | L1.E20 | What 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 |
| 016 | rl-starter-016 | L1.E21 | Can You Come to the Party? | can 邀约 / 复习 | /static/data/starter/mp3/016-come-to-party.mp3 | /static/data/starter/lrc/016-come-to-party.lrc |
| 017 | rl-starter-017 | L1.E24 | Yesterday Was Amazing! | 一般过去时 was/were | /static/data/starter/mp3/017-yesterday.mp3 | /static/data/starter/lrc/017-yesterday.lrc |
| 018 | rl-starter-018 | L1.E25 | I'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 |
| 019 | rl-starter-019 | L1.E27 | Pizza, Pasta, and Music | like + V-ing | /static/data/starter/mp3/019-pizza-pasta.mp3 | /static/data/starter/lrc/019-pizza-pasta.lrc |
| 020 | rl-starter-020 | L1.E29 | A Long Time Ago | 过去时叙述 | /static/data/starter/mp3/020-long-time-ago.mp3 | /static/data/starter/lrc/020-long-time-ago.lrc |
| 021 | rl-starter-021 | L1.E33 | Watching Sports | 现在进行时 / 体育词汇 | /static/data/starter/mp3/021-watching-sports.mp3 | /static/data/starter/lrc/021-watching-sports.lrc |
| 022 | rl-starter-022 | L1.E37 | This Land Is Your Land | 比较级 bigger / better | /static/data/starter/mp3/022-this-land.mp3 | /static/data/starter/lrc/022-this-land.lrc |
| 023 | rl-starter-023 | L1.E45 | Help Wanted | 工作场景 / would you mind | /static/data/starter/mp3/023-help-wanted.mp3 | /static/data/starter/lrc/023-help-wanted.lrc |
| 024 | rl-starter-024 | L1.E52 | A 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 Handbook | Ch1 The Digital World / Ch2 Language, Identity, and Culture | 学术写作框架、论证结构 |
| U2 心理学英语 | Psychology 2e | Ch1 Introduction to Psychology / Ch3 Biopsychology | 学科术语 + 定义句式 |
| U3 美国历史 | U.S. History | Ch3 Creating New Social Orders / Ch6 War for Independence | 历史叙述 + 时间链 |
| U4 商业入门 | Introduction to Business | Ch1 Economic Systems / Ch5 Business Ownership | 商务词汇 + 数据表达 |
| U5 学习策略 | College Success Concise | Ch4 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 课落地清单
| # | lessonId | lessonType | title | mp3_local | lrc | status |
|---|---|---|---|---|---|---|
| 001 | rl-starter-001 | story | The Lion and the Mouse | /static/data/aesop/mp3/lesson-001-lion-mouse.mp3 | /static/data/aesop/lrc/lesson-001-lion-mouse.lrc | 已上线(需裁剪修正) |
| 002 | rl-starter-002 | story | The Hare and the Tortoise | /static/data/aesop/mp3/lesson-002-hare-tortoise.mp3 | /static/data/aesop/lrc/lesson-002-hare-tortoise.lrc | 已上线(需裁剪修正) |
| 003 | rl-starter-003 | dialog | Hello, I am... | /static/data/starter-core/mp3/lesson-003-intro.mp3 | /static/data/starter-core/lrc/lesson-003-intro.lrc | 待制作 |
| 004 | rl-starter-004 | drill | Be Verbs and Pronouns Review | /static/data/starter-core/mp3/lesson-004-be-review.mp3 | /static/data/starter-core/lrc/lesson-004-be-review.lrc | 待制作 |
| 005 | rl-starter-005 | dialog | At a Grocery Store | /static/data/starter-core/mp3/lesson-005-grocery.mp3 | /static/data/starter-core/lrc/lesson-005-grocery.lrc | 待制作 |
| 006 | rl-starter-006 | dialog | At a Cafe | /static/data/starter-core/mp3/lesson-006-cafe.mp3 | /static/data/starter-core/lrc/lesson-006-cafe.lrc | 待制作 |
| 007 | rl-starter-007 | dialog | Asking for Directions | /static/data/starter-core/mp3/lesson-007-directions.mp3 | /static/data/starter-core/lrc/lesson-007-directions.lrc | 待制作 |
| 008 | rl-starter-008 | drill | Stage 2 Mission Dialogue | /static/data/starter-core/mp3/lesson-008-stage2-task.mp3 | /static/data/starter-core/lrc/lesson-008-stage2-task.lrc | 待制作 |
| 009 | rl-starter-009 | dialog | My Daily Routine | /static/data/starter-core/mp3/lesson-009-routine.mp3 | /static/data/starter-core/lrc/lesson-009-routine.lrc | 待制作 |
| 010 | rl-starter-010 | dialog | What are you doing now? | /static/data/starter-core/mp3/lesson-010-progressive.mp3 | /static/data/starter-core/lrc/lesson-010-progressive.lrc | 待制作 |
| 011 | rl-starter-011 | story | The Fox and the Grapes | /static/data/aesop/mp3/lesson-011-fox-grapes.mp3 | /static/data/aesop/lrc/lesson-011-fox-grapes.lrc | 待制作 |
| 012 | rl-starter-012 | drill | Time and Frequency Review | /static/data/starter-core/mp3/lesson-012-time-frequency.mp3 | /static/data/starter-core/lrc/lesson-012-time-frequency.lrc | 待制作 |
| 013 | rl-starter-013 | story | The Boy Who Cried Wolf | /static/data/aesop/mp3/lesson-013-boy-cried-wolf.mp3 | /static/data/aesop/lrc/lesson-013-boy-cried-wolf.lrc | 待制作 |
| 014 | rl-starter-014 | dialog | Yesterday at School | /static/data/starter-core/mp3/lesson-014-yesterday-school.mp3 | /static/data/starter-core/lrc/lesson-014-yesterday-school.lrc | 待制作 |
| 015 | rl-starter-015 | story | The Ant and the Grasshopper | /static/data/aesop/mp3/lesson-015-ant-grasshopper.mp3 | /static/data/aesop/lrc/lesson-015-ant-grasshopper.lrc | 待制作 |
| 016 | rl-starter-016 | drill | Past Tense Consolidation | /static/data/starter-core/mp3/lesson-016-past-review.mp3 | /static/data/starter-core/lrc/lesson-016-past-review.lrc | 待制作 |
| 017 | rl-starter-017 | dialog | Weekend Plans | /static/data/starter-core/mp3/lesson-017-weekend-plans.mp3 | /static/data/starter-core/lrc/lesson-017-weekend-plans.lrc | 待制作 |
| 018 | rl-starter-018 | dialog | Can you help me? | /static/data/starter-core/mp3/lesson-018-can-could.mp3 | /static/data/starter-core/lrc/lesson-018-can-could.lrc | 待制作 |
| 019 | rl-starter-019 | story | The Wind and the Sun | /static/data/aesop/mp3/lesson-019-wind-sun.mp3 | /static/data/aesop/lrc/lesson-019-wind-sun.lrc | 待制作 |
| 020 | rl-starter-020 | drill | Suggestions and Advice | /static/data/starter-core/mp3/lesson-020-suggestions.mp3 | /static/data/starter-core/lrc/lesson-020-suggestions.lrc | 待制作 |
| 021 | rl-starter-021 | story | The Crow and the Pitcher | /static/data/aesop/mp3/lesson-021-crow-pitcher.mp3 | /static/data/aesop/lrc/lesson-021-crow-pitcher.lrc | 待制作 |
| 022 | rl-starter-022 | dialog | Which one is better? | /static/data/starter-core/mp3/lesson-022-comparison.mp3 | /static/data/starter-core/lrc/lesson-022-comparison.lrc | 待制作 |
| 023 | rl-starter-023 | task | Integrated Speaking Task | /static/data/starter-core/mp3/lesson-023-integrated-task.mp3 | /static/data/starter-core/lrc/lesson-023-integrated-task.lrc | 待制作 |
| 024 | rl-starter-024 | review | Final 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 步)
- 锁定英文版本:V.S. Vernon Jones(Project Gutenberg #11339)。
- 锁定朗读源:LibriVox 对应章节音频。
- 下载原始 mp3,保留 src_mp3 记录。
- 裁剪片头片尾,导出 mp3_local。
- 按句切分课文,生成初版 lrc(句级)。
- 人工精调时间轴(目标误差 <= 300ms)。
- 在 H5 真机与浏览器各回归一次(播放、拖动、逐句点击)。
- 更新 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.json | Book 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 步
- 填表:在
plans/rl-book-N.json的lessons数组追加一行,必填字段:
{
"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 动词 + 复数"
}
- 跑脚本(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.* 三件套就位。
- 补中文层:打开
lessons/book1/group1.js,照前两课模板新增一段 lesson 对象——sentences[]的text直接抄 transcript JSON 的 lines,cnText手填;同时补translation段落、3-6 条knowledgePoints、grammar.points、quiz、summaryQA、source。 - 注册数量:在
subjects.js把rl-book-1的totalLessons改成新的实际课数。 - 冒烟自测:
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[].text、knowledgePoints候选词列表的 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 | ★★☆ 静音检测 | 干净音频(无背景音乐) |