说实话,我一开始做这个小工具是被逼的。网课两小时,倍速听到第十五分钟就开始走神,进度条到底了,脑子里啥也没留下。期末前对着几十个视频疯狂赶笔记,抄PPT抄到手酸,最后复习还是得重新翻视频截图。后来我搭了一条AI流水线,把课程视频丢进去,自动输出一份结构清晰的Markdown讲义,从视频到讲义全程不用手动写一行笔记。
这篇文章就把整套方案摊开讲,包含技术选型、完整脚本、提示词模板和避坑实录。学生党、在职考证、知识付费自学者都适用,小白照着抄也能跑通第一版,进阶玩家可以拿去做二次开发。
1. 项目拆解:一条视频是怎么变成讲义的
1.1 核心流水线:音频提取、语音转写、内容提炼
很多朋友一听到“AI自动生成讲义”,第一反应是“这玩意儿是不是直接拿大模型分析视频画面”。实际上,以目前主流方案来说,我不会把视频直接喂给大模型,那样成本高、速度慢,而且绝大多数课程视频的“信息密度”集中在语音轨道上。真正稳的做法是拆成三段流水线:
- 从视频中提取音频轨,转成适合语音识别的格式。
- 用语音转写模型把音频变成带时间戳的逐字稿。
- 把逐字稿按上下文切成片段,交给大模型,按你指定的结构生成讲义。
这一步是整条流水线的核心思路:把“看视频”这个任务拆解成“听写”和“归纳”两步,分别用最擅长对应任务的模型去处理。
语音转写模型解决的是“老师说了什么”,大模型解决的是“这部分内容怎么组织成讲义”。两个问题分开处理,误差不会互相放大,出问题时也好排查——错字多就调转写,结构散就改提示词,不会像端到端方案那样出了问题根本不知道从哪儿下手。
1.2 先搞清楚需求:你到底是“记不全”还是“看不懂”
动手之前先别急着装环境,我建议你想清楚自己的真实场景:
- 考前复习型:需要一份能快速翻查的提纲,保留定义、公式、结论,省略例子的展开过程。
- 日常预习型:需要比原视频更细的笔记,甚至保留老师口述的推理步骤,方便你理解来龙去脉。
- 资料整理型:你在做知识库、做读书笔记、做部门培训归档,需要带时间轴定位到原文,方便回看原视频对应位置。
这个选择会直接影响你后面的提示词设计和输出格式。
以我自己为例,我平时做的是“复习型讲义”,所以我的提示词里明确要求:保留核心概念、公式、结论,省略口语化表达和与主题无关的插科打诨。如果做的是预习型,就反而要保留例子和过渡句,因为那些内容承载了理解逻辑。需求没搞清楚之前,调多少版提示词都像无头苍蝇。
1.3 现成工具和自己搭脚本,怎么选
看到这里你可能会问:剪映能导出字幕、飞书妙记能转写、通义听悟能自动总结,为什么还要自己搭?
拆开看,现成工具确实省事。剪映的语音转文字准确率不错,免费且有客户端;飞书妙记可以自动分离说话人,适合会议场景;通义听悟能直接生成“笔记”,对视频进行摘要和要点提取。对完全不想碰代码的同学,我建议先用这些工具顶一阵,尤其适合单次处理、不追求格式定制的场景。
但现成工具的短板也很明显:输出格式是固定的,你没法让“讲义”按你的知识体系去组织;批量处理几十个视频时,手动上传下载烦到崩溃;最重要的是,你拿不到中间产物——逐字稿——也就没法做进一步处理,比如高频词统计、题目生成、知识点切片。
自己搭脚本,本质上是把“控制权”拿回自己手里。脚本的好处在于:可以批处理、可以自定义输出格式、可以接入任何你想要的模型、可以随时改逻辑。代价是你要花一晚上把环境跑通,而且后续要自己修bug。
我的建议是:先花10分钟明确需求,再决定走哪条路。如果只是每周处理一两个视频、对格式没执念,现成工具完全够用;如果像我一样需要批量处理、定制格式,或者想把讲义喂给其他知识库工具,自建流水线是唯一解。
2. 技术选型与参数解读:转写和总结模型怎么配
2.1 语音转写方案横向对比
语音转写是整个流水线的地基。地基歪了,后面大模型再强也救不回来。目前主流的转写方案有三类,我列个表格方便你直观对比。
| 方案 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 本地开源模型(Whisper系列,如faster-whisper) | 免费、离线可用、数据不出本机、支持批量 | 需要GPU或较长耗时;部署有门槛 | 注重隐私、批量处理、长期使用 |
| 云厂商API(阿里云、讯飞、腾讯等) | 准确率高、速度快、有专人维护 | 按量付费、数据要上传到云端 | 追求效果、不在乎成本、临时用一次 |
| 剪辑工具导出字幕(剪映、必剪等) | 免费、操作简单、准度尚可 | 无法脚本化、格式不自由、批量困难 | 零基础、单次使用 |
我最终选了本地部署 faster-whisper,原因有三:一是免费,二是可以写进Python脚本做批处理,三是课程视频通常不涉密,但自己电脑上的资料也懒得全传云端。如果你的机器没有独立显卡,也可以选云API方案,代码里做一个小封装,后续切换只需要改几行配置。
2.2 内容提炼模型怎么挑
逐字稿拿到之后,负责“归纳”的是大模型。这里的选择比转写模型要灵活得多,关键在三个指标:上下文窗口、中文能力、API成本。
课程视频一节课通常是40分钟到2小时,逐字稿动辄一万字以上。如果你想把整段逐字稿一次性丢进模型,那上下文窗口至少要16k token,否则只能分段喂。中文能力这个不用多说,直接看模型的评测和你的试跑结果,别只看榜单。API成本方面,不同模型价格差异很大,如果批量处理长视频,成本也要算进去。
我当前的主力组合是大参数模型做“结构规划”,小参数模型做“分段润色”。具体来说,第一遍我先把逐字稿全部输入,让它输出一个章节大纲;然后按大纲把内容分段,逐段交给模型详细展开。这样做的好处是,每段文本量小,模型不容易丢信息,而且单次调用费用低。如果你嫌麻烦,也可以一次性让模型输出完整讲义,但输出质量往往不如“先大纲后分写”稳定。
2.3 环境要求与成本估算
先说说我自己机器的配置,给你一个参考坐标:CPU是i5-12400,显卡是RTX 3060 12GB,内存32GB。这个配置跑faster-whisper的small模型,处理一小时的视频大概需要8到12分钟,基本可以接受。如果用的是纯CPU机器,时间会拉到四五倍,但也能跑,就是需要耐心。
大模型API方面的成本,以目前市面主流中文模型来算,处理一小时视频的逐字稿,大概需要1到2万字的内容输入,加上几轮总结输出,总费用基本在几角钱到一元人民币这个量级。比起通义听悟这类服务一次性收你几块钱,自建方案在批量处理时省钱优势非常明显。
关于本地模型再补充一点:不要一上来就上“large”级别的模型。faster-whisper的small模型,中文识别准确率已经相当能打,处理课程这种相对标准的普通话口语完全够了。large模型速度慢、吃显存,收益却很有限。我做批量处理时,常跑的是“small”,只有在处理录音质量很差的老课程时,才切到“medium”以上。
3. 实操全程:从零搭一套自动讲义生成脚本
3.1 环境准备:Python、FFmpeg、Whisper
开始之前,先把该装的东西装齐。我这里假设你用的是Windows系统,macOS和Linux的命令大同小异,路径上稍作调整即可。
第一步,安装Python 3.10以上版本,装的时候记得勾选“Add Python to PATH”。第二步,安装FFmpeg并加入系统环境变量,这是后面所有音视频处理的基础工具,不管你是提取音频、裁剪视频、还是合并字幕,都绕不开它。第三步,用pip安装faster-whisper:
pip install faster-whisper openai这里顺手把openai库也装了,后面调大模型API要用。注意,我用的openai库并不只是适配OpenAI官方服务,现在很多国产大模型都提供了兼容接口,base_url指到对应服务商就行,这点后面会展开。
全部装完,在命令行里输入ffmpeg -version,能显示版本信息就说明环境OK。
3.2 第一步:从视频里干净地抽出音频
很多课程视频是网课平台加密过的,或者封装在MP4容器里但混了多条音轨。抽取音频我习惯直接用FFmpeg,一次性把采样率、声道数、编码格式全部设定好,得到的就是可以直接喂给Whisper的干净文件。
ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 audio.wav这条命令的作用是:读入input.mp4,丢弃视频轨(-vn),把音频编码成16位PCM波形文件(-acodec pcm_s16le),采样率设为16000Hz(-ar 16000),合并为单声道(-ac 1)。
为什么是16000Hz单声道?因为Whisper官方训练数据就是16kHz的单声道音频,这个采样率既能保底语音识别质量,又能显著减小音频文件体积,处理速度也更快。直接用44.1kHz立体声的原始音频也能识别,但速度变慢、显存占用变大,效果几乎没有提升。这是我在本地跑过几轮对比之后的经验值。
3.3 第二步:本地语音转写并保留时间轴
代码层面我推荐用faster-whisper,它是OpenAI Whisper模型的高效实现,支持CTranslate2推理,在相同模型下比原版Whisper提速数倍,显存占用也低不少。
from faster_whisper import WhisperModel model = WhisperModel("small", device="cuda", compute_type="float16") segments, info = model.transcribe( "audio.wav", language="zh", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=500), ) text_parts = [] for segment in segments: text_parts.append( f"[{segment.start:.0f}s-{segment.end:.0f}s] {segment.text.strip()}" ) transcript = "\n".join(text_parts) with open("transcript.txt", "w", encoding="utf-8") as f: f.write(transcript)这里有两个容易被忽略的细节。
第一个是vad_filter=True。VAD(Voice Activity Detection)的作用是自动跳过没人说话的段落。课程视频经常有几十秒的停顿、翻PPT、喝水、大家笑场的片段,开着VAD,转写结果会干净很多,还能避免把环境噪声硬识别成乱七八糟的文字。我试过关掉VAD跑一堂课,结果出现了一堆莫名其妙的“哈哈哈”“嗯嗯”,清理起来很痛苦。
第二个是language="zh"。如果明确知道视频是中文,就把语言写死。不写也行,Whisper会自己检测,但偶尔会在中英夹杂时抽风,给英文翻译一遍再转回来,浪费时间且容易出错。
得到transcript.txt之后,我建议先肉眼扫一眼,确认转写没有大面积错乱,再进入下一步。这个检查步骤花不了两分钟,但能帮你避免把一堆垃圾数据交给大模型。
3.4 第三步:用大模型把逐字稿变成讲义
逐字稿这东西,直接看是能看,但信息密度太低,一眼扫过去全是“然后”“就是”“对吧”。我们真正要做的是把逐字稿变成“可复习的材料”。
我这里的思路是:先让大模型读完整个逐字稿,给出一份“章节大纲”;再按大纲分块,逐块生成讲义的详细正文。
为什么要先有“大纲”再写“正文”?因为课程视频是线性播放的,老师讲到一个知识点时会穿插例子、回顾、提问,信息在时间线上是散乱的。如果让大模型直接从开头按顺序整理,它很容易被口语内容带偏,生成的讲义结构也和PPT脱节。先让它通读全局、生成大纲,等于强制它先“看懂”整堂课的逻辑,再组织内容。
大纲和正文的生成,我推荐拆成两次API调用,这样做的好处是可以单独调每一环节的提示词。下面是调用大模型的示例代码,我用的是兼容OpenAI接口的中文模型:
from openai import OpenAI client = OpenAI( api_key="your-api-key", base_url="https://your-model-provider.com/v1", ) prompt = f""" 你是一位课程助教。请阅读下面的课程逐字稿,先输出一份完整的章节大纲。 要求: 1. 大纲按课程逻辑组织,而不是按时间顺序 2. 每个章节下面用一句话概括该部分的核心内容 3. 课时中出现与主题无关的闲谈,直接忽略 逐字稿: {transcript[:12000]} """ resp = client.chat.completions.create( model="qwen-plus", messages=[{"role": "user", "content": prompt}], temperature=0.3, ) with open("outline.md", "w", encoding="utf-8") as f: f.write(resp.choices[0].message.content)这里transcript[:12000]是我截取逐字稿前12000个字符去做大纲,原因很简单:一次性全量输入太贵,而且大部分模型对超长输入的“注意力”会稀释在后面的内容上,开头和结尾的部分容易被忽略。12000个字符对多数一节课的视频来说足够覆盖完整信息了。
3.5 提示词模板:把“输出讲义”这件事说清楚
大模型能不能给你想要的讲义,提示词比模型本身更关键。我把经过多轮调试的提示词模板分享出来,你拿去直接改改就能用。
你是一位经验丰富的课程讲师。下面是一份课程视频的逐字稿片段,请把它整理成结构清晰的讲义正文。 要求: 1. 使用Markdown格式输出 2. 开篇用一句话概括本段的核心主题 3. 正文分小节,每节一个小标题 4. 重要的定义、公式、结论用加粗标出 5. 老师举的例子只保留一个最有代表性的,其余省略 6. 如果原文有听不清或逻辑跳跃的地方,用[需核对]标出 7. 不要把逐字稿中的口语词(比如“嗯”“啊”“然后”)带进讲义 课程内容: {chunk}有个细节分享给你:temperature参数一定不要调太高。我习惯把temperature设为0.2到0.3,这个范围既能保留一点点表达多样性,又不会让模型自由发挥到偏离原文。你是在整理一份讲义,不是在让它创作散文,温度越高,越容易出现“老师没讲但模型觉得应该讲”的内容。
还有一点,[需核对]这个占位符,很多人嫌麻烦会去掉。但实际用下来,它对复习非常有帮助,因为模型只要遇到听不懂或有遗漏的地方,就会老老实实标记出来,而不是为了显得连贯而瞎编。这些标记点就是你二次回看视频时需要重点确认的地方,相当于AI帮你做了一份“个性化错题本”。
生成完后,把大纲和正文拼在同一个Markdown文件里,一份讲义就算成型了。我习惯的拼法是大纲放最上面,正文按章节依次向下排,编号对齐大纲。这样打印出来或者导入Notion,都能直接当复习资料用。
4. 常见问题与排查技巧实录
4.1 转写结果错字连篇,怎么救
转写出错,先冷静排查原因,别急着换模型。八成是以下三类问题:
第一,音频质量太差。远程网课音质本身就容易发闷,视频里还常常混着背景音乐。对策是在FFmpeg阶段先做一次轻量音频降噪,比如用-af "highpass=f=100,lowpass=f=8000"过滤掉无关频段,能明显提升识别率。
第二,说话人重叠。两个老师讨论问题时,Whisper对重叠语音的处理能力有限,转写结果往往变成一人说话被截成几段。这个问题目前没有太好的自动解,我做的是让大模型在整理讲义时忽略语气词和重复语句,尽量减少影响。
第三,专业名词和英文缩略语。这一点是课程场景最头疼的。转写模型经常把课堂上的英文术语、项目代号、人名听成同音汉字。我目前采取的办法是:准备一个自定义词典,在转写后做一次字符串替换,把常见错词映射回正确写法。比如把“API”被听成“诶屁爱”的时候,直接替换回“API”。这个办法不完美,但对高频词很有效。
4.2 长视频跑到一半中断
如果你的视频超过1小时,转写过程在中间突然报错退出,大概率是显存不够,或者Python进程被系统杀掉了。我第一个长视频就踩过这个坑,报错信息五花八门,最后发现是12GB显存不够跑medium模型加长音频。
解决方案有几条路:
- 切分音频。用FFmpeg把60分钟的音频切成两段30分钟,每段单独转写,最后合并结果。这个方案最省事,我一直在用。
- 换更小的模型。small不行就换base,但识别准确率会下降。
- 开VAD过滤静音,减少无效音频长度,间接降低显存压力。
分段转写时注意接缝位置的处理,最好在静音段切,直接在20分钟或30分钟处硬切也行,只是接缝附近偶尔会丢一两个字,对讲义影响不大。
4.3 模型总结得太空,不像讲义
试过几轮的朋友应该都有同感:大模型生成的讲义,有时候“像百科词条”多过“像课堂笔记”。它会把每个概念都解释得四平八稳,但你看完还是不知道老师这节课到底强调的重点是什么。
这个问题的根源在于提示词里没有告诉模型“优先级”。课堂讲义和Wiki词条的区别在于,老师花20分钟讲的难点和花1分钟提的名词,分量完全不同。我后来在提示词里加了一条规则:“根据逐字稿中花费的篇幅比例,确定知识点详略。老师重点展开的部分详细书写,一笔带过的部分只保留结论。”效果立竿见影。
另外,如果逐字稿太长,大模型在总结时会趋向于“均匀分配注意力”,每个段落都写得不痛不痒。这时我会把逐字稿按章节预先切分,每段单独生成,最后用大纲拼装。分段操作让模型在生成每个章节时都能聚焦在局部内容上,详略判断比全局生成准得多。
4.4 耗时太长,想压缩时间
自建流水线的最大短板是耗时。一小时的视频,抽取音频大约1分钟,转写可能要10分钟,大模型API调用又要几分钟,虽然不是完全不能接受,但批量处理时确实会让人烦躁。
我实测有效的提速方案有三个:
- 转写模型用small或base,不要迷信大模型。这一点前面提过,再强调一次,因为很多朋友就是卡在这。
- 用GPU推理而不是CPU。有NVIDIA显卡的记得装CUDA版PyTorch,转写速度差五倍以上是常事。
- 大模型API并行调用。大纲一定好之后,各章的详写任务互相独立,用Python的多线程或asyncio同时发起多个API请求,总体耗时能压到原来的三分之一左右。
我踩过一次大坑,就是并行调用API时触发了服务方的限流,导致一批请求被拒。后来加了简单的重试机制,遇到限流就sleep几秒再试。这段逻辑代码很简单,不赘述了,但各位记住:跑大批量任务前,一定先看一眼服务商的速率限制文档。
5. 我踩过的一些坑和后续想法
5.1 时间轴到底要不要保留
一开始我的转写脚本会保留每个段落的时间戳,但生成的讲义里没放时间戳。后来发现,复习时想回看老师原话,得翻回逐字稿,按时间戳去定位,很麻烦。
改进的思路是:让大模型在输出讲义时,对每个章节标题和重要定义后面,追加上对应的原始视频时间区间。比如一个标记[12:34-15:20],你看到的知识点能在哪段时间里找到,一目了然。这样做复习时直接从讲义跳到视频,效率高很多。
但也别把所有时间戳都堆在正文里,那会破坏阅读节奏。只标章节级的时间区间就够。这个思路对大段视频尤其适用,建议你试一次就知道多省事。
5.2 图片和公式这块怎么补
课程视频里的PPT截图、手写公式,是纯语音转写方案完全覆盖不到的内容。逐字稿只转述了老师说的话,但很多老师会说“这个公式推导过程大家看PPT”,然后就不念了,讲义里公式就缺了。
我的临时方案是遇到公式密集的课程(比如数学、物理、机器学习),在生成讲义后手动把PPT截图插进对应位置。虽然手动,但比从头抄笔记还是快好几倍。更深度的方案是把视频在关键帧抽帧,用OCR识别PPT文字,再和逐字稿合在一起丢给大模型,这是后续可以继续玩的方向。
5.3 下一版想做的事
我现在这套脚本已经跑了两三个月,稳定处理了几十个课程视频。下一步打算做两件事:一是把“讲义”再往前推一步,直接生成配套的思维导图文本文件,导入XMind就能用;二是加入更多课程类型的适配,让提示词能根据科目自动切换,比如理工科多保留公式推导,文科类多保留案例解读。
不过这些都是锦上添花。对于还没跑通第一版的朋友,我的建议特别简单:先拿一个20分钟的短视频,把整条流水线跑一遍,别管效果多粗糙,跑通一次之后,后面所有优化都有抓手了。
最后分享一个实际操作中的体会:这套方案用久了之后,最值钱的不是它生成的讲义,而是“逐字稿”。讲义读几遍就丢一边了,但逐字稿是原始素材,可以反复拿去做各种加工——生成错题、做知识问答、抽题目,甚至喂给本地知识库。所以无论你选哪套工具链,一定把逐字稿单独存一份,这玩意儿的复用价值极高。