最好用的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的一個副本並反轉信號的相位。可以生成噪音的反相位波以抑制或消除噪音。

科技分類資訊推薦

人體工學設計 M+無線跨屏傳輸技術 雷柏MT760/MT760 mini多模無線滑鼠評測 - 天天要聞

人體工學設計 M+無線跨屏傳輸技術 雷柏MT760/MT760 mini多模無線滑鼠評測

隨著現代辦公的複雜程度變得越來越高,用戶使用滑鼠的時候不僅需要握感舒適符合人體工學設計,同時還有豐富的配置讓日常辦公變得更為簡便。  今天,我們拿到了雷柏科技專為高端商務上班族打造的MT760/MT760 mini多模無線滑鼠,這款滑鼠外觀符合人體工學設計,握感舒適,長時間使用不易疲憊,並且還有三種連接方式,可以同...
快手完成「收購」網路小貸牌照,此前牌照隸屬廣州歡聚時代 - 天天要聞

快手完成「收購」網路小貸牌照,此前牌照隸屬廣州歡聚時代

4月19日,天眼查顯示廣州歡聚小額貸款有限責任公司已經變更名稱為廣州快手小額貸款有限公司,廣州華多網路科技有限公司從股東中退出。至此,快手徹底完成獲得網路小貸牌照的動作。南都記者了解到,原來的歡聚小貸成立於2016年,是一家以從事貨幣金融服務為主的企業,曾經是歡聚時代旗下的消費金融平台,可以為用戶提供主播...
續航時間長 通信範圍廣 海能達S1 Pro對講機正式開售 - 天天要聞

續航時間長 通信範圍廣 海能達S1 Pro對講機正式開售

前不久,對講機業界知名品牌海能達發布了對講機新品——S1 Pro,主要針對商業應用領域,可以為商業活動提供良好的通信服務,而在擁有續航時間長、通信範圍廣等強大性能的同時,S1 Pro還有著極高的顏值,並且操作簡便易於上手。目前S1 Pro已正式開售,價格是999元起。在海能達京東自營旗艦店中正在進行S1 Pro的促銷活動,購...
【V觀京津冀 新質鑄輝煌】「人工智慧」與「數字安全」雙主線推進,精準賦能新質生產力發展 - 天天要聞

【V觀京津冀 新質鑄輝煌】「人工智慧」與「數字安全」雙主線推進,精準賦能新質生產力發展

光明網訊(見習記者 張璐琢)「圓環主樓與3組高層連接樓的建築組合設計,靈感源自於計算技術中的二進位語言,象徵技術發展的『無限可能』。」在天津360集團總部的園區沙盤前,執行總編輯劉闖向網路名人調研團介紹道,如今,在新質生產力的推動下,360將人工智慧納入核心業務,開闢出創新發展的新賽道。  在360城市數字安...
每公里五毛錢,傳祺GS4 MAX正式上市,售價10.98萬起 - 天天要聞

每公里五毛錢,傳祺GS4 MAX正式上市,售價10.98萬起

當下,國貨正當潮。「活力28三老頭」一夜爆賣500萬元,蜂花、郁美凈、孔鳳春等國貨美妝產品銷量成倍增長......而這些「走紅」的國貨品牌,它們都「大件兼抵食!」作為廣州本土車企,廣汽傳祺更是深諳此道。
滲透率突破50%!王傳福的預言提前實現,新能源取代燃油成定局 - 天天要聞

滲透率突破50%!王傳福的預言提前實現,新能源取代燃油成定局

根據乘聯會發布的數據顯示,4月1-14 日新能源零售滲透率達到50.39%,這意味著如今買新能源的消費者已成了主流,而購買燃油車的人正式成為少數派。此外,乘聯會還發布了另一項數據,4月前兩周的新能源汽車滲透率同樣也已經超過了50%!兩項數據的出現,標誌著目前的中國汽車市場正經歷著轉折性的變化,我們也可以直接大膽地斷...
華為Pura 70 Ultra的影像有多強?最大進光量和最快抓拍一次滿足 - 天天要聞

華為Pura 70 Ultra的影像有多強?最大進光量和最快抓拍一次滿足

12年前的4月18日,華為P系列第一款產品一經上市,其先鋒的產品設計理念和突出的影像性能就受到了廣大消費者的一致好評。經過了十多年的產品迭代更新,這個系列越來越深入人心。如今是P系列品牌12周年,2024年4月18日,由華為P系列進化而來的華為Pura系列首款旗艦機,華為Pura 70全系列新機集體亮相,目前華為Pura 70 Ultra...