moviepy剪切视频&spleeter视频降噪-CPU&GPU

2023-11-03

简介

moviepy官方中文API
spleeter官方github

本文视频降噪原理为使用spleeter提取出人声,仅将人声写回视频并保存。

对于AudioClip和VideoClip使用完要close()来释放资源

VideoFileClip构建时最好指定fps_source=‘fps’(平均帧率),默认为tbr(帧率)

一次运行对多个视频进行降噪时,不要把Separator(‘spleeter:2stems’)放到频繁调用的函数里,否则可能因为频繁创建Separator(‘spleeter:2stems’)对象而卡死(可以放进__main__函数或使用单例模式等)

所有可能用到的文件同时放在百度网盘:
链接:https://pan.baidu.com/s/1jyKsR65QI7dpo9NIObGlhA?pwd=xyvk
提取码:xyvk
在这里插入图片描述

安装spleeter

# 创建虚拟环境【可选】
conda create -n sp python=3.7

# 激活虚拟环境【可选】
conda activate sp

# 在gpu上运行需要下列二者之一:
# 	1) 执行代码conda install cudatoolkit=10.1 cudnn=7.6.5
#   2) 在本地安装CUDA10.1+cuDNN7.6.5(参考https://blog.csdn.net/qq_42283621/article/details/124095937)
# 否则将在cpu上运行

pip install moviepy==1.0.3
pip install spleeter-gpu==2.0.2
conda install ffmpeg==4.2.2
# 测试
# 在百度网盘下载audio_example.mp3,然后cd到其所占目录,例如:
cd C:\Users\shang\Desktop

# 命令spleeter separate [OPTIONS] -i INPUTS...
# 这里使用[OPTIONS] -p <预训练参数文件名> -o <输出路径>
# 第一次执行会在当前目录新建pretrained_models/2stems文件夹并下载4个预训练文件,若下载慢或网络错误可在百度网盘下载2stems.tar.gz将其中的4个文件复制到pretrained_models/2stems文件夹
spleeter separate -p spleeter:2stems -o . -i audio_example.mp3 

# 若在<输出路径>下出现名为audio_example的文件夹(该名即为输入文件名),audio_example文件夹下包含vocals.wav(人声)和accompaniment.wav(背景声)则测试成功。

# 若使用了gpu则在下面的两个图中可以看到显存占用,否则显存占用保持在0。

windows: 任务管理器 -> 性能 -> GPU1

image-20220805172418109

linux: 命令nvidia-smi

image-20220805214146000

代码执行

在当前目录下放置1.mp4、2.mp4、audio_example.mp3(均在百度网盘)以及pretrained_models/2stems/4个预训练文件(网络不佳或运行失败时,否则第一次执行下列代码将自动下载pretrained_models/2stems/4个预训练文件)

若输出结果第一行为“Successfully opened dynamic library cudart64_101.dll”则说明使用了GPU,若“Could not load dynamic library 'cudart64_110.dll'”则说明使用了CPU。
from moviepy.editor import *
from moviepy.audio.AudioClip import AudioArrayClip
from spleeter.separator import Separator


def audioNoiseReduction(audio, separator):
    """
    音频降噪(去除背景声保留人声)
    注:AudioClip包含AudioFileClip和AudioArrayClip两个子类
    :param audio: AudioClip或其子类对象
    :param separator: 人声分离器对象
    :return: AudioClip或其子类对象
    """
    audiodata = audio.to_soundarray(fps=44100)
    prediction = separator.separate(audiodata)
    # 保存人声(其中fps 44100需和获取时一样,AudioFileClip('audio_example.wav')采用了缺省的默认fps 44100)
    vocals = AudioArrayClip(prediction['vocals'], 44100)
    return vocals


def videoNoiseReduction(video, separator):
    """
    视频降噪(去除背景声保留人声)
    注:VideoClip包含VideoFileClip和DataVideoClip两个子类
    :param video: VideoClip或其子类对象
    :param separator: 人声分离器对象
    :return: VideoClip或其子类对象
    """
    audio = audioNoiseReduction(video.audio, separator)
    video_no = video.without_audio()
    video_red = video_no.set_audio(audio)
    audio.close()
    video_no.close()
    return video_red


def splitAndMergeVideo(pathList, savePath, timeList, separator, noiseReduction=False):
    """
    截取&合并视频片段&视频降噪

    调用示例:
        splitAndMergeVideo('1.mp4', 'smv1.mp4', '00:05-00:17')
        splitAndMergeVideo(['1.mp4', '1.mp4'], 'smv2.mp4', ['00:05-00:17', '00:00-00:10'], noiseReduction=True)
        splitAndMergeVideo(['1.mp4', '2.mp4'], 'smv3.mp4', ['00:05-00:17', '00:00-00:10'])

    :param pathList: 视频路径列表(str/str list)
    :param savePath: 视频结果保存位置
    :param timeList: 欲截取的视频片段起止时间列表(str/str list),格式为'开始时间-截止时间',
        开始时间/截止时间需使用'分:秒'或者'时:分:秒'或者'秒’,时、分、秒均为2位整数,例如'12‘,'12:34','12:34:56'
    :param separator: 人声分离器对象
    :param noiseReduction: 开启降噪(去除背景声保留人声)
    :return:  空
    """

    # 若为str,转为str list
    if isinstance(pathList, str):
        pathList = [pathList]
    if isinstance(timeList, str):
        timeList = [timeList]

    # 检查数据是否完整
    if len(pathList) != len(timeList):
        print('pathList 与 timeList 长度不匹配')

    # 解析并标准化起止时间格式,标准格式为'hh:mm:ss'
    startList = []
    endList = []
    for item in timeList:
        t = item.split('-')
        startList.append(t[0])
        endList.append(t[1])
    for index in range(len(startList)):
        if startList[index].count(':') == 0:
            startList[index] = '00:00:' + startList[index]
        elif startList[index].count(':') == 1:
            startList[index] = '00:' + startList[index]
    for index in range(len(endList)):
        if endList[index].count(':') == 0:
            endList[index] = '00:00:' + endList[index]
        elif endList[index].count(':') == 1:
            endList[index] = '00:' + endList[index]

    # 切割出每个视频的欲截取片段
    videoFiles = []
    for index in range(len(pathList)):
        videoFiles.append(VideoFileClip(pathList[index], fps_source='fps').subclip(startList[index], endList[index]))

    # 合并片段,写入新文件,关闭每个片段的操作句柄
    finVideo = concatenate_videoclips(videoFiles)

    # 降噪
    if noiseReduction:
        finVideo2 = videoNoiseReduction(finVideo, separator)
        finVideo2.write_videofile(savePath)
        finVideo2.close()
    else:
        finVideo.write_videofile(savePath)
    for item in videoFiles:
        item.close()
    finVideo.close()


if __name__ == '__main__':
    # Separator('spleeter:2stems')不要放到audioNoiseReduction函数里,否则可能因为频繁创建Separator('spleeter:2stems')对象而卡死
    separator = Separator('spleeter:2stems')

    # 测试audioNoiseReduction
    audio = AudioFileClip('audio_example.mp3')
    audio_red = audioNoiseReduction(audio, separator)
    audio_red.write_audiofile('audio_example_red.wav')
    audio.close()
    audio_red.close()

    # 测试videoNoiseReduction
    video = VideoFileClip('1.mp4', fps_source='fps')
    newVideo = videoNoiseReduction(video, separator)
    newVideo.write_videofile('new_video.mp4')
    video.close()
    newVideo.close()

    # 测试splitAndMergeVideo
    splitAndMergeVideo('1.mp4', 'smv1.mp4', '00:05-00:17', separator)
    splitAndMergeVideo(['1.mp4', '1.mp4'], 'smv2.mp4', ['00:05-00:17', '00:00-00:10'], separator, noiseReduction=True)
    splitAndMergeVideo(['1.mp4', '2.mp4'], 'smv3.mp4', ['00:05-00:17', '00:00-00:10'], separator)

    exit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

moviepy剪切视频&spleeter视频降噪-CPU&GPU 的相关文章

  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • 将一个时间序列插入到 pandas 中的另一个时间序列中

    我有一组定期测量的值 说 import pandas as pd import numpy as np rng pd date range 2013 01 01 periods 12 freq H data pd Series np ran
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5

随机推荐

  • js检测是否为数组的方法-JavaScript学习笔记

    1 方法一 instanceof 运算符 它可以用来检测是否为数组 代码 var arr var obj console log arr instanceof Array true console log obj instanceof Ar
  • Spring Boot 学习研究笔记(九) - Spring Data JPA常用注解

    Spring Data JPA 常用注解详细说明 1 Entity Entity 说明这个class 是实体类 并且使用默认的orm 规则 即 class 名对应数据库表中的表明 class 字段名即表中的字段名 如果想要改变这种默认的or
  • shell之多分支if语句

    1 语法格式 if 条件测试1 then 命令序列1 elif 条件测试2 then 命令序列2 elif 条件测试3 then 命令序列3 else 命令序列n fi 2 吃鸡段位排行 bin bash Author hejing Dat
  • 蓝牙硬件设备没有链接到计算机,电脑未发现蓝牙硬件设备怎么办

    有时我们想连接蓝牙硬件设备 却发现找不到了 没发现 怎么办 下面是学习啦小编为大家介绍电脑未发现蓝牙硬件设备的解决方法 欢迎大家阅读 电脑未发现蓝牙硬件设备的解决方法 首先我们在桌面找到 我的电脑 当然如果是WIN7 WIN8等系统以上的电
  • Postman 中文汉化界面

    参考 大佬的Gitee地址 gitee地址
  • GateWay 中StripPrefix的作用

    StripPrefix网关过滤器工厂采用一个参数StripPrefix StripPrefix参数表示在将请求发送到下游之前从请求中剥离的路径个数 spring cloud gateway routes id crm uri http cr
  • [1068]启动hdfs时,报错 Canary 测试无法在目录 /tmp/.cloudera_health_monitoring_canary_files 中创建文件

    启动hdfs时 报错 Canary 测试无法在目录 tmp cloudera health monitoring canary files 中创建文件 经过查看日志 发现 Name node is in safe mode 解决方法 sud
  • python练习10

    活动 10 while 循环的应用实例 一 程序示例 问 题 编程实现 猜数游戏 在给定某数后 让用户进行猜测并输入数 计算机给出相应提示 如偏大 偏小或正 确 若所猜测的数正确 则输出猜测次数 否则继续猜数 设计算法 初始 给定数 num
  • logback最详细配置讲解,及命名规范

    介绍 logback是一款日志框架 这个就不详细赘述了 命名规范 一般来说logback的配置文件可以命名为logback xml 项目启动时就可以读取到里面的配置 但是在spring boot项目中 这样会有一点问题 因为logback
  • 通过Docker方式安装海思Hi3516EV200交叉编译工具arm-himix100-linux

    前言 安装交叉编译环境 繁琐 耗时间 还得解决ubuntu版本不同 导致的各种错误 docker很好的解决了 不同版本 不同系统之间的差异性的问题 DOPI制作了docker方式的交叉编译环境 工作环境 vmare安装的ubuntu18 0
  • 实现前端项目自动化部署(webpack+nodejs)

    前言 一般来说 我们前端是不需要关心部署的事情的 只需要把打包后的文件直接丢给后台去部署就可以了 但是呢 如果频繁修改一点东西就要叫后台进行部署 这样后台会很烦 毕竟人家还有其他工作嘛 我们也会很不好意思 或许有些公司会给前端配置可视化操作
  • 静态时序分析——基础概念

    一 简述 静态时序分析是检查系统时序是否满足要求的主要手段 以往时序的验证依赖于仿真 采用仿真的方法 覆盖率跟所施加的激励有关 有些时序违例会被忽略 此外 仿真方法效率非常的低 会大大延长产品的开发周期 静态时序分析工具很好地解决了这两个问
  • Java的冒泡排序方法

    废话不多说 直接上代码 看不懂的话可以看注释 在这里插入代码片 public static void bubbleSort int arr 标志位 标志是否进行交换 boolean flag false for int i 0 i lt a
  • java 双列集合Map 万字详解

    目录 一 前言 二 概述 三 特点 四 常用方法 1 V put K key V value 代码演示 2 V get Object key 代码演示 3 V remove Object key 代码演示 4 int size 代码演示 5
  • excel两个指标相关性分析_指数相关性如何计算?

    且慢上长赢指数计划中有个指标叫相关性 这是统计学概念 主要看两个数列之间的相关程度 用在指数投资上 用作分散参照 如果两只指数的相关性越高 说明指数走势高度相似 涨的时候都涨 跌的时候都跌 起不到平衡或者分散风险的目的 因而 在投资时 尽量
  • 力扣 - 106、从中序与后序遍历序列构造二叉树

    题目 根据一棵树的中序遍历与后序遍历构造二叉树 注意 你可以假设树中没有重复的元素 例如 给出 中序遍历 inorder 9 3 15 20 7 后序遍历 postorder 9 15 7 20 3 返回如下的二叉树 3 9 20 15 7
  • 活锁和饥饿

    活锁 活锁本质上不是锁 是互相干扰导致线程无法跳出循环 比如 public class TestLiveLock static volatile int count 10 static final Object lock new Objec
  • SpringBoot 自定义注解(一)参数校验

    SpringBoot 2 3 0版本之后就没有引入validation对应的包 需要手动引用 依赖如下
  • ​JVM-调优参数归纳​

    本地线程分配缓冲 XX UseTLAB 把内存分配的动作按照线程划分在不同的空间之中进行 即每个线程在Java堆中预先分配一小块内存 通过 XX UseTLAB参数来设定虚拟机是否使用TLAB JVM会默认开启 XX UseTLAB XX
  • moviepy剪切视频&spleeter视频降噪-CPU&GPU

    文章目录 简介 安装spleeter 代码执行 简介 moviepy官方中文API spleeter官方github 本文视频降噪原理为使用spleeter提取出人声 仅将人声写回视频并保存 对于AudioClip和VideoClip使用完