离线生成双语字幕,一键生成中英双语字幕,基于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.mfbz.cn/a/364930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型开发架构设计(7)——人人都需要掌握的AI编程及应用案例实战

文章目录 人人都需要掌握的AI编程及应用案例实战1 AI代码生成模型与AI编程助手介绍程序设计方式的发展自动代码生成AI编程工具 2 AI编程助手的代码生成模型架构剖析以 CodeGeeX 为例-发展过程以 CodeGeeX 为例-训练过程以 CodeGeeX 为例-大规模代码数据处理以 CodeGeeX 为例-模…

消息中间件特性

一:消息队列的主要作用是什么? 1.消息队列的特性: 业务无关,一个具有普适性质的消息队列组件不需要考虑上层的业务模型,只做好消息的分发就可以了,上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

Base64编码原理

Base64编码原理非常简单,首先确定好要编码的字符串,并查找其对应的 ASCII码将其转换为二进制表示,每三个8位的字节转换为四个6位的字节 (384 624),把6位的最高位添两位数字0 ,组成四个8位的字节…

内裤洗衣机有用吗?口碑好的小型洗衣机推荐

随着内衣洗衣机的流行,很多小伙伴在纠结该不该入手一款内衣洗衣机,专门来洗一些贴身衣物,答案是非常有必要的,因为我们现在市面上的大型洗衣机只能做清洁,无法对我们的贴身衣物进行一个高强度的清洁,而小小…

前端JavaScript篇之let、const、var的区别

目录 let、const、var的区别 let、const、var的区别 let、const和var是JavaScript中用于声明变量的关键字,它们之间有一些区别。 首先,var是在ES5中引入的关键字,而let和const是在ES6中引入的。在ES6之前,我们只能使用var来声明…

基于STM32F103C8T6最小系统板(对标某淘)

原理图和PCB都和某淘购买一样!!! 原理图 PCB 3D图

炒股操作方法!南通怎么开股票账户佣金最低?炒股交易手续费最低?

炒股操作方法可以有很多种,以下是一些建议:这些是一些股票交易技巧,希望对你有帮助。请记住,投资有风险,决策请谨慎。 设定明确的投资目标:确定你的投资目标,是为了长期投资还是短期交易&#x…

BGP按组打包

按组打包技术将所有拥有共同出口策略的BGP邻居当作是一个打包组 每条待发送路由只被打包一次然后发给组内的所有邻居 RR1发给三个Client,需要发三份路由。 通过按组打包,可以将路由打包,一次发给所有组内的邻居(前提是出口策略相…

【数据分享】1929-2023年全球站点的逐年最高气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)

客户端流程 客户端心跳与实例往服务端注册

fastadmin导入excel并对导入数据处理

情景描述 fastadmin有自带的导入功能,但是不好用,它要求你的表格标题必须跟数据表的备注一致,而且拿到的数据是直接插入数据表,我们无法获取想要的数据并对数据进行处理;而且有时候我们只是想要单纯的读取文件功能&…

k8s之安装部署及kuboard发布应用

目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm,kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…

代码随想录算法训练营第五十九天|503.下一个更大元素II 、42. 接雨水

代码随想录算法训练营第五十九天|503.下一个更大元素II 、42. 接雨水 下一个更大元素II 503.下一个更大元素II 文章讲解:https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0II.html 题目链接:https://…

守好“安全关” 筑牢“安全线”—济南中医风湿病医院6S管理小组开展安全生产大检查活动

春节将至,许多患者希望在春节前获得康复,因此预约到院参与会诊的患者数量较多。为营造干净整洁迎佳节的浓厚氛围,提升群众就医满意度,优化就医服务,改善医院医疗环境,结合6S精益管理,做到整理、…

深度学习的新前沿:突破、应用与挑战

引言 深度学习的快速发展已经在人工智能领域引起了革命性的变化。作为模仿人脑结构和功能的强大工具,深度神经网络在图像识别、自然语言处理、医学诊断等多个领域取得了显著成就。但是,随着技术的不断推进,深度学习也在不断地进化和扩展其能…

【QT】贪吃蛇小游戏 -- 童年回忆

成品展示 项目分析: 🐍基本元素如下 🐍小蛇的设计,初始大小蛇头占一个方块,蛇身占两个方块。 🐍关于小蛇的移动,采用蛇头前进方向增加一个方块,蛇尾减掉一个方块的实现方法。 &#…

迷你洗衣机哪个牌子好又实惠?最好用的迷你洗衣机分享

随着大家工作的压力越来越大,下了班之后只能想躺平,在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起,而且这样子是非常不好的,用过的内衣裤长时间不清洗容易滋生细菌,而…

Vue3_基础使用

vue2的选项式与vue3的组合式区别: 选项式:vue2中数据与方法计算属性等等,针对一个数据的处理在不同的配置中,当业务复杂时很难维护,修改起来也不好查找。 vue3的组合式:将针对数据的方法计算属性等等放在一…

10.网桥是什么?网桥和路由器及交换机的区别?以太网和令牌环网,nat,查公网ip等

网桥是什么?有什么作用? 网桥是一种网络设备,它可以在数据链路层(第二层)上连接不同的局域网(LAN),并根据MAC地址转发数据帧。网桥的作用是: 隔离碰撞域,提…

QML自定义ComboBox组件,支持动态筛选

QtQuick.Controls提供了ComboBox组件,该组件能够满足日常的下拉选择框的需求,但当需要用户在ComboBox中通过输入关键字进行自动匹配时,原生的组件虽然提供了editable属性用于输入关键字,但是匹配内容不弹出下拉框,无法…