51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【生成视频双语字幕-项目实战】手把手教你利用whisper +Qwen1.5_110B+FFmpeg来实现,效果惊艳,干货满满!

今天给大家分享一个实操项目[给视频自动生成双语字幕],手把手教你利用 whisper +qwen1.5_110B大模型+ffmpeg 来给视频添加英文字幕,效果惊艳!干货满满!当然你可以翻译成其他语言(日语或者韩语等等),思路大同小异。下面进入今天的主题~

本文目录

  • 第一步: 准备短视频素材

  • 第二步: 利用whisper来对电影的声音提取对应的字幕

    • whisper 网络结构介绍

    • whisper 命令行用法介绍

    • 利用whisper的large模型来识别素材视频中的中文语言

    • 利用whisper的large模型来翻译素材视频中的中文语言为英文

  • 第三步: 利用大模型来进行翻译添加其他语音字幕

    • Qwen1.5_110B大模型来扮演翻译官

    • 之前whisper的large模型识别出的中文的内容

    • 搭建Qwen1.5_110B来扮演翻译官进行推理测试

  • 第四步: 解析字幕文件中的中文翻译成英文

  • 第五步: 利用FFmpeg来将新生成的字幕合并到视频中

    • 给原视频添加字幕

    • 调整英文字幕显示的位置

  • 参考文档

第一步: 准备短视频素材

首先我们需要随便找一个短视频作为素材(我在B站上随便找了一个),进行下载:

!you-get --format=dash-flv480-AVC https://www.bilibili.com/video/BV1Js411a75q/
!cp *.mp4 ./demo.mp4

原始的视频是对<九人禁闭室>电影进行中文二次解说:为了便于效果展示,利用ffmpeg来剪切前30秒的视频;

!ffmpeg -i demo.mp4  -ss 0 -to 30 -c copy output.mp4

最终输出的剪切后的视频用于展示(只有前30秒):

可以看出原视频是中文解说视频,只有中文字幕;我现在想添加对应的英文字幕该怎么办呢~,当然你也可以用各大平台软件来手动操作,今天给大家利用whisper+qwen系列大模型来实现这一过程~

第二步: 利用whisper来对电影的声音提取对应的字幕

whisper 网络结构介绍

Whisper架构是一种简单的端到端方法,实现为编码器-解码器变换器(Transformer),如图。输入的音频被分割成30秒的块,转换成对数Mel频谱图,然后传递给编码器。解码器被训练用来预测相应的文本标题,其中夹杂着特殊标记,这些标记指导单一模型执行诸如语言识别、短语级时间戳、多语种语音转录以及英语语音翻译等任务。

whisper 命令行用法介绍

之前给大家介绍过whisper利用权重加载的方式来进行语音识别【3.26M次下载,2.7k次点赞】OpenAI开源Whisper-large-v3语音识别模型权重,错误率大幅下降,效果惊艳!

今天介绍另外一种模式whisper使用命令行模式来处理语音和视频数据,其底层模型调用跟上文提供的权重模型参数是一致的。

whisper 支持的模型版本

下面是whisper各个模型版本的参数信息以及支持语言的能力。模型参数量越大,模型的效果越好,但是占用的内存也是越多。

安装whisper相关的包和环境配置

!pip install -U openai-whisper setuptools-rust
!sudo apt update && sudo apt install ffmpeg -y

whisper最终整体命令行运行常见参数如下:

!whisper  your_audio.mp3 -- 输入你的音频和视频
-task  transcribe # 指定转录方式,默认使用 transcribe 转录模式, translate 则为 翻译模式,目前只支持翻译成英文。
--model large # 指定使用模型,默认使用 --model small
--language zh# 指定转录语言,默认会截取 30 秒来判断语种;https://github.com/openai/whisper/blob/main/whisper/tokenizer.py
--output_format srt #指定字幕文件的生成格式,txt,vtt,srt,tsv,json,all
-- output_dir ./audio_asr # 指定字幕文件的输出目录,不设置默认输出到当前目录下。

下面我给大家实操一下,自动语音识别样本视频中的中文输出对应的字幕;为了更好的展示效果,我这里采用whisper的large模型来进行测试。

利用whisper的large模型来识别素材视频中的中文语言

!whisper output.mp4  --model large --output_format srt

可以看出whisper的large模型识别素材视频的中文,生成的中文字幕结果几乎完全正确。效果非常惊艳!

利用whisper的large模型来翻译素材视频中的中文语言为英文

!whisper output.mp4  --model large --output_format srt --task translate --output_dir ./audio_asr

嗯,可以看出在将中文翻译成英文这块,whisper的large模型版本效果还是不够好,其中对应的时间戳和英文翻译都不太对应的上。

第三步: 利用大模型来进行翻译添加其他语音字幕

由于whisper的large模型在语音翻译成英文这块效果不好,因为我决定用大模型来对识别出来的中文字幕进行翻译成英文。

Qwen1.5_110B大模型来扮演翻译官

Qwen系列的大模型,之前给大家分享过Qwen2、Qwen-Agent重磅开源!!实操部署Qwen2-7B模型推理效果展示&&语音展示,不愧是大厂出品!!

当然你可以用最新开源的Qwen2_7B大模型来进行推理实现翻译, 需要本地部署,下载权重推理,可以参考上面的文章;

由于更好的体验效果,我决定给大家展示Qwen1.5_110B的大模型来扮演翻译官进行推理预测;

之前whisper的large模型识别出的中文的内容

!cat output.srt

搭建qwen1.5_110B来扮演翻译官进行推理测试

system_prompt= """
你是一名翻译专家,特别擅长将中文翻译成地道的英文表达,我将给出中文的语句,你直接输出对应的英文地道翻译。
不需要输出其他无关的语言。
"""
response = client.chat.completions.create(
    model="QWEN/QWEN1.5-110B-CHAT",
    messages=[ {"role": "system", "content": system_prompt},
              {"role": "user", "content": "你是谁?你能干什么"}],
)
print(response.choices[0].message.content)

输出的结果:

Who are you and what can you do?

可以看出测试,没有问题~

第四步: 解析字幕文件中的中文翻译成英文

上面我们测试通利用qwen1.5_110B来实现中文翻译成英文,下面我们只需要编写一个脚本将字幕送进大模型中进行依次翻译,但是需要保存格式一致,对应的部分代码如下:

with open("output.srt", "r") as f:
    result = f.read()
result = result.split("\n")
total_size = len(result)
from tqdm import tqdm
import time
for index in tqdm(range( int(total_size/4))):
    tmp= result[2+4*index]
    response = client.chat.completions.create(
        model="QWEN/QWEN1.5-110B-CHAT",
        messages=[ {"role": "system", "content": system_prompt},
                  {"role": "user", "content":tmp}],
    )
    output = response.choices[0].message.content
    result[2+4*index]=  output
    time.sleep(1)
with open("finally_ast.srt","w") as f:
    f.write("\n".join(result))
!cat finally_ast.srt

运行的效果展示:生成的英文字幕

第五步: 利用ffmpeg来将新生成的字幕合并到视频中

给原视频添加字幕

!ffmpeg -i output.mp4 -vf "subtitles=finally_ast.srt" \
    -c:a copy release_with_srt.mp4 -y

运行发现出现错误:

Too many packets buffered for output stream 0:1.
Conversion failed!

经过排查发现是,该异常抛出的原因是部分视频数据有问题,导致视频处理过快,容器封装时队列溢出。添加该参数后再次执行对应的ffmpeg命令:

!ffmpeg -i output.mp4 -vf "subtitles=finally_ast.srt" -max_muxing_queue_size 1024   -c:a copy release_with_srt.mp4 -y

最终输出的视频效果如下:达到我们的效果,在播放视频的同时显示中英文字幕,但是唯一美中不足的是,原视频中的中文字幕和新添加的英文字幕出现重叠,下面我将调节英文字幕的位置。

调整英文字幕显示的位置

# Alignment=2:底部居中
# MarginV=2:离底部的距离
!ffmpeg -i output.mp4 \
    -vf "subtitles=./finally_ast.srt:force_style='Alignment=2,MarginV=2'" \
    -max_muxing_queue_size 1024 \
    finally_output.mp4 -y

可以看出英文字幕与原视频自带的中文字幕分离开来:

达到我们最终想要的效果,完美~

参考文档

  1. https://api.together.xyz

  2. https://github.com/openai/whisper

  3. https://openai.com/index/whisper/

  4. 素材视频:https://www.bilibili.com/video/BV1Js411a75q/

赞(5)
未经允许不得转载:工具盒子 » 【生成视频双语字幕-项目实战】手把手教你利用whisper +Qwen1.5_110B+FFmpeg来实现,效果惊艳,干货满满!