
最近很多朋友在练英语听力手里攒了一堆英文动画、对话、纪录片片段但能真正坚持学完的很少。原因不复杂原速听不懂手动放慢又费时间生词查起来更打断节奏。这次我们来看一个很实际的问题拿到一段类似《Oh No... Will Dad Get His Idea Back_!》这种慢速英语素材怎么用一套开源工具链把它变成带字幕、带慢速音频、带生词表的完整学习材料。这套流程的重点不是某个端到端的“网红项目”而是几个常用工具的组合ffmpeg 做音视频拆分Whisper 做语音识别字幕Edge-TTS 或本地 TTS 做慢速朗读音频Python 脚本做词汇统计和卡片生成。整个过程可以本地跑通支持 CPU也支持 GPU 加速能批量处理多个视频接口层面也能封装成命令行工具或 HTTP 服务。这篇文章会从环境准备开始逐步带你完成音频提取、字幕生成、慢速音频制作、生词提取和 Anki 卡片生成最后给出一套批量任务脚本和常见问题排查表。如果你想给自己的英语学习素材库搭建一条自动化流水线或者想在本地测试 Whisper 和 TTS 的组合效果这篇文章可以直接收藏。1. 核心能力速览能力项说明项目类型本地音视频处理 ASR 字幕 TTS 朗读 词汇分析工作流核心功能英文视频转慢速学习材料生成字幕、慢速音频、生词表、Anki 卡片推荐硬件CPU 可运行GPU 能显著提升 Whisper 识别速度显存占用根据 Whisper 模型大小而定4G 显存可跑 small 级别更大模型需更多显存需实测支持平台Windows / macOS / Linux启动方式命令行逐条执行或执行批量脚本是否支持 API可封装成 HTTP 服务也可直接命令行调用是否支持批量任务支持按目录批量处理多个视频文件适合场景英语学习者、教育内容制作者、语言教学素材整理这套工作流不绑定某个特定模型真正的核心是把“视频素材”转成“结构化学习数据”。材料中提到的慢速英语视频可以是一段对话、一个小故事或一个教学片段只要本地有音视频文件就能进入这条流水线。2. 适用场景与使用边界这套流程适合谁最典型的是英语学习博主、英语老师、留学生以及想给自己做听力材料的人。输入是一个英文视频或音频输出是字幕文件、慢速音频、词汇表、Anki 卡片整个过程对最终端用户完全透明你只需要把生成好的文件丢到手机或播放器里就能用。几个典型场景把一段动画短片转成逐句慢速跟读材料。把 TED 演讲或纪录片片段转成带中英字幕的精听材料。把教材配套音频转成“先慢速听、再常速听”的练习模式。批量把一个文件夹里的英语素材全部处理成统一格式的学习包。边界也要说清楚这套工作流处理的是你自己拥有版权、已获授权或明确定义为学习用途的素材。不要用它对未经授权的商业视频做二次分发也不要在公开平台随意下载并重新打包发布。涉及人物肖像、特定声音、内部课程内容时更要先确认授权。隐私方面如果本地处理数据不出机器如果调用了云端 TTS 或 ASR则要注意传输内容不能包含敏感个人信息。3. 环境准备与前置条件这里给出一套通用的环境检查清单不写死版本号按你自己的系统情况调整。3.1 操作系统与语言环境Windows 10/11 或 macOS 12Linux 发行版也可以。Python 3.10 或更高版本。建议用虚拟环境隔离依赖避免污染系统 Python。能正常访问 PyPI 等软件源。安装依赖时如果网络不稳定可以考虑换国内镜像源。3.2 必要工具工具作用安装方式ffmpeg音视频拆分、变速、格式转换Windows 下载静态编译版macOS 可用 HomebrewLinux 用 apt 等OpenAI Whisper语音识别生成字幕pip install openai-whisperedge-tts生成自然慢速朗读音频pip install edge-ttsfaster-whisperWhisper 的加速版本CPU/GPU 都可用pip install faster-whisperpysubs2字幕文件解析和转换pip install pysubs2如果你想完全本地跑 Whisper需要把模型文件下载到本地。不同 size 的模型对应不同的显存和速度。模型越大识别质量越好但资源占用也越高。更稳妥的判断是先跑 small 或 base 模型验证流程再决定是否升级到 medium 或 large。3.3 GPU 与驱动Whisper 在 CPU 上也能跑只是速度慢一些。如果你有 NVIDIA 显卡建议先确认驱动和 CUDA 工具链是否正常。可以在命令行里执行nvidia-smi如果能看到显卡信息就说明驱动正常。PyTorch 是否能调用 GPU可以用下面的 Python 代码验证import torch print(torch.cuda.is_available())如果返回False说明 PyTorch 没安装 CUDA 版本需要按 PyTorch 官网的提示重新安装。4. 安装部署与启动方式下面给出一套在 Windows / macOS / Linux 上都适用的安装流程。以项目目录slow_english_pipeline为例。4.1 创建虚拟环境并安装依赖mkdir slow_english_pipeline cd slow_english_pipeline python -m venv venv # Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate激活虚拟环境后安装依赖pip install faster-whisper edge-tts pysubs2 requestsfaster-whisper对 CPU 和 GPU 都支持底层用的是 CTranslate2解码速度明显比原版模型更快。如果你更习惯原版 Whisper也可以直接装pip install openai-whisper4.2 确认 ffmpeg 可用ffmpeg -version如果提示找不到命令需要先安装 ffmpeg。Windows 用户可以从 ffmpeg 官网下载压缩包把bin目录加入 PATH 环境变量。macOS 用户执行brew install ffmpegDebian/Ubuntu 用户执行sudo apt update sudo apt install ffmpeg4.3 启动服务前的准备工作这套工具链没有统一的 Web 界面默认是通过命令行分步执行。如果你希望做成 HTTP 接口后面会给出一个 FastAPI 封装示例。启动前先确认输入文件夹和输出文件夹的结构slow_english_pipeline/ |-- inputs/ # 原始视频或音频文件 |-- outputs/ # 生成的字幕、慢速音频、词汇表 |-- scripts/ # Python 脚本 |-- venv/ # 虚拟环境5. 功能测试与效果验证5.1 测试素材准备把《Oh No... Will Dad Get His Idea Back_!》对应的视频或音频文件放到inputs/目录下。如果没有现成文件也可以先用任意一段英文短视频测试重点不是素材本身而是流程是否走通。为了便于测试建议先用 30 秒到 1 分钟的短音频验证。5.2 从视频中提取音频使用 ffmpeg 提取音频并转换成 16kHz WAV 格式。这一步主要是为了降低 Whisper 的计算量和提升识别稳定性。ffmpeg -i inputs/example.mp4 -ar 16000 -ac 1 outputs/example.wav参数说明-ar 16000设置采样率为 16000 Hz。-ac 1设置单声道。执行成功后在outputs/下会看到example.wav。如果这一步报错先检查 ffmpeg 是否能正确解码输入文件。5.3 Whisper 生成字幕这里以faster-whisper为例。写一个简单的 Python 脚本from faster_whisper import WhisperModel model_size small # tiny/base/small/medium/large-v3 model WhisperModel(model_size, devicecpu, compute_typeint8) segments, info model.transcribe(outputs/example.wav, languageen, vad_filterTrue) with open(outputs/example.srt, w, encodingutf-8) as f: idx 1 for segment in segments: start segment.start end segment.end text segment.text.strip() f.write(f{idx}\n) f.write(f{format_timestamp(start)} -- {format_timestamp(end)}\n) f.write(f{text}\n\n) idx 1 def format_timestamp(seconds): ms int((seconds % 1) * 1000) total_seconds int(seconds) h total_seconds // 3600 m (total_seconds % 3600) // 60 s total_seconds % 60 return f{h:02d}:{m:02d}:{s:02d},{ms:03d}这里的format_timestamp函数在循环之后定义Python 在执行到循环时才调用所以正常运行没问题。如果你输入的是 30 秒音频能在几十秒内生成字幕说明流程正常。如果输入的是长视频建议先开启 GPU 加速否则 CPU 推理会让等待时间明显变长。判断是否成功的标准outputs/example.srt文件存在且非空。字幕时间轴能对应音频内容。文本没有大量乱码或重复。常见失败原因音频文件不是 16kHz WAVWhisper 也能处理但速度会变慢。vad_filterTrue会过滤静音段如果音频太特殊也可以关掉。CPU 推理时 small 模型对 1 分钟音频约需几十秒到几分钟具体取决于 CPU 性能。如果你觉得原版 Whisper 的时间戳不够准也可以用 WhisperX 做词级时间戳对齐但那是另一个工具需要额外安装。5.4 生成慢速英语音频有两种思路一种是用 ffmpeg 对原音频变速另一种是用 TTS 重新朗读文本并输出慢速音频。前者能保留原声但会改变音调需要做变调补偿后者更接近“慢速英语”教学材料的听感适合生成听力和跟读内容。方案一ffmpeg 变速不变调ffmpeg -i outputs/example.wav -filter:a atempo0.8,asetrate44100*0.8,aresample44100,atempo1.0 outputs/example_slow.wav其中atempo0.8表示放慢到原速的 80%。如果你只想要简单变速也可以只保留一个atempoffmpeg -i outputs/example.wav -filter:a atempo0.8 outputs/example_slow.wav注意atempo的有效范围是 0.5 到 2.0。要放到更慢需要串联多个atempo。方案二edge-tts 生成慢速朗读音频Edge-TTS 是微软 Edge 浏览器内置神经语音的封装接口使用简单能直接输出 mp3。edge-tts --voice en-US-JennyNeural --rate-30% --text Oh no, will dad get his idea back? --write-media outputs/example_tts_slow.mp3--rate-30%表示放慢 30%。调整--voice可以选择不同音色。如果想用脚本逐句生成音频并配合字幕切分可以这样写import asyncio import edge_tts async def text_to_speech(text, output_path): tts edge_tts.Communicate(text, voiceen-US-JennyNeural, rate-30%) await tts.save(output_path) asyncio.run(text_to_speech(Oh no, will dad get his idea back?, outputs/example_tts_slow.mp3))判断成功的标准生成的音频能听清、语速明显比原速慢、没有明显吞字或破音。TTS 毕竟是合成音如果想保留原声还是优先用 ffmpeg 变速。5.5 提取生词并生成词汇表用 Python 对字幕文本做词频统计和生词筛选。简单做法是先做小写化、去标点再统计词频最后过滤掉常见停用词。import re from collections import Counter with open(outputs/example.srt, r, encodingutf-8) as f: content f.read() # 去掉字幕行号和空行只保留文本内容 lines [] for line in content.splitlines(): if -- in line or not line.strip() or line.strip().isdigit(): continue lines.append(line.strip()) text .join(lines).lower() words re.findall(r[a-z], text) stopwords {oh, no, will, dad, get, his, idea, back, the, a, an} filtered [w for w in words if w not in stopwords and len(w) 1] counter Counter(filtered) with open(outputs/vocab.csv, w, encodingutf-8) as f: f.write(word,count\n) for word, count in counter.most_common(50): f.write(f{word},{count}\n)这个示例里停用词是手工写的。如果你有真实项目中的词表可以替换成自己的停用词列表。更专业的做法是用wordfreq或cefr-level这类库做词汇分级但那些库的准确性和词库覆盖范围需要额外验证第一次没必要上来就做。5.6 生成 Anki 卡片Anki 支持通过 CSV 或 TSV 导入卡片。我们可以把词汇表再加上原句上下文生成一个适合导入 Anki 的格式。import csv with open(outputs/vocab.csv, r, encodingutf-8) as f: reader csv.DictReader(f) rows list(reader) with open(outputs/anki_cards.tsv, w, encodingutf-8) as f: f.write(Word\tSentence\tTranslation\n) for row in rows: word row[word] # 这里只做示例翻译需要后续用词典接口或自己补充 f.write(f{word}\t{word}\t\n)这个示例不会自动翻译因为自动翻译涉及外部接口和词典质量需要单独验证。你可以手动补充翻译或接一个自己测试过的词典 API。6. 接口 API 与批量任务6.1 批量处理脚本如果你想一次性处理inputs/下的所有视频可以写一个批处理脚本#!/usr/bin/env bash for f in inputs/*.mp4; do base$(basename $f .mp4) echo process $base ffmpeg -i $f -ar 16000 -ac 1 outputs/${base}.wav python scripts/transcribe.py outputs/${base}.wav outputs/${base}.srt done对应的transcribe.py可以复用 5.3 节的代码只需把参数改为从命令行读取。6.2 HTTP API 封装如果不想每次都敲命令行可以用 FastAPI 封装一个简单接口。先安装pip install fastapi uvicorn写一个服务from fastapi import FastAPI, File, UploadFile import shutil import subprocess app FastAPI() app.post(/transcribe) async def transcribe(file: UploadFile File(...)): temp_path temp_input.mp4 wav_path temp_input.wav with open(temp_path, wb) as buffer: shutil.copyfileobj(file.file, buffer) subprocess.run([ffmpeg, -i, temp_path, -ar, 16000, -ac, 1, wav_path], checkTrue) # 这里调用 Whisper 识别脚本把 wav_path 转成 srt 后返回 return {status: ok, message: transcription started} if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8000)启动服务uvicorn api_server:app --host 127.0.0.1 --port 8000调用接口curl -X POST http://127.0.0.1:8000/transcribe \ -F fileinputs/example.mp4这个示例只是演示了接口框架和文件上传处理Whisper 识别部分需要你按 5.3 节的代码补充。批量任务建议在脚本里加日志、按输入文件名自动生成输出文件名并对失败的视频单独记录。7. 资源占用与性能观察Whisper 的资源占用主要取决于模型大小、音频长度和是否使用 GPU。tiny 模型体积小CPU 也能快速跑但识别质量一般。base 模型质量略好CPU 可跑。small 模型在 4G 显存显卡上基本可用速度比 CPU 快很多。medium / large显存占用更高需要自行测试。观察显存占用可以使用nvidia-smi。在 GPU 推理时隔几秒钟执行一次nvidia-smi -l 1就能看到进程占用情况。要注意如果 PyTorch 没有安装 CUDA 版本即使有显卡也会走 CPU 推理。如果你发现推理速度太慢可以先降低模型大小再把音频切成长度较短的片段处理。音频越长Whisper 处理时间越长这是线性关系。TTS 端 Edge-TTS 是调用在线服务的所以本地资源占用不高。ffmpeg 变速是纯 CPU 操作速度很快基本不构成瓶颈。8. 常见问题与排查方法问题现象可能原因排查方式解决方案ffmpeg命令找不到ffmpeg 未安装或未加入 PATH执行ffmpeg -version安装 ffmpeg 并配置 PATHWhisper 识别速度极慢没有启用 GPU 或模型过大查看nvidia-smi和进程日志安装 CUDA 版 PyTorch或换 small/base 模型显存不足运行时报 OOM模型过大或音频过长查看报错堆栈换小模型、切分音频、降低 compute_type 精度edge-tts 报网络错误网络无法访问在线 TTS 服务使用网络工具确认连通性更换网络环境或改用本地 TTS 引擎字幕时间轴不对齐音频采样率或 VAD 过滤影响仔细对比音频内容关闭 VAD或换 WhisperX生成的字幕为空音频无声或语言参数不对播放音频确认内容重新提取音频检查languageen参数接口调用返回 500输入文件格式不对或服务异常查看 Uvicorn 日志和文件格式检查 ffmpeg 是否支持该格式批量脚本中途失败某个视频文件损坏或格式特殊查看脚本输出日志单独处理失败文件跳过或重试9. 最佳实践与使用建议第一次跑这套流程不要用长视频。先用 30 秒的短视频或纯音频把整条链路验证通过再去处理完整课程视频。原因很简单Whisper 的长音频识别时间、字幕格式、TTS 音色都需要先做小规模测试等参数稳定后再上批量任务。文件组织上建议把原始素材、中间音频、字幕、慢速音频、词汇表分开目录存放。这样即使某个步骤失败也不需要重新处理原始视频。批量任务要加日志记录每个文件的处理状态方便定位失败点。接口服务如果开放到局域网要限制访问范围避免别人大量提交任务把机器资源耗尽。涉及版权和合规时优先处理公共版权素材、自己录制的素材、已经购买授权的课程内容。不要因为能自动生成字幕和慢速音频就把所有看到的视频都下载下来处理。声音、肖像、课程内容的授权问题同样要注意用于教学和商业发布之前的确认步骤不能省。10. 总结与下一步这套工作流最值得尝试的点在于它把“找音频 - 听 - 查词 - 做笔记”变成了“放文件 - 执行脚本 - 得到一套学习材料”中间不需要手动剪音频、不需要手动敲字幕、不需要手动做卡片。第一次使用建议先验证 Whisper 字幕生成和 edge-tts 慢速朗读这两个核心环节跑通之后再加入词汇表和 Anki 卡片。最容易踩的坑有三个一是 PyTorch 的 CUDA 版本没装对导致 GPU 不可用二是 ffmpeg 不在 PATH 里导致脚本频繁报错三是直接用大模型跑长视频显存和等待时间都不可控。把这些先解决掉后面的流程会顺畅很多。后续可以继续扩展的方向包括接入本地词典做自动释义、加入句子级对齐和逐句跟读模式、把整套流程封装成 Web 界面或者把处理结果同步到 Anki 间隔重复系统。这套流程的价值不在单一组件而在组合之后形成的自动化能力。建议收藏备用等真正需要处理英语学习素材时直接照着搭一遍。