粘贴 Zoom 导出的 .vtt、字幕文本或本地视频转写结果。支持 WEBVTT 时间轴,留空则使用代码里的示例。
🎬 AI课堂视频转写官 · 学员手册
第二季:文明进化计划 · 第5课(总第十三课) | 75 分钟 | 文本分析与课堂报告 | +240 EXP | 🎬
今天怎么玩:双人 Boss 副本
今天不是单纯听老师讲,也不是一直点下一步。两名学员组成临时小队,每 10 分钟交换一次角色。
- 侦察官:负责读代码、找规律、解释这一行在做什么。
- 工程师:负责改代码、运行、修 Bug、让右侧结果发生变化。
通关口令:我改了什么?结果为什么变了?
| 关卡 | 倒计时 | 双人挑战 |
|---|---|---|
| 第1关 | 2分钟 | 粘贴 Zoom .vtt 或真实转写文本,查看程序如何清洗数据 |
| 第2关 | 3分钟 | 解释 ([^::]+) 抓什么,并统计真实发言人 |
| 第3关 | 3分钟 | 从真实课堂里找老师提问,检查有没有漏识别 |
| 第4关 | 3分钟 | 把关键词换成当天课程主题,统计真实命中数 |
| 第5关 | 4分钟 | 两人设计不同评分公式,比较哪个合理 |
| Boss关 | 5分钟 | 生成个人报告,并用30秒讲解修改结果 |
| 你将学会 | 你将完成 |
|---|---|
split() / 列表推导式 | 把转写文本拆成一行行记录 |
re.findall() | 从文本里抓出发言人、问题句 |
collections.Counter | 统计每个人发言次数 |
| 关键词列表 | 判断课堂内容是否贴合主题 |
| 字典返回值 | 把多项统计结果打包成报告 |
HTML_PREVIEW | 把分析结果变成可展示的数据面板 |
一、🎯 这节课到底做什么?
我们要做的不是一个演示小玩具,而是老师真的可以用的工具:把 Zoom 录课、转写字幕或课堂聊天记录,变成课堂复盘报告。
它能回答几个真实问题:
- 老师问了几个问题?
- 学员有没有回应?
- 课堂是不是围绕本节课关键词展开?
- 哪些同学发言多,哪些同学需要被提醒?
- 这节课互动质量大概怎么样?
这就是现实世界里的“文本分析”:程序不只是算数字,还能读懂一段文字里藏着的结构。
真实数据怎么来?
课堂上推荐三种来源,优先级从高到低:
- Zoom 云录制里的字幕 / 音频转写,下载
.vtt后直接粘贴到实验室的“真实课堂转写输入”。 - 本地视频转写工具生成的文本,格式可以是
00:00:03 老师: 内容,也可以是 WEBVTT 时间轴。 - 如果当天没有转写文件,就用老师准备的上课片段手工转成 8-12 行文本。
程序会自动处理常见 VTT 时间轴:
WEBVTT
00:00:03.000 --> 00:00:08.000
郭老师: 今天我们复习城市交通管理控制平台。
00:00:09.000 --> 00:00:15.000
小林: csv.DictReader 是把每一行变成字典吗?粘贴后点任意关卡,实验室会优先分析你粘贴的真实数据;输入框留空时才使用代码里的保底样本。
二、逐行完整代码解释
1. 导入工具
import re
from collections import Counterre 是正则表达式模块,用来从文本里精准抓取内容。比如本课要抓发言人、抓问题句。
Counter 是计数器,用来统计列表中每个元素出现了几次。比如统计“郭老师、小林、小雅”各发言几次。
一句话记忆:re 负责“找”,Counter 负责“数”。
2. 选择运行关卡
RUN_LEVEL = int(input("请选择关卡 1-6:") or "6")input() 接收关卡编号;or "6" 表示不输入就默认第 6 关;int() 把文字数字变成真正的整数。
实验室顶部也有“关卡”输入框。输入 1 到 6 后点击运行,就能单独调试每一关。
3. 课程关键词库
COURSE_KEYWORDS = ["Python", "csv", "StringIO", "try", "except", "statistics", "函数", "变量", "数据", "交通", "转写"]这是一份课堂重点词清单。程序会统计这些词出现了多少次,用来判断课堂有没有围绕课程主题。
它可以修改。爬虫课可以换成:
COURSE_KEYWORDS = ["爬虫", "requests", "BeautifulSoup", "HTML", "链接"]4. 原始转写文本
transcript = """
00:00:03 郭老师: 同学们好,今天我们先复习城市交通管理控制平台。
00:00:18 郭老师: 谁还记得 csv.DictReader 是做什么的?
00:00:30 小林: 它可以把 CSV 每一行变成字典。
"""这是模拟视频 AI 转写字幕。每一行格式是:
时间 + 发言人 + 冒号 + 说话内容后面的正则表达式依赖这个格式。如果没有时间、空格、姓名、冒号,发言人识别就会失败。
5. get_lines() 清洗文本、有效分行
def get_lines(text):
return [line.strip() for line in text.strip().split("\n") if line.strip()]text.strip():去掉整段文本首尾空白。
.split("\n"):按换行切成一行一行。
line.strip():去掉每一行前后空格。
if line.strip():空行不要。
整句可以读成:把文本清干净,按换行切开,再把每一行清干净,只保留有效行。
6. find_speakers() 正则抓取所有发言人
def find_speakers(text):
return re.findall(r"\d\d:\d\d:\d\d\s+([^::]+)[::]", text)正则规则匹配的是:时间 + 空格 + 名字 + 冒号。
| 正则片段 | 含义 |
|---|---|
\d\d:\d\d:\d\d | 匹配 00:00:03 这种时间 |
\s+ | 匹配一个或多个空格 |
([^::]+) | 抓取冒号前面的名字 |
[::] | 匹配英文冒号或中文冒号 |
最关键的是括号 ():括号里的内容会被抓出来,所以返回的是发言人姓名列表。
7. find_questions() 智能抓取所有提问句
def find_questions(text):
pattern = r"[^。!??]*(?:[??]|谁|什么|为什么|哪个|怎么)[^。!??]*"
return [q.strip() for q in re.findall(pattern, text) if q.strip()]这段代码把带问号,或者带“谁、什么、为什么、哪个、怎么”的句子先当成问题句。
它不是让电脑真正理解中文,而是先用规则做一个能工作的智能原型。
8. count_keywords() 统计知识点出现次数
def count_keywords(text, keywords):
hits = {}
lower_text = text.lower()
for word in keywords:
hits[word] = lower_text.count(word.lower())
return hitshits = {}:创建空字典保存结果。
text.lower():把英文统一转小写,避免 Python 和 python 被当成两个词。
for word in keywords:逐个检查关键词。
count():统计出现次数。
最后返回类似 {"csv": 2, "try": 1} 的统计字典。
9. build_report() 核心总计算函数
def build_report(text):
speakers = find_speakers(text)
questions = find_questions(text)
speaker_count = Counter(speakers)
keyword_hits = count_keywords(text, COURSE_KEYWORDS)
total_keyword_hits = sum(keyword_hits.values())
student_turns = sum(count for name, count in speaker_count.items() if "老师" not in name)
teacher_turns = sum(count for name, count in speaker_count.items() if "老师" in name)
score = min(100, len(questions) * 12 + student_turns * 8 + total_keyword_hits * 5)
return {"lines": get_lines(text), "speakers": speakers, "speaker_count": speaker_count, "questions": questions, "keyword_hits": keyword_hits, "teacher_turns": teacher_turns, "student_turns": student_turns, "score": score}speakers:全部发言人列表。
questions:所有提问句子。
speaker_count:统计每个人发言次数。
keyword_hits:知识点命中统计。
total_keyword_hits:总知识点出现次数。
student_turns:所有名字里不含“老师”的发言次数,先当成学生发言。
teacher_turns:名字里包含“老师”的发言次数。
score:课堂互动评分,提问越多、学生发言越多、知识点聊得越多,分数越高;min(100, ...) 表示最高不超过 100。
10. html_page() 生成网页模板
html_page(title, body) 接收标题和内容,返回完整 HTML 网页代码。所有关卡右侧漂亮的网页效果,都是靠它生成的。
实验室约定:只要设置 HTML_PREVIEW = html_page(...),右侧效果区就显示网页作品。
11. 主程序
report = build_report(transcript)这一行一次性执行所有文本分析,把结果存到 report 字典里。后面 1 到 6 关都从 report 里取数据。
三、关卡 1-6 运行效果
| 关卡 | 功能 | 核心能力 |
|---|---|---|
| 第1关 | 原始文本清洗展示 | 把杂乱字幕变成干净行列表 |
| 第2关 | 发言人识别 + 发言次数统计 | 正则抓人名 + Counter 计数 |
| 第3关 | 智能抓取老师所有提问 | 用问号和疑问词识别问题 |
| 第4关 | 知识点关键词统计 | 判断课堂聚焦度 |
| 第5关 | 课堂互动评分系统 | 设计业务评分公式 |
| 第6关 | 完整 AI 课堂报告成品页 | 汇总数据并生成可视化平台 |
四、关卡 1:原始转写文本
代码里先准备了一段 transcript,它模拟 Zoom 转写后的文本。
transcript = """
00:00:03 郭老师: 同学们好,今天我们先复习城市交通管理控制平台。
00:00:18 郭老师: 谁还记得 csv.DictReader 是做什么的?
00:00:30 小林: 它可以把 CSV 每一行变成字典。
"""每一行都有三个信息:
时间 -> 说话人 -> 说话内容get_lines() 的作用是把一大段文本拆成干净的行。
def get_lines(text):
return [line.strip() for line in text.strip().split("\n") if line.strip()]人话解释:
text.strip():去掉整段文字开头和结尾的空白。.split("\n"):按换行切开。line.strip():每一行再去掉多余空格。if line.strip():空行不要。
这一步训练的是:任何数据分析都要先把原始数据整理成程序能处理的形状。
三、关卡 2:用正则识别发言人
def find_speakers(text):
return re.findall(r"\d\d:\d\d:\d\d\s+([^::]+)[::]", text)re 是 Python 的正则表达式模块,适合做“文字侦察”。
这句正则可以拆开看:
| 片段 | 意思 |
|---|---|
\d\d:\d\d:\d\d | 匹配 00:00:03 这种时间 |
\s+ | 匹配时间后面的空格 |
([^::]+) | 抓取冒号前面的名字 |
[::] | 匹配中文或英文冒号 |
最关键的是括号 ():括号里的内容会被抓出来,所以返回的是“郭老师、小林、小雅……”这些名字。
接着用 Counter 统计谁说了几次:
speaker_count = Counter(speakers)Counter 就像自动计数器,看到一次名字就加 1。
四、关卡 3:找出老师提问
pattern = r"[^。!??]*(?:[??]|谁|什么|为什么|哪个|怎么)[^。!??]*"
questions = re.findall(pattern, text)这段代码不是让电脑真的理解人类语言,而是先用规则判断“像不像问题”。
判断依据包括:
- 出现问号
?或?。 - 出现疑问词:谁、什么、为什么、哪个、怎么。
这就是 AI 产品里很常见的第一步:先用规则做一个能工作的原型,再逐步升级成更智能的模型。
五、关卡 4:统计课程关键词
COURSE_KEYWORDS = ["Python", "csv", "StringIO", "try", "except", "statistics", "函数", "变量", "数据", "交通", "转写"]关键词列表代表本节课应该出现的核心内容。
def count_keywords(text, keywords):
hits = {}
lower_text = text.lower()
for word in keywords:
hits[word] = lower_text.count(word.lower())
return hits人话解释:
hits = {}:准备一个空字典保存结果。text.lower():把英文统一转小写,避免 Python 和 python 被当成两个词。for word in keywords:逐个检查关键词。count():统计出现次数。
这一步能判断课堂有没有跑题。比如一节 Python 数据课,关键词命中很少,就说明讲课内容可能不够贴合课程。
六、关卡 5:生成课堂互动评分
student_turns = sum(count for name, count in speaker_count.items() if "老师" not in name)
teacher_turns = sum(count for name, count in speaker_count.items() if "老师" in name)
score = min(100, len(questions) * 12 + student_turns * 8 + total_keyword_hits * 5)这里开始像真实产品了:程序把多个指标合成一个评分。
| 指标 | 为什么重要 |
|---|---|
| 老师提问数 | 提问越多,课堂越容易互动 |
| 学员发言数 | 学员有回应,说明参与度更高 |
| 关键词命中 | 说明课堂没有偏离主题 |
min(100, ...) 的作用是封顶,最高不超过 100 分。
这也是产品设计里的重要思想:不是数据越多越好,而是要把数据变成老师看得懂、能行动的指标。
七、关卡 6:发布完整报告面板
最后一关把所有结果放进 HTML_PREVIEW:
HTML_PREVIEW = html_page("第6关:AI课堂视频转写官", body)实验室里只要设置 HTML_PREVIEW,右侧效果区就会显示网页作品。
完整作品包含:
- 老师提问数量
- 学员发言数量
- 课程关键词命中
- 课堂互动评分
- 下一步使用提示
- 合法数据边界提醒
真实视频分析要打开教师工具:
/teacher/zoom-review在那里可以导入 Zoom 字幕、聊天记录,或者上传自己的课程录制视频进行本地免费转写。
八、调试方式:顶部关卡输入框
第 13 课不是每次都只运行最终作品。实验室顶部有“关卡”输入框,输入 1 到 6,再点击运行,就能单独调试每个模块。
| 输入 | 运行模块 | 调试目标 |
|---|---|---|
1 | 原始转写文本 | 检查每一行是否包含时间、发言人、内容 |
2 | 发言人识别 | 看 re.findall() 有没有抓出名字 |
3 | 老师提问识别 | 看问题句是否被正确识别 |
4 | 关键词统计 | 看课程关键词命中是否合理 |
5 | 互动评分 | 看评分公式是否符合课堂直觉 |
6 | 完整报告 | 看最终作品是否完整显示 |
也可以点击右侧任务卡里的“运行第1关 / 运行第2关”。两种方式效果一样。
九、常见调试问题
| 问题 | 可能原因 | 怎么修 |
|---|---|---|
| 发言人识别为空 | 转写文本格式不对 | 改成 00:00:03 姓名: 内容 |
| 关键词全是 0 | 关键词和文本不匹配 | 修改 COURSE_KEYWORDS |
| 评分不符合直觉 | 权重设计不合理 | 修改 12 / 8 / 5 这些数字 |
| 右侧没有预览 | 没设置 HTML_PREVIEW | 检查关卡最后是否赋值 |
十、可以改哪里?
- 改
transcript:换成自己的课堂对话。 - 改
COURSE_KEYWORDS:换成当前课程真正的关键词。 - 改
pattern:让问题识别更严格或更宽松。 - 改
score:设计自己的课堂评分规则。 - 改
html_page()的 CSS:调整报告面板视觉风格。
十一、重要边界:能做什么,不能做什么
这节课可以做:
- 分析自己录制的课程视频。
- 分析老师授权的课堂资料。
- 分析公开网页和公开数据集。
- 分析自己创作的音频、游戏日志和学习记录。
这节课不做:
- 爬盗版电影、音乐、游戏资源。
- 绕过登录、会员、付费、版权保护。
- 批量下载没有授权的内容。
真正厉害的工程师,不是会钻空子,而是能在合法边界内把工具做得专业、可靠、可持续。
十二、作品标准
- ✅ 能把转写文本拆成一行行记录
- ✅ 能用正则识别发言人
- ✅ 能用 Counter 统计发言次数
- ✅ 能提取老师问题句
- ✅ 能统计课程关键词
- ✅ 能生成课堂互动评分
- ✅ 能显示完整课堂报告面板
- ✅ 知道真实视频要去教师工具使用本地转写
点击 ▶ 运行或按 Ctrl+Enter
把我们上课的视频转写文本粘贴到真实数据输入框,先看程序如何清洗时间、人物和内容。
用真实课堂数据统计老师和每个学员发言次数,比模拟对话更能看出课堂互动。
从真实课堂里抓取老师提问,学生可以判断哪些问题被识别、哪些漏掉,再改正则。
把关键词换成当天课程主题,观察真实课堂是否围绕重点展开。
用真实转写数据测试评分公式,讨论提问、回答、关键词哪个权重更合理。
Boss关:用真实课堂转写生成报告,说明数据来源、代码处理过程和报告结论。
🎁 完成全部 +30 XP