脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python利用Pydub实现自动分割音频

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

2023-05-06 14:20黄昏中起飞的猫头鹰 Python

pydub是一个轻量级的音频处理库,安装方便,使用简单。而且pydub提供了丰富的音频处理功能,包括切割、合并、转换等。本文将利用Pydub实现自动分割音频功能,感兴趣的可以了解一下

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

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

I. 简介

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

II. 安装

使用pip安装pydub库:

?
1
pip install pydub

III. 使用

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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实现音频分割的方法,希望对大家有所帮助

方法一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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"# 新建的保存文件夹

方法二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"""
把原音频,按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")

到此这篇关于Python利用Pydub实现自动分割音频的文章就介绍到这了,更多相关Python Pydub分割音频内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_20163065/article/details/130457661

延伸 · 阅读

精彩推荐
  • Python在keras里面实现计算f1-score的代码

    在keras里面实现计算f1-score的代码

    这篇文章主要介绍了在keras里面实现计算f1-score的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    安于此生_11892020-06-15
  • Python简单了解Django模板的使用

    简单了解Django模板的使用

    这篇文章主要介绍了简单了解Django模板的使用,具有一定借鉴价值,需要的朋友可以参考下。...

    James3962020-12-26
  • Pythonpython列表推导式实现找出列表中长度大于5的名字

    python列表推导式实现找出列表中长度大于5的名字

    这篇文章主要介绍了python列表推导式实现找出列表中长度大于5的名字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝...

    慕慕和小绵羊5742022-09-22
  • PythonNumPy 矩阵乘法的实现示例

    NumPy 矩阵乘法的实现示例

    这篇文章主要介绍了NumPy 矩阵乘法的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    爱抓猫的狗9232021-09-26
  • Pythonpytorch中的numel函数用法说明

    pytorch中的numel函数用法说明

    这篇文章主要介绍了pytorch中的numel函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    schmiloo9382021-11-01
  • PythonPython利用Django如何写restful api接口详解

    Python利用Django如何写restful api接口详解

    这篇文章主要给大家介绍了关于Python利用Django如何写restful api接口的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考...

    六月的雨9112021-03-02
  • PythonPython+Matplotlib+LaTeX玩转数学公式

    Python+Matplotlib+LaTeX玩转数学公式

    这篇文章主要为大家介绍了如何在Matplotlib中使用LaTeX 公式和符号以及Python如何生成LaTeX数学公式。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下...

    pythonic生物人3992022-10-13
  • PythonPython cx_freeze打包工具处理问题思路及解决办法

    Python cx_freeze打包工具处理问题思路及解决办法

    这篇文章主要介绍了Python cx_freeze打包工具处理问题思路及解决办法的相关资料,需要的朋友可以参考下...

    xiaoyu_102015332020-08-12