近日有同学让我帮他剪辑某一段音频,笔者就搜罗了下网上一些常用的剪辑音视频软件。各类杂七杂八的软件挺多的,在纠结于选择哪一个时,忽然想起”为嘛不用Python
神器试试呢?“
有了想法,那就实践呗!这一搜索,还真有相应的库是可以切割音频的。
from scipy.io import wavfile
import numpy as np
使用scipy
库中的方法wavfile
。
from pydub import AudioSegment
主要使用pydub
库中的方法AudioSegment
。
经过比较,发现方法1操作简单,但是只对.wav
格式有效。方法2 略微复杂,但是功能强大,支持多种文件格式,如,我们常见的mp3, wav,MP4
等。学习成本也不算高, 因此,本文主要针对方法2 进行说明。方法1 在文末给出相应参考文档。
安装pudub
pydub
,用来处理音频,比如说MP3啊、wav之类的东西是很方便的。这个库的安装和其他常见的库类似:
pip install pydub
安装ffmeg
这个是一个命令行工具,可以用于一些音频格式的转换,比如mp3
转wav
啊之类的,然后就可以处理其他类型的多媒体文件了。
可以去ffmeg
官网下载,解压配置环境变量即可。
windows
用户下载压缩包 ffmeg.
操作步骤很简单,这里给出一个参考教程
安装完之后,打开命令行测试;
直接从源码入手:
'''
@Time : 2020/2/12 13:55
@FileName: cutVoice.py
@Author : Solarzhou
@Email : [email protected]
'''
from pydub import AudioSegment
file_name = r"../data/source.mp3"
sound = AudioSegment.from_mp3(file_name)
start_time = "0:00"
stop_time = "1:29"
print("time:", start_time, "~", stop_time)
start_time = (int(start_time.split(':')[0]) * 60 + int(start_time.split(':')[1])) * 1000
stop_time = (int(stop_time.split(':')[0]) * 60 + int(stop_time.split(':')[1])) * 1000
print("ms:", start_time, "~", stop_time)
word = sound[start_time:stop_time]
# 保存路径
save_name = r"../data/" + "sound1" + file_name[-4:]
print(save_name)
word.export(save_name, format="mp3", tags={'artist': 'AppLeU0', 'album': save_name[:-4]})
这里是先读取了mp3
文件,使用AudioSegment.from_mp3
函数,如果是其他的一些特殊格式,可以使用AudioSegment.from_file("sound.mp4", format="mp4")
剪切时间是按ms 毫秒来的,所以时间格式的转换就要到毫秒级的。sound[start_time:stop_time]
使用了python
里的list
分割来选择时间的长短。最后export函数输出,指定保存为mp3
格式的。
'''
@Time : 2020/2/12 14:48
@FileName: joinVoice.py
@Author : Solarzhou
@Email : [email protected]
'''
from pydub import AudioSegment
def joinVoice():
file1_name = r"../data/sound1.mp3"
file2_name = r"../data/sound2.mp3"
# 加载需要拼接的两个文件
sound1 = AudioSegment.from_mp3(file1_name)
sound2 = AudioSegment.from_mp3(file2_name)
# 取得两个文件的声音分贝
db1 = sound1.dBFS
db2 = sound2.dBFS
dbplus = db1 - db2
# 声音大小
if dbplus < 0:
sound1 += abs(dbplus)
else:
sound2 += abs(dbplus)
# 拼接两个音频文件
finSound = sound1 + sound2
save_name = r"../data/" + "finSound" + file1_name[-4:]
print("save_path:", save_name)
finSound.export(save_name, format="mp3", tags={'artist': 'AppLeU0', 'album': save_name[:-4]})
return True
if __name__ == '__main__':
joinVoice()
到此,我们想要的音频已经剪辑完成。
从一名不羁的码农开始
参考文档1
参考文档2
方法1参考文档