使用Whisper+Gemini为外语视频添加中文字幕

工作环境

  • 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是秒,可以为负数。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇