AutoCut: 通过字幕剪辑视频
AutoCut 可以为你的视频自动生成字幕。然后你选择要保留的句子,AutoCut 会裁剪视频中相应的片段并保存。你无需使用视频编辑软件,只需编辑文本文件即可完成剪辑。
2024年3月10日更新:支持通过pip安装,并提供导入转录相关功能
# 安装
pip install autocut-sub
from autocut import Transcribe, load_audio
2023年10月14日更新:支持faster-whisper和指定依赖(但由于Action限制暂时移除了faster-whisper的测试运行)
# 仅安装whisper
pip install .
# 安装whisper和faster-whisper
pip install '.[faster]'
# 安装whisper和openai-whisper
pip install '.[openai]'
# 安装所有
pip install '.[all]'
# 使用faster-whisper
autocut -t xxx --whisper-mode=faster
# 使用openai api
export OPENAI_API_KEY=sk-xxx
autocut -t xxx --whisper-mode=openai --openai-rpm=3
2023年8月13日更新:支持调用Openai Whisper API
export OPENAI_API_KEY=sk-xxx
autocut -t xxx --whisper-mode=openai --openai-rpm=3
使用示例
假设你录制的视频保存在2022-11-04/
文件夹中。运行以下命令:
autocut -d 2022-11-04
提示:如果你使用OBS录屏,可以在"设置->高级->录像->文件名格式"中将空格改为"/",即
%CCYY-%MM-%DD/%hh-%mm-%ss
。这样视频文件将保存在以日期命名的文件夹中。
AutoCut会持续处理该文件夹中的视频,进行字幕提取和剪辑。例如,你刚完成一个视频录制,保存为11-28-18.mp4
。AutoCut会生成11-28-18.md
。在其中选择需要保留的句子后,AutoCut将剪辑出11-28-18_cut.mp4
,并生成11-28-18_cut.md
来预览结果。
你可以使用任何Markdown编辑器。我常用VS Code和Typora。下图展示了使用Typora编辑11-28-18.md
的界面。
全部完成后,在autocut.md
中选择需要拼接的视频,AutoCut将输出autocut_merged.mp4
和相应的字幕文件。
安装
首先安装Python包:
pip install git+https://github.com/mli/autocut.git
本地安装测试
git clone https://github.com/mli/autocut
cd autocut
pip install .
上述命令会安装pytorch。如果你需要使用GPU运行,且默认安装的版本不匹配,可以先安装Pytorch。如果安装Whisper遇到问题,请参考官方文档。
另外需要安装ffmpeg:
# Ubuntu或Debian系统
sudo apt update && sudo apt install ffmpeg
# Arch Linux系统
sudo pacman -S ffmpeg
# MacOS使用Homebrew (https://brew.sh/)
brew install ffmpeg
# Windows使用Scoop (https://scoop.sh/)
scoop install ffmpeg
Docker安装
首先将项目克隆到本地:
git clone https://github.com/mli/autocut.git
安装CPU版本
进入项目根目录,然后构建docker镜像:
docker build -t autocut .
运行以下命令创建docker容器即可使用:
docker run -it --rm -v E:\autocut:/autocut/video autocut /bin/bash
其中-v
将主机存放视频的文件夹E:\autocut
映射到虚拟机的/autocut/video
目录。E:\autocut
是主机存放视频的目录,需修改为你自己主机存放视频的目录。
安装GPU版本
使用GPU加速需要主机有Nvidia显卡并安装好相应驱动。然后在项目根目录执行以下命令构建docker镜像:
docker build -f ./Dockerfile.cuda -t autocut-gpu .
使用GPU加速时,运行docker容器需添加参数--gpus all
:
docker run --gpus all -it --rm -v E:\autocut:/autocut/video autocut-gpu
更多使用选项
转录某个视频生成.srt
和.md
结果
autocut -t 22-52-00.mp4
-
如果对转录质量不满意,可以使用更大的模型,例如:
autocut -t 22-52-00.mp4 --whisper-model large
默认是
small
。更好的模型是medium
和large
,但建议使用GPU以获得更快的速度。也可以使用更快的tiny
和base
,但转录质量会下降。
剪辑某个视频
autocut -c 22-52-00.mp4 22-52-00.srt 22-52-00.md
-
默认视频比特率是
--bitrate 10m
,你可以根据需要调整。 -
如果不习惯Markdown格式文件,也可以直接在
srt
文件中删除不需要的句子,剪辑时不传入md
文件名即可。即autocut -c 22-52-00.mp4 22-52-00.srt
-
如果只有
srt
文件,编辑不方便可以使用以下命令生成md
文件,然后编辑md
文件即可,但此时会完全按照srt
生成,不会出现no speech
等提示文本。autocut -m test.srt test.mp4 autocut -m test.mp4 test.srt # 支持视频和字幕顺序颠倒 autocut -m test.srt # 也可以只传入字幕文件
一些小提示
- 讲话流利的视频转录质量会更高,这是因为Whisper训练数据分布的缘故。对于一个视频,你可以先粗略选择一些句子,然后在剪辑出来的视频上再进行一次剪辑。
- 最终生成的视频字幕通常还需要做一些小编辑。但
srt
文件中空行太多。你可以使用autocut -s 22-52-00.srt
来生成一个更紧凑的版本22-52-00_compact.srt
,方便编辑(这个格式不合规范,但编辑器,如VS Code,仍会进行语法高亮)。编辑完成后,使用autocut -s 22-52-00_compact.srt
转回正常格式。 - 用Typora和VS Code编辑Markdown都很方便。它们都有相应的快捷键来标记一行或多行。但VS Code的视频预览似乎有些问题。
- 视频是通过ffmpeg导出的。在Apple M1芯片上它无法使用GPU,导致导出速度不如专业视频软件。
常见问题
-
输出是乱码?
AutoCut默认输出编码是
utf-8
。确保你的编辑器也使用utf-8
解码。你可以通过--encoding
指定其他编码格式。但注意生成字幕文件和使用字幕文件剪辑时的编码格式需要一致。例如使用gbk
:autocut -t test.mp4 --encoding=gbk autocut -c test.mp4 test.srt test.md --encoding=gbk
如果使用了其他编码格式(如
gbk
等)生成md
文件并用Typora打开后,该文件可能会被Typora自动转码为其他编码格式。此时再通过生成时指定的编码格式进行剪辑可能会出现编码不支持等报错。因此可以在使用Typora编辑后,再通过VS Code等修改为你需要的编码格式并保存,然后再使用剪辑功能。 -
如何使用GPU来转录?
当你有Nvidia GPU,并且安装了对应版本的PyTorch时,转录会在GPU上进行。你可以通过以下命令查看当前是否支持GPU:
python -c "import torch; print(torch.cuda.is_available())"
否则,你可以在安装AutoCut前手动安装对应的GPU版本PyTorch。
-
使用GPU时报错显存不够。 whisper 的大模型需要一定的 GPU 显存。如果你的显存不够,你可以使用小一点的模型,比如
small
。如果你仍然想用大模型,可以通过--device
来强制使用 CPU。例如:
autocut -t 11-28-18.mp4 --whisper-model large --device cpu
-
能不能使用
pip
安装?whisper 已经发布到 PyPI 了,可以直接用
pip install openai-whisper
安装。
如何参与贡献
这里有一些想做的功能,欢迎贡献。
代码结构
autocut
│ .gitignore
│ LICENSE
│ README.md # 一般新增或修改需要让使用者知道就需要对应更新 README.md 内容
│ setup.py
│
└─autocut # 核心代码位于 autocut 文件夹中,新增功能的实现也一般在这里面进行修改或新增
│ cut.py
│ daemon.py
│ main.py
│ transcribe.py
│ utils.py
└─ __init__.py
安装依赖
开始安装这个项目所需的依赖之前,建议先了解一下 Anaconda 或者 venv 的虚拟环境使用,推荐使用虚拟环境来搭建该项目的开发环境。 具体安装方式为在你搭建的虚拟环境中按照上方安装步骤进行安装。
为什么推荐使用虚拟环境开发?
一方面是保证各种不同的开发环境之间互相不污染。
更重要的是在于这个项目实际上是一个 Python 包,所以在你安装之后 AutoCut 的代码实际也会变成你的环境依赖。 因此在你更新代码之后,你需要将新代码重新安装到环境中,然后才能调用到新的代码。
开发
- 代码风格目前遵循 PEP-8,可以使用相关的自动格式化软件完成。
utils.py
主要是全局共用的一些工具方法。transcribe.py
是调用模型生成srt
和md
的部分。cut.py
提供根据标记后md
或srt
进行视频剪切合并的功能。daemon.py
提供的是监听文件夹生成字幕和剪切视频的功能。main.py
声明命令行参数,根据输入参数调用对应功能。
开发过程中请尽量保证修改在正确的地方,以及合理地复用代码,
同时工具函数请尽可能放在 utils.py
中。
代码格式目前是遵循 PEP-8,变量命名尽量语义化即可。
在开发完成之后,最重要的一点是需要进行测试,请保证提交之前对所有与你修改直接相关的部分以及你修改会影响到的部分都进行了测试,并保证功能的正常。
目前使用 GitHub Actions
CI, Lint 使用 black,提交前请运行 black
。
提交
- commit 信息用英文描述清楚你做了哪些修改即可,小写字母开头。
- 最好可以保证一次的 commit 涉及的修改比较小,可以简短地描述清楚,这样也方便之后有修改时的查找。
- PR 的时候 title 简述有哪些修改,contents 可以具体写下修改内容。
- 运行测试
pip install pytest
然后pytest test
- 运行 lint
pip install black
然后black .