课件视频制作技能 是做什么的?
将一课的幻灯片面板转化为完成的教学视频:合成语音朗读旁白,每个卡片、步骤或行正好在语音到达时出现,转场各不相同,轻柔的音效标记每次揭示,钢琴背景音乐在语音下方自动降音,学习者暂停时显示倒计时,关键项获得手绘圆圈,字幕作为单独文件输出,真实的屏幕录制嵌入教程课程。一次一课;运行它,查看它,然后交付。
输入来自lesson-slide-designer技能:slides/<course>/<lesson>/slides.json、<file_name>.pptx和_preview/slide-NN.png。如果缺失,请先构建面板。来自越南语版本 (kieu、loi_doc、_kiem/) 的面板也可读取。
输出在videos/<course>/<lesson>/ (镜像幻灯片路径;否则为<slides folder>/video/):
| 文件 | 说明 |
|---|---|
<file_name>.mp4 | 视频: 1920x1080, 30 fps, H.264, AAC 48 kHz, -16 LUFS |
<file_name>.<lang>.vtt / .srt | 单独的字幕文件,从不烧录 (否则会覆盖幻灯片文字);上传.vtt作为字幕 |
<file_name>.narration.txt | 干净的旁白,每行一个口语节拍;` |
<file_name>.storyboard.json / .md | 事件发生时间:从pptx测量的区域、每行出现的时间、效果、转场、圆圈、缩放、倒计时;.md用于人工审查 |
<file_name>.voice.mp3 + .timeline.json | 旁白及其每行精确的开始和结束时间 (行缓存于.voice.mp3.cache/) |
<file_name>.events.json、.audio.mp3 | 音效事件及三层混音 |
video.json (可选,由你编写) | 每张幻灯片的覆盖设置:揭示行、转场、停留、圆圈、缩放、屏幕录制 |
_check/ | contact-NN.png (成片视频的关键帧)、<file_name>.report.md (测量数据)、voice-review.txt (Whisper审查)、voice-exceptions.txt |
_segments/ | 每张幻灯片渲染一个片段,当该幻灯片未更改时重用 |
工具:Python 3.10+ (需安装python-pptx、numpy、Pillow;opencv-python用于平滑录制,faster-whisper用于语音审查);Node 18+ (需安装puppeteer-core,在assets/engine中运行npm install) 以及Chrome、Chromium或Edge;ffmpeg/ffprobe。语音:Kokoro (pip install kokoro soundfile) 或 VieNeu-TTS,均为Apache 2.0许可且本地运行。如果引擎位于自己的虚拟环境中,请设置KOKORO_PYTHON或VIENEU_PYTHON指向该Python解释器。GPU有助于加速,但不是必需的。
工作流程
步骤0. 读取面板并确定简报
- 读取
slides.json(旁白、制作说明、幻灯片类型) 并查看_preview/contact-sheet.png。如果课程源代码存在,读取它以了解学习者练习和提问的位置。 - 读取
references/video-standards.md(标准:单一主题、脚本、开头-主体-结尾、转场、互动) 和references/motion-and-sound.md(每种幻灯片类型的处理方式,以及为什么视频必须动感但不显得杂乱)。 - 确定:语言和语音 (
slides.json中的language字段;英语默认使用Kokoro的am_michael,女性使用af_heart,其他Kokoro语言根据语音前缀,越南语使用VieNeu);课程是否需要真实的屏幕录制 (任何教授点击、打字或软件的课程:是的,见步骤2);哪些问题幻灯片需要暂停及暂停时长;哪些内容需要圆圈或缩放。旁白已在幻灯片步骤中为文本转语音编写。不要在此处重写教学内容;仅当语音读错单词时修复其发音。
步骤1. 构建故事板并审查
python scripts/storyboard.py slides/<course>/<lesson>/slides.json
读取<file_name>.storyboard.md:每张幻灯片的区域、每行出现的行号、转场、停留、圆圈。对照motion-and-sound.md的第4节检查:第三个卡片在语音到达第三个想法时出现;相邻元素从不共享同一种转场;问题幻灯片停留;类似“circle answer B”的注释应产生一个圆圈。使用video.json(参见templates/video.example.json) 修复并重新运行。“未找到区域”表示幻灯片整体显示:对于image类型可以,对于其他类型请检查pptx。
步骤2. 真实屏幕录制 (操作演示、动手实践和软件课程)
当课程教授操作时,展示真实操作。绝不用截图或模拟页面代替。规则见references/screen-recording.md。简而言之:
- 准备窗口:私密浏览器窗口或干净账户,无通知,侧边栏无真实姓名。在Windows上,运行
python scripts/record_screen.py --list查看窗口标题。 - 录制:
python scripts/record_screen.py videos/<course>/<lesson>/clips/S07-name.mp4 --window "<title>" --seconds 40 --size 1280x720 [--crop-top 90] [--scroll "6:200:4"](在Windows上;其他系统使用OBS或ffmpeg)。你自己通过浏览器工具进行操作,或让用户操作。仅使用--scroll或页面内平滑滚动 (window.scrollBy({top: 200, behavior: 'smooth'})每0.6到0.8秒一次),不要逐段滚动。每次结果后保持静止3到5秒;长结果缓慢滚动 (150到250像素/秒) 以便学习者阅读。 - 每次录制后运行
check_motion.py。如果有跳跃残留:python scripts/smooth_scroll.py <in> <out>,然后再次测量直到归零。检查剪辑顶部条带,查找账户名称和杂项标签页。 - 在
video.json中声明:"S07": {"clip": {"file": "clips/S07-name.mp4", "mode": "frame", "speed": "auto"}}。幻灯片应为image或two-column类型,并带有大画框;将剪辑的第一帧放在上面 (composite_clips.py --first-frame clips/S07-name.mp4 slides/<course>/<lesson>/S07-first-frame.png) 并重建面板,使剪辑淡入时无跳跃感。 - 使用
--extend参数运行make_video.py:当录制时长超过其旁白时,会自动添加静音。切勿将录制速度提高到1.25倍以上。
步骤3. 一条命令渲染
python scripts/make_video.py slides/<course>/<lesson>/slides.json [--extend]
九个步骤:故事板、旁白 (通过gpu_lock.py)、Whisper审查、渲染计划、三层混音、画面 (无头Chrome,逐张幻灯片)、屏幕录制、字幕、最终检查。对于超过3分钟的课程,请在后台运行 (首次渲染大约每分钟视频需要一到两分钟,幻灯片级别的修复只需几秒)。当它停止时:
- 语音审查 (
_check/voice-review.txt):Whisper先整体听一遍,然后仅对可疑行进行重新生成和检查,最多3轮。它会过滤掉Whisper对短词的自身错误、在音乐上虚构的短语,以及第二次、有提示的监听能正确听出的内容;仅对长词、术语、名称或连续多个词停止。监听具体位置 (ffmpeg -ss 1:23 -t 4 -i <voice.mp3> clip.wav)。如果语音错误,在make_voice.py的PRONUNCIATION中添加音标修正 (字幕保持真实拼写) 或更改slides.json中的单词;如果Whisper听错,将单词添加到_check/voice-exceptions.txt。然后使用--from-step 2(缓存行不会被重新生成)。 - 最终检查失败 (
_check/<file_name>.report.md):修复原因 (使用--music-db调整响度、平滑录制以消除跳跃、重新渲染以调整时长) 并从该步骤重新运行。
步骤4. 交付前检查
- 查看
_check/contact-NN.png(每张幻灯片三帧:进入时、稳定时、即将离开时),对照references/quality-checks.md中的检查清单:封面补丁覆盖了文字、缩放裁剪了文字、转场时两张幻灯片同时可见、文字上的倒计时、录制内容超出画框、空白的第一帧。要仔细检查某一时刻:node assets/engine/render.mjs sheet <storyboard.json> <timeline.json> _check/zoom --from 40 --to 46 --every 0.25。 - 聆听两处:前20秒和一处转场 (
ffmpeg -ss 0 -t 20 -i <mp4> -vn test.mp3)。音效可听见但明显低于语音,音乐低沉。 - 使用
video.json或脚本修复,再次渲染 (仅重新渲染更改的幻灯片),再次查看,直到完全通过。在查看最新渲染的接触画面之前,切勿报告视频已完成。
步骤5. 汇报
向用户提供:mp4和vtt路径;实际时长;语音和语速 (每秒词数);幻灯片、效果、暂停;检查报告 (裁决、LUFS、跳跃);合成的录制;添加到发音表或Whisper例外列表的单词;留下的警告及其原因。展示接触画面。
连续多节课
在整个课程中保持相同的语音、音乐音量和音效;各课之间的差异不应超过1.5 LU (比较每份报告的LUFS行)。发音表和Whisper例外列表随时间增长;不要重置。录制文件保存在videos/<course>/<lesson>/clips/中,每次录制使用新文件名。如果面板被拆分为多个主题视频 (V<k>-<name>/slides.json),则逐个子面板进行渲染。
原则
- 标准是固定的 (
video-standards.md):每视频一个主题、脚本、开头-主体-结尾、各部分之间的口语转场、互动。节奏、画面和声音是你发挥创造力的地方。 - 画面和声音互相补充;语音从不直接读取幻灯片。 区域在语音到达时出现;正在被朗读的文字不会移动。
- 与屏幕一致的暂停:说“请暂停视频”的旁白得到3秒停留且无倒计时 (学习者手动暂停;运行中的计时器旁边若出现“60秒”标签会矛盾)。没有这句话的问题幻灯片按照其指定时间暂停,最多60秒,并伴有倒计时。
- 注意力圆圈:对于答案和类似“circle B”的注释,使用明确的圆圈;带有强调词阅读的想法会自动生成一个淡出的圆圈;卡片使用椭圆,行使用圆角框;每张幻灯片最多三个。
- 默认关闭光标。 绘制指针大多数观众会认为是游离的鼠标。在
video.json中设置{"_all": {"cursor": true}}可打开演示风格视频的光标;光标沿曲线移动,在文字外停留,并且决不在标题、章节、关键信息或结束幻灯片上显示。 - 生动但不杂乱:每5到10秒有变化,任何静态内容不超过25秒;但每个画面只有一个焦点,没有旋转或翻转,每分钟最多16个音效,转场音效仅在幻灯片切换时出现,音乐比语音低17到23 dB。
- 语音是人们首先感受到的质量。 不要对拉伸后听感不佳的模型进行时间拉伸 (VieNeu);改用更长的暂停来减慢。Whisper审查不是可选项:发音错误的术语是教学错误。
- 字幕是单独文件,从不烧录。
- 视频阶段不改变内容:不添加新想法,不编造数字。旁白问题应回到课程或幻灯片步骤处理。
- 运行、测量、查看后再交付:响度、跳跃、时长、接触画面。
- 录制就是录制:没有截图代替操作;滚动必须测量平滑度。
- 要添加转场、效果或音效:扩展
assets/engine/video.js、scripts/storyboard.py和references/motion-and-sound.md中的表格,渲染测试,查看,然后使用。
参考资料
references/video-standards.md:音视频学习材料的教学标准,映射到幻灯片类型,以及平台规范 (Udemy等)。references/motion-and-sound.md:区域和动作的推断方式,幻灯片类型表格,运动数字,音轨,video.json语法,如何保持学习者清醒。references/narration-voice.md:Kokoro和VieNeu,语速,发音修正,Whisper审查。references/screen-recording.md:录制窗口,平滑滚动,测量和平滑跳跃,合成,隐私。references/quality-checks.md:最终检查和接触画面检查清单的阈值。templates/video.example.json:每张幻灯片的覆盖设置。