AI助力英语视频学习,轻松实现中英双语字幕与智能总结,效率翻倍!

大模型容器数据库

最近,Winsurf 和 DeepLearning.ai 联合推出了一套关于如何用 AI 高效编程的教学视频(https://www.deeplearning.ai/short-courses/build-apps-with-windsurfs-ai-coding-agents/?utm\_campaign=codeium-launch&utm\_medium=partner&utm\_source=windsurf)。这套课程价值还不错,不仅系统讲解了实际项目开发过程中利用AI协同编程的诸多技巧,还分享了不少 Winsurf 的设计理念和技术原理。看完之后,我对于为何winsurf对项目代码库的理解能力这么优秀的原因有了进一步认知。

picture.image

DeepLearning.ai 网站上经常会有这种质量较高的课程视频,不过,视频一般只有英文字幕,且语速较快,所以对于英语水平一般的同学来说,观看起来有些费劲。我自己也经常因为听不懂或者理解不到位的部分不得不反复回放,查单词,效率实在不高。于是,我周末花了半天时间,用 Winsurf 快速开发了一套工具,可以自动为这些视频加上中英双语字幕,并且还能对视频内容进行总结,帮助提升学习效率。今天就跟大家分享一下实现思路。项目已开源:https://github.com/skindhu/VideoLingua

方案设计

在动手实现之前,我先进行了整体方案设计和模块拆解,确保Winsurf能高效地完成整个工作流。这个过程的思路和模块划分如下图所示,我把整个工作流分成了五个模块,按照时序关系逐个实现:

picture.image

  • 视频下载模块(video_downloader)

对于不同的视频源,下载策略也会有所不同。而且,很多视频源还需要进行鉴权才能下载。为了提高效率,我选择了使用第三方工具来实现自动化下载。这里推荐使用 Downie ,这款工具支持识别各种网站的视频源,而且可以通过交互式方式进行手动鉴权操作,下载起来比较方便。

picture.image

  • 字幕提取模块(subtitle_extractor)
    字幕提取的过程是从源视频中提取出每个时间片对应的字幕内容。这里的实现涉及两步 :首先,利用 ffmpeg 把视频的音频导出成 .wav 文件,然后用 OpenAI 的 Whisper 模型进行语音转文本。Whisper 能根据语音中的停顿自动切分时间片并把语音转成文本,整个过程非常智能。这里注意,Whisper模型有不同的尺寸,影响最终生成的速度和质量,我们可以按需选择:

picture.image

最终生成的字幕文件如下,可以看到,它包含了一系列时间分片,每个时间分片上都有对应转出的字幕文本:

picture.image

  • 字幕翻译模块(subtitle_translator)
    得到了英文字幕后,接下来的问题就是翻译成中文。虽然市面上有很多翻译服务,但对于长视频而言,翻译字幕面临的挑战也不少。比如,如果按照每个时间片去调用翻译服务,可能会导致短时间内调用多次,频率容易受限,翻译过程也比较耗时。如果一次性把所有字幕内容发送给翻译服务,又可能遇到输入过大的问题,而且如何确保翻译后的内容和原始字幕时间对齐也是一个难点。

为了解决以上的两难问题,我选择了 Google 的 Gemini-2.0-flash 大模型。它的上下文窗口大到可以处理 100 万个 tokens,翻译任务一次性输入足够长的字幕内容也不成问题。虽然输出限制到8k,但如果超限的话我可以通过一些策略让翻译模型分段输出。此外,为了解决翻译出的字幕时间分片对齐问题,我在 prompt 中做了严格限制:

“ 请将以下字幕翻译成 {dest_language},必须严格保持原始格式、时间戳和段落结构。 每个字幕片段包含三部分:序号、时间戳和文本。 只翻译文本部分,保持序号和时间戳不变。 非常重要:必须保持原始字幕的段落结构,每个片段单独翻译,不要合并或分割片段。 即使某些句子在语义上是连续的,也必须按照原始字幕的分段进行翻译。 返回完整的翻译后字幕文件,包含所有序号和时间戳。

最终翻译出的双语字幕如下,当然我们的程序实现中可以不局限于在中、英双语间翻译,可以通过参数控制支持更多的语种。

picture.image

  • 字幕烧录模块(subtitle_burner)
    字幕翻译完成后,接下来的任务就是将字幕烧录到视频中。其实,可以通过一些播放器来挂载字幕,但这种方式麻烦且不够便捷,特别是在不同系统上需要找不同的播放器来执行。所以,我选择了直接将字幕烧录到视频里,这样视频本身就带有字幕,任何平台都能直接播放。烧录字幕的操作其实很简单,ffmpeg 本身就支持字幕烧录。我们可以通过参数来控制字幕的样式,比如字体、大小、颜色等,确保视觉效果最佳。命令如下:
  
ffmpeg -y -i "{video\_path}" -vf "subtitles={subtitle\_path}:force\_style=\'FontName=Arial,FontSize={font\_size},PrimaryColour=&H{font\_color\_hex},OutlineColour=&H{outline\_color\_hex},BorderStyle=1,Outline=2,Shadow={shadow\_radius},Bold=1\'" -c:v libx264 -crf 18 -c:a copy "{output\_path}"  

我们只需要通过参数控制好字幕样式,让视觉效果达到最优即可,我们可以提供的参数如下:

picture.image

  • 视频总结模块(subtitle_burner)
    为了简单起见,我目前是直接通过Gemini-2.0-flash大模型通过视频字幕总结出视频的主题内容,prompt设计如下:

  
请根据以下视频字幕内容,生成一个详细的视频内容总结。请务必使用中文进行总结。总结应该包括:  
1. 视频的主要主题和目的  
2. 视频中讨论的关键点和重要信息  
3. 视频的结构和内容组织  
4. 视频中提到的任何重要数据、事实或观点  
  
请以Markdown格式输出,包含适当的标题、小标题和列表。确保总结全面但简洁,突出最重要的信息。  
  
无论原始字幕是什么语言,都请使用中文进行总结。    
  
字幕内容:    
  
{text\_content}  

这里更严谨的方式其实可以考虑用多模态来总结 ,不仅理解字幕内容,还真正理解视频画面,技术方案可以参考我之前的文章《解读游戏设计:AI助你从视频中快速获取玩法规则》,总结出的视频主题内容如下:

picture.image

方案实现

方案设计好后,剩下就逐步交给Winsurf实现即可,这里如何让实现的代码尽量精准之前的文章也反复讲过,可以再回看下相关文章。可以看到,最终实现的项目遵循了我们规划的模块分层,每个模块职责单一,非常清晰,而且它还针对每个模块实现了测试用例去保障功能变更的稳定性。

picture.image

我们可以通过程序提供的命令行来快速生成带有字幕的视频,如果觉得命令行比较麻烦,我还让Winsurf帮我实现了一套可视化界面,方便操作。

picture.image

效果呈现

源视频片段:

加上字幕的视频片段:

项目已开源,自取:

https://github.com/skindhu/VideoLingua

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论