使用Python剪輯 拼接音頻文件

使用Python剪輯 拼接音頻文件

近日有同學讓我幫他剪輯某一段音頻,筆者就蒐羅了下網上一些常用的剪輯音視頻軟件。各類雜七雜八的軟件挺多的,在糾結於選擇哪一個時,忽然想起”爲嘛不用Python神器試試呢?“

有了想法,那就實踐唄!這一搜索,還真有相應的庫是可以切割音頻的。

  • 方法1
from scipy.io import wavfile
import numpy as np

使用scipy庫中的方法wavfile

  • 方法2
from pydub import AudioSegment

主要使用pydub庫中的方法AudioSegment

經過比較,發現方法1操作簡單,但是隻對.wav格式有效。方法2 略微複雜,但是功能強大,支持多種文件格式,如,我們常見的mp3, wav,MP4等。學習成本也不算高, 因此,本文主要針對方法2 進行說明。方法1 在文末給出相應參考文檔。

安裝相關庫及工具

  • 安裝pudub
    pydub,用來處理音頻,比如說MP3啊、wav之類的東西是很方便的。這個庫的安裝和其他常見的庫類似:
    pip install pydub

  • 安裝ffmeg

這個是一個命令行工具,可以用於一些音頻格式的轉換,比如mp3wav啊之類的,然後就可以處理其他類型的多媒體文件了。
可以去ffmeg官網下載,解壓配置環境變量即可。
windows用戶下載壓縮包 ffmeg.
操作步驟很簡單,這裏給出一個參考教程
安裝完之後,打開命令行測試;
在這裏插入圖片描述

音頻剪輯

直接從源碼入手:

'''
@Time    : 2020/2/12 13:55
@FileName: cutVoice.py
@Author  : Solarzhou
@Email   : [email protected]
'''
from pydub import AudioSegment

file_name = r"../data/source.mp3"
sound = AudioSegment.from_mp3(file_name)

start_time = "0:00"
stop_time = "1:29"
print("time:", start_time, "~", stop_time)

start_time = (int(start_time.split(':')[0]) * 60 + int(start_time.split(':')[1])) * 1000
stop_time = (int(stop_time.split(':')[0]) * 60 + int(stop_time.split(':')[1])) * 1000

print("ms:", start_time, "~", stop_time)

word = sound[start_time:stop_time]
# 保存路徑
save_name = r"../data/" + "sound1" + file_name[-4:]
print(save_name)

word.export(save_name, format="mp3", tags={'artist': 'AppLeU0', 'album': save_name[:-4]})

這裏是先讀取了mp3文件,使用AudioSegment.from_mp3函數,如果是其他的一些特殊格式,可以使用AudioSegment.from_file("sound.mp4", format="mp4")

剪切時間是按ms 毫秒來的,所以時間格式的轉換就要到毫秒級的。sound[start_time:stop_time]使用了python裏的list分割來選擇時間的長短。最後export函數輸出,指定保存爲mp3格式的。

音頻拼接

'''
@Time    : 2020/2/12 14:48
@FileName: joinVoice.py
@Author  : Solarzhou
@Email   : [email protected]
'''
from pydub import AudioSegment


def joinVoice():
    file1_name = r"../data/sound1.mp3"
    file2_name = r"../data/sound2.mp3"
    # 加載需要拼接的兩個文件
    sound1 = AudioSegment.from_mp3(file1_name)
    sound2 = AudioSegment.from_mp3(file2_name)
    # 取得兩個文件的聲音分貝
    db1 = sound1.dBFS
    db2 = sound2.dBFS
    dbplus = db1 - db2
    # 聲音大小
    if dbplus < 0:
        sound1 += abs(dbplus)
    else:
        sound2 += abs(dbplus)
    # 拼接兩個音頻文件
    finSound = sound1 + sound2
    save_name = r"../data/" + "finSound" + file1_name[-4:]
    print("save_path:", save_name)

    finSound.export(save_name, format="mp3", tags={'artist': 'AppLeU0', 'album': save_name[:-4]})
    return True
if __name__ == '__main__':
    joinVoice()

到此,我們想要的音頻已經剪輯完成。

剪輯效果圖

在這裏插入圖片描述
我將所有的源碼放在了公衆號上,後臺回覆音頻剪輯獲取。

從一名不羈的碼農開始
這裏寫圖片描述
參考文檔1
參考文檔2
方法1參考文檔

發佈了91 篇原創文章 · 獲贊 55 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章