本项目的核心流程是:准备课文源文件 → 按规则生成结构化课程内容。
课文源文件由人工维护,课程内容由规则或工具自动生成。生成结果为 JSON 格式,可直接供应用程序使用。
一个完整的课程单元文件夹如下(文件夹名称可自由命名):
my-unit-folder/
├── textbook.md ← 必需:课文源文件
├── wordlist.md ← 可选:单元单词表
├── manifest.json ← 生成:单元元数据
├── assets/ ← 可选:单元图片、音频等素材
│ └── images/
│ └── cleaning-car.png
└── content/
├── sentence-practice.json ← 生成:拆句练习
├── conversation-practice.json ← 生成:对话练习
├── reading-qa.json ← 可选:阅读理解(可含图片题)
└── growth-content.json ← 可选:语言成长线(词族、句型迁移)
创建一个文件夹,名称随意,例如 cinderella/ 或 unit1/。
这是唯一必需的源文件。模板如下:
# 五年级第一单元 - Cinderella
学习关于灰姑娘故事的表达
## 课程信息
- **难度**: 初级
- **级别**: 1
## Story time
1. There is a party at the prince's house, but Cinderella cannot go.
2. Sister: Cinderella, come and help me!
3. A fairy comes.Story time 规则:
- 标题固定为
## Story time - 每行一条对话,以数字编号开头
- 对话格式:
编号. 角色名: 英文内容 - 旁白格式:
编号. 英文内容(无角色名) - 一条对话中可以有多个句子(用
.?!分隔),不要拆成多条 - 编号、角色名、英文原文、标点、缩写都必须保留原样
可选章节:
## 翻译覆盖 ← 可选:人工指定的中文翻译
## 图片素材 ← 可选:人工指定的配图和出题意图
## 生成配置 ← 可选:生成参数如果希望通过图片出题,在单元目录下创建 assets/images/,把图片放进去,并在 textbook.md 里添加 ## 图片素材:
## 图片素材
- id: morning-cleaning-car
file: assets/images/morning-cleaning-car.png
alt: 爸爸早上在门口洗车
relatedLines: [1]
targets:
- My father is cleaning the car.
- cleaning the car字段说明:
| 字段 | 说明 |
|---|---|
id |
图片唯一标识,建议用英文短横线 |
file |
图片相对当前单元目录的路径 |
alt |
给老师和无障碍场景看的图片描述,不直接给学生当答案 |
relatedLines |
图片关联的课文编号 |
targets |
希望图片触发练习的英文句子、短语或词 |
图片出题的目标是让学生先观察场景,再回忆课文表达。不要把答案写进图片文件名、题干或 alt 中。
如果单元有重点单词表,创建 wordlist.md:
# Unit 1 Wordlist
* prince 王子
* fairy 仙女
* why 为什么
* because 因为
* clothes 衣服
* put on 穿上
* try on 试穿
* fit 合适,合身格式:每行一个词或短语,用 * 开头,英文和中文之间用空格分隔。
词表的作用:
- 标记哪些词是本单元的学习重点
- 生成时为这些词补齐音标、词性、意思
- 已包含在片段链中的词不强制单独出题
准备好 textbook.md(和可选的 wordlist.md)后,就可以交给 AI 自动生成课程内容了。
推荐工具:TRAE SOLO
目前大部分课程使用 TRAE SOLO 生成。操作步骤:
- 打开 TRAE SOLO
- 将课程文件夹(包含
textbook.md)作为工作目录 - 上传
learn-english-course-content-rules.md作为规则上下文 - 告诉 AI:"按规则生成课程内容"
- AI 会自动完成拆句、生成 JSON、校验
AI 将按以下流程执行:
1. 读取 textbook.md,锁定 Story time 原文(不可修改)
2. 读取 wordlist.md(如果存在)
3. 逐条对话拆句:
a. 去掉角色前缀,按 .?! 拆成独立句子
b. 每句按自然结构拆成连续、不重叠的片段链
c. 为每个片段生成中文、语法、提示、单词信息
d. 完整句放在最后,必须带词块
e. 完整句必须列出每一个单词的详细信息
4. 生成 JSON 文件
5. 校验
片段链要求:
- 片段必须来自原句的连续文本
- 片段拼起来必须正好还原整句
- 每个片段在当前句子里只出现一次
- 短语优先于单词(如
a party优于party)
功能词处理:
| 类型 | 规则 | 示例 |
|---|---|---|
| 介词(at/to/from/before) | 连接语义块时单独拆 | a party | at | the prince's house |
| 连接词(and/but/or/so) | 默认不单独拆 | 附在相邻片段中 |
| 冠词(a/an/the) | 不单独拆 | a party、the prince's house |
| be动词/助动词(is/are/do) | 不单独拆 | 附在相邻片段中 |
| 代词(I/you/he/she/it) | 不单独拆 | 附在相邻片段中 |
完整句要求:
- 必须列出该句每一个单词的详细信息(音标、词性、意思)
- 必须带词块(structureBlocks)
- 放在当前句子的最后
原文:There is a party at the prince's house.
片段链:There is → a party → at → the prince's house → 完整句
单元元数据文件,模板如下:
{
"schemaVersion": "2.0",
"id": "grade5-semester2-unit1",
"name": "五年级下册 Unit 1 - Cinderella",
"description": "学习关于灰姑娘故事的表达",
"subject": "english",
"publisher": {
"name": "Learn with daddy's love"
},
"domain": {
"key": "english",
"planning": {
"audience": {
"stage": "primary",
"ageRange": "10-11",
"teachingGoal": "使用课文原句表达故事"
},
"grade": 5,
"semester": 2,
"unit": 1,
"tags": ["灰姑娘", "故事", "童话"],
"language": "en",
"wordlist": "wordlist.md",
"languageLevel": "primary-grade-5",
"growth": {
"growthAvailable": false,
"growthTypes": [],
"foundationActivityTypes": ["sentence-practice", "conversation-practice", "reading-qa"],
"growthActivityTypes": []
}
},
"package": {
"source": {
"type": "textbook-markdown",
"path": "textbook.md"
},
"activities": [
{
"type": "sentence-practice",
"name": "拆句练习",
"data": "content/sentence-practice.json",
"enabled": true
},
{
"type": "conversation-practice",
"name": "对话练习",
"data": "content/conversation-practice.json",
"enabled": true
},
{
"type": "reading-qa",
"name": "阅读理解",
"data": "content/reading-qa.json",
"enabled": true
}
]
}
},
"generation": {
"sourceHash": "",
"generatorVersion": "learn-language-generator-2",
"generatedAt": "2026-04-18"
}
}字段说明:
| 字段 | 说明 |
|---|---|
id |
唯一标识,格式 grade{年级}-semester{学期}-unit{单元号} |
name |
显示名称,中文 |
subject |
必填;英语课程固定为 english |
domain.key |
领域标识;英语课程固定为 english,必须与 subject 一致 |
domain.planning |
英语域拥有的规划上下文:受众、教材坐标、标签、语言与成长声明 |
domain.package |
英语域拥有的执行数据:源课文和活动列表 |
Weekly 核心不会解释 domain.planning 或 domain.package 的字段。英语课程生成器必须生成上述英语领域 payload;新的数学等领域可以在自己的 domain 包裹中使用不同字段。活动 type 是领域字符串,英语领域只接受 WeeklyEnglishActivityTypes 声明的类型;未知 type 会被过滤并告警。
拆句练习数据,结构如下:
{
"manifestId": "grade5-semester2-unit1",
"activityType": "sentence-practice",
"sections": [
{
"title": "Breakdown",
"sentences": [
{
"sequenceNumber": 1,
"segmentNumber": 1,
"english": "There is",
"speaker": "narrator",
"chinese": "有",
"difficulty": 1,
"hint": "存在片段",
"grammarAnalysis": "There be 句型",
"words": [
{
"text": "There",
"phonetic": "/ðeə(r)/",
"partOfSpeech": "副词",
"meaning": "引导 there be 句型"
}
],
"structureBlocks": [],
"category": "phrase",
"id": "1-1-1"
}
]
}
]
}字段说明:
| 字段 | 说明 |
|---|---|
sequenceNumber |
对话编号(对应 textbook.md 中的编号) |
segmentNumber |
片段编号(同一对话内递增) |
english |
英文片段(来自原文的连续文本) |
speaker |
说话者(角色名或 narrator) |
chinese |
中文翻译 |
difficulty |
难度级别 |
hint |
学习提示(帮助回忆,不泄露答案) |
grammarAnalysis |
语法说明(短、精炼、面向小学生) |
words |
单词数组,每个单词含 text/phonetic/partOfSpeech/meaning |
structureBlocks |
词块数组,完整句必须有,格式 {"label": "标签", "text": "英文片段"} |
category |
类型:phrase(短语)/ word(单词)/ sentence(完整句) |
category 规则:
phrase:短语片段,words 列核心单词即可word:单个单词片段sentence:完整句,必须列出每一个单词的详细信息,必须有 structureBlocks
对话练习数据,结构如下:
{
"manifestId": "grade5-semester2-unit1",
"activityType": "conversation-practice",
"sections": [
{
"title": "Story time",
"lines": [
{
"sequenceNumber": 1,
"speaker": "narrator",
"english": "There is a party at the prince's house, but Cinderella cannot go.",
"chinese": "王子家有一个派对,但灰姑娘不能去。"
}
]
}
]
}对话练习直接来自 ## Story time 原文,不做任何修改。
阅读理解图片题数据,结构如下:
{
"manifestId": "grade5-semester2-unit1",
"activityType": "reading-qa",
"sourceHash": "",
"generatorVersion": "learn-language-generator-2",
"generatedAt": "2026-04-29",
"images": [
{
"id": "morning-cleaning-car",
"src": "assets/images/morning-cleaning-car.png",
"alt": "爸爸早上在门口洗车",
"relatedLines": [1]
}
],
"questions": [
{
"id": "img-u5-q1",
"imageId": "morning-cleaning-car",
"type": "multiple-choice",
"prompt": "图中爸爸正在做什么?",
"options": [
"He is cleaning the car.",
"He is cooking breakfast.",
"He is sweeping the floor.",
"He is sleeping."
],
"correctIndex": 0,
"answer": "He is cleaning the car.",
"targetEnglish": "My father is cleaning the car.",
"targetChinese": "我爸爸正在洗车。",
"explanation": "图片对应课文表达:My father is cleaning the car.",
"difficulty": 1
}
]
}图片题推荐类型:
| 类型 | 用途 |
|---|---|
multiple-choice |
看图选择正确句子,适合低年级和首次练习 |
fill-blank |
看图补全关键词,如 He is ____ the car. |
speak |
看图说句子,适合口语和背诵检查 |
order-words |
看图后给词排序,适合句型巩固 |
生成图片题时,答案必须来自课文原文或课文原文的自然变体;如果是自然变体,要在 targetEnglish 里保留对应课文原句,方便追溯。
每次生成后,逐项检查:
-
## Story time原文完全一致(未改任何字符) - 对话编号连续、无新增或删除
- 角色名未被修改
- 每个完整句都有整句中文翻译(不是单词翻译)
- 每个完整句都列出了每一个单词的详细信息
- 每个完整句都有 structureBlocks(词块)
- wordlist 中的重点词已覆盖(单独题或包含在片段中)
- 片段链连续、不重叠、拼起来还原整句
- 介词在连接语义块时已单独拆出
- 功能词(and/but/or/so/a/the)未单独拆出
- 图片路径存在且是相对单元目录的路径
- 图片题的答案能追溯到课文原文或明确的目标句
- 图片题干、文件名和
alt没有直接泄露答案 - manifest 使用
schemaVersion: "2.0",并包含subject: "english"与domain.key: "english" -
domain.package.activities中声明的每个数据文件都存在 - 只有存在
content/growth-content.json且完成稳定度门槛时,才声明成长活动
1. 创建文件夹
2. 编写 textbook.md(必须)
3. 编写 wordlist.md(可选)
4. 打开 TRAE SOLO,上传规则文件和课程文件夹
5. 发送提示词,等待生成
6. 检查生成结果
准备好文件后,在 TRAE SOLO 中发送以下提示词:
初次生成:
请按照 learn-english-course-content-rules.md 的规则,读取 textbook.md(和 wordlist.md),生成 manifest.json 和 content/ 下的 JSON 文件。
仅重新生成拆句练习(不改对话原文):
请按照规则重新生成 sentence-practice.json,对话原文保持不变。
校验已有内容:
请按照 learn-english-course-content-rules.md 的检查清单,校验当前单元的 JSON 文件是否合规。