离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope

在这里插入图片描述

离线生成双语字幕整合包,一键生成中英双语字幕,基于AI大模型

制作双语字幕的方案网上有很多,林林总总,不一而足。制作双语字幕的原理也极其简单,无非就是人声背景音分离、语音转文字、文字翻译,最后就是字幕文件的合并,但美中不足之处这些环节中需要接口api的参与,比如翻译字幕,那么有没有一种彻底离线的解决方案?让普通人也能一键制作双语字幕,成就一个人的字幕组?

人声背景音分离

如果视频不存在嘈杂的背景音,那么大多数情况下是不需要做人声和背景音分离的,但考虑到背景音可能会影响语音转文字的准确率,那么人声和背景音分离还是非常必要的,关于人声抽离,我们首先想到的解决方案当然是spleeter,但其实,阿里通义实验室开源的大模型完全不逊色于spleeter,它就是FRCRN语音降噪-单麦-16k,模型官方地址:

https://modelscope.cn/models/iic/speech_frcrn_ans_cirm_16k/summary

FRCRN语音降噪模型是基于频率循环 CRN (FRCRN) 新框架开发出来的。该框架是在卷积编-解码(Convolutional Encoder-Decoder)架构的基础上,通过进一步增加循环层获得的卷积循环编-解码(Convolutional Recurrent Encoder-Decoder)新型架构,可以明显改善卷积核的视野局限性,提升降噪模型对频率维度的特征表达,尤其是在频率长距离相关性表达上获得提升,可以在消除噪声的同时,对语音进行更针对性的辨识和保护。

需要注意的是该模型再Pytorch1.12上有bug,所以最好指定版本运行:

pip install pytorch==1.11 torchaudio torchvision -c pytorch

运行方式也很简单,通过pipeline调用即可:

from modelscope.pipelines import pipeline  
from modelscope.utils.constant import Tasks  ans = pipeline(  Tasks.acoustic_noise_suppression,  model='damo/speech_frcrn_ans_cirm_16k')  
result = ans(  'test.wav',  output_path='output.wav')

语音转文字 faster-whisper

成功分离出人声,接着要做的就是语音转文字,这里选择faster-whisper,faster-whisper 是 OpenAI Whisper 模型的重新实现,使用了 CTranslate2,这是一个用于 Transformer 模型的快速推理引擎。相比于 openai/whisper,faster-whisper 的实现速度提高了 4 倍,同时内存占用更少。此外,faster-whisper 还支持在 CPU 和 GPU 上进行 8 位量化,进一步提高了效率。

pip install faster-whisper

随后编写转写代码:

def convert_seconds_to_hms(seconds):  hours, remainder = divmod(seconds, 3600)  minutes, seconds = divmod(remainder, 60)  milliseconds = math.floor((seconds % 1) * 1000)  output = f"{int(hours):02}:{int(minutes):02}:{int(seconds):02},{milliseconds:03}"  return output  # 制作字幕文件  
def make_srt(file_path,model_name="small"):  device = "cuda" if torch.cuda.is_available() else "cpu"  if device == "cuda":  model = WhisperModel(model_name, device="cuda", compute_type="float16",download_root="./model_from_whisper",local_files_only=False)  else:  model = WhisperModel(model_name, device="cpu", compute_type="int8",download_root="./model_from_whisper",local_files_only=False)  # or run on GPU with INT8  # model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")  segments, info = model.transcribe(file_path, beam_size=5)  print("Detected language '%s' with probability %f" % (info.language, info.language_probability))  count = 0  with open('./video.srt', 'w') as f:  # Open file for writing  for segment in segments:  count +=1  duration = f"{convert_seconds_to_hms(segment.start)} --> {convert_seconds_to_hms(segment.end)}\n"  text = f"{segment.text.lstrip()}\n\n"  f.write(f"{count}\n{duration}{text}")  # Write formatted string to the file  print(f"{duration}{text}",end='')  with open("./video.srt", 'r',encoding="utf-8") as file:  srt_data = file.read()  return "转写完毕"

这里通过convert_seconds_to_hms方法来把时间戳格式化为标准字幕时间轴。

大模型翻译字幕

这里字幕翻译我们依然使用大模型,依然是阿里通义实验室的CSANMT连续语义增强机器翻译-英中-通用领域-large,模型官方地址:

https://modelscope.cn/models/iic/nlp_csanmt_translation_en2zh/summary

该模型基于连续语义增强的神经机器翻译模型,由编码器、解码器以及语义编码器三者构成。其中,语义编码器以大规模多语言预训练模型为基底,结合自适应对比学习,构建跨语言连续语义表征空间。此外,设计混合高斯循环采样策略,融合拒绝采样机制和马尔可夫链,提升采样效率的同时兼顾自然语言句子在离散空间中固有的分布特性。最后,结合邻域风险最小化策略优化翻译模型,能够有效提升数据的利用效率,显著改善模型的泛化能力和鲁棒性。

依然是通过pipeline进行调用:

# 翻译字幕  
def make_tran():  pipeline_ins = pipeline(task=Tasks.translation, model=model_dir_ins)  with open("./video.srt", 'r',encoding="utf-8") as file:  gweight_data = file.read()  result = gweight_data.split("\n\n")  if os.path.exists("./two.srt"):  os.remove("./two.srt")  for res in result:  line_srt = res.split("\n")  try:  outputs = pipeline_ins(input=line_srt[2])  except Exception as e:  print(str(e))  break  print(outputs['translation'])  with open("./two.srt","a",encoding="utf-8")as f:f.write(f"{line_srt[0]}\n{line_srt[1]}\n{line_srt[2]}\n{outputs['translation']}\n\n")  return "翻译完毕"

合并字幕

虽然字幕已经完全可以导入剪辑软件进行使用了,但是依然可以通过技术手段来自动化合并字幕,这里使用ffmpeg:

# 合并字幕  
def merge_sub(video_path,srt_path):  if os.path.exists("./test_srt.mp4"):  os.remove("./test_srt.mp4")  ffmpeg.input(video_path).output("./test_srt.mp4", vf="subtitles=" + srt_path).run()  return "./test_srt.mp4"

结语

笔者已经将上面提到的技术集成到了一个完整的项目之中,项目地址:

https://github.com/v3ucn/Modelscope_Faster_Whisper_Multi_Subtitle

操作简单,无须思考:

在这里插入图片描述

生成的双语字幕效果:

在这里插入图片描述

这也许是首个让普通人也能无脑操作的完全离线双语字幕制作方案。最后奉上整合包,以与众乡亲同飨:

https://pan.quark.cn/s/55248dcadfb6

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目,是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目,基于archetype可以创建多种类型的java项目;Maven仓库…

热门技术问答 | 请 GaussDB 用户查收

近年来,Navicat 与华为云 GaussDB 展开一系列技术合作,为 GaussDB 用户提供面向管理开发工具的生态工具。Navicat 现已完成 GaussDB 主备版(单节点、多节点)和分布式数据库的多项技术对接。Navicat 通过工具的流畅性和实用性&…

css中常用的水平垂直居中的方法(六种详细布局的方法)

目录 一、背景二、实现方式利用定位margin:auto利用定位margin:负值利用定位transformtable布局flex弹性布局grid网格布局小结 三、总结内联元素居中布局块级元素居中布局 参考文献 一、背景 在开发中经常遇到这个问题,即让某个元素的内容在水平和垂直方向上都居中…

ETCD高可用架构涉及常用功能整理

ETCD高可用架构涉及常用功能整理 1. etcd的高可用系统架构和相关组件1.1 Quorum机制1.2 Raft协议 2. etcd的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 强行拉起新集群 --force-new-cluster2.2.2 兼容磁盘io性能差2.2.3 etcd存储quota 3. etcd常用命令3.1 常用基础命令3.1.1 列…

【C++】wxWidgets编程的程序入口点

在wxWidgets中,程序的入口点通过wxIMPLEMENT_APP宏定义来设置,该宏会扩展为一个实现了main函数或者在Windows上是WinMain函数的代码。wxIMPLEMENT_APP宏与wxDECLARE_APP宏一起使用来设置基于wxWidgets的应用程序的启动代码。 使用wxIMPLEMENT_APP宏通常是…

day31WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

目录 1.JS验证 2.JS验证MIME 3.JS验证.user.ini 4.JS验证.user.ini短标签 (ctfshow154,155关) 5.JS验证.user.ini短标签过滤 [ ] 6.JS验证.user.ini短标签加过滤文件头 有关文件上传的知识 1.为什么文件上传存在漏洞 上传文件…

2024年数学建模美赛C题(预测 Wordle)——思路、程序总结分享

1: 问题描述与要求 《纽约时报》要求您对本文件中的结果进行分析,以回答几个问题。 问题1:报告结果的数量每天都在变化。开发一个模型来解释这种变化,并使用您的模型为2023年3月1日报告的结果数量创建一个预测区间。这个词的任何属性是否会…

【服务器Midjourney】创建部署Midjourney网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

分布式空间索引了解与扩展

目录 一、空间索引快速理解 (一)区域编码 (二)区域编码检索 (三)Geohash 编码 (四)RTree及其变体 二、业内方案选取 三、分布式空间索引架构 (一)PG数…

elementUI的el-select传递item对象或其他参数的2种方法

方法1 :value“item” 绑定对象 只要:value绑定item对象就可以 value-key"value" 必须是item里的一个属性&#xff0c;绑定值为对象类型时必填 <el-select v-model"value" placeholder"请选择" value-key"value" change"cha…

【产品经理从0到1】产品经理常用网站

1.产品社区类 人人都是产品经理 | 产品经理、产品爱好者学习交流平台 2.资讯新闻 虎嗅网(虎嗅网) 捕获互联网每个重要时刻 36kr(36氪 | 让创业更简单) 互联网最新最热新闻资讯 爱范儿(爱范儿 让未来触手可及) 国内聚焦创新和科技领域的第一媒体 钛媒体(钛媒体_引领未来商…

Rust循环和函数

下面聊聊以下主题&#xff1a; 基于条件的分支循环函数属性测试 基于条件的分支 基于条件的分支&#xff0c;可以通过常见的 if、if else 或 if else if else 构造来完成&#xff0c;例如下面的示例&#xff1a; fn main() { let dead false; let health 48; if dead { p…

探索Pyecharts关系图绘制技巧:炫酷效果与创意呈现【第42篇—python:Pyecharts水球图】

文章目录 Pyecharts绘制多种炫酷关系网图引言准备工作代码实战1. 基本关系网图2. 自定义节点样式和边样式3. 关系网图的层级结构4. 添加标签和工具提示5. 动态关系网图6. 高级关系网图 - Les Miserables 示例7. 自定义关系网图布局8. 添加背景图9. 3D 关系网图10. 热力关系网图…

【幻兽帕鲁】开服务器,高性能高带宽(100mbps),免费!!!【学生党强推】

【幻兽帕鲁】开服务器&#xff0c;高性能高带宽&#xff08;100mbps&#xff09;&#xff0c;免费&#xff01;&#xff01;&#xff01;【学生党强推】 教程相关视频地址&#xff1a;https://www.bilibili.com/video/BV16e411Y7Fd/ 目前幻兽帕鲁开服务器有以下几套比较性价比的…

【Android】MediaCodec学习

在开源Android屏幕投屏代码scrcpy中&#xff0c;使用了MediaCodec去获取和display关联的surface的内容&#xff0c;再通过写fd的方式&#xff08;socket等&#xff09;传给PC端&#xff0c; MediaCodec的处理看起来比较清楚&#xff0c;数据in和数据out 这里我们做另外一个尝试…

qml与C++的交互

qml端使用C对象类型、qml端调用C函数/c端调用qml端函数、qml端发信号-连接C端槽函数、C端发信号-连接qml端函数等。 代码资源下载&#xff1a; https://download.csdn.net/download/TianYanRen111/88779433 若无法下载&#xff0c;直接拷贝以下代码测试即可。 main.cpp #incl…

二叉树--199. 二叉树的右视图/medium 理解度C

199. 二叉树的右视图 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧&#xff0c;使用 JPEG 标准对其进行压缩&#xff0c;然后通过UDP以太网将其传输到另一个设备&#xff08;例如计算机&#xff09;&#xff0c;所有…

Element-Plus如何实现表单校验和表单重置

一&#xff1a;页面布局介绍&#xff1a; 这是我刚刚用基于vue3element-plus写好的一个部门管理的页面 基本的增删改查已经写好&#xff0c;下面我只提供页面的template和style的代码&#xff1a; template <template><el-card class"box-card"><…

【YOLO系列算法俯视视角下舰船目标检测】

YOLO系列算法俯视视角下舰船目标检测 数据集和模型YOLO系列算法俯视视角下舰船目标检测YOLO系列算法俯视视角下舰船目标检测可视化结果 数据集和模型 数据和模型下载&#xff1a; YOLOv6俯视视角下舰船目标检测训练好的舰船目标检测模型舰船目标检测数据YOLOv7俯视视角下舰船…