工作环境
- Arch Linux计算机
- 待翻译mp4格式视频
- Gemini api key
- NVIDIA显卡
识别和提取字幕
首先,需要从视频文件中,将原始字幕提取出来。如果视频中已经内嵌了字幕,那么直接使用工具提取就是了,但如果没有,就需要使用AI模型来做这件事。
我们使用来自OpenAI的Whisper来做这件事
首先,确保已经安装必备软件包:
# 安装基础依赖
sudo pacman -S python python-pip ffmpeg git base-devel cmake
在Arch Linux中,无法使用pip包管理器,所以需要生成一个python虚拟环境。
注意!由于Arch Linux软件包过新,一些依赖项很可能还没有针对最新的Python版本析出文件,所以需要安装Python的历史版本!
# 创建一个虚拟python环境
python -m venv vosk-env
source whisper-env/bin/activate
如此构建一个虚拟python环境,在其内部可以使用pip包管理器来安装所需依赖。
# 安装 PyTorch with CUDA 支持
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 安装 Whisper
pip install openai-whisper
# 安装 GPU 加速组件
pip install faster-whisper
然后,开始从视频文件中提取字幕,这一步需要使用GPU加速,否则提取速度会非常感人,这就要求你必须拥有一张NVIDIA显卡(必须是NVIDIA!)。
whisper input.mp4 --model medium --output_format srt --output_dir output_dir
如此,将使用 medium 模型,从imput.mp4中提取字幕,作为srt格式的文件输出到output_dir中。这个过程将会用到NVIDIA显卡加速计算,要求至少拥有5GB显存,如果你的显卡没有达到此要求,你可以使用更为迷你的模型,参阅Whisper-models。
至此,字幕提取已经完全结束。
翻译
提取出来的字幕依然是看不懂的鸟语,还不能直接使用,需要将它翻译成人话。
推荐使用srt-ai来翻译字幕文件,要使用srt-ai,你需要准备一个Gemini的API密钥,此处不做赘述。
git clone https://github.com/yazinsai/srt-ai
cd srt-ai
cp .env.example .env.local
# 在.env.local中填入你的Gemini API密钥
npm install
npm run dev
然后,打开浏览器访问http://localhost:3000,通过Web界面上传SRT文件,目标语言选择Simplified Chinese,然后开始翻译。翻译完成后,Web将会自动下载翻译好的文件。
封装视频
我们使用ffmpeg来将字幕嵌入视频中,总的来说,有两种方法,分为硬封装和软封装。
硬封装就是逐帧处理视频,将字幕硬嵌入画面中,好处是兼容性强,只要是个能播放mp4的播放器就可以看到字幕,坏处就是字幕无法自由开关,而且封装时间长,封装后的视频文件如果不额外压缩调优的话,体积会暴涨。
软封装就是利用mp4格式的字幕轨道,将字幕信息放入字幕轨道中,在播放时由播放器负责渲染。好处是灵活且快速,封装时间短,体积不会发生太大的变化,而且字幕可以自由开关,但一些播放器很可能不会去管字幕轨道,导致使用这种播放器时看不到字幕。
硬封装
硬封装也需要使用GPU加速,否则速度也很感人。
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" -c:v h264_nvenc -preset p6 -cq 23 -c:a copy output.mp4
以防你没有NVIDIA GPU(那你是怎么看到这里的?),这里也放纯CPU计算的硬封装方法
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" -c:v libx264 -crf 23 -preset fast -c:a copy output.mp4
软封装
ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=chi output.mp4
如果你发现字幕不同步,可以在input.mp4后面加上 -itsoffset sec来调整偏移量,其中sec是秒,可以为负数。