一段录音在本机转成带时间的文字,再交给 Codex 改成口播稿
本机转写faster-whisper 是 SYSTRAN 用 CTranslate2 重写的 Whisper 语音转写库,MIT 协议。它不带界面:装上之后用几行 Python,就能把录音转成一句一句、带开始和结束时间的文字。
推理走 CTranslate2,同一类模型比原版 Whisper 更快,也更省内存。8-bit 量化在 CPU 和 GPU 上都能用。和原版不一样,它不用另外安装系统里的解码器,音频解码交给 Python 包 PyAV,安装时会带上所需的库。
转写只负责「听见什么」。删掉嗯啊和口误、改同音字和专有名词、按封面 / 效果演示 / 使用方法 / 结尾拆成口播稿,交给 Codex。把你满意的旧稿和这些规矩写进项目里的 AGENTS.md,之后直接说人话就行。
| 项目 | 说明 |
|---|---|
| 输入 | 常见音频,例如 mp3、wav、m4a、flac。视频要先抽出音轨再转 |
| 适用类型 | 语音备忘、直播回放、访谈、播客、课程录音 |
| 输出 | 按句的文字,带起止时间;打开词级时间后能对到每个词。静音过滤可去掉没人说话的部分 |
| 语言 | 沿用 Whisper 的多语识别。中文建议把 language 设为 zh,不写则自动检测 |
| 规格 | 模型名可用 tiny、base、small、medium、large-v3、distil-large-v3、turbo。第一次用某个模型会下载权重 |
| 环境 | 建议配置 |
|---|---|
| 操作系统 | Windows、Linux、macOS 都可以 |
| 运行环境 | Python 3.9 或更高 |
| 硬件 | NVIDIA 显卡走 GPU 时,需要 CUDA 12 和 cuDNN 9。官方在 RTX 3070 Ti 8GB 上测 large-v2、fp16,显存大约 4525MB |
| 没有独显 | 改用 CPU,compute_type 用 int8。官方在 i7-12700K、8 线程、small 模型上,转 13 分钟音频大约 1 分 42 秒,内存大约 1477MB |
| 关键依赖 | pip 安装 faster-whisper 即可。解码库随 PyAV 一起装,不用再装系统里的 ffmpeg |
在 GitHub 搜索 SYSTRAN 的 faster-whisper,或直接用下面这一条。装的是 PyPI 上的发行版。
pip install faster-whisper
把 memo.m4a 换成你的录音。segments 是生成器,写进 for 循环才会真正开始转写。只写到 transcribe 那一行,程序会马上结束,一个字都没有。
from faster_whisper import WhisperModel
model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe("memo.m4a", beam_size=5, language="zh")
print(info.language, info.language_probability)
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
常用参数:
| 参数 | 作用 |
|---|---|
模型名 | tiny / base / small / medium / large-v3 / distil-large-v3 / turbo。要质量用 large-v3,要速度用 distil-large-v3 或 turbo,没显卡先用 small |
device | cuda 或 cpu |
compute_type | GPU 用 float16;GPU 想再省显存用 int8_float16;CPU 用 int8 |
beam_size | 束搜索宽度,这里默认 5。和别的实现比速度时要设成同一个值 |
language | 中文写 zh。不写就自动检测语种 |
word_timestamps | 设为 True 后,每句里的每个词也带起止时间 |
vad_filter | 设为 True 用 Silero 去掉没人说话的部分。默认只去掉长于 2 秒的静音,批量转写默认就开着 |
确认 CUDA 12 和 cuDNN 9 已经装好再改这两处。large-v3 第一次运行会下载权重,体积比 small 大不少。
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
开静音过滤,并把每条结果写成同名的 txt。词级时间把 word_timestamps 设为 True,再去读 segment.words。
from pathlib import Path
out = Path("transcripts")
out.mkdir(exist_ok=True)
for audio in Path("recordings").glob("*.m4a"):
segments, info = model.transcribe(str(audio), language="zh", vad_filter=True)
text = "".join(segment.text for segment in segments)
(out / (audio.stem + ".txt")).write_text(text, encoding="utf-8")
同一条很长的音频想再加快,可以用官方的批量推理。它和普通 transcribe 的用法一样,多一个 batch_size。批量转写默认会开静音过滤。
from faster_whisper import WhisperModel, BatchedInferencePipeline
model = WhisperModel("turbo", device="cuda", compute_type="float16")
batched = BatchedInferencePipeline(model=model)
segments, info = batched.transcribe("memo.m4a", batch_size=16)
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
转写稿还不是口播稿。把一两篇你满意的旧稿发给 Codex,让它把格式写进 AGENTS.md,至少写清这几条:
口播稿只保留口播。按封面、效果演示、使用方法、结尾分场。
每场标题写上估好的秒数,超了就删句子,不要硬凑。
删掉嗯、啊、重复句和说错又改口的部分。
专有名词以旧稿为准。写 skills,不要写成技能。
下面是官方 README 里的实测,不是宣传口径。同一段 13 分钟音频,large-v2 模型,beam size 都是 5。GPU 测试用 CUDA 12.4、RTX 3070 Ti 8GB。
| 跑法 | 时间 | 显存 / 内存 |
|---|---|---|
| faster-whisper,GPU,fp16 | 1 分 03 秒 | 4525MB |
| faster-whisper,GPU,fp16,batch_size=8 | 17 秒 | 6090MB |
| faster-whisper,GPU,int8 | 59 秒 | 2926MB |
| openai/whisper,GPU,fp16 | 2 分 23 秒 | 4708MB |
CPU 用的是 small 模型、8 线程、Intel i7-12700K,转的仍是这 13 分钟。
| 跑法 | 时间 | 内存 |
|---|---|---|
| faster-whisper,int8 | 1 分 42 秒 | 1477MB |
| faster-whisper,int8,batch_size=8 | 51 秒 | 3608MB |
| openai/whisper,fp32 | 6 分 58 秒 | 2335MB |
模型一类,推理引擎换成了 CTranslate2。官方同一段 13 分钟音频、large-v2、GPU fp16:faster-whisper 1 分 03 秒,原版 2 分 23 秒。
不用。原版 Whisper 要系统里有 ffmpeg,这个库用 PyAV 解码,安装包里已经带了库。
能。device 用 cpu,compute_type 用 int8,模型先选 small。核显和苹果芯片也走这条 CPU 路径。
GPU 路径需要 CUDA 12 和 cuDNN 9。CUDA 11 要把 ctranslate2 降到 3.24.0;CUDA 12 但 cuDNN 还是 8,降到 4.4.0。Linux 可以用 pip 装 nvidia-cublas-cu12 和 nvidia-cudnn-cu12,并设置库路径。Windows 按 NVIDIA 的文档安装,或把社区整理好的库放进 PATH。暂时搞不定就改回 CPU。
多半在下载模型权重。large-v3 比 small 大很多。想先看结果,把模型名改成 small。已经下过的模型可以传本地目录,不必每次都下。
转写负责听写,不负责改稿。同音字和专有名词交给 Codex,拿你的旧口播稿对照着改。这一步不要指望转写模型自己改对。
要听写质量用 large-v3。要更快用 distil-large-v3 或 turbo。没有独显用 small 加 int8。英文材料可以试 distil-large-v3,并把 language 设为 en。
segments 是生成器。transcribe 返回之后转写还没开始,要放进 for 循环,或者用 list(segments) 收齐,才会真正跑。
让 Codex 执行 pip install faster-whisper。再把旧稿和分场规矩写进 AGENTS.md。之后说:把这个文件夹里的录音都改成口播稿,每条一分钟以内,专有名词照旧稿来。
MIT 协议。可以放进商业项目,也可以再分发。分发时保留版权声明和许可声明。