首页 > 编程语言 >工作提效--python实现批量音频裁剪工具

工作提效--python实现批量音频裁剪工具

时间:2023-06-18 20:34:18浏览次数:55  
标签:format -- 裁剪 音频文件 python 文件夹 path 提效 audiofile

一、问题:大批量的音频测试文件,无法满足测试需求

项目测试需要往平台中上传一批音频文件进行算法测试, 平台规定的音频的时长必须在10-30s内, 而从算法开发人员那里获取到的3000条音频文件都是32s时长, 因此无法将测试数据上传到平台进行测试。

基于以上问题,需要在项目体测之前将3000条音频文件都转换成30s以内的文件,手动裁剪的话费时费力,且没有那么多的时间和人力去处理。因此想到了编写工具脚本来批量处理这些音频文件

二、解决思路:批量裁剪音频文件

网上搜索到python中的第三方库pydub中有很多音频文件处理的方法,以下是脚本的实现思路

1、调用脚本,传参:音频文件路径、音频文件格式,裁剪模式,裁剪的起点,裁剪的终点

  音频文件格式:一般是mp3、wav格式

  裁剪模式:分为模式1和模式2, 输入的是模式1的话,则将一条音频裁剪成相等时长的两段音频文件(生成了2条音频);输入的是模式2的话,则裁剪出起点                            和终点之间的一段音频文件(生成了1条音频)

  裁剪的起点、裁剪的终点:即按照指定的音频的开始时间位置和结束时间位置进行裁剪,参数值的单位为秒

2、根据 音频文件路径参数,先在此路径下生成一个名为“separateResultFile”的文件夹,若已存在此文件夹,则删除重新创建,若未存在此文件夹,则直接创建

3、根据1中输入的参数,读取音频文件夹下的所有文件,并循环处理每一条文件,并将处理后生成的音频文件保存到“separateResultFile”文件夹中

三、解决过程:采用python中的第三方库pydub进行批量处理音频文件

如下图所示,是实现的代码。用到了pydub 库中的AudioSegment  和 pydub.utils 中的make_chunks 

from pydub import AudioSegment
from pydub.utils import make_chunks
import os, re,shutil

def mikdir(path):
    folder=os.path.exists(path)
    if not folder:
        os.makedirs(path)
    else:
        shutil.rmtree(path)
        os.makedirs(path)
    return path

def audioFileSeparate(filepath,audiofile_type,separate_mode,starttime=0,endtime=0):
    """
    :param filepath: 音频文件存放的文件夹路径
    :param audiofile_type: 音频文件格式(mp3、wav等格式)
    :param separate_mode: 裁剪模式(1:裁剪成长度相等的两段视频,2:输入起止时间进行裁剪)
    :param starttime,endtime: 如果模式为2时,需要输入裁剪的开始时间和结束时间,单位为秒
    :return:无
    """
    #创建分割后存储的文件夹
    savepath=mikdir(os.path.join(filepath,"separateResultFile"))
    # # 循环目录下所有文件
    for eachfile in os.listdir(filepath):  # 循环目录
        #audiofilename = re.findall(r"(.*?)\.wav", eachfile)  # 取出.mp3后缀的文件名
        print(eachfile)
        try:
            if eachfile:
                audiofile_path = os.path.join(filepath, eachfile)
                audiofile = AudioSegment.from_file_using_temporary_files(file=audiofile_path,
                                                                         format=audiofile_type)  # 打开指定格式的文件
                # mp3 = AudioSegment.from_file('P:/ai测试数据/光纤/光纤/异常//{}'.format(eachfile), "wav")  # 打开mp3文件
                #         # # mp3[17*1000+500:].export(filename[0], format="mp3") # 切割前17.5秒并覆盖保存,与以下代码不可同时使用
                audioDuration = audiofile.duration_seconds
                if separate_mode == 1:
                    # size = 16000  # 切割的毫秒数 10s=10000
                    chunks = make_chunks(audiofile, audioDuration // 2 * 1000)  # 将文件平分成两个
                    for i, chunk in enumerate(chunks):
                        chunk_name = "{}-{}.wav".format(eachfile.split(".")[0], i)  # 也可以自定义名字
                        # chunk.export('P:/ai测试数据/光纤/光纤/异常分割后/{}'.format(chunk_name), format=audiofile_type)  # 新建的保存文件夹
                        chunk.export(savepath+ "/" + chunk_name, format=audiofile_type)  # 新建的保存文件夹
                elif separate_mode == 2:
                    audioAfterSeparate = audiofile[starttime*1000:endtime*1000]
                    audioAfterSeparate_name = "{}-{}.wav".format(eachfile.split(".")[0], 0)  # 也可以自定义名字
                    audioAfterSeparate.export(savepath + "/" + audioAfterSeparate_name, format=audiofile_type)
                else:
                    print("separate_mode 参数只能是1或2, 您输入的参数有误")
            else:
                print("文件夹下无视频文件,请确认一下文件夹路径")

        except PermissionError:
            pass

if __name__ == '__main__':
    #audioFileSeparate(filepath="C:\\Users\\chenna9\\Desktop\\test",audiofile_type="wav",separate_mode=2,starttime=0,endtime=30)
    audioFileSeparate(filepath="C:\\Users\\chenna9\\Desktop\\test", audiofile_type="wav", separate_mode=2, starttime=0,
                      endtime=30)

 

四、总结

1、脚本实现过程中,出现了permissionError 的问题,问题得到了一定程度的解决,但最后还是会有这个报错,所有并没有真正意义上的解决,最后是将此报错忽略了,具体解放方法可查看此的随笔 :python--python脚本中保存处理后的音频文件到指定文件夹时报错permission denied 的问题

2、将文件夹下的所有文件,获取到并循环处理每一个音频文件, 其实这里是有问题的,有可能此文件夹下有非音频类型的文件,所有应该是获取到指定的格式的文件并对此文件进行处理。

不过由于时间有限,且工作中都是一个文件夹下都是音频文件,所有此需求点比较低,没有实现,后续有需要的话再优化把。

3、其实代码里异常捕捉和处理的功能没有实现,奈何自己这块还有点薄弱,后续加强这一块的学习和使用把。

标签:format,--,裁剪,音频文件,python,文件夹,path,提效,audiofile
From: https://www.cnblogs.com/ccnn9/p/17489641.html

相关文章

  • 【Unity3D】阴影原理及应用
    1阴影原理​光源照射到不透明物体上,会向该物体的后面投射阴影,如果阴影区域存在其他物体,这些物体不被光源照射的部分就需要渲染阴影。因此,我们可以将阴影的生成抽象出2个流程:物体投射阴影、物体接收阴影。1.1阴影相关开关​1)开启Light组件渲染阴影NoShadows......
  • 【Unity3D】魔方
    1需求实现​绘制魔方中基于OpenGLES实现了魔方的绘制,实现较复杂,本文基于Unity3D实现了2~10阶魔方的整体旋转和局部旋转。​本文完整代码资源见→基于Unity3D的2~10阶魔方实现。下载资源后,进入【Build/Windows】目录,打开【魔方.exe】文件即可体验产品。......
  • 必知必会:Java基础
    创建对象有几种方式(1)new创建对象;(2)反射创建对象;(3)采用clone机制;(4)序列化机制。创建反射对象的几种方式(1)类.class:通过 类名.class 创建反射获取对象; 类.class 是静态加载,是JVM编译时就要加载。Class<ClassDemo>oClass=ClassDemo.class;(2) object.getClass() :以 实......
  • 虚拟机安装ubuntu22.04以及后续出现的问题
    官网下载:Ubuntu系统下载|Ubuntu创建新的虚拟机 自定义 默认下一步 修改安装位置,系统盘会不断增加 默认下一步 自定义硬件(移除打印机),使用ISO映像文件(M)  关闭,完成。开启虚拟机:(默认启动默认安装,要不容易卡死) 安装Ubuntu continue创建SWAP分区:S......
  • 【网络(八)】
    1.在CPU中,用来保存运算器的运算结果状态、程序运行时的工作状态及机器的状态信息的寄存器是(C)。A.程序计数器PCB.指令寄存器IRC.状态字寄存器PSWD.地址寄存器AR2.以下哪个功能比较适合使用UDP协议?(A)A.数据多播B.可靠连接C.流量控制D.拥塞控制UDP是面向无连接,尽最大努力到达,......
  • spinnaker部署
    1、部署miniokubectlapply-f-<<eofapiVersion:apps/v1kind:Deploymentmetadata:name:minionamespace:spinnakerspec:selector:matchLabels:app:minioreplicas:1template:metadata:labels:app:miniosp......
  • CMake官网教程学习
    简介本文档是根据CMake的官方教程学习的笔记,同时将教程中C++实现的代码更改为C语言实现。当前还未学习完。教程官网:CMakeTutorial—CMake3.27.0-rc1Documentation中文教程:教程—CMake3.26.4Documentation(cmake-doc.readthedocs.io)官方教程源码下载:https://cmake.o......
  • QQ客户端中网址显示「?」或「安全性未知」的申诉
    情况网址在QQ中显示「?」图标和「安全性未知」,无法在QQ中打开。  申诉方法一访问:https://urlsec.qq.com/complain.html填写网址后,点击「提交查询」填写相关信息后,点击提交。申诉方法二用电脑或手机打开微信公众号:腾讯安全反诈骗实验室右下角「联系我们」→「网......
  • 敏捷与瀑布的区别
    众所周知,项目管理起源于软件开发行业,而目前已广泛应用于各行各业,完整的项目管理包含五个部分,分别是:项目启动、项目规划、项目执行、项目监控、项目收尾。随着行业的发展,传统的瀑布式项目管理模式,已经不适应于当前快速迭代快速开发的需求,从而衍生出了“敏捷项目管理”。瀑布式项目......
  • 二、微程序设计
    二、微程序设计组合方式进行控制器的设计结构清晰,简单明了,但是电路庞杂,每一个控制信号都需要设计单独的电路来完成控制信号的生成,修改起来十分困难,因此产生了这种设计容易,修改容易的控制器设计方法1.微程序设计思想一条机器指令对应一个微程序,一个微程序包含多个微指令,一个微指......