< python音頻庫:Windows下pydub安裝配置、過程出現的問題及常用API >
背景
-
剛從B站上看過倒放挑戰之后也想體驗下,心血來潮一個晚上完成了基本的實現。其中倒放與播放部分使用了pydub這個音頻庫,十分快捷方便,但是它完整一套的配置讓我還是踩了幾個坑。特將其配置過程記錄於此,方便大家。
-
Windows10
系統 -
附帶我做的倒放挑戰程序:< BackwardsToChallenge倒放挑戰小程序 >
安裝Pydub
-
Anaconda
:打開Anaconda prompt
,activate
切換至工作環境下,鍵入pip install pydub
-
Pycharm
:setting
下project
,將pydub
安裝進pip
環境
安裝FFmpeg
(或選擇libav
)
-
下載
FFmpeg
-
< FFmpeg官網 > :找到對應的系統版本下載。
-
將壓縮包解壓到任意目錄。
-
將安裝安裝目錄下的
bin
文件夾添加到系統的Path
環境變量中。 -
如果添加環境變量成功后,打開
cmd
,鍵入ffmpeg -version
,就可以看到版本信息。
-
-
下載
FFmpeg
包-
除了按完成以上下載之外,還需要在
python
中導入FFmpeg
包 -
同上
Pydub
包導入 -pip install FFmpeg
-
安裝Pyaudio
-
可以僅使用純
Pydub
打開或保存WAV
文件。為了打開或保存非WAV
文件——比如MP3
——你需要ffmepg
或是libav
。而如果需要播放音頻,則需要安裝以下包:-
simpleaudio
-
pyaudio
-
ffplay
(通常隨ffmpeg
安裝) -
avplay
((通常隨libav
安裝)
-
-
官網是強烈推薦安裝
simpleaudio
,而我選擇的是pyaudio
,因為之后程序的其他部分還需要用到,所以就直接選擇了pyaudio
。 -
包安裝同上
Pydub
-pip install pyaudio
-
至此安裝配置工作完成,可試驗以下代碼看是否能運行。
from pydub import AudioSegment
from pydub.playback import play
sound = AudioSegment.from_file("0.mp3", "mp3")
play(sound)
問題:[Errno 13] Permission denied
- 安裝了
pydub
和ffmpeg
,但是缺少播放音頻的包,安裝后不再顯示。
問題 [WinError 2] 系統找不到指定的文件
- 安裝了
ffmpeg
其中的一項,還缺少另外一項,安裝后不再顯示。
常用API
打開一個XXX類型文件:
mp4_version = AudioSegment.from_file("never_gonna_give_you_up.mp3", "mp3")
wma_version = AudioSegment.from_file("never_gonna_give_you_up.wav", "wav")
aac_version = AudioSegment.from_file("never_gonna_give_you_up.mp4", "mp4")
對音頻段切片
# pydub做任何操作的時間尺度都是毫秒
ten_seconds = 10 * 1000
first_10_seconds = song[:ten_seconds]
last_5_seconds = song[-5000:]
連接音頻段
without_the_middle = beginning + end
讓開頭更響和讓結束更弱
# 聲音增益6dB
beginning = first_10_seconds + 6
# 聲音減弱3dB
end = last_5_seconds - 3
重復
# 將片段重復兩遍
do_it_over = with_style * 2
倒放
# 讀取想要倒放的音頻文件
ted = AudioSegment.from_file("ted.mp3")
# 將音頻倒放賦給變量 backwards
backwards = ted.reverse()
保存結果 / 音頻格式轉換
awesome.export("mashup.mp3", format="mp3")
批量處理音頻
from pydub import AudioSegment
# i 從 0 到 9 取值
for i in range(10):
# 按順序讀取 00i.m4a 文件
temp = AudioSegment.from_file(f"00{i}.m4a")
# 將 00i.m4a 轉換為 答案00i.mp3
temp.export(f"答案00{i}.mp3")
# 將音頻倒放
backplay = temp.reverse()
# 將倒放音頻存為 音謎00i.mp3
backplay.export(f"音謎00{i}.mp3")
# 打印個 done 提示完成
print("done")
舉個例子:
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')