Python利用Pydub实现自动分割音频

作者:黄昏中起飞的猫头鹰 时间:2022-10-08 22:02:48 

随着短视频应用的普及,越来越多人开始了解并尝试制作自己的短视频作品。而在制作短视频时,背景音乐的选择和使用也是非常重要的一步。很多人喜欢选择一首长音乐,再通过剪辑软件将其剪成多段来使用,这种做法虽然可行,但效率较低。

在这种情况下,我们可以使用音频分割技术来快速剪辑出需要的音频段,以便于在短视频中使用。在 Python 中,我们可以使用 Pydub 库来进行音频分割。

I. 简介

pydub是Python的一个音频处理库,可以处理各种音频格式,如mp3、wav、flv等等。它是一个轻量级、快速且易于使用的库。silence库是pydub的一个扩展库,可以在音频文件中根据静默部分进行分割,非常方便。

II. 安装

使用pip安装pydub库:

pip install pydub

III. 使用

下面是一个使用pydub=分割音频文件的示例代码:

from pydub import AudioSegment
from pydub.silence import split_on_silence

# 读取音频文件
audio = AudioSegment.from_file("audio.mp3", format="mp3")

# 设置分割参数
min_silence_len = 700  # 最小静音长度
silence_thresh =-10  # 静音阈值,越小越严格
keep_silence = 600  # 保留静音长度

# 识别计算分割歌曲数量
num_segments = int(audio.duration_seconds/60/3)  # 每首歌曲大概三分钟,计算歌曲数量

# 分割音频文件
for i in range(-10, 0):
   segments = split_on_silence(audio, min_silence_len=min_silence_len, silence_thresh=i, keep_silence=keep_silence)
   if len(segments) <= num_segments:
       print(f"分割成功,共分割出 {len(segments)} 段")
       break
   else:
       print(f"当前阈值为 {i},分割出 {len(segments)} 段,继续尝试")

上面的代码首先使用AudioSegment类从audio.mp3文件中读取音频数据,然后设置了分割参数min_silence_len、silence_thresh和keep_silence。min_silence_len是最小静音长度,silence_thresh是静音阈值,keep_silence是保留静音长度。这些参数的具体含义可以根据实际情况进行调整。最后,根据分割参数使用split_on_silence函数对音频文件进行分割。

分割成功后,我们可以输出分割后的音频文件,验证是否达到了我们预期的效果。至此,我们就完成了音频文件的自动分割,可以将分割后的文件用于其他需要使用的场景了。

补充

除了利用Pydub实现自动分割音频,本文还为大家整理了其他Python实现音频分割的方法,希望对大家有所帮助

方法一:

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

# # 循环目录下所有文件
for each in os.listdir("D:/PycharmProjects/拾音器/"):  # 循环目录

filename = re.findall(r"(.*?)\.mp3", each)  # 取出.mp3后缀的文件名
   print(each)
   if each:

mp3 = AudioSegment.from_file('D:/PycharmProjects/拾音器//{}'.format(each), "mp3")  # 打开mp3文件
       #         # # mp3[17*1000+500:].export(filename[0], format="mp3") # 切割前17.5秒并覆盖保存,与以下代码不可同时使用
       size = 10000  # 切割的毫秒数 10s=10000

chunks = make_chunks(mp3, size)  # 将文件切割为10s一块

for i, chunk in enumerate(chunks):
           chunk_name = "{}-{}.mp3".format(each.split(".")[0], i)    # 也可以自定义名字
           print(chunk_name)
           chunk.export('D:/PycharmProjects/拾音器2/{}'.format(chunk_name), format="mp3")  # 新建的保存文件夹

方法二:

"""
把原音频,按csv中的标注结果分割成几个音频,如text是无,忽略。否则从sDate到eDate 进行分割。
"""
import os
import pandas as pd
import json
from pydub import AudioSegment

csv_url = "D:\csv\\"
wav_url = "D:\标注音频与示例\\"
save_wav = "D:\wav\\new_wav\\"

for path in os.listdir(csv_url):
   data_frame = pd.read_csv(csv_url + path, encoding='utf-8')
   name_list = data_frame["storeFileName"]
   result_list = data_frame["finalResult"]
   for nl, rl in zip(name_list, result_list):
       new_wav_url = save_wav + nl.split(".")[0] + "\\"
       if not os.path.exists(new_wav_url):
           os.makedirs(new_wav_url)
       result = json.loads(rl)
       txt_url = new_wav_url + nl.split(".")[0]+".txt"
       with open(txt_url, "w", encoding='utf-8') as fn:
           fn.write(nl+"\n")
           fn.write(rl)
           fn.close()
       audio = AudioSegment.from_wav(wav_url + nl)
       for text in result['text']:
           if text['defData']['text'] != '无':
               sTime = text['defData']['sTime'] * 1000
               dTime = text['defData']['dTime'] * 1000
               eTime = sTime + dTime
               # 音频切割按开始时间到结束时间切割
               audio_chunk = audio[sTime:eTime]

audio_chunk.export(new_wav_url + nl.split(".")[0] + "-" + str(text['id']) + ".wav", format="wav")

来源:https://blog.csdn.net/qq_20163065/article/details/130457661

标签:Python,Pydub,音频
0
投稿

猜你喜欢

  • Python selenium如何设置等待时间

    2023-08-31 18:53:39
  • python GUI库图形界面开发之PyQt5开发环境配置与基础使用

    2023-11-16 04:45:22
  • python3用PIL把图片转换为RGB图片的实例

    2021-08-20 02:08:49
  • 关于windos10环境下编译python3版pjsua库的问题

    2021-06-04 08:12:13
  • python通过线程实现定时器timer的方法

    2023-04-28 17:49:28
  • Python实现Word的读写改操作

    2022-08-11 13:42:48
  • python截取两个单词之间的内容方法

    2022-06-02 01:48:46
  • 跟老齐学Python之集合(set)

    2023-02-11 00:51:31
  • Python中寻找数据异常值的3种方法

    2023-10-18 11:21:41
  • python使用Thread的setDaemon启动后台线程教程

    2023-09-29 05:49:26
  • pytorch对可变长度序列的处理方法详解

    2022-11-11 23:19:39
  • 在django模板中实现超链接配置

    2023-03-03 12:22:44
  • Pytest allure 命令行参数的使用

    2022-04-12 17:06:19
  • python使用re模块爬取豆瓣Top250电影

    2023-10-11 17:28:38
  • python调用API接口实现登陆短信验证

    2021-03-13 00:04:03
  • Python时间获取及转换知识汇总

    2023-08-02 12:17:08
  • Numpy np.array()函数使用方法指南

    2023-05-23 09:33:37
  • 一些让Python代码简洁的实用技巧总结

    2022-02-06 11:03:25
  • Google谷歌的CSS前景图片合并技术

    2009-07-13 12:21:00
  • mysql与sqlserver的所有区别

    2009-02-27 16:18:00
  • asp之家 网络编程 m.aspxhome.com