最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python音頻處理庫pydub的使用示例詳解

 更新時間:2023年11月27日 14:17:28   作者:古明地覺的編程教室  
pydub是一個輕量級的音頻處理庫,安裝方便,使用簡單,這篇文章主要為大家詳細介紹了pydub的具體使用,文中的示例代碼講解詳細,需要的小伙伴可以參考下

以前我們介紹過 moviepy,它是一個處理視頻的第三方庫,基于 ffmpeg。那么本次來分享一個處理音頻的庫 pydub,它同樣是對 ffmpeg 進行的一個封裝。

既然是封裝,那就說明實際處理音頻的還是 ffmpeg,所以 pip install pydub 之后,我們還要安裝 ffmpeg,直接去官網下載即可。

然后將這些可執(zhí)行文件所在的目錄配置到環(huán)境變量中就可以了。

打開音頻文件

音頻有很多種格式,比如 wav、mp3、ogg 等等,只要是 ffmpeg 支持的文件格式都可以打開,而 ffmpeg 基本支持所有主流的音頻格式。

from pydub import AudioSegment

# 打開 mp3 文件
AudioSegment.from_mp3("1.mp3")
# 打開 wav 文件
AudioSegment.from_wav("1.wav")
# 打開 ogg 文件
AudioSegment.from_ogg("1.ogg")

# 以上所有方法都調用了 from_file,等價于
AudioSegment.from_file("1.mp3", "mp3")
AudioSegment.from_file("1.wav", "wav")
AudioSegment.from_file("1.ogg", "ogg")
# 由于 mp3、wav、ogg 文件很常見,所以有單獨的方法
# 但還有不常見的音頻格式,比如蘋果手機自帶的錄音軟件導出的就是 m4a 格式
# 此時就只能使用 from_file 打開了
AudioSegment.from_file("1.m4a", "m4a")

注意:在讀取文件的時候,格式一定要匹配,否則報錯。舉個例子:

from pydub import AudioSegment

try:
    AudioSegment.from_wav("高梨康治 - 百鬼夜行.mp3")
except Exception as e:
    print(e)
"""
Decoding failed. ffmpeg returned error code: 1

Output from ffmpeg/avlib:

b'...Invalid data found when processing input\r\n
"""

我們的音頻是 mp3 格式的,但是卻調用了 from_wav,所以會報錯。當然也不要覺得將文件擴展名改成 wav 就萬事大吉了,因為文件的類型取決于它存儲的字節(jié)流,而不是擴展名。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
print(song) 
"""
<pydub.audio_segment.AudioSegment object at 0x0000021782910C40>
"""

返回的是一個 AudioSegment 對象,它就是音頻讀取之后的結果,通過該對象我們可以對音頻進行各種操作,比如增加音量、淡入淡出等等。

并且這些操作都是鏈式的,每一個操作都會返回一個新的對象,不會修改原來的對象。所以我們在操作的時候,可以一直寫下去,比如 song.xxx.xxx,不用每一次操作都重新賦值一個變量。

注意:pydub 做的任何操作,只要和時間相關,那么單位都是毫秒。

下面我們來看看它都支持哪些操作。

截取某一個片段

對音頻進行切片,這是一個非常常用的操作,一個長音頻,我們可能只要前 5 秒,或者后 5 秒等等。

# 截取前 5 秒
first_5_seconds = song[: 5 * 1000]

# 截取后 5 秒
last_5_seconds = song[-5000:]

返回的都是新的 AudioSegment 對象,保存之后正好是原始音頻文件的前 5 秒和后 5 秒,關于保存文件后面會說。

音量增加和減小

我們可以讓音量放大和縮小,并且實現起來也非常簡單。

# 聲音增大 9 分貝
first_5_seconds = first_5_seconds + 9

# 聲音減小 7 分貝
last_5_seconds = last_5_seconds - 7

怎么樣,是不是非常簡單呢?

音頻拼接

估計有人猜到做法了,沒錯,直接相加即可。

song_first_last = first_5_seconds + last_5_seconds

此時 song_first_last 就是由原始音頻的前 5 秒放大 9 分貝,和原始音頻的后 5 秒減小 7 分貝組合而成的新的音頻(AudioSegment 對象)。

淡入淡出

song_first_last = first_5_seconds.append(last_5_seconds, crossfade=1500)

調用 append 也相當于將音頻組合在一起,但是這種方式可以增加一些淡入淡出的效果。當然我們也可以手動實現:

song_first_last = first_5_seconds.fade_in(2000) + last_5_seconds.fade_out(3000)

前 5 秒和后 5 秒拼接起來得到 10 秒鐘的音頻,并且前 2 秒淡入,后 3 秒淡出。

片段重復

將一個片段重復 n 遍。

repeat_5 = song[: 3000] * 5

將前 3 秒重復了 5 遍,等于把 song[: 3000] 重復相加 5 次。

反轉音頻

說白了就是倒放。

song_reverse = song.reverse()

兩個音頻重疊播放

比如你有兩個音頻,一個是臺詞,一個是背景音樂,你需要將它們合并為一個音頻。

from pydub import AudioSegment

song1 = AudioSegment.from_ogg("臺詞.ogg")
song2 = AudioSegment.from_ogg("背景音樂.ogg")
# 將 song1 和 song2 合并在一起
# 并且在 song1 的 5 秒后,開始播放 song2,position 默認為 0
song1.overlay(song2, position=5000)

聲道分離

關于聲道,我們一會兒解釋。

from pydub import AudioSegment

song = AudioSegment.from_ogg("高梨康治 - 百鬼夜行.mp3")
# 聲道的分離,得到兩個不同聲道對應的 AudioSegment 對象
left_channel, right_channel = song.split_to_mono()

獲取音頻的某一幀

song.get_frame(1)  # 獲取第一幀

獲取音頻屬性

下面我們來獲取音頻的一些屬性,不過在獲取之前,先介紹一下音頻屬性的一些細節(jié)。

采樣頻率:又被稱作取樣頻率,是單位時間內的采樣次數,決定了數字化音頻的質量。采樣頻率越高,數字化音頻的質量越好,還原的波形越完整,播放的聲音越真實,當然所占的大小也就越大。根據奎特采樣定理,要從采樣中完全恢復原始信號的波形,采樣頻率要高于聲音中最高頻率的兩倍。人耳可聽到的聲音的頻率范圍是在 16 赫茲到 20 千赫茲之間,因此要將聽到的原聲音真實地還原出來,采樣頻率必須大于 40千赫茲。而 44千赫茲 的音頻可以達到 CD 的音質,當然可以更高,只不過高于 48 千赫茲 的采樣頻率人耳很難分別,沒有實際意義。

采樣位數:也叫量化位數(單位:比特),是存儲每個采樣值所用的二進制位數,采樣值反映了聲音的波動狀態(tài),采樣位數決定了量化精度。采樣位數越長,量化的精度就越高,還原的波形曲線越真實,產生的量化噪音越小,回放的效果越真實。常用的量化位數有 4、8、12、16、24等等,量化位數與聲卡的位數和編碼有關。

聲道數:使用的聲音通道的個數,也是采樣時所產生的聲音波形個數。播放聲音時,單聲道的 wav 一般使用一個喇叭發(fā)聲,立體聲的 wav 可以使用兩個喇叭發(fā)聲。記錄聲音時,單聲道每次產生一個波形的數據;雙聲道每次產生兩個波形的數據,當然最終音頻所占的存儲空間也會增加一倍。

比特率:比特率是指每秒傳送的比特(bit)數,單位為 bps(Bit Per Second),比特率越高,傳送的數據越大。在音頻、視頻領域,比特率又被稱為碼率、位率、位速(這四個老鐵是同一個東西,只是不同領域、不同翻譯造就了這么多的名詞)。比特率表示經過編碼(壓縮)后的音、視頻數據每秒鐘需要用多少個比特來表示。比特率與音、視頻壓縮的關系,簡單來說就是比特率越高,音頻、視頻的質量就越好,但編碼后的文件就越大;如果比特率越少則情況剛好相反,比特率 = 采樣頻率 * 采樣位數 * 聲道數。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")

# 聲道數, 1 表示單聲道, 2 表示雙聲道
print(song.channels)  # 2

# 采樣寬度, 采樣位數除以 8 就是采樣寬度了, 因為一個字節(jié)有 8 位
# 同理采樣寬度乘以 8 就是采樣位數,當前音頻是 16 位的
print(song.sample_width)  # 2
print(song.sample_width * 8)  # 16

# 采樣頻率, 采樣頻率等于幀速率
print(song.frame_rate)  # 44100

# 塊對齊之后的大小, 或者一幀的字節(jié)數
# 等于 通道數 * 采樣位數 / 8, 或者 通道數 * 采樣寬度
print(song.frame_width)  # 4
print(song.channels * song.sample_width)  # 4

# 字節(jié)率, 等于 采樣頻率 * 聲道數量 * 采樣寬度(采樣位數 / 8), 可以直接計算得到
print(song.frame_rate * song.channels * song.sample_width)  # 176400

# 時長(單位秒)
print(song.duration_seconds)  # 87.8225850340136

# 幀數目
print(song.frame_count())  # 3872976.0

# 原始的音頻數據, 不打印了
song.raw_data

音頻導出

我們對音頻進行了一些操作之后,怎么保存到本地呢?這也是關鍵的一部分,不然你處理完了沒有用啊。很簡單,直接調用 AudioSegment 對象的 export 方法即可。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
song.export("百鬼夜行.wav", "wav")

指定文件名和保存的類型即可,注意:第二個參數表示保存的音頻的類型,必須要指定正確。如果不指定那么默認是 mp3,即便我們第一個參數的文件名結尾是 .wav,但是保存的時候仍是 mp3。

所以基于 pydub 可以很容易地實現音頻格式轉換。

修改屬性

有時我們需要改變文件的格式,但有時也需要改變文件的屬性。比如某個 MP3 文件的采樣頻率有點高,我們需要降低一些,或者雙聲道變成單聲道等等,這個時候該怎么做呢?

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
print(song.channels)  # 2

# 將通道設置為 1, 然后導出
song.set_channels(1).export("高梨康治 - 百鬼夜行_1.mp3", "mp3")

# 重新讀取, 查看通道
print(
    AudioSegment.from_mp3(r"高梨康治 - 百鬼夜行_1.mp3").channels
)  # 1

1 表示單聲道,2 表示雙聲道,從單聲道轉成雙聲道不會有任何的改變,但從雙聲道轉成單聲道可能會導致質量損失(當左右聲道不同時)。

單聲道:只用一條音頻通道記錄聲音,是最古老、最基礎的聲音記錄方式。單聲道因為只有一條音頻通道,所以我們的大腦接收的左右耳的信息沒有差異,聽覺系統(tǒng)就不會產生心理聲學的定位,所以不會有寬度及深度的差異。只能感受到聲音、音樂的前后位置及音色、音量的大小,而不能感受到聲音從左到右等橫向的移動。效果相對于真實的自然聲來說,是簡單化的,是失真了的。所以聽出來的聲音干澀,沒有層次感,沒有現場感,一般用來聽新聞廣播,因為單聲道信號簡單不易丟失。原理是把來自不同方位的音頻信號混合后統(tǒng)一由錄音器材把它記錄下來,再由一只音箱進行重放。

雙聲道:人們聽到聲音時可以根據左耳和右耳對聲音的相位差來判斷聲源的具體位置,在電路上它們往往各自傳遞的電信號是不一樣的。相當于實現立體聲的原理,在空間放置兩個互成一定角度的揚聲器,每個揚聲器單獨由一個聲道提供信號。而每個聲道的信號在錄制的時候就經過了處理,有些音樂就跟氣流一樣,從左到右再從右到左,因為是兩個不同的聲道,當一個聲道的響度比另一個聲道大的時候,我們就感覺聲音好像有了方向一樣。雙聲道立體感強,有音場,多用于音樂、CD 等專輯?;旧弦魳范际请p聲道,如果是單聲道的音樂,只能說明音質非常非常差。

注意:設置的話不要通過下面這種方式來設置。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
song.channels = 1

因為一個屬性變了,可能會影響其它的屬性,比如:幀大小,它等于 通道數 乘上 采樣寬度(采樣位數 / 8),如果通道變了,那么幀大小也會受到影響。所以我們應該通過 pydub 提供的 API 來設置,內部會自動幫我們處理。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
print(song.frame_rate)  # 44100

# 更改采樣頻率, 一般都是 44100, 我們可以修改為其它的值
# 注意: 并不是任意值都可以, 只能是 8000 12000 16000 24000 32000 44100 48000 之一
# 如果不是這些值當中的一個, 那么會當中選擇與設置的值最接近的一個
# 比如我們設置 18000, 那么會自動變成 16000
song.set_frame_rate(18000).export("高梨康治 - 百鬼夜行_1.mp3", "mp3")
print(
    AudioSegment.from_mp3(r"高梨康治 - 百鬼夜行_1.mp3").frame_rate
)  # 16000

采樣頻率等于幀速率,以赫茲為單位。增大這個值通常不會導致質量的下降,但降低這個值一定會導致質量的下降,因為更高的幀速率意味著更大的頻響特征(即可以表示更高的頻率)。

除了通道數、采樣頻率之外,我們還可以設置采樣寬度(采樣位數除以 8),對于一個音頻而言能設置這些屬性已經足夠了。像很多大廠提供的音頻識別服務,也會對音頻屬性有嚴格的限制,而限制的屬性也基本上就這些。無非是通道、采樣頻率、采樣位數等等。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
print(song.sample_width)  # 2
song.set_sample_width(3).export("高梨康治 - 百鬼夜行_1.mp3", "mp3")
print(
    AudioSegment.from_mp3(r"高梨康治 - 百鬼夜行_1.mp3").sample_width
)  # 2

從打印的結果上來看,我們似乎沒有設置成功,因為這和音頻本身也是有相應關系的??赡芤纛l本身的采樣寬度就只能是 2,不過絕大部分音頻的采樣寬度都是 2,即采樣位數為 16。

export 的其它參數

我們導出音頻的時候使用的是 export 方法,這里面還可以接收其它參數,先來看看我們導出的音頻的原始的音頻之間的差異。

我們看到原始的音頻有很多其它信息,比如作曲人、專輯等等,但是我們導出的沒有,那么可不可以設置呢。答案是可以的,在導出的時候加上一個 tags 參數即可。

from pydub import AudioSegment

song = AudioSegment.from_mp3(r"高梨康治 - 百鬼夜行.mp3")
song.export("高梨康治 - 百鬼夜行_1.mp3",
            "mp3",
            tags={"artist": "古明地覺",
                  "album": "地靈殿專輯",
                  "title": "好聽的百鬼夜行",
                  "comments": "媽耶, 真好聽"})

再來看看效果。

其它的屬性可以單擊右鍵,然后點擊屬性查看。對了還有圖片,如果在導出的時候想要自定義封面的話,可以通過 cover 參數,傳遞一個圖片文件地址即可。

另外,我們這里導出的文件要比原始文件小很多,原因在于比特率不一樣。原始的音頻的比特率是 320kbps,而我們導出的音頻的比特率要小很多。因為比特率表示音頻一秒所需的比特數,比特率越小,顯然文件就越小。而我們在導出的時候也是可以修改比特率的:

song.export("高梨康治 - 百鬼夜行_1.mp3",
            "mp3",
            bitrate="320k")

以上就是Python音頻處理庫pydub的使用示例詳解的詳細內容,更多關于Python pydub的資料請關注腳本之家其它相關文章!

相關文章

  • python基于celery實現異步任務周期任務定時任務

    python基于celery實現異步任務周期任務定時任務

    這篇文章主要介紹了python基于celery實現異步任務周期任務定時任務,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 用Python爬取某乎手機APP數據

    用Python爬取某乎手機APP數據

    最近爬取的數據都是網頁端,今天來教大家如何爬取手機端app數據(本文以ios蘋果手機為例,其實安卓跟ios差不多)! 本文將以『某乎』為實戰(zhàn)案例,手把手教你從配置到代碼一步一步的爬取App數據,需要的朋友可以參考下
    2021-06-06
  • Python爬蟲 批量爬取下載抖音視頻代碼實例

    Python爬蟲 批量爬取下載抖音視頻代碼實例

    這篇文章主要介紹了Python爬蟲 批量爬取下載抖音視頻代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python中關于eval函數的使用及說明

    python中關于eval函數的使用及說明

    這篇文章主要介紹了python中關于eval函數的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python3 導入上級目錄中的模塊實例

    Python3 導入上級目錄中的模塊實例

    今天小編就為大家分享一篇Python3 導入上級目錄中的模塊實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python中的collections集合與typing數據類型模塊

    Python中的collections集合與typing數據類型模塊

    這篇文章介紹了Python中的collections集合與typing數據類型模塊,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Python實現句子翻譯功能

    Python實現句子翻譯功能

    這篇文章主要介紹了Python實現句子翻譯功能,涉及urllib庫的使用等相關內容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Python對excel文檔的操作方法詳解

    Python對excel文檔的操作方法詳解

    這篇文章主要介紹了Python對excel文檔的操作方法,結合實例形式分析了Python基于xlrd、xlwd庫針對Excel文件的讀寫、sheet表創(chuàng)建、獲取、遍歷等相關操作技巧,需要的朋友可以參考下
    2018-12-12
  • 詳解python多線程之間的同步(一)

    詳解python多線程之間的同步(一)

    這篇文章主要介紹了python多線程之間的同步,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 使用Python輕松實現一個簡單的圖床功能

    使用Python輕松實現一個簡單的圖床功能

    在網上分享圖片或將圖片嵌入到網頁中時,通常需要一個圖床來存儲和管理這些圖片,所以本文就來為大家介紹一下如何使用Python輕松實現一個簡單的圖床功能吧
    2024-01-01

最新評論

鸡东县| 乌兰察布市| 凤城市| 阳信县| 襄汾县| 蛟河市| 义乌市| 大洼县| 湘潭县| 视频| 隆德县| 盱眙县| 方山县| 定安县| 阿克陶县| 射洪县| 肥西县| 长顺县| 寻甸| 望谟县| 吴堡县| 壶关县| 聊城市| 牟定县| 民丰县| 家居| 鲜城| 溆浦县| 宁城县| 琼结县| 那曲县| 宜兰市| 和静县| 西乌珠穆沁旗| 三都| 海淀区| 遂平县| 崇明县| 东城区| 寿宁县| 策勒县|