iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Software Development

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

( Day 14 ) 聲音剪輯、串接、混合、反轉

  • 分享至 

  • 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 檔案 ( 參考「如何讀取聲音?」 ),接著使用串列的方式取出 1500~5500 毫秒的內容,輸出成為 output.mp3。

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

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

from pydub import AudioSegment     # 載入 pydub 的 AudioSegment 模組

song = AudioSegment.from_mp3("oxxostudio.mp3")  # 讀取 mp3 檔案
song[1500:5500].export('output.mp3')            # 取出 1500 毫秒~5500 毫秒長度的聲音,輸出為 output.mp3
print('ok')                                     # 輸出後印出 ok

串接聲音

讀取聲音後,使用「相加」的方式,就能將不同的聲音串接成同一段聲音,下方的例子會將兩段聲音組合成一段聲音輸出。

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

from pydub import AudioSegment

song1 = AudioSegment.from_mp3("oxxo1.mp3")  # 讀取第一個 mp3 檔案
song2 = AudioSegment.from_mp3("oxxo2.mp3")  # 讀取第二個 mp3 檔案
output = song1 + song2                      # 串接兩段聲音
output.export('output.mp3')                 # 輸出為 output.mp3
print('ok')                                 # 輸出後印出 ok

因為讀取的聲音本質已是用串列的方式呈現,所以也能夠使用「串列相乘」的方式,將某一段聲音變成重複多次,下方的例子會將讀取的聲音乘以 3,就會重複三次。

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

from pydub import AudioSegment
song = AudioSegment.from_mp3("oxxostudio.mp3")  # 讀取 mp3 檔案
output = song*3                                 # 乘以 3,重複三次變成三倍長
output.export('output.mp3')
print('ok')

混合聲音

透過 overlay 方法混合聲音,使用方法如下:

output = sound1.overlay(sound2, position, gain_during_overlay, loop, times)
# output 輸出聲音
# sound1 主聲音
# sound2 要混合的聲音
# position 從 sound1 的何處開始混合,單位毫秒 ( 針對主聲音 )
# gain_during_overlay 混合時 sound1 的音量變化 ( 針對主聲音 )
# loop 如果 sound2 不夠長,是否要不斷重複,True 或 False
# times 如果 sound2 不夠長,指定 sound2 要重複幾次

下方的例子,會將說話的聲音,和一段背景音樂進行混合,由於背景音樂不夠長,使用 loop 參數將音樂不斷重複,直到說話聲音結束為止 ( 如果說話聲音比音樂短,則說話聲音結束時,音樂也會跟著結束 )

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

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

from pydub import AudioSegment                      # 載入 pydub 的 AudioSegment 模組
song = AudioSegment.from_mp3("oxxostudio.mp3")      # 讀取背景音樂 mp3 檔案
voice = AudioSegment.from_mp3("voice.mp3")          # 讀取說話聲音 mp3 檔案
output = voice.overlay(song, loop=True)             # 混合說話聲音和背景音樂
output.export('output.mp3')

聲音反轉

透過 reverse 方法反轉聲音,產生趣味的效果:

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

from pydub import AudioSegment                      # 載入 pydub 的 AudioSegment 模組
voice = AudioSegment.from_mp3("voice.mp3")          # 讀取說話聲音 mp3 檔案
output = voice.reverse()                            # 反轉說話聲音
output.export('output.mp3')

參考資料

更多 Python 教學

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


上一篇
( Day 13 ) 讀取聲音資訊、輸出聲音
下一篇
( Day 15 ) 調整聲音音量和速度
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言