1、引言
😀平时上下班通勤,有听播客或看视频并做笔记的习惯,边听边记显然效率很低,而且会破坏学习的 连贯性。
所以笔者一般都是想办法捣鼓出 字幕,然后 对关键信息进行浏览和总结, 而且这种处理方式在遇到 进度慢 或 内容枯燥 的学习视频时,效率极高。
音视频字幕提取 或者说 语音识别,两年前写过一篇文章《好家伙 | 自己写一个视频字幕提取工具 - 掘金》,文中实现了三种字幕提取的方案:
- ① 定时提取视频帧 + 裁剪特定区域 + OCR文字识别
- ② 判断是否存在字幕流,是直接提取
- ③ 破解第三方语音转文字APP的API,直接本地脚本批量调用
这里的破解并不是破解了付费接口白嫖!!!掏了98买了两年!!!不过前几个月过期了,按照我的使用频次,续费肯定是不可能的,需要找下替代品。
2、剪映
问了下做短视频的朋友,字幕怎么搞,给我推荐了 剪映专业版,使用方法很简单:把视频或者音频拖到下面,然后点击 识别字幕/歌词:
静待片刻,会出现字幕:
接着点击右上角的 导出,选中 字幕导出,还可以选择字幕的格式:
点击 导出,会生成对应的字幕文件:
能用,但是不支持多个视频的字幕提取(当然也可能是我使用方式不对),像这个冥想的专题视频有76个。一个个搞,得搞到啥时候,需要找一个支持批量提取的工具。
3、Buzz
网上搜了一圈,发现很多人安利了 chidiwilliams/buzz ,基于OpenAI 开源的 Whisper 自动语音识别模型,可以批量将音视频中的内容自动转换为带有时间的字幕,速度极快(模型离线存在本地,转换过程无需联网)。安装方法:
# macOS
brew install --cask buzz
# Windows
下载这个页面里的.exe文件安装:https://github.com/chidiwilliams/buzz/releases/latest
# Linux
sudo apt-get install libportaudio2
sudo snap install buzz
用法很简单,此处以winodws为例,打开软件后,点击 File → Import Media File... 选中要提取字幕的音视频文件:
打开目标目录没找到音视频的话,这里选择:
选完文件会弹窗,然后选择 模型(默认就好) ,视频语言,生成字幕的格式:
第一次转换需要下载模型 (后面不需要),建议打开 科学上网,不然速度会很慢!!!
模型下载完,静待片刻,等待字幕提取完毕:
可以看到速度很快,5个视频加起来1分钟不到就完成了,在视频所在目录下可以看到生成的字幕文件:
格式不喜欢或者要修改字幕内容,还可以双击,重新导出:
打开看下识别效果:
不能看出有部分 错字,以及 繁体字,试试换成更大的模型看看效果,比如这里从 tiny → small
可以看到时间长了不少,但是识别准确率却大幅提升:
如果觉得准确率还不够,可以试下更大的模型,不同级别模型的大小及需要的显存大小要求如下:
笔者的i7 6700k没外置显卡,使用medium卡得一匹,转换时长也延长到快3分钟:
另外,Buzz其实还支持其它模型:
不过Whisper模型基本够用了,感兴趣的读者可以试试其它几个,同类型的工具还有 WhisperDesktop、jhj0517/Whisper-WebUI (需要自己部署到本地,提供网页UI页面)
4、python 调 whisper库
上面的工具其实够用了,但我想打造一条批处理的流水线:
输入一条视频url → 批量下载视频 → 转音频 → 提取字幕 → 结果合并。
还是得用python调下 openai/whisper,使用它需要 python 3.8-3.10 间的版本,确认安装的python版本在此区间,使用 pip命令安装whisper库:
# 下述方式二选一
# ① 下载并安装(或更新到)最新版本的whisper,建议
pip install -U openai-whisper
# ② 从存储库中提取并安装最新的提交及其 Python 依赖项
pip install git+https://github.com/openai/whisper.git
# 要将软件包更新到此存储库的最新版本
pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git
接着需要安装下 ffmpeg 配下环境变量,Windows系统可参考《ffmpeg的安装配置》
然后安装 pyTorch,打开官网 pytorch.org 选择cpu版本,最下面会生成一行pip命令用于安装,直接复制:
比如这里的命令:
pip3 install torch torchvision torchaudio
# 注:没科学上网会下载有可能很慢,可以替换成国内镜像加快下载速度
pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
openai-whisper、torch、ffmpeg 这三个东西都准备好了,接着就可以写代码提取字幕了,先看下命令语法:
参数讲解:
- --task: 指定转录方式,默认使用 --task transcribe 转录模式,--task translate 则为 翻译模式,目前只支持翻译成英文。
- --model:指定使用模型,默认使用 --model small,Whisper 还有 英文专用模型,就是在名称后加上 .en,这样速度更快。
- --language:指定转录语言,默认会截取 30 秒来判断语种,但最好指定为某种语言,比如指定中文是 --language Chinese。
- --device:指定硬件加速,默认使用 auto 自动选择,--device cuda 则为显卡,cpu 就是 CPU, mps 为苹果 M1 芯片。
- --output_format:指定字幕文件的生成格式,txt,vtt,srt,tsv,json,all,指定多个可以用大括号{}包裹,不设置默认all。
- -- output_dir: 指定字幕文件的输出目录,不设置默认输出到当前目录下。
- --fp16:默认True,使用16位浮点数进行计算,可以在一定程度上减少计算和存储开销,可能存在精度丢失,笔者CPU不支持,会出现下述警告,指定它为False就不会出现了,即采用32位浮点数进行计算。
执行命令示例如下:
whisper.exe test.mp4 --language Chinese --model tiny --fp16 False
识别效果:
生成的字幕文件:
好,接着在python代码中调用:
import whisper
if __name__ == '__main__':
model = whisper.load_model("tiny")
result = model.transcribe("test.mp4", fp16=False, language="Chinese")
print(result["text"])
运行结果如下:
Tip:如果运行出现下述错误:
if` '/' in name or '' in name: TypeError: argument of type 'NoneType' is not iterable
可以执行下述命令 卸载whisper 安装openai-whisper:
pip uninstall whisper
pip install openai-whisper
没找到直接生成字幕文件的方法,官方仓库给出的api非常简陋... 这部分估计得自己写代码生成,result的结构:
按需获取字段吧,另外还发现了一个两个有意思的库,感兴趣自取:
- jianfch/stable-ts → 更准确的时间戳,一些常用工具方法封装,如:to_srt_vtt()
- gumblex/zhconv → 中文简繁转换
🤡 对了,有个加快提取速度的小妙招:先用ffmpeg将视频批量转换为音频,再进行字幕提取~
🤣 另外,我还试了下霓虹语字幕提取,识别效果同样很不戳,😍如果再 配合ai翻译,以后看小电影岂不是不用在车牌号后面加上: 中字 了,AI YYDS!!!
参考文献及文中部分图片来源:5 分钟 Whisper 测评,看完没有人比你更懂「语音识别」