autocut

news2024/11/20 14:17:48

在讲 OpenAI Whisper 前先做了一个剪视频小工具【论文精读·44】_哔哩哔哩_bilibili更多论文:https://github.com/mli/paper-reading, 视频播放量 58633、弹幕量 233、点赞数 2732、投硬币枚数 1630、收藏人数 1465、转发人数 604, 视频作者 跟李沐学AI, 作者简介 ,相关视频:OpenAI Whisper 精读【论文精读·45】,免费开源语音转文字Whisper快速搭建,可生成字幕,媒体人的福音,OpenAI开源Whisper,我来教你如何从零开始搭建,#如何安装和使用 Whisper AI,Chain of Thought论文、代码和资源【论文精读·43】,我是如何快速阅读和整理文献,GPT,GPT-2,GPT-3 论文精读【论文精读】,免费离线语音识别神器whisper安装教程,OpenAI Whisper大法 | 用OpenAI开源模型搞定音频转写,免费且优雅,大概能省1万,还能学到不少东西,自动识别讲座、访谈录音 ——Python开源whisper语音识别https://www.bilibili.com/video/BV1Pe4y1t7de/?spm_id_from=333.999.0.0&vd_source=4aed82e35f26bb600bc5b46e65e25c22GitHub - mli/autocut: 用文本编辑器剪视频用文本编辑器剪视频. Contribute to mli/autocut development by creating an account on GitHub.https://github.com/mli/autocut1.环境安装

openai-whisper、torchaudio

a.输入inputs,是一个["input.mp4"]的形式。

b.autocut-main\autocut\transcribe.py中

self.vad_model, funcs = torch.hub.load(
repo_or_dir=r"E:\common_tools\wav2lip_tools\autocut-main\autocut\silero-vad", model="silero_vad", trust_repo=True,source='local')

c.transcribe 92行

self.whisper_model = whisper.load_model(
self.args.whisper_model, self.args.device,download_root=r"E:\common_tools\wav2lip_tools\autocut-main", )

2.入参

    parser.add_argument("--inputs", type=str, nargs="+",
                        default=[r"F:\wav2lip_tmp\601112\1672544575_1.mp4"],help="Inputs filenames/folders")
    parser.add_argument(
        "-t",
        "--transcribe",  # 转写
        default=True,
        help="Transcribe videos/audio into subtitles",
        # action=argparse.BooleanOptionalAction,
    )
    parser.add_argument(
        "-c",
        "--cut",  # 裁剪视频
        help="Cut a video based on subtitles",
        # action=argparse.BooleanOptionalAction,
    )
    parser.add_argument(
        "-d",
        "--daemon", # 监听文件夹生成字幕和剪切字幕的功能
        help="Monitor a folder to transcribe and cut",
        # action=argparse.BooleanOptionalAction,
    )
    parser.add_argument(
        "-s",
        help="Convert .srt to a compact format for easier editing",
        # action=argparse.BooleanOptionalAction,
    )
    parser.add_argument(
        "-m",
        "--to-md",
        help="Convert .srt to .md for easier editing",
        # action=argparse.BooleanOptionalAction,
    )
    parser.add_argument(
        "--lang",
        type=str,
        default="zh",
        choices=["zh", "en"],
        help="The output language of transcription",
    )
    parser.add_argument(
        "--prompt", type=str, default="", help="initial prompt feed into whisper"
    )
    parser.add_argument(
        "--whisper-model",
        type=str,
        default="small",
        choices=["tiny", "base", "small", "medium", "large", "large-v2"],
        help="The whisper model used to transcribe.",
    )
    parser.add_argument(
        "--bitrate",
        type=str,
        default="10m", # 默认视频比特率10m
        help="The bitrate to export the cutted video, such as 10m, 1m, or 500k",
    )
    parser.add_argument(
        "--vad", help="If or not use VAD", choices=["1", "0", "auto"], default="auto"
    )
    parser.add_argument(
        "--force",
        help="Force write even if files exist",
        # action=argparse.BooleanOptionalAction,
    )
    parser.add_argument(
        "--encoding", type=str, default="utf-8", help="Document encoding format"
    )
    parser.add_argument(
        "--device",
        type=str,
        default=None,
        choices=["cpu", "cuda"],
        help="Force to CPU or GPU for transcribing. In default automatically use GPU if available.",
    )

3.代码

3.1 权重

_MODELS = {
    "tiny.en": "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt",
    "tiny": "https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt",
    "base.en": "https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt",
    "base": "https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt",
    "small.en": "https://openaipublic.azureedge.net/main/whisper/models/f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872/small.en.pt",
    "small": "https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt",
    "medium.en": "https://openaipublic.azureedge.net/main/whisper/models/d7440d1dc186f76616474e0ff0b3b6b879abc9d1a4926b7adfa41db2d497ab4f/medium.en.pt",
    "medium": "https://openaipublic.azureedge.net/main/whisper/models/345ae4da62f9b3d59415adc60127b97c714f32e89e936602e85993674d08dcb1/medium.pt",
    "large-v1": "https://openaipublic.azureedge.net/main/whisper/models/e4b87e7e0bf463eb8e6956e646f1e277e901512310def2c24bf0e11bd3c28e9a/large-v1.pt",
    "large-v2": "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt",
    "large": "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt",
}

3.2 transcribe

transcribe().run()->
audio=whisper.load_audio(input,16000)->ffmpeg.input()->
vad="1" or vad="auto" speech_timestamps=_detect_voice_activity(audio)->
vad_model is None or detect_speech is None->self.vad_model,funcs=torch.hub.load()->
detect_speech=funcs[0] = get_speech_timestamps->
- speeches=detect_speech(audio,vad_model,16000)->
- speeches=utils.remove_short_segments(speeches,1.0*16000)-> # 去掉一些太短的片段
-- [s for s in segments if s["end"] - s["start"] > threshold]
- speeches=utils.expand_segments(speeches,0.2*16000,0.0*16000,audio.shape[0])->避免片段过于紧凑,对一开始做了一个padding
- speeches=utils.merge_adjacant_segment(speeches,0.5*16000)-> 将一些邻近的片段进行合并
transcribe_results=_transcribe(audio,speech_timestamps)->
- whisper_model is None: whisper_model=whisper.load_model("small",)->
-- checkpoint_file=_download(_MODELS['small'],download_root,in_memory)->
-- checkpoint=torch.load(,map_location=device)->
-- dims=ModelDimensions(**checkpoint['dim'])->
-- mdoel=Whisper(dims)->
--- encoder=AudioEncoder/decoder=TextDecoder->
- whisper_model.transcribe()
-- mel=log_mel_spectrogram(audio,padding=480000)-> SAMPLE_RATE为16000,即在1秒内采集到16000个样本点。因此,在30秒采集时长内,采集到的总共样本点数为30 * 16000 = 480000,即N_SAMPLES的值为480000。
-- tokenizer=get_tokenizer()->tokenizer通常包括两个主要组件:分词器和编码器。分词器将文本分割成一个一个的token,可以使用空格、标点符号或者字典等方式进行划分;编码器则将分词器生成的token编码成数字表示,以便于模型使用。
-- inital_prompt_tokens=tokenizer.encode()->
- DecodingResult=decode_with_fallback(mel_segment)->
-- res:[{'text': '耐德是一个750度的烙温 同时呢 我们还有防部插防漏电的设计啊里面是有挡板的 是有挡板的', 'segments': [{'id': 0, 'seek': 0, 'start': 0.0, 'end': 6.3, 'text': '耐德是一个750度的烙温 同时呢 我们还有防部插防漏电的设计啊', 'tokens': [50364, 4450, 238, 35898, 1541, 20182, 45396, 13127, 1546, 23661, 247, 9592, 102, 220, 13089, 15729, 6240, 8624, 9497, 35091, 35863, 13470, 11673, 240, 35863, 14065, 237, 42182, 1546, 7422, 122, 7422, 94, 4905, 50679], 'temperature': 0.0, 'avg_logprob': -0.418671938089224, 'compression_ratio': 1.0169491525423728, 'no_speech_prob': 0.039087388664484024}, {'id': 1, 'seek': 0, 'start': 6.3, 'end': 8.1, 'text': '里面是有挡板的 是有挡板的', 'tokens': [50679, 15759, 8833, 1541, 2412, 8501, 94, 43664, 1546, 11947, 2412, 8501, 94, 43664, 1546, 50769], 'temperature': 0.0, 'avg_logprob': -0.418671938089224, 'compression_ratio': 1.0169491525423728, 'no_speech_prob': 0.039087388664484024}], 'language': 'zh', 'origin_timestamp': {'start': 0, 'end': 131146}}]
_save_srt()
_save_md()

3.3 cut

[r"F:\wav2lip_tmp\601112\1672544575_1.mp4",r"F:\wav2lip_tmp\601112\1672544575_1.srt"]

cut主要是根据已经裁剪好的srt文件进行视频的裁剪。

4.whisper small模型结构

ModelDimensions(n_mels=80, n_audio_ctx=1500, n_audio_state=768, n_audio_head=12, n_audio_layer=12, n_vocab=51865, n_text_ctx=448, n_text_state=768, n_text_head=12, n_text_layer=12)

Whisper(
  (encoder): AudioEncoder(
    (conv1): Conv1d(80, 768, kernel_size=(3,), stride=(1,), padding=(1,))
    (conv2): Conv1d(768, 768, kernel_size=(3,), stride=(2,), padding=(1,))
    (blocks): ModuleList(
      (0-11): 12 x ResidualAttentionBlock(
        (attn): MultiHeadAttention(
          (query): Linear(in_features=768, out_features=768, bias=True)
          (key): Linear(in_features=768, out_features=768, bias=False)
          (value): Linear(in_features=768, out_features=768, bias=True)
          (out): Linear(in_features=768, out_features=768, bias=True)
        )
        (attn_ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
        (mlp): Sequential(
          (0): Linear(in_features=768, out_features=3072, bias=True)
          (1): GELU(approximate='none')
          (2): Linear(in_features=3072, out_features=768, bias=True)
        )
        (mlp_ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
      )
    )
    (ln_post): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
  )
  (decoder): TextDecoder(
    (token_embedding): Embedding(51865, 768)
    (blocks): ModuleList(
      (0-11): 12 x ResidualAttentionBlock(
        (attn): MultiHeadAttention(
          (query): Linear(in_features=768, out_features=768, bias=True)
          (key): Linear(in_features=768, out_features=768, bias=False)
          (value): Linear(in_features=768, out_features=768, bias=True)
          (out): Linear(in_features=768, out_features=768, bias=True)
        )
        (attn_ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
        (cross_attn): MultiHeadAttention(
          (query): Linear(in_features=768, out_features=768, bias=True)
          (key): Linear(in_features=768, out_features=768, bias=False)
          (value): Linear(in_features=768, out_features=768, bias=True)
          (out): Linear(in_features=768, out_features=768, bias=True)
        )
        (cross_attn_ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
        (mlp): Sequential(
          (0): Linear(in_features=768, out_features=3072, bias=True)
          (1): GELU(approximate='none')
          (2): Linear(in_features=3072, out_features=768, bias=True)
        )
        (mlp_ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
      )
    )
    (ln): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
  )
)

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

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

相关文章

什么是python,一篇带你详细了解Python

Python是一种跨平台的计算机程序设计语言,是ABC语言的替代品,属于面向对象的动态类型语言,最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。 python前景…

挖掘用户真实需求 避坑5大技巧

1、用户总是“说一套 做一套” 在进行需求市场调研时,我们问1000个用户,是否想要黄金,几乎所有的用户都是肯定的回答。如果我们以此认定,黄金是用户的真实需求会过于草率。 我们需继续追问用户:买黄金做什么&#xff1…

【微信小程序开发】第 7 课 - 小程序的组件

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、小程序中组件的分类 3、常用的视图容器类组件 3.1、view 组件 3.2、scroll - view 组件 3.3、swiper 和 swiper…

【youcans动手学模型】Xception 模型-CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】Xception 模型-CIFAR10图像分类 1. Xception 神经网络模型1.1 模型简介1.2 论文介绍1.3 分析与讨论 2. 在 PyTorch 中定义 Xception 模型类2.1 深度可分离卷积2.2 带残差连接的…

【九章斩题录】从尾到头打印链表(JZ6)

精品题解 🔥 《九章斩题录》 👈 猛戳订阅 目录 JZ6 - 从尾到头打印链表 「 法一 」链表元素存入数组后再反转 「 法二 」递归大法 「 法三 」栈 JZ6 - 从尾到头打印链表 📚 题目:输入一个链表的头节点,按链表从…

苹果iOS 17新功能:重置密码 72 小时内可使用旧密码再次重置

一些用户可能会遇到,在修改了 iPhone 密码之后,突然忘记新密码的情况。现在苹果在 iOS 17 中加入了新的解决方案:在重置密码的 72 小时之内,如果用户不小心忘记了新设置的密码,仍然可以使用旧密码进行再次重置。 在重…

TS系列之工具类型Partial、Required、Pick、Record详解,示例

TS系列之工具类型Partial、Required、Pick、Record详解&#xff0c;示例 文章目录 前言一、Partial<Type>二、Required<Type>三、Pick<Type, Keys>四、Record<Keys, Type>总结 前言 本片文章主要利用上一篇所学的keyof做一个延申与扩展的学习。在Type…

OpenGaussDB2.0.1

目录 1. GaussDB版本2. OpenGaussDB介绍3. 单节点安装3.1 环境配置3.2 安装 4. 远程连接设置 1. GaussDB版本 GaussDB的版本&#xff1a; GaussDB 100&#xff1a;目前暂不发布&#xff0c;公司合作伙伴需向华为提交申请&#xff08;GaussDB 100 将在 2020 年被正式命名为 Gaus…

Redis入门 - 3种特殊数据类型

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 3种特殊数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/three-special-datatype.html 在我们平常的业务中基本只会使用到Redis的基本数据类型&#xff08;String、List、Hash、Set、S…

浅谈.NET语言开发应用领域

.NET语言是一种跨平台的开发框架&#xff0c;适用于各种应用程序的开发。以下是一些常见的.NET语言开发应用领域&#xff1a; 桌面应用程序开发&#xff1a;使用.NET框架开发的桌面应用程序可以在Windows操作系统上运行&#xff0c;包括Windows Forms和WPF。这些应用程序可以用…

CentOS开机报错““error can‘t find command ‘:‘“处理方法

CentOS开机报错"error cant find command :"处理方法 本文为故障描述和问题记录。converterP2V迁移CentOS7到虚拟机&#xff0c;开机报错"error can’t find command ‘:’"的处理方法。 本文为CentOS7的操作记录&#xff0c;其他版本可以参考&#xff0c;…

CASAIM光学彩色三维扫描仪助力文物艺术品三维数字化3D打印

文物艺术品数字化&#xff0c;实际上是一种文物艺术品信息的记录方式&#xff0c;除了运用视频、照片、录音等多媒体形式将某些文物进行记录外&#xff0c;文物艺术品数字化主要是指针对有形文化遗产采用非接触式扫描得到的三维数字化记录&#xff0c;通过实景三维建模&#xf…

GitHub 上传自己的项目

文章目录 前言一、步骤1.GitHub 创建项目2.Git 上传本地项目到 GitHub3.Git 命令整理 总结 前言 不附 Demo 连接的博客不是好博客&#xff0c;所以我们要做个乐于助人&#xff0c;有责任心的人&#xff0c;这篇文章手把手教你如何在 GitHub 上传自己的项目&#xff0c; 一、步…

【OpenMMLab AI实战营二期笔记】第五天 MMPretrain代码课

1.环境安装 conda activate mmpre # 激活创建好的环境,确保安装好pytorch,可以使用gpu git clone https://github.com/open-mmlab/mmpretrain.git # 下载mmpre源码 cd mmpretrain # 进入mmpretrian目录 pip install openmim # 安装管理工具 mim install -e ".[multimodal…

JAVA开发运维(系统上到生产环境准备工作)

一、前言 java项目在开发环境开发完成&#xff0c;在测试环境测试没有问题后&#xff0c;就需要发布到生产环境&#xff0c;如果系统是对公众的&#xff0c;那就需要很多工作了。比如服务器申请&#xff0c;域名申请&#xff0c;渗透测试&#xff0c;漏洞扫描&#xff0c;公网…

第二章(第二节):导数与微分

1.导数与微分 1.导数概念 设曲线 L 的方程 y=f(x),a ≤ x ≤ b,x0 ∈ (a, b),在曲线 L 上的点 M0(x0, y0) 附近任取一点 M(x0 + Δx, y0 + Δy),过 M0 与 M 作曲线的割线M~0~M,的斜率为:当 x→x0 时,点 M 沿着曲线 L 趋向 M0,与此同时,割线 M0M 趋向一个极限位置 M0T…

想要转行的一定要看软件测试发展简史+学习路线

迄今为止&#xff0c;软件测试的发展一共经历了五个重要时期&#xff1a; 调试为主 20世纪50年代&#xff0c;计算机刚诞生不久&#xff0c;只有科学家级别的人才会去编程&#xff0c;需求和程序本身也远远没有现在这么复杂多变&#xff0c;相当于开发人员一人承担需求分析&am…

idea设置注释模板

目录 设置注释文件模板设置模板 设置注释文件模板 Ctrl Alt S 打开设置&#xff0c;Editor - File and Code Templates 选择class、interface、enum根据自己需要选择需要添加注释的文件&#xff0c;依次添加如下配置内容 /**1. ClassName ${NAME}2. Description TODO3. Aut…

BUUCTF Unencode 1

题目描述&#xff1a; 密文&#xff1a; 89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM]解题思路&#xff1a; 1、观察密文&#xff0c;尝试Base85、Base91等编码&#xff0c;均失败。 2、结合题目&#xff0c;联想到UUencode编码&#xff0c;尝试后成功&#xff0c;得到flag。 …

驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----上报匿名上位机实现可视化

概述 lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式&#xff0c;常见的是四元数&#xff0c;欧拉角&#xff0c;矩阵和轴角。他们各自有其自身的优点&#xff0c;在不同的领域使用不同的表示方式。在四轴飞行器中使用到了四元数和欧拉角。 姿态解算选用的…