使用智谱AI大模型翻译视频字幕

news2024/9/20 16:43:33

不久前,国内的头部大模型厂商智谱 AI ,刚刚推出了 glm-4-0520 模型,该模型被认为是当前平台最先进的模型,具备 128k 的上下文长度,并且相较于前一代模型,指令遵从能力大幅提升 18.6%。可以看出,智谱AI对于该模型寄予厚望。

为了验证这个大模型的性能,我们尝试用它来实现【视频字幕翻译】功能。目前很多视频网站(如B站)上面,大量优质内容都是英文的,并且也没有配备中文的字幕翻译,这对于很多人来说,大大降低了观看体验。因此,我们决定利用大模型,将视频的字幕翻译成中文,这样就可以快速理解视频的大致内容,大幅提升工作与学习效率。

下面,我们以 B站 上的视频为例,来实现这个功能。视频链接:https://www.bilibili.com/video/BV1g84y1R7oE/?vd_source=2fd71d56662056b97691b4d7bdf39151

在这里插入图片描述
话不多说,开始写代码。

现在很多视频网站都提供了 OpenAPI,支持获取视频和字幕等相关信息。为了方便开发,我们直接采用 LangChain 封装好的 BiliBiliLoader 来实现视频字幕的加载功能:

首先,我们需要在浏览器登录B站,并且浏览器的开发者工具,获取SESSDATA、JCT 和 BUVID3信息,并保存到环境变量中:

# B站相关配置
BiliBili_SESSDATA=xxx
BiliBili_JCT=xxx
BiliBili_BUVID3=xxx

接下来,我们通过 BiliBiliLoader 工具,加载该视频对应的字幕文本:

import os

import dotenv
from langchain_community.document_loaders import BiliBiliLoader

# 加载环境变量
dotenv.load_dotenv()

# 创建B站字幕文档加载器
loader = BiliBiliLoader(
    video_urls=["https://www.bilibili.com/video/BV1g84y1R7oE/"],
    sessdata=os.getenv("BiliBili_SESSDATA"),
    bili_jct=os.getenv("BiliBili_JCT"),
    buvid3=os.getenv("BiliBili_BUVID3"),
)

# 加载完整字幕
full_caption = loader.load()
print(f"完整字幕: {full_caption[0].page_content[:1000]}")

部分字幕内容如下:

完整字幕: Video Title: Let’s Learn English on a Hike! 🍂🚶🏼🎒 【英文字幕】, description: Have you ever learned English in nature? In this English lesson I take you to a hiking trail near me and teach you all of the words and phrases you’ll need to know to have a conversation about hiking.

In this free English class you’ll learn words and phrases like: trail, path, treacherous, view, sign, observation deck, gear, hiking boots, dangerous animals, racoon, skunk, and more.

为了便于后面的翻译,我们将完整的字幕长文本进行切割,拆分成多个字幕块:

# 创建文档分割器,将原始字幕文本分割成更小的片段
splitter = RecursiveCharacterTextSplitter(chunk_size=200,

chunk_overlap=10)

caption_chunks = splitter.split_documents(full_caption)
print(f"切割后的分块大小: {len(caption_chunks)}")

我们指定了每个文档分块大小为200,块之间的重叠为10,这样将原始的字幕分割成了46个文档片段。

下面,我们就可以利用智谱AI的 glm-4-0520 大模型,将原版的英文字幕翻译成中文:

# 构造Chain,将原版的英文字幕翻译成中文
llm = ChatZhipuAI(model="glm-4-0520", temperature=0)  # 使用智谱AIglm-4-0520大模型
chain = (
        {"content": lambda x: x.page_content}
        | ChatPromptTemplate.from_template("你是一个翻译专家,请将输入的英文翻译成中文: {content}")
        | llm
        | StrOutputParser()
)
chinese_captions = chain.batch(caption_chunks, config={"max_concurrency": 1})

full_english_caption = "\n".join([caption.page_content for caption in caption_chunks])
full_chinese_caption = "\n".join(chinese_captions)
print(f"原版英文字幕: \n{full_english_caption}")
print(f"翻译后的中文字幕: \n{full_chinese_caption}")

翻译后的中文字幕如下:

视频标题:让我们在徒步中学习英语吧!🍂🚶🏼🎒【英文字幕】

描述:你有没有在自然环境中学习过英语?在这个英语课程中,我将带你到我附近的一条徒步小径,教你所有的……(此处原文未给出完整内容,因此翻译也无法完整)

你需要知道的单词和短语,以便进行关于徒步旅行的对话。

在这个免费的英语课程中,你将学习到如下单词和短语:小径、路径、危险重重、景观、标志、观景台、装备、徒步靴、危险动物、浣熊、臭鼬等等。

大功告成!现在我们已经拿到了翻译后的中文字幕。大致看来,语义和文法还算比较通顺。但是这只是我们直观上的感受,有没有什么量化的方式,可以评估翻译的效果呢?还是有的,我们可以利用大模型的 Embedding 能力,计算下原版的英文字幕和翻译后的中文字幕在语言上的相似性,如果二者的相似度很高,则大概率可以说明翻译基本复现了原始的内容。当然还有更准确的评估方式,我们这里暂时不做展开了。

最后,我们可以利用智谱AI刚刚推出的 embedding-3 这个 Embedding 模型,计算下两个字幕的语义相似度:

# 计算原版英文字幕和翻译后的中文字幕在语义上的相似度
embeddings = ZhipuAIEmbeddings(model="embedding-3")
english_embedding = embeddings.embed_documents([full_english_caption])

chinese_embedding = embeddings.embed_documents([full_chinese_caption])

similarity = cosine_similarity(X=english_embedding,Y=chinese_embedding)[0]

print(f"两个字幕的语义相似度: {similarity}")

两个字幕的语义相似度: [0.73141426]

可以看出,最终两个字幕 Embedding 的余弦相似度超过了0.7,说明大模型的翻译效果还是不错的。

综上所述:针对语料的翻译工作,glm-4-0520 应该是一个不错的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键开启,精彩即现!极简设计录屏软件大盘点

如果你想要用一款小巧的录屏工具,第一时间是不是就想到了ocam录屏,现在这类的简便录屏工具越来越多了,如果你想要换一个不妨接着往下看吧。 1.福昕录屏大师 链接:www.foxitsoftware.cn/REC/ 这个软件的界面看起来就很好操作&am…

《HelloGitHub》第 101 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…

测试 UDP 端口可达性的方法

前言: UDP (User Datagram Protocol) 是一种无连接的传输层协议,它不像 TCP 那样提供确认机制来保证数据包的可靠传输。因此,测试 UDP 端口的可达性通常需要一些特殊的方法,因为传统的端口扫描工具(如 nmap&#xff0…

【开源 Mac 工具推荐之 5】tldr:简洁明了的命令行手册显示工具

简介 在大家日常在 macOS/Linux 上使用 Shell 的时候&#xff0c;常常会遇到一些不太熟悉的命令行指令&#xff0c;为此我们一般会查看一下该命令的使用手册&#xff08;指南&#xff09;。往往&#xff0c;大家都会使用 man <command> 这样一个非常传统的指令。但 man …

YOLOv8改进 | 融合改进 | C2f融合Faster-GELU模块提升检测速度【完整代码 + 主要代码解析】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

Unity URPShader支持多光源处理

//声明变体并且引用文件 #pragma shader_feature _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" //在数据结构体中声明需要使用的数据 struct Attributes {float4 posit…

如何写一份简单的3C产品说明书?五步让你留住客源

在撰写3C&#xff08;计算机、通信、消费电子&#xff09;产品说明书时&#xff0c;清晰、简洁且全面的信息传递至关重要。本文将首先介绍产品说明书的基本结构&#xff0c;随后探讨视觉阅读的重要性&#xff0c;并通过实例展示如何撰写一份优秀的产品说明书。最后&#xff0c;…

SpringBoot2:学SpringBoot前的知识准备-用IDEA创建传统的webapp工程,并整合SpringMVC

1、IDEA创建工程 基于Maven模板创建的SpringMVC工程 工程创建好后&#xff0c;只有webapp目录 这里&#xff0c;我们需要手动创建java目录和resources配置文件目录 创建好后&#xff0c;配置下目录属性 最终结构 至此&#xff0c;工程就创建好了 2、配置Tomcat 参考&am…

LabVIEW中10μs方波生成问题

在LabVIEW中使用NI PCIe-6353卡生成并控制10μs级别的方波输出可能遇到频率调整的问题。下面将详细分析常见问题的原因&#xff0c;如采样率设置、时钟源配置、波形生成方式等&#xff0c;并提供具体的解决方案&#xff0c;帮助用户成功生成并调整高精度方波信号。 为了在LabVI…

孙悟空求药的深刻反思

孙悟空求药的深刻反思 - 孔乙己大叔引言&#xff1a;孙悟空的求药之旅 在古老的神话故事中&#xff0c;孙悟空为了拯救乌鸡国国王的生命&#xff0c;不惜跨越千山万水&#xff0c;前往太上老君的仙宫&#xff0c;祈求那传说中的九转还魂丹。面对孙悟空那看似贪婪的一千…

【案例65】WebSphere启动比tomcat启动慢的测试

以下为多次测试的一些结论&#xff0c;谨慎使用&#xff0c;请一定做好测试后在使用。 1.在原先慢的WAS环境下&#xff0c;添加-Dsun.reflect.inflationThreshold15,可以有效提升was下的响应速度&#xff0c;和Tomcat下速度相当&#xff0c;但该参数15的情况我们Tomcat以前还没…

FastGPT:利用大模型重新定义传统知识库

引言 传统知识库的痛点 传统知识库广泛应用于企业文档管理、客户支持等场景&#xff0c;但随着信息量和复杂度的增加&#xff0c;存在以下显著问题&#xff1a; 数据难整合&#xff1a; 结构化与非结构化数据分散&#xff0c;更新维护成本高。检索不精准&#xff1a; 依赖关…

day03-面向对象-内部类泛型常用API

一、内部类 内部类是类中的五大成分之一&#xff08;成员变量、方法、构造器、代码块、内部类&#xff09; 如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 场景&#xff1a;当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且这个事物没有必要单…

Go发布自定义包

1、初始化go.mod go mod init github.com/xumeng03/images2、编写包内容 这里只是一个简单的压缩jpg/jpeg图片例子&#xff0c;代码参考 https://github.com/disintegration/imaging 2.1、fs.go package imagesimport ("image""io""os""p…

利用通义灵码实现我的第一次开源贡献

作者&#xff1a;重庆邮电大学计算机学院李逸雄 结缘开源 最早了解开源是从学校的兴趣组织开始的。2023 年 10 月 21 日&#xff0c;openSUSE 亚洲峰会在我们学校召开&#xff0c;这次会议汇聚了许多来自 openSUSE 社区贡献者以及对开源感兴趣的爱好者们。我第一次知道有这么…

postman使用记录

输入密码&#xff0c;地址 然后输入格式为json 在 body里写入传参 然后点击发送即可

裸机:SD卡启动详解

内存和外存的区别 内存和外存在计算机系统中扮演着不同的角色&#xff0c;它们之间存在显著的差异。以下是内存和外存之间几个主要方面的区别&#xff1a; 存储特性与易失性 内存&#xff08;Memory&#xff09;&#xff1a;通常指的是随机存取存储器&#xff08;RAM&#x…

Java面试题·区别题·JavaSE部分

系列文章目录 总章 Java区别题 文章目录 系列文章目录前言private/默认/protected/public权限修饰符的区别&和&&区别和联系&#xff0c;I和II区别和联系if和switch的不同之处和equals的区别和联系数组做形参和可变参数做形参联系和区别接口和抽象类的异同之处面向…

Android设备如何异地访问本地部署的code-server随时随地远程开发

文章目录 前言1.Ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 前言 本文主要介绍如何在Linux Ubuntu系统安装code-server&#xff0c;并结合cpolar内网穿透工具配置公网地址&#xff0c;轻松实现使用安…