iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Software Development

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

( Day 13 ) 讀取聲音資訊、輸出聲音

  • 分享至 

  • xImage
  •  

這篇文章會介紹如何安裝和使用 Python 的 pydub 第三方函式庫,透過 pydub 取得聲音長度、聲道、音量...等基本資訊,以及如何將聲音輸出為不同格式 ( 例如讀取 wav 檔案後輸出為 mp3 格式 )。

原文參考:讀取聲音資訊、輸出聲音

本篇使用的 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 Quickstart」說明,可以使用下列的方法,讀取不同格式的聲音檔案:

方法 說明
AudioSegment.from_wav 讀取 .wav
AudioSegment.from_mp3 讀取 .mp3
AudioSegment.from_flv 讀取 .flv

如果要讀取影片的音軌檔案,可使用下列的方法:

方法 說明
AudioSegment.from_file("test.mp4", "mp4") 讀取 .mp4
AudioSegment.from_file("test.wma", "wma") 讀取 .wma
AudioSegment.from_file("test.aiff", "aiff") 讀取 .aiff

下方的程式碼執行後,會使用 from_mp3 方法,讀取資料夾中一個名為 test.mp3 的聲音檔案。

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

from pydub import AudioSegment
song = AudioSegment.from_mp3("oxxostudio.mp3")      # 讀取 mp3 檔案
print(song)     # <pydub.audio_segment.AudioSegment object at 0x7faaa545a7f0>

如何輸出聲音?

參考「pydub AudioSegment(…).export()」說明,輸出時可以設定以下幾個參數:

參數 說明
format 輸出格式,預設 mp3,可設定 wav 或 raw。
codec 編碼器,預設自動判斷。
bitrate 壓縮比率,預設 128k,可設定 32k、96k、128k、192k、256k、320k。
tags 夾帶在聲音中的標籤,使用字典格式。
cover 夾帶在聲音中的預覽圖,支援 jpg、png、bmp 或 tiff 格式。

下方的程式執行後,會先讀取一段 mp3 聲音檔,接著以 96k 的壓縮比輸出。

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

from pydub import AudioSegment     # 載入 pydub 的 AudioSegment 模組
song = AudioSegment.from_mp3("oxxostudio.mp3")    # 讀取 mp3 檔案
song.export("oxxostudio.wav", format="wav")       # 輸出為 wav
print('ok')                                       # 輸出後印出 ok

下方的程式執行後,會讀取 mp3 聲音檔並轉換成 wav 格式輸出。

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

from pydub import AudioSegment     # 載入 pydub 的 AudioSegment 模組
song = AudioSegment.from_mp3("oxxostudio.mp3")    # 讀取 mp3 檔案
song.export('output.wav', bitrate="96k")          # 輸出壓縮比率為 96k 的 mp3 檔案
print('ok')                                       # 輸出後印出 ok

取得聲音資訊

使用 pydub AudioSegment 讀取 mp3 檔案後,可以使用下列方法取得聲音常用的資訊:

方法 說明
.channels 聲道數量,如果是一般左右聲道就是 2。
.duration_seconds 聲音長度,單位是秒。
.frame_rate 取樣頻率,常見值為 44100 ( CD )、48000 ( DVD )、22050、24000、12000 和 11025。
.raw_data 原始數據。
.dBFS 聲音響度。

下方的程式執行後,會先讀取一段 mp3 聲音檔,讀取後印出該聲音的聲道數量以及長度。

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

from pydub import AudioSegment     # 載入 pydub 的 AudioSegment 模組
song = AudioSegment.from_mp3("oxxostudio.mp3")  # 讀取 mp3 檔案
duration = song.duration_seconds                # 讀取長度
channels = song.channels                        # 讀取聲道數量
print(channels, duration)                       # 印出資訊

參考資料

更多 Python 教學

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


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

尚未有邦友留言

立即登入留言