欢迎关注

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

pydub 是一款简单、方便且强大的 Python 音频处理库

项目地址:

https://github.com/jiaaro/pydub

日常音频剪辑处理工具,都可以使用它来完成,比如:提取音频、音频切断、音效处理、响度控制、声道配置、音频合成等

首先,安装依赖包

# 安装依赖
pip3 install pydub

3. 常见操作

接下来,我们来聊聊 pydub 常见的操作

3-1 AudioSegment 对象

pudub 最重要的一个类是:AudioSegment

它是一个不可变的对象,代表一个音频段对象

首先,我们实例化一个 AudioSegment 对象,它内置有多种实现方式

比如,我们从本地加载一个 wav 的音频文件

from pydub import AudioSegment# 音频路径
audio_path = "./raw/1.wav"# 指定音频格式,这里以wav音频为例
format='wav'# 实例化一个AudioSegment对象
audio_segment = AudioSegment.from_file(audio_path, format)

3-2 裁剪某段音频

针对 AudioSegment 对象,使用中括号指定开始时间和结束时间,即可以快速提取某一段音频

PS:时间以毫秒为单位

# 某一段音频文件
# 指定开始时间、结束时间
# 时间以毫秒为单位
audio_part = audio_segment[start_time:end_time]

3-3 合并音频

使用 pydub 合并多段音频非常便捷,只需要使用符号 +,将三段音频的 AudioSegment 对象加起来即可

def sound_compound(one_audio_segment, *other):"""合并两段音频:param one_audio_segment::param other_audio_segment::return:"""result = one_audio_segment# 使用符号+,一段一段合并for segment in other:result += segmentreturn result# 合并3段音频
audio_segment1 = AudioSegment.from_file('./1.wav', 'wav')
audio_segment2 = AudioSegment.from_file('./2.wav', 'wav')
audio_segment3 = AudioSegment.from_file('./3.wav', 'wav')# 合并3段音频文件
audio_segment_result = sound_compound(audio_segment1, audio_segment2, audio_segment3)

3-4 音频常见属性

音频比较常见的属性包含:

  • 时长
  • 响度
  • 声道数
  • 帧速率
  • 原始数据

对于音频的时长,有 2 种获取方式,即:

# 音频常见属性
# 实例化AudioSegment对象
as = AudioSegment.from_file("sound1.wav")# duration_seconds:在内部调用了 len() ,单位为秒
# 方式一,duration_seconds,以秒为单位
as_duration1 = as.duration_seconds# 方式二:len(as),以毫秒为单位
as_duration2 = (len(as) / 1000.0)

其他原始数据都可以从 AudioSegment 对象相应的属性中获取 :

# 音频常见属性
# 实例化AudioSegment对象
as = AudioSegment.from_file("sound1.wav")# 2、音频响度
as_loudness = as.dBFS# 3、声道数
as_channel_num = as.channels# 4、帧速率
# 一般值为 44100 (CD), 48000 (DVD), 22050, 24000, 12000 和 11025
as_frame_rate = sound.frame_rate# 5、音频的原始数据
as_raw_data = sound.raw_data

3-5 单条音频淡入淡出

视频剪辑中,经常需要对音频做淡入淡出处理,使音效播放更加自然

比如:针对单个音频,在开头使用淡入,结束使用淡出,并指定淡入和淡出的时间

PS:单位以毫秒为单位

def sound_fade_in_and_out(one_audio_segment, fade_in=0, fade_out=0):"""单段音频设置开头淡入、结尾淡出可以把许多运算符连成一串使用,因为运算符都会返回一个AudioSegment对象:param one_audio_segment::param fade_in:淡入时间(毫秒):param fade_out:淡出时间(毫秒):return:"""return one_audio_segment.fade_in(fade_in).fade_out(fade_out)audio_segment = AudioSegment.from_file("./raw/1.wav", format='wav')# 单条视频开头淡入,结束淡出
sound_fade_in_and_out(audio_segment,2000,2000)

需要指出的是,AudioSegment 对象内置的 fade() 函数,可以更加灵活地实现淡入淡出效果

sound = AudioSegment.from_file("./sound.wav")# fade实现淡入/淡出效果
# 1、从1s开始,持续2s,执行淡化效果,并从0dB逐渐增加到3dB
sound_fade1 = sound.fade(to_gain=+3.0, start=1000, duration=2000)# 2、从1s开始,一直到4s,中间1s的时间内执行淡化效果,从0db逐渐降低-2dB
sound_fade2 = sound1.fade(to_gain=-2, start=1000, end=4000)

3-6 调整音频播放速度

视频剪辑中,音频速度的调整很常见

比如:在视频结尾,调整最后的画面帧为慢动作,同样需要同步调慢音频的播放速度

def speed_change(sound, speed=1.0):"""改变音频的速度:param sound::param speed::return:"""sound_with_altered_frame_rate = sound._spawn(sound.raw_data, overrides={"frame_rate": int(sound.frame_rate * speed)})return sound_with_altered_frame_rate.set_frame_rate(sound.frame_rate)# 改变音频的播放速度
# 比如:0.8调整为之前速度的0.8
audio_new = speed_change(self.audio_segment, 0.8)

3-7 播放音频

AudioSegment 对象使用 pydub 内置的 play() 方法,可以播放音频,在调试代码的时候非常方便
from pydub.playback import playsound1 = AudioSegment.from_file("./1.wav")# 播放音频
play(sound1)
3-8  音量增益及降低
要调整一段音频的音量,可以直接对 AudioSegment 实例加、减对应的分贝数目即可
def sound_gain(audio_segment, db_value):"""声音增益:param audio_segment::param db_value 分贝:return:"""return audio_segment + db_valuedef sound_reduce(audio_segment, db_value):"""降低音量:param audio_segment::param db_value 分贝:return:"""return audio_segment - db_value# 降低音量,-10分贝
audio_segment_temp = sound_reduce(audio_segment, 10)# 增加音量,+10分贝
audio_segment_temp1 = sound_gain(audio_segment, 10)

3-9 交叉淡化效果

使用 append() 方法,可以将多段音频对象进行合并,并添加交叉淡化的效果
PS:使用 crossfade 参数指定交叉淡化的持续时间,单位为毫秒def sound_overlap_effect(one_audio_segment, other_audio_segment, overlap_during):"""两段音频合并的同时,使用交叉淡化的效果:param one_audio_segment:第一段:param other_audio_segment:第二段:param overlap_during:单位毫秒:return:"""return one_audio_segment.append(other_audio_segment, crossfade=overlap_during)# 两段音频
audio_segment1 = AudioSegment.from_file('./1.wav', 'wav')
audio_segment2 = AudioSegment.from_file('./2.wav', 'wav')# 合并两段音频,并添加效果
# 持续时间:2000毫秒
result = sound_overlap_effect(audio_segment1, audio_segment2, 2000)

3-10 多声道音频

利用 from_mono_audiosegments() 函数,可以一个轨道上创建多声道音频

def create_multichannel_as(self):"""创建多声道音频(支持2个或者多个):return:"""# PS:每个单声道音频段都应该有相同的时长以及帧速率one_as = AudioSegment.from_wav("./1.wav")other_as = AudioSegment.from_wav("./2.wav")# 合成多声道音频return AudioSegment.from_mono_audiosegments(one_as, other_as)

3-11 提取音频及导出音频

在 3-1 中实例化 AudioSegment 方式,方法同样适用于视频,即:我们可以从视频中提取 AudioSegment 音频对象

使用 AudioSegment 对象的 export(filename,format) 方法,就可以将音频保存到本地了

# 1、从视频中提取一个AudioSegment音频对象
audio_segment = AudioSegment.from_file(video)def save_audio(audio_segment, filename, format):"""保存音频文件到本地:param audio_segment::param filename::param format::return:"""audio_segment.export(filename, format=format)# 2、导出音频到本地
save_audio(result, './result.wav', 'wav')

4. 实战一下

对搞笑类短视频,经常会采用这种剪辑手法,即:将视频尾部,对最后一段对话降低速度并重新播放一次

准备一段视频素材,下面通过 pydub 来实现它

video_path = './raw.mp4'# 注意:加载视频不需要指定format
audio_sgement = AudioSegment.from_file(video_path)# 截取尾部内容
audio_end = audio_sgement[70 * 1000:70 * 1000 + 3000]# 变慢速度,具体根据视频速度去调整
audio_end2 = speed_change(audio_end, 0.55)# 合并两段音频
audio_result = audio_end + audio_end2# 尾部淡出处理
audio_result.fade_out(1000)# 视频导出
audio_result.export("result.wav", format='wav')

最后生成音频

5. 最后

文中仅仅对 pydub 常用的操作进行了讲解,更多骚操作可以阅读官方文档去解锁

音视频的一些常见操作都可以做成自动化,让自己从重复的剪辑工作中抽离出来

完整脚本下载:

https://download.csdn.net/download/huangbangqing12/46065047

用 Python j进行一次短视频音频创作相关推荐

  1. TaoAudio: 淘宝直播短视频音频解决方案

    背景介绍 2019年是电商直播爆发的一年,被称为电商直播元年,2020年电商直播持续发展,越来越多的平台开始发力直播带货业务.淘宝直播作为电商直播第一平台,成为连接上亿主播和粉丝的桥梁. 直播传递信息 ...

  2. python 使用twilio免费发送短信

    这里写自定义目录标题 python 使用twilio免费发送短信 登录 获取发送用号码 在python中测试,并发送短信 python 使用twilio免费发送短信 使用twilio提供的服务,貌似使 ...

  3. 使用python代码给手机发短信详解(twilio的使用)

    ☞☞☞点击查看更多优秀Python博客☜☜☜ 使用python代码给手机发短信详解 twilio网页注册 实现代码 效果演示 ==**文章导航:==** 使用python代码给手机发送短信,在这里给大 ...

  4. 疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息

    疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息 随着时间的流逝,在中国共产党的领导,全国人民的共同努力下,疫情逐渐受到了控制,逐渐好转,复工,开学有望.最近在和女朋友的闲聊当中得知 ...

  5. python GSM模块-电脑接收短信

    文章目录 一.GSM模块: 1. 产品介绍 2.前言:最近做了一个需求,需要接收手机短信验证码.因此我这里考虑到了 GSM 模块 一.GSM模块: 1. 产品介绍 ① 一种具有独立的操作系统的功能模块 ...

  6. 使用Python开通腾讯云短信(sms)【亲测有效·超详细】

    使用Python开通腾讯云短信(sms) 1.开通腾讯云短信服务 2.创建应用 3.创建签名 4.Python 操作腾讯云短信接口 模块安装 详细代码[可直接作为接口] 1.开通腾讯云短信服务 腾讯云 ...

  7. python使用SIM800C发送英文短信

    python使用SIM800C发送英文短信 import io import time import serial import serial.tools.list_ports# 字符串转16进制un ...

  8. python:实现SMS群发短信服务(附完整源码)

    python:实现SMS群发短信服务 from __future__ import print_function import os import sqlite3 import urllib # UR ...

  9. Python爬虫:多平台短视频去水印下载器

    Python爬虫:多平台短视频去水印下载器 功能介绍 各平台分解 抖音 快手 微视 皮皮搞笑 总结 源码仓库 本教程描述的爬取方案定档与2020年10月26日 郑重申明:该文章介绍的技术仅供用于学习, ...

  10. RPA解决:python GSM 模块 - 电脑接收短信

    学Python,用RPA 艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载使用 www.i-search.com.cn/index.html?from=line1 前言: 最近做了一个需求, ...

最新文章

  1. 基于TensorRT的BERT实时自然语言理解(上)
  2. 李飞飞最新访谈:我每天都在对AI的担忧中醒来
  3. 将java.time.LocalDate转换为java.util.Date类型
  4. 一段代码到可执行程序所有经历
  5. PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法
  6. 数据结构—二叉树BinaryTree
  7. java中ThreadPool的介绍和使用
  8. Java基础知识——Java数组详解
  9. sqlserver 如何把一列分为一行显示_SqlServer数据库如何快速修改表的一列值
  10. oracle数据库中函数和存储过程中的区别
  11. 空格分隔输出(信息学奥赛一本通-T1026)
  12. C++/C--文件及函数注释【转载】
  13. python 驱动级鼠标_电竞极速鼠标
  14. 2022电大国家开放大学网上形考任务-工程数学(本)非免费(非答案)
  15. 蓝桥杯单片机第七届省赛-模拟风扇控制系统
  16. 计算机管理usb出现问号,USB设备全部都是问号,求助?
  17. 虚拟机安装Win10纯净版操作系统
  18. 一个鼠标移出事件引发的问题
  19. 内江人物--(张大千、骆成骧)秀才、美女、黏鱼
  20. Vue实例详解与生命周期

热门文章

  1. img 标签如何使图片成为圆形
  2. JS混入(mix-in)小案例
  3. 使用Cisco Packet Tracer之图解无线网络全网互联
  4. Poi 为word 添加页眉 获取页眉
  5. Android 水瓶动画,贝塞尔Loading
  6. 中蒙联合考古队发现青铜时代至清代岩画图案
  7. #STM32 LCD12864编程即原理介绍
  8. Ubuntu下全命令行部署Android模拟器
  9. 全球定位经纬度的方法现在是GPS等系统定位,以前是指南针罗盘六分仪
  10. 火车进出栈【卡特兰数】【高精度】【压位】【压int位】