• pydub:音频转换器,对音频进行格式转换、附加特效


    楔子

    我们有些时候可能会对音频格式进行一些转换,而python也提供了这样的库,叫pydub。下面我们来看看用法。

    安装

    安装这个库很简单,直接pip install pydub即可,但是这个库非常简单,显然它不是处理音频的"幕后主使"。没错,真正处理音频的是ffmpeg,pydub只是封装了一些api。因此,我们要想处理音频,还需要ffmpeg。

    ffmpeg下载地址可以网上搜索,下载完了将bin目录配置到环境变量中即可。

    读取音频文件

    下面来读取一个音频

    import pydub
    
    song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
    

    以上我们就读取了一个mp3格式的音频,当然支持的音频格式不止mp3,不同格式的音频对应不同的读取方法。

    pydub.AudioSegment.from_mp3("song.mp3")

    pydub.AudioSegment.from_flv("song.flv")

    pydub.AudioSegment.from_ogg("song.ogg")

    pydub.AudioSegment.from_raw("song.raw")

    pydub.AudioSegment.from_wav("song.wav")

    根据音频格式选择合适的方法即可,或者还有一种通用的方法。

    pydub.AudioSegment.from_file("song.mp4", "mp3")

    pydub.AudioSegment.from_file("song.mp4", "mp4")

    pydub.AudioSegment.from_file("song.flv", "flv")

    pydub.AudioSegment.from_file("song.wma", "wma")

    pydub.AudioSegment.from_file("song.aiff", "aac")

    通过from_file,显式的指定音频格式也是可以的,并且from_file还可以读取很多其它格式的音频,只要是ffmpeg支持的格式都行。但是说实话,最常用的还是mp3、ogg、wav

    支持的操作

    通过from_mp3将音频读取进来之后,可以做什么操作呢?

    import pydub
    
    # 变量song便保存了该音频流
    song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
    """
    可以查看音频的各种属性,但是说实话,很多属性如果不是专门搞音频的,几乎用不到
    其实很多本人也不是很了解,下面只介绍几个常用的
    """
    
    # 获取channels
    # 如果channels为1,那么表示音频是单声道(mono), 如果为2表示音频是立体声(stereo)
    print(song.channels)  # 2
    
    # 使用的转化器,这里是ffmpeg
    print(song.converter)  # ffmpeg
    
    # 查看该音频总共有多少秒,这首歌总共是3分58秒
    print(song.duration_seconds)  # 238.603514739229
    
    # 打印音频的字节流,太长了,这里就不打印了
    # print(song.raw_data)
    
    # 我们可以对音频进行切片,切片之后还是一个音频。
    # 所以这里的first_5_seconds、last_5_seconds和song都是一个类型
    first_5_seconds = song[: 5 * 1000]  # 默认以毫秒作为单位,这里截取前5秒
    last_5_seconds = song[-5 * 1000:]  # 截取后五秒
    
    # 增加音量和减小音量,注意:这里不会影响原来的song
    first_5_seconds += 6  # 增加6分贝
    last_5_seconds -= 6  # 减小6分贝
    
    # 我们可以直接将两个音频进行合并,合并之后还是一个音频
    just_first_5_last_5 = first_5_seconds + last_5_seconds
    # 那么它是可以导出的,至于怎么导出后面说
    # 如果此时将just_first_5_last_5导出,那么该音频就只有开头5秒和结尾5秒,并且开头的音量增加了6分贝,结尾减少了6分贝
    
    # 还可以实现交叉淡入淡出的效果,这里将两端音频拼接在了一起,并加上了交叉淡入淡出效果
    with_style_first_5_last_5 = first_5_seconds.append(last_5_seconds, crossfade=1500)
    
    # 并且还可以手动实现淡入淡出
    _ = (first_5_seconds * 2).fade_in(2000).fade_out(3000)
    # 我们将前五秒的音频变成两份拼接在一起,那么总共就是10秒钟。会在开始的两秒淡入、最后的3秒淡出
    # 这里的每一步操作都会返回一个新的音频,因此可以直接进行链式操作
    
    # 总之对音频操作,结果还是一个音频。所以它们都是可以导出的。
    # 比如我们将两首歌合在一起,那么直接将两首歌读取进来,得到song1和song2
    # 直接song1 + song2然后导出即可,是不是非常简单呢?当然音频的切片、淡入淡出什么的,得到的还是音频,也是可以直接导出的
    

    导出音频

    我们对音频做了操作之后,下面就是导出音频了。导出比较简单,直接一个export即可,指定文件名和格式。比如:

    song.export("xxx.wav", format="wav")

    import pydub
    
    song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
    
    # 前5秒进行淡入,后10秒淡出,中间部分则是自动保持不变
    # 然后保存为wav格式
    song.fade_in(5000).fade_out(10000).export("幽閉サテライト - 加速する恋は谁にも止められない.wav")
    

    此时我们就将音频导出了,这里文件名太长,因此后面没有显示,但我们生成的文件的确是wav的。

    但还是有些不完美的地方,上面是原始音频,下面是我们导出的音频。有没有看到什么区别呢?对,一些歌曲的附加信息没了,那么可不可以在导出的时候加上呢,显然是可以的

    import pydub
    
    song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
    
    # 我们可以通过tags来指定,但是注意:如果想看到信息那么就不能指定为wav了,这里也指定mp3格式吧
    song.fade_in(5000).fade_out(10000).export("幽閉サテライト - 加速する恋は谁にも止められない123.mp3",
                                              tags={"artist": "古明地觉",
                                                    "title": "好听的歌",
                                                    "album": "东方地灵殿专辑",
                                                    "comments": "妈耶,小五好可爱呀(*╹▽╹*)"})
    

    总体来说,还是很方便、并且很容易操作的。如果你只是想改变格式,比如mp3转ogg,那么直接:pydub.AudioSegment.from_mp3("xxx.mp3").export("xxx.ogg", format="ogg")即可。当然你也可以用变量将音频保存起来,加入一些淡入淡出的效果,以及通过切片将音频分为多个部分,对每一部分单独做处理,然后再直接通过+将处理之后的每一部分组合起来、再导出也是可以的。

  • 相关阅读:
    Spring-web初始化流程简图
    记一次升级Tomcat
    Spring-Task思维导图
    2019的第一个工作日
    RocketMQ专题2:三种常用生产消费方式(顺序、广播、定时)以及顺序消费源码探究
    RocketMQ专题1:入门
    博客搬家到云栖社区
    ActiveMQ专题2: 持久化
    ActiveMQ专题1: 入门实例
    linux下怎么卸载自带的JDK和安装想要的JDK
  • 原文地址:https://www.cnblogs.com/traditional/p/12391872.html
Copyright © 2020-2023  润新知