< python音頻庫:Windows下pydub安裝配置、過程出現的問題及常用API >


< python音頻庫:Windows下pydub安裝配置、過程出現的問題及常用API >

背景

  • 剛從B站上看過倒放挑戰之后也想體驗下,心血來潮一個晚上完成了基本的實現。其中倒放與播放部分使用了pydub這個音頻庫,十分快捷方便,但是它完整一套的配置讓我還是踩了幾個坑。特將其配置過程記錄於此,方便大家。

  • Windows10系統

  • < Pydub in Github >

  • 附帶我做的倒放挑戰程序:< BackwardsToChallenge倒放挑戰小程序 >

安裝Pydub

  • Anaconda:打開Anaconda promptactivate切換至工作環境下,鍵入pip install pydub

  • Pycharmsettingproject,將pydub安裝進pip環境

安裝FFmpeg(或選擇libav

  1. 下載FFmpeg

    • < FFmpeg官網 > :找到對應的系統版本下載。

    • 將壓縮包解壓到任意目錄。

    • 將安裝安裝目錄下的bin文件夾添加到系統的Path環境變量中。

    • 如果添加環境變量成功后,打開cmd,鍵入ffmpeg -version,就可以看到版本信息。

  2. 下載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

  • 安裝了pydubffmpeg,但是缺少播放音頻的包,安裝后不再顯示。

問題 [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')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM