iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Software Development

學 Python 到底可以幹麻勒?系列 第 15

( Day 15 ) 調整聲音音量和速度

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 pydub 第三方函式庫,實現聲音的音量調整、聲音淡入淡出、以及改變聲音播放速度的效果。

原文參考:聲音音量調整、淡入淡出改變聲音速度

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

整聲音音量和速度

安裝 pydub 函式庫

輸入下列指令,就能安裝 pydub 函式庫 ( 依據每個人的作業環境不同,可使用 pip 或 pip3 或 pipenv )。

!pip install pydub

如果是使用 Anaconda 的環境,要額外輸入下列指令安裝 ffmpeg 和 ffprobe,不然執行後會發生找不到 ffprobe 的錯誤訊息 ( 使用 Colab 完全不用安裝額外套件 )。

conda install ffmpeg

!pip install ffprobe

調整聲音音量

使用 pydub AudioSegment 模組讀取 mp3 檔案 ( 參考「如何讀取聲音?」 ),就可以使用兩種方法調整聲音的音量:

音樂來源使用 Google 音樂庫:https://www.youtube.com/audiolibrary

  • 針對聲音陣列,增加或減少數值

    from pydub import AudioSegment
    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    song = AudioSegment.from_mp3("oxxostudio.mp3")  # 讀取 mp3
    output1 = song[:] + 10                          # 將所有陣列中的資料增加 10 ( 變大聲 )
    output2 = song[:] - 10                          # 將所有陣列中的資料減少 10 ( 變小聲 )
    output1.export('output1.mp3')                   # 輸出聲音
    output2.export('output2.mp3')
    print('ok')
    
  • 使用 apply_gain() 方法

    from pydub import AudioSegment
    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    song = AudioSegment.from_mp3("oxxostudio.mp3")
    output1 = song.apply_gain(10)             # 將音量增加 10 ( 變大聲 )
    output2 = song.apply_gain(-10)            # 將音量減少 10 ( 變小聲 )
    output1.export('output1.mp3')
    output2.export('output2.mp3')
    print('ok')
    

音量淡入淡出

聲音的淡入是指從無聲慢慢變大聲,淡出則是指從大聲慢慢變小到無聲,透過 pydub AudioSegment 模組的 fade()、fade_in() 和 fade_out() 方法,就能實現淡入淡出的效果。

  • fade_in()、fade_out()

    「fade_in() 淡入」和「fade_out() 淡出」可以快速進行淡入和淡出的效果,使用方法會包含一個「時間」參數,單位是毫秒,設定 3000 表示 3 秒。

    from pydub import AudioSegment
    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    song = AudioSegment.from_mp3("oxxostudio.mp3")
    output1 = song.fade_in(3000)     # 開頭三秒 ( 3000ms ) 淡入
    output2 = song.fade_out(3000)    # 結尾三秒 ( 3000ms ) 淡出
    output1.export('output1.mp3')
    output2.export('output2.mp3')
    print('ok')
    
  • fade()

    fade() 方法提供更為彈性的淡入淡出調整方式,使用方法會包含 to_gain ( 淡入或淡出結束的音量 )、start/end ( 開始或結束的秒數 ) 和 duration ( 持續時間 ) 參數。

    from pydub import AudioSegment
    import os
    os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用
    song = AudioSegment.from_mp3("oxxostudio.mp3")
    
    output1 = song.fade(to_gain=15, start=1000, duration=2000)
    # 從 1 秒的位置開始,慢慢變大聲到增加 15,過程持續 2 秒
    
    output2 = song.fade(to_gain=-30, end=3000, duration=2000)
    # 從 1 秒的位置開始 ( 3000-2000 ),慢慢變小聲到減少 30,過程持續 2 秒
    
    output1.export('output1.mp3')
    output2.export('output2.mp3')
    print('ok')
    

改變聲音播放速度

參考「How to change audio playback speed using Pydub」的做法,定義聲音加速和減速的函式,就能將改變聲音檔案的速度。

音樂來源使用 Google 音樂庫:https://www.youtube.com/audiolibrary

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # Colab 換路徑使用

from pydub import AudioSegment
song = AudioSegment.from_mp3("test.mp3")    # 讀取聲音檔案

# 定義加速與減速的函式
def speed_change(sound, speed=1.0):
    rate = sound._spawn(sound.raw_data, overrides={
        "frame_rate": int(sound.frame_rate * speed)
      })
    return rate.set_frame_rate(sound.frame_rate)

song_slow = speed_change(song, 0.75)   # 聲音減速
song_fast = speed_change(song, 2.0)    # 聲音加速

song_slow.export('song_slow.mp3')
song_fast.export('song_fast.mp3')

參考資料

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 14 ) 聲音剪輯、串接、混合、反轉
下一篇
( Day 16 ) 麥克風錄音
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言