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
猜你喜欢
- 下面进行一个高维线性实验假设我们的真实方程是:假设feature数200,训练样本和测试样本各20个模拟数据集num_train,num_t
- 本文实例讲述了Flask框架学习笔记之消息提示与异常处理操作。分享给大家供大家参考,具体如下:flask通过flash方法来显示提示消息:f
- 这篇文章主要介绍了深入了解如何基于Python读写Kafka,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 看过数据库的备份与还原。大多数都是用组件来完成的。其实可通过sql语句来完成。 由于时间关系,未对参数进行验证和界面美化。代码
- DesktopNexus 是我最喜爱的一个壁纸下载网站,上面有许多高质量的壁纸,几乎每天必上, 每月也必会坚持分享我这个月来收集的壁纸但是
- 印象中最早看老外个人网站就挺纳闷,怎么人家都没有www,这样也可以?经过不断尝试,我发现确实不录入www要快捷的多,但不清楚怎么能做到。几年
- 大量的多行段落本身就会降低可读性,同时空行分段也比空格分段有更高的可适应性...前文讨论的热烈程度远超我预期,正好还有之前查阅资料拍的几张实
- 在各类的前端开发工具里,在功能上虽然Editplus显得有些“单薄”,但是仍然是很多我辈做开发的人们离不开的工具,因为他小巧,语言高亮,支持
- 毫无疑问,我们生活在编辑器的最好年代,Vim是仅在Vi之下的神级编辑器,而脱胎于Vim的NeoVim则是这个时代最好的编辑器,没有之一。异步
- eval函数就是实现list、dict、tuple与str之间的转化str函数把list,dict,tuple转为为字符串一、字符串转换成列
- python中zip()函数用法举例定义:zip([iterable, ...])zip()是Python的一个内建函数,它接受一系列可迭代
- FBVFBV,即 func base views,函数视图,在视图里使用函数处理请求。以用户注册代码为例,使用两个函数完成注册初级注册代码d
- 看了oschina上的两个代码,受益匪浅。其中对join()方法不理解,看python官网文档的介绍:join([timeout]):等待直
- Twig是一款快速、安全、灵活的PHP模板引擎,它内置了许多filter和tags,并且支持模板继承,能让你用最简洁的代码来描述你的模板。他
- 为了使一个MySQL系统安全,强烈要求你考虑下列建议……当你连接一个MySQL服务器时,你通常应
- 网页开发人员常常希望能够了解并掌握多种语言,结果是,学习一门语言的所有内容是棘手的,但是却很容易发现你并没有完全利用那些比较特殊却很有用的标
- 张量范数:torch.norm(input, p=2) → float返回输入张量 input 的 p 范数举个例子:>>>
- 梯度下降(Gradient Descent)算法是机器学习中使用非常广泛的优化算法。当前流行的机器学习库或者深度学习库都会包括梯度下降算法的
- 导语应好友邀请,帮他写了个小程序,功能类似于实时监控自己关注的UP主,如果关注的UP主中有人发布了抽奖的动态,就自动参与这个抽奖。这样就能不
- 通过for循环求和,结果发现输出完全不一样,一个循环是输出每一步的结果,另一个循环是输出最终一次的结果,今天终于弄懂了。如下所示:补充:py