最好用的python音頻庫之一:pydub

2019年11月29日12:55:07 科技 1712

pydub 提供了簡潔的高層介面,極大的擴展了python處理音頻文件的能力,pydub可能不是最強大的Python音頻處理庫,但絕對是Python最簡潔易用的音頻庫只要,非要說有什麼弊端,大概只有高度依賴ffmpeg,Linux安裝起來不太方便吧。其功能足以滿足大多數情況下的音頻處理需求,如果它真的滿足不了你,那為什麼不選擇更強大的庫來開發你的專業應用呢?

最好用的python音頻庫之一:pydub - 天天要聞

一、快速開始

打開一個音頻文件

打開一個WAV文件:

from pydub import AudioSegment

song = AudioSegment.from_wav("never_gonna_give_you_up.wav")

打開一個MP3文件:

song = AudioSegment.from_mp3("never_gonna_give_you_up.mp3")

打開一個OGG或FLV或其他的什麼FFMPEG支持的文件:

ogg_version = AudioSegment.from_ogg("never_gonna_give_you_up.ogg")
flv_version = AudioSegment.from_flv("never_gonna_give_you_up.flv")

mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
wma_version = AudioSegment.from_file("never_gonna_give_you_up.wma", "wma")
aac_version = AudioSegment.from_file("never_gonna_give_you_up.aiff", "aac")

對音頻段切片

切片操作(從已導入的音頻段中提取某一個片段):

# pydub做任何操作的時間尺度都是毫秒
ten_seconds = 10 * 1000

first_10_seconds = song[:ten_seconds]
last_5_seconds = song[-5000:]

讓開頭更響和讓結束更弱

使開頭十秒的聲音變得更響並使結束的五秒聲音變弱:

# 聲音增益6dB
beginning = first_10_seconds + 6

# 聲音減弱3dB
end = last_5_seconds - 3

連接音頻段

連兩個接音頻段(把一個文件接在另一個後面)

without_the_middle = beginning + end

音頻段長度

音頻段有多長呢?

without_the_middle.duration_seconds == 15.0

音頻段是不可變的

音頻段是不可變的

# 音頻不可以被修改
backwards = song.reverse()

交叉淡化

交叉淡化(再一次強調,beginning和end都是不可變的)

# 1.5秒的淡入淡出
with_style = beginning.append(end, crossfade=1500)
12

重複

# 將片段重複兩遍
do_it_over = with_style * 2

淡化

淡化(注意一下,你可以把許多運算符連成一串使用,因為運算符都會返回一個AudioSegment對象)

# 2秒淡入, 3秒淡出
awesome = do_it_over.fade_in(2000).fade_out(3000)

保存結果

保存編輯的結果(再說一下,支持所有ffmpeg支持的格式)

保存帶有標籤的結果(元數據)

awesome.export("mashup.mp3", format="mp3", tags={'artist': 'Various artists', 'album': 'Best of 2011', 'comments': 'This album is awesome!'})

你也可以通過指定任意ffmpeg支持的比特率來導出你的結果

awesome.export("mashup.mp3", format="mp3", bitrate="192k")

更多其他的ffmpeg所支持的參數可以通過給』parameters』參數傳遞一個列表來實現,列表中第一個應該是選項,而第二個是對應的參數。
特別注意一下,這些參數沒有得到確認,支持的參數可能會受限於你所使用的特定的 ffmpeg / avlib 構建

# 使用預設MP3質量0(相當於lame -V0)
# ——lame是個MP3編碼器,-V設置的是VBR壓縮級別,品質從0到9依次遞減(譯者注)
awesome.export("mashup.mp3", format="mp3", parameters=["-q:a", "0"])

# 混合到雙聲道並設置輸出音量百分比(放大為原來的150%)
awesome.export("mashup.mp3", format="mp3", parameters=["-ac", "2", "-vol", "150"])

0x02 Debugging

人們在運行時遇到到大多數問題都與使用ffmpeg/avlib轉換格式有關,pydub提供了一個logger輸出子進程的調用來幫助你追蹤問題

>>> import logging

>>> l = logging.getLogger("pydub.converter")
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())

>>> AudioSegment.from_file("./test/data/test1.mp3")
subprocess.call(['ffmpeg', '-y', '-i', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpeZTgMy', '-vn', '-f', 'wav', '/var/folders/71/42k8g72x4pq09tfp920d033r0000gn/T/tmpK5aLcZ'])
<pydub.audio_segment.AudioSegment object at 0x101b43e10>

不用擔心轉換中產生的臨時文件,它們會被自動地清除。

0x03 安裝

安裝pydub很容易,但不要忘記安裝ffmpeg/avlib(下一部分也在此文檔中)

pip install pydub

或者可以從github安裝最新的開發中版本(dev version),也可以用像是@v0.12.0這樣的發布版本取代@master……

pip install git+https://github.com/jiaaro/pydub.git@master

-或者-

git clone https://github.com/jiaaro/pydub.git

0x04 依賴

你可以僅使用純Python打開或保存WAV文件。為了打開或保存非WAV文件——比如MP3——你需要ffmepg或是libav。

回放

當你安裝了這些的其中之一後,你就可以播放音頻了(強烈推薦simpleaudio,哪怕你已經安裝了ffmpeg/libav)

  • simpleaudio
  • pyaudio
  • ffplay (通常隨ffmpeg安裝,參見下一部分)
  • avplay ((通常隨libav安裝,參見下一部分)
from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_file("mysound.wav", format="wav")
play(sound)

0x05 安裝ffmpeg

你可以安裝libav或是ffmpeg。

Mac (使用homebrew):

# libav
brew install libav --with-libvorbis --with-sdl --with-theora

#### OR #####

# ffmpeg
brew install ffmpeg --with-libvorbis --with-sdl2 --with-theora

Linux (使用aptitude):

# libav
apt-get install libav-tools libavcodec-extra

#### OR #####

# ffmpeg
apt-get install ffmpeg libavcodec-extra

Windows:

  1. 從Windows binaries provided here下載並提取libav;
  2. 添加libav /bin 文件夾到你的環境變數(PATH);
  3. pip install pydub;

0x06 注意事項

AudioSegment對象是不可變的

Ogg導出和默認編碼器

Ogg的官方說明沒有指出該怎樣使用編碼器,這些選擇被拋給了用戶。Vorbis和Theora是一大堆可用的編碼器中的一部分 (參見RFC第三頁),可以被用於封裝的數據。
方便起見,當沒有指定輸出為ogg格式的編碼器時,會默認使用vorbis進行輸出,像這樣:

from pydub import AudioSegment
song = AudioSegment.from_mp3("test/data/test1.mp3")
song.export("out.ogg", format="ogg")
# Is the same as:
song.export("out.ogg", format="ogg", codec="libvorbis")

0x08 使用範例

假設你有一個放滿了mp4和flv視頻的文件夾,並且你想要把它們轉換為mp3,以便於用你的MP3播放器來聽這些視頻的聲音。

import os
import glob
from pydub import AudioSegment

video_dir = '/home/johndoe/downloaded_videos/' # 你保存有視頻的文件夾路徑
extension_list = ('*.mp4', '*.flv')

os.chdir(video_dir)
for extension in extension_list:
for video in glob.glob(extension):
mp3_filename = os.path.splitext(os.path.basename(video))[0] + '.mp3'
AudioSegment.from_file(video).export(mp3_filename, format='mp3')

再舉個例子如何?

from glob import glob
from pydub import AudioSegment

playlist_songs = [AudioSegment.from_mp3(mp3_file) for mp3_file in glob("*.mp3")]

first_song = playlist_songs.pop(0)

# 讓我們只包含第一首歌的前30秒 (切片以毫秒為單位)
beginning_of_song = first_song[:30*1000]

playlist = beginning_of_song
for song in playlist_songs:
# 我們不想讓結尾聽起來像是突然停止,所以我們給它加上10秒的淡化
playlist = playlist.append(song, crossfade=(10 * 1000))

# 讓我們給最後一首歌的結尾加上淡出
playlist = playlist.fade_out(30)

# 唔……我還想知道它有多長( len(audio_segment)返回值同樣是以毫秒計的 )
playlist_length = len(playlist) / (1000*60)

# 現在保存下來!
out_f = open("%s_minute_playlist.mp3" % playlist_length, 'wb')

playlist.export(out_f, format='mp3')

pydub API文檔

如果你正在尋找一些特殊的功能,去看一看源代碼或許是個好主意。核心功能大部分都在pydub/audio_segment.py中 – 一部分AudioSegment方法在 pydub/effects.py模塊中,同時通過註冊效果處理(register_pydub_effect() 裝飾器函數)來添加到AudioSegment中。

尚未正式編入文檔的部分:

  • Playback 回放功能 (pydub.playback)
  • Signal Processing 信號處理 (壓縮, EQ, 標準化, 變速 - pydub.effects, pydub.scipy_effects)
  • Signal generators 信號生成器 (正弦波, 方波, 鋸齒波, 白雜訊, 等等 - pydub.generators)
  • Effect registration system 效果註冊系統 (基本上是 pydub.utils.register_pydub_effect 裝飾器)
  • Silence utilities 靜音效果 (靜音探測, 分別靜音, 等等 - pydub.silence)

AudioSegment()

AudioSegment對象是不可變的,同時支持很多運算符。

from pydub import AudioSegment
sound1 = AudioSegment.from_file("/path/to/sound.wav", format="wav")
sound2 = AudioSegment.from_file("/path/to/another_sound.wav", format="wav")

# sound1 增益 6 dB, 然後衰減 3.5 dB
louder = sound1 + 6
quieter = sound1 - 3.5

# 將sound2添加到sound1
combined = sound1 + sound2

# sound1重複三次
repeated = sound1 * 3

# 持續時間
duration_in_milliseconds = len(sound1)

# sound1的前五秒
beginning = sound1[:5000]

# sound1的後五秒
end = sound1[-5000:]

# 將sound1前5秒分割開來
slices = sound1[::5000]

# 高級操作,如果你有原始音頻數據:
sound = AudioSegment(
# 原始音頻數據 (bytes類型)
data=b'…',

# 2 byte (16 bit)採樣
sample_width=2,

# 44.1 kHz 幀速率
frame_rate=44100,

# 立體聲
channels=2
)

任何連接了多個AudioSegment對象的操作,都確保這些對象有相同的聲道數、幀速率、採樣率、位深、等等。當這些屬性不匹配時,較低質量的聲音會被提升為和用較高質量的對象相同的聲音質量,以免於降低音質:單聲道將被轉換為雙聲道,並且低採樣率/幀速率的將被提升為需要的質量。如果你不想讓這些行為進行,那你可能需要通過合適的類方法,明確地減少聲道數、比特數、等等。

AudioSegment(…).from_file()

將一個音頻文件打開為一個AudioSegment實例,並返回這個實例。方便起見,這裡還提供了其他的一些包裝,但你應該僅僅直接地使用他們。

from pydub import AudioSegment

# wave和raw不需要使用ffmpeg
wav_audio = AudioSegment.from_file("/path/to/sound.wav", format="wav")
raw_audio = AudioSegment.from_file("/path/to/sound.raw", format="raw",
frame_rate=44100, channels=2, sample_width=2)

# 其他的所有格式都需要使用ffmpeg
mp3_audio = AudioSegment.from_file("/path/to/sound.mp3", format="mp3")

# 使用一個你已經打開了的文件 (advanced …ish)
with open("/path/to/sound.wav", "rb") as wav_file:
audio_segment = AudioSegment.from_file(wav_file, format="wav")

# 同時,對應python 3.6以上版本支持os.PathLike方案
from pathlib import Path
wav_path = Path("path/to/sound.wav")
wav_audio = AudioSegment.from_file(wav_path)

第一個參數是文件的讀取路徑(以字元串string形式傳遞)或一個用來讀取的文件句柄。

支持的關鍵字參數:

  • format | 示例: "aif" | 默認: "mp3" 輸出文件的格式。 原生支持 "wav"和 "raw",需要 ffmpeg 以支持其他的所有格式. "raw" 文件需要三個額外的關鍵字參數, sample_width, frame_rate, 和 channels, 用以下表述: raw only。這些額外信息之所以需要,是因為原始音頻文件不像WAV文件那樣擁有一個自身信息的文件頭。
  • sample_width | 示例: 2 raw only — 用 1 表示 8-bit 音頻, 2 表示 16-bit (CD品質) and 4 表示 32-bit。這是每種取樣的位元組數。
  • channels | 示例: 1 raw only — 1 表示單聲道, 2 表示雙聲道。
  • frame_rate | 示例: 2 raw only — 也稱為採樣率, 其值一般為 44100 (44.1kHz - CD音頻), 或是 48000 (48kHz - DVD音頻)

AudioSegment(…).export()

將AudioSegment對象寫入文件 – 返回一個輸出文件的文件句柄 (不過,你不必為此做任何事)。

from pydub import AudioSegment
sound = AudioSegment.from_file("/path/to/sound.wav", format="wav")

# 簡單導出
file_handle = sound.export("/path/to/output.mp3", format="mp3")

# 更複雜的導出
file_handle = sound.export("/path/to/output.mp3",
format="mp3",
bitrate="192k",
tags={"album": "The Bends", "artist": "Radiohead"},
cover="/path/to/albumcovers/radioheadthebends.jpg")

# 將聲音分割為5秒的片段並導出
for i, chunk in enumerate(sound[::5000]):
with open("sound-%s.mp3" % i, "wb") as f:
chunk.export(f, format="mp3")

第一個參數是用於輸出的位置(以string類型), 或一個用於輸出的文件句柄。如果你沒有給出輸出文件或文件句柄,將會創建一個臨時文件。

支持的關鍵字參數:

  • format | 示例: "aif" | 默認: "mp3" 格式的輸出文件。原生支持"wav"和"raw" ,需要ffmpeg以支持其他格式。
  • codec | 示例: "libvorbis" 對於可能包含用不同編解碼器編碼的內容,你可以指定你編碼時想要使用的編解碼器。舉個例子, "ogg"格式通常使用"libvorbis"編碼器. (需要ffmpeg)
  • bitrate | 示例: "128k" 對於使用壓縮的格式,你可以設置編碼時所使用的編碼器 (需要 ffmpeg). 每一種編碼器接受不同的比特率參數,詳情參見ffmpeg文檔 (比特率參數通常寫作 -b, -ba 或 -a:b).
  • tags | 示例: {"album": "1989", "artist": "Taylor Swift"} 允許你給編碼器提供媒體信息標籤 (需要ffmpeg). 不是所有格式都可以使用標籤 (mp3 可以).
  • parameters | 示例: ["-ac", "2"] 輸入額外的 命令行參數 來調用ffmepg. 這些參數可以被添加到調用的末尾 (在輸出文件部分).
  • id3v2_version | 示例: "3" | 默認: "4" 設置ffmpeg使用的 ID3v2 版本來添加標籤到輸出文件. 如果你想讓windows文件管理器顯示標籤, 在這使用 "3" (source).
  • cover | 示例: "/path/to/imgfile.png" 使你可以給音頻文件添加封面 (到封面圖片的路徑). 目前, 只有MP3可以使用這個關鍵字參數. 封面必須是jpeg, png, bmp,或 tiff格式的文件.

AudioSegment.empty()

創建一個持續時間為零的AudioSegment對象.

from pydub import AudioSegment
empty = AudioSegment.empty()

len(empty) == 0

這是一個很有用的、用於將許多音頻集合在一起的循環:

from pydub import AudioSegment

sounds = [
AudioSegment.from_wav("sound1.wav"),
AudioSegment.from_wav("sound2.wav"),
AudioSegment.from_wav("sound3.wav"),
]

playlist = AudioSegment.empty()
for sound in sounds:
playlist += sound

AudioSegment.silent()

創建一個靜音的音頻段, 可以被用作佔位符, 保存間隔,或用做一個用於放置其他聲音在其上的畫布.

from pydub import AudioSegment

ten_second_silence = AudioSegment.silent(duration=10000)

支持的關鍵字參數:

  • duration | 示例: 3000 | 默認: 1000 (1 秒) 靜音AudioSegment對象的長度,以毫秒為單位。
  • frame_rate | 示例 44100 | 默認: 11025 (11.025 kHz) 靜音AudioSegment對象的幀速率 (即採樣率) 以Hz為單位

AudioSegment.from_mono_audiosegments()

用多個單聲道音頻段創建多聲道音頻段(兩個或更多). 每個單聲道音頻段都應該有相同的時長以及幀速率.

from pydub import AudioSegment

left_channel = AudioSegment.from_wav("sound1.wav")
right_channel = AudioSegment.from_wav("sound1.wav")

stereo_sound = AudioSegment.from_mono_audiosegments(left_channel, right_channel)

AudioSegment(…).dBFS

以dBFS (相當於可能的最大db數的響度)為單位返回AudioSegment對象的響度.一段方波的最大振幅會被簡單地定為 0 dBFS (最大響度), 然而一段正弦波的最大振幅會被定為 -3 dBFS.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

loudness = sound.dBFS

AudioSegment(…).channels

該音頻段的聲道數 (1 表示單聲道, 2 表示雙聲道)

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

channel_count = sound.channels

AudioSegment(…).sample_width

Number of bytes in each sample (1 means 8 bit, 2 means 16 bit, etc). CD Audio is 16 bit, (sample width of 2 bytes).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

bytes_per_sample = sound.sample_width

AudioSegment(…).frame_rate

CD音頻的採樣率為44.1kHz,這意味著幀速率會是 44100 (與採樣率相同, 參見 frame_width). 一般值為 44100 (CD), 48000 (DVD), 22050, 24000, 12000 和 11025.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

frames_per_second = sound.frame_rate

AudioSegment(…).frame_width

每個"frame(幀)"的位元組數. 每幀包含每個聲道的一次採樣 (所以對於雙聲道而言,每幀被播放時都有兩次採樣). frame_width 與 channels * sample_width 相同. 對於CD音頻這個值將會是 4 (2 雙聲道,每次採樣為 2 位元組).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

bytes_per_frame = sound.frame_width

AudioSegment(…).rms

響度的度量. 用於計算 dBFS, 一種你應該在大多數情況下使用的單位. 響度是以對數計的 (rms 不是), 這使得 dB 成為一種更自然的響度衡量方式.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

loudness = sound.rms

AudioSegment(…).max

在AudioSegment中每次採樣的最大振幅. 對於像音量標準化這樣的操作很有用 (在pydub.effects.normalize中提供).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

peak_amplitude = sound.max

AudioSegment(…).max_dBFS

AudioSegment任何一幀的最大振幅, 以dBFS (相對於可能的最大振幅的值)為單位. 對於像音量標準化這樣的操作很有用 (在 pydub.effects.normalize 中提供).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

normalized_sound = sound.apply_gain(-sound.max_dBFS)

AudioSegment(…).duration_seconds

以秒為單位返回AudioSegment的持續時間 (len(sound) 返回毫秒). 這個方法是為了方便提供的; 它在內部調用了 len() .

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

assert sound.duration_seconds == (len(sound) / 1000.0)

AudioSegment(…).raw_data

音頻段的原始音頻數據. 對於與其他音頻庫協作或是使用什麼需要位元組流格式的音頻數據的奇奇怪怪的API時很有用. 當想要實現效果器或是其他什麼直接數字信號處理器(DPS)時也很有用.

You probably don』t need this, but if you do… you』ll know.

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

raw_audio_data = sound.raw_data

AudioSegment(…).frame_count()

返回一個AudioSegment的幀數目. 你可以通過在音頻AudioSegment中的毫秒數用一個關鍵字參數 ms 取得幀的數目 (用於切片, 等等).

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

number_of_frames_in_sound = sound.frame_count()

number_of_frames_in_200ms_of_sound = sound.frame_count(ms=200)

支持的關鍵字參數:

  • ms | 示例: 3000 | 默認: None (輸入AudioSegment的持續時間) 指定該參數後, 該方法會返回AudioSegment在 X 毫秒中的幀的數目

AudioSegment(…).append()

通過添加另一個 AudioSegment對象,返回一個新的 AudioSegment對象。 對於被添加的這一個對象 (即添加到末尾的這一個), 可以任意使用淡化. 當使用+添加AudioSegment對象時.AudioSegment(…).append()會被在內部使用。

默認為 100ms (0.1 秒) 的淡化會被用於消除劈啪聲和爆裂的聲音.

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")
sound2 = AudioSegment.from_file("sound2.wav")

# 默認 100 ms 淡化
combined = sound1.append(sound2)

# 5000 ms 淡化
combined_with_5_sec_crossfade = sound1.append(sound2, crossfade=5000)

# 不進行淡化
no_crossfade1 = sound1.append(sound2, crossfade=0)

# 不進行淡化
no_crossfade2 = sound1 + sound2

支持的關鍵字參數:

  • crossfade | 示例: 3000 | 默認: 100 (輸入AudioSegment的持續時間) 當這個參數被指定後, 該方法返回AudioSegment在X毫秒內的幀數目

AudioSegment(…).overlay()

覆蓋一個 AudioSegment在其上. 結果得到的 AudioSegment they 會被同步播放. 如果被覆蓋的 AudioSegment 比這一個長, 結果會被截斷(所以被覆蓋的聲音的結果會被切斷). 結果總會和這個 AudioSegment相同,甚至當使用loop 和 times 關鍵字參數時.

儘管 AudioSegment 對象是不可變的, 繞過這個限制覆蓋一段短的聲音到長的上, 或通過創建一個擁有合適時長的 AudioSegment 對象,然後兩個聲音到這一個上.

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")
sound2 = AudioSegment.from_file("sound2.wav")

played_togther = sound1.overlay(sound2)

sound2_starts_after_delay = sound1.overlay(sound2, position=5000)

volume_of_sound1_reduced_during_overlay = sound1.overlay(sound2, gain_during_overlay=-8)

sound2_repeats_until_sound1_ends = sound1.overlay(sound2, loop=true)

sound2_plays_twice = sound1.overlay(sound2, times=2)

# 假設 sound1 長30秒,並且 sound2 長5秒:
sound2_plays_a_lot = sound1.overlay(sound2, times=10000)
len(sound1) == len(sound2_plays_a_lot)

支持的關鍵字參數:

  • position | 示例: 3000 | 默認: 0 (該AudioSegment的開頭) 覆蓋 AudioSegment會在X毫秒後被覆蓋
  • loop | 示例: True | 默認: False (輸入 AudioSegment的長度)覆蓋AudioSegment會被重複 (在 position 處開始) 直到該AudioSegment結束
  • times | 示例: 4 | 默認: 1 (輸入 AudioSegment 的持續時間) 覆蓋AudioSegment會被重複X次 (在position處開始) 但仍然會受限於該 AudioSegment 的長度被截斷
  • gain_during_overlay | 示例: -6.0 | 默認: 0 (在覆蓋中不會改變音量) 再覆蓋過程中,以該dB數改變原始音頻的音量(增加或減少). 該參數可用於在覆蓋音頻播放過程中降低原始音頻的音量.

AudioSegment(…).apply_gain(gain)

改變AudioSegment的振幅 (總體上的響度).增益以dB為單位指定. 這個方法被用在 + 運算符的內部.

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

# 給 sound1 增益 3.5 dB
louder_via_method = sound1.apply_gain(+3.5)
louder_via_operator = sound1 + 3.5

# 給 sound1 衰減 5.7 dB
quieter_via_method = sound1.apply_gain(-5.7)
quieter_via_operator = sound1 - 5.7

AudioSegment(…).fade()

一個更一般的 (更靈活的) 淡化方法. 你可以指定 start 和 end, 或指定兩者之一和持續時間 (例如, start 和 duration).

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

fade_louder_for_3_seconds_in_middle = sound1.fade(to_gain=+6.0, start=7500, duration=3000)

fade_quieter_beteen_2_and_3_seconds = sound1.fade(to_gain=-3.5, start=2000, end=3000)

# 更簡單易用的方式是使用 .fade_in() 方法. 注意: -120dB 基本是靜音.
fade_in_the_hard_way = sound1.fade(from_gain=-120.0, start=0, duration=5000)
fade_out_the_hard_way = sound1.fade(to_gain=-120.0, end=0, duration=5000)

支持的關鍵字參數

  • to_gain | 示例: -3.0 | 默認: 0 (0dB, 不做任何改變) 結果會改變淡化的末端. -6.0 意味著淡化會從 0dB (不做任何改變) 到 -6dB, 並且在淡化後面的音頻響度都會衰減6dB.
  • from_gain | 示例: -3.0 | 默認: 0 (0dB, 不做任何改變) 改變淡化的開端. -6.0 意味著淡化 (以及所有在淡化之前的音頻) 都會被衰減-6dB 然後淡化到 0dB – 在淡化後面的剩餘部分都會進行0dB的增益 (即不改變).
  • start | 示例: 7500 | 沒有默認!沒有淡化開始的默認位置! (以毫秒為單位). 5500 意味著淡化會在5.5秒後開始.
  • end | 示例: 4 | 沒有默認!覆蓋AudioSegment會被重複 X 次 (從 position 開始) 但仍然會受限於AudioSegment而被截斷
  • duration | 示例: 4 | 沒有默認! 你可以和 start 或 end 一同使用持續時間(duration), 用於替代同時指定這兩者 - 這功能是為方便而提供的.

AudioSegment(…).fade_out()

在AudioSegment的末尾淡出到靜音. 其內部使用了 .fade() .

支持的關鍵字參數

  • duration | 示例: 5000 | 沒有默認值 淡化的時長(以毫秒為單位). 在內部直接傳遞給了 .fade()

AudioSegment(…).fade_in()

在 AudioSegment 的開頭從靜音淡入.其內部使用了 .fade() .

支持的關鍵字參數

  • duration | 示例: 5000 | 沒有默認值 淡化的時長(以毫秒為單位). 在內部直接傳遞給了 .fade()

AudioSegment(…).reverse()

產生一個AudioSegment對象反向播放的副本. 用於 Pink Floyd, screwing around, 和一些音頻處理演算法.

AudioSegment(…).set_sample_width()

通過指定採樣寬度(以位元組為單位)來創建一個與該AudioSegment等效的版本。增大這個值通常不會導致質量的下降,但降低這個值一定會導致質量的下降。更高的採樣寬度意味著更寬的動態範圍。

AudioSegment(…).set_frame_rate()

通過指幀速率(以赫茲為單位)來創建一個與該AudioSegment等效的版本。增大這個值通常不會導致質量的下降,但降低這個值一定會導致質量的下降。更高的幀速率意味著更大的頻響特徵(即可以表示更高的頻率)

AudioSegment(…).set_channels()

通過指聲道數(1表示單聲道,2表示雙聲道)來創建一個與該AudioSegment等效的版本。從單聲道轉換至雙聲道不會有任何聽得出來的改變,但從雙聲道轉換為單聲道可能會導致質量損失(但僅當左右聲道有不同時)

AudioSegment(…).split_to_mono()

把一個雙聲道 AudioSegment 對象分為兩個,每個都是其中的一個聲道(左或右). 返回一個含有新AudioSegment對象的列表其中左聲道索引為0,右聲道索引為1.

AudioSegment(…).apply_gain_stereo()

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

# 將左聲道衰減6dB,並將右聲道提升2dB
stereo_balance_adjusted = sound1.apply_gain_stereo(-6, +2)

對一個雙聲道AudioSegment的左右聲道分別應用增益.如果這個AudioSegment是單聲道的,它在應用增益前會被轉換為雙聲道.

兩個增益參數都以dB為單位指出.

AudioSegment(…).pan()

from pydub import AudioSegment
sound1 = AudioSegment.from_file("sound1.wav")

# pan the sound 15% to the right
panned_right = sound1.pan(+0.15)

# pan the sound 50% to the left
panned_left = sound1.pan(-0.50)

接受一個應該在-1.0 (100% left)到+1.0 (100% right)之間的位置參數,pan amount。
當pan_amount == 0.0 時左右平衡(即聲像位置)不會改變.

改變聲像不會影響感知音量的大小,但由於改變後一邊的音量會減小,另一邊的音量需要增大以補償.當聲像左移得很厲害時, 左聲道會被提升3dB並且右聲道會被靜音(反之亦然).

AudioSegment(…).get_array_of_samples()

以採樣數組的形式返回原始音頻數據。注意:如果音頻有多個聲道,每個聲道的採樣會被連起來存放 – 舉個例子,雙聲道音頻會像這樣: [sample_1_L, sample_1_R, sample_2_L, sample_2_R, …].

這個方法主要用於使用效果和其他進行其他處理。

from pydub import AudioSegment
sound = AudioSegment.from_file(「sound1.wav」)

samples = sound.get_array_of_samples()

# 然後修改採樣...

new_sound = sound._spawn(samples)

注意一下,當使用numpy或scipy時,在生成前需要把他們轉換回數組

import array
import numpy as np
from pydub import AudioSegment

sound = AudioSegment.from_file(「sound1.wav」)
samples = sound.get_array_of_samples()

# 對音頻數據的示例操作
shifted_samples = np.right_shift(samples, 1)

# 現在需要把它們轉換成一個 array.array
shifted_samples_array = array.array(sound.array_type, shifted_samples)

new_sound = sound._spawn(shifted_samples_array)

AudioSegment(…).get_dc_offset()

返回一個在-1.0到1.0的值表示該聲道在直流偏移(DC offset)。該方法使用audioop.avg()統計b並通過採樣最大值標準化結果。

支持的關鍵字參數

  • channel | 示例: 2 | 默認: 1 選擇左聲道(1) 或右聲道(2)來統計直流偏移(DC offset). 如果該段為單聲道,這個值將被忽略.

AudioSegment(…).remove_dc_offset()

從聲道移除直流偏移(DC offset)。這個方法通過使用audioop.bias()實現,所以要小心溢出。

支持的關鍵字參數

  • channel | 示例: 2 | 默認值: None 選擇左聲道(1)或右聲道(2)移除直流偏移(DC offset)。如果值為None, 從所有可用的聲道中移除。如果該段為單聲道,這個值將被忽略.
  • offset | 示例: -0.1 | 默認值: None 將從聲道移除的偏移的值。如果這個值為None,將自動計算偏移. 偏移值必須在-1.0到1.0之間.

效果

通過AudioSegment對象生效的DSP效果的集合

AudioSegment(…).invert_phase()

創建該AudioSegment的一個副本並反轉信號的相位。可以生成噪音的反相位波以抑制或消除噪音。

科技分類資訊推薦

移動支付時代,外國人來華如何輕鬆掃碼 - 天天要聞

移動支付時代,外國人來華如何輕鬆掃碼

還在為來華支付犯愁嗎?今天分享外籍來華人員的支付指南,幫你輕鬆搞定支付問題!來華的朋友們,你們可以使用標有銀聯、Visa、Mastercard等標識的銀行卡在商戶直接刷卡支付。如果沒有標識,可以詢問收銀員是否支持。
小眾專業‖哈爾濱工業大學,焊接技術與工程 - 天天要聞

小眾專業‖哈爾濱工業大學,焊接技術與工程

「哈工大焊接在國內是第一的,是985中唯一開設焊接專業的,所以具備一定的行業龍頭的優勢性。 焊接本科主要是材料和機械專業的交叉。目前的話,釺焊、激光焊方向就業會相對較好。 釺焊方向可以向電子封裝方向靠,可以去華為小米手機公司,激光焊方向也可以去手機公司。
「華為9系雙旗艦」來襲!華為北汽首款旗艦轎車享界S9曝光 - 天天要聞

「華為9系雙旗艦」來襲!華為北汽首款旗艦轎車享界S9曝光

【CNMO科技消息】3月13日,工信部公布了華為與北汽強強聯合打造的全新車型申報信息,新車命名為「享界S9」,品牌英文標識「STELATO」,定位華為首款豪華旗艦轎車,將直接對標德系BBA豪華品牌。據悉,未來在智選車模式下,華為與北汽雙方將同時在產品定義、ID設計、軟硬體開發等領域持續深入合作,共同著力打造智慧豪華新能...
小米14 Lite新機獲BIS認證 或為Civi 4國際版 啥時候發? - 天天要聞

小米14 Lite新機獲BIS認證 或為Civi 4國際版 啥時候發?

【CNMO科技消息】據CNMO了解,一款新的小米手機出現在印度標準局(BIS)認證網站上。外媒猜測,這可能是針對印度市場的小米14 Lite。據悉,該手機的型號為24053PY09I,可能是Civi 4的重命名版本,後者最近出現在中國工信部認證中,型號為24053PY09C。小米14系列  小米通常將Civi系列保留在中國獨家銷售,並在全球範圍內以...
關於網紅短視頻賬號相關權益歸屬的認定 - 天天要聞

關於網紅短視頻賬號相關權益歸屬的認定

山東法院民法典適用典型案例153關於網紅短視頻賬號相關權益歸屬的認定——青島某科技公司訴楊某某物權確認糾紛案裁判要旨對於MCN機構與網紅博主合作運營的短視頻賬號,因雙方在運營過程中貢獻程度不同,其相關權益歸屬不能一概而論,應綜合考量合同約定、貢獻程度等因素進行具體分析。
326馬力電動小鋼炮 大眾ID.3 GTX官圖 - 天天要聞

326馬力電動小鋼炮 大眾ID.3 GTX官圖

日前,大眾發布了一組ID.3 GTX的官圖。新車定位緊湊型兩廂車,是大眾ID.3的高性能版車型,其搭載一台後置單電機,ID.3 GTX最大功率為286馬力,ID.3 GTX Performance為326馬力,WLTP純電續航里程約為600km。
佛山軌道交通設計研究院有限公司通過高新技術企業重新認定 - 天天要聞

佛山軌道交通設計研究院有限公司通過高新技術企業重新認定

地鐵設計(003013)於3月14日發布公告稱,廣州地鐵設計研究院股份有限公司(以下簡稱「公司」)的控股子公司佛山軌道交通設計研究院有限公司(以下簡稱「佛山設計院」)近日收到廣東省科學技術廳、廣東省財政廳、國家稅務總局廣東省稅務局聯合頒發的《高新技術企業證書》,證書編號為 GR202344002293,發證日期:2023 年 1...
伍娜辭去新亞製程(浙江)股份有限公司董事會秘書職務 - 天天要聞

伍娜辭去新亞製程(浙江)股份有限公司董事會秘書職務

新亞製程(002388)於3月14日發布公告稱,新亞製程(浙江)股份有限公司(以下簡稱「公司」)董事會於近日收到董事會秘書伍娜女士的書面辭職報告。伍娜女士因工作調整原因申請辭去公司董事會秘書職務,辭職後仍在公司擔任其他職務。根據《公司法》《深圳證券交易所股票上市規則(2023 年 8 月修訂)》等法律法規及《公司章...