首頁  >  文章  >  後端開發  >  Python音訊處理庫pydub如何使用

Python音訊處理庫pydub如何使用

WBOY
WBOY轉載
2023-05-06 11:58:061841瀏覽

    1. 安裝

    使用pip安裝即可(還需安裝ffmpeg依賴,建議使用conda指令安裝,則不需要設定環境):

    pip install pydub

    2. 匯入和讀取音訊檔案

    from pydub import AudioSegment
    audio = AudioSegment.from_file("path/to/file")

    3. 播放音訊

    from pydub.playback import play
    play(audio)

    4. 音訊長度

    duration = audio.duration_seconds # 单位为秒

    5. 音訊切割

    # 前10秒
    audio = audio[:10000]
    
    # 后10秒
    audio = audio[-10000:]
    
    # 从第10秒开始到第20秒结束
    audio = audio[10000:20000]
    
    # 从第10秒开始到结尾
    audio = audio[10000:]
    
    # 从开始到第10秒audio = audio[:10000]

    6. 音訊合併

    audio1 = AudioSegment.from_file("path/to/file1")
    audio2 = AudioSegment.from_file("path/to/file2")
    audio_combined = audio1 + audio2

    7.音訊轉換

    audio.export("path/to/new/file", format="mp3")

    8. 調整音量

    # 增加10分贝
    louder_audio = audio + 10
    
    # 减小10分贝
    quieter_audio = audio - 10

    9. 等分割音訊

    # 等分分割,按大概每三分钟进行分割
    for i in range(1, 1000):
        if 3.3 >= (audio.duration_seconds / (60 * i)) >= 2.8:
            number = i
            break
    chunks = audio[::int(audio.duration_seconds / number * 1000 + 1)]  # 切割
    
    # 保存分割后的音频
    for i, chunk in enumerate(chunks):
        chunk.export("path/to/new/file{}.wav".format(title,i), format="wav")

    10. 完整程式碼

    以下是一段完整的程式碼,用於對音訊進行前後切割,並將音訊分割成適當長度的小段進行儲存。

    from pydub import AudioSegment
    
    # 读取音频文件
    audio = AudioSegment.from_file("path/to/file")
    
    # 输出视频时长
    print('视频时长:', audio.duration_seconds / 60)
    
    # 前后切割
    start = int(input('前切割n秒,不切割输入0'))*1000
    end = int(input('后切割n秒,不切割输入0'))*1000
    if start:
        audio = audio[start:-end]
    
    # 计算合适的分割长度
    for i in range(1, 1000):
        if 3.3 >= (audio.duration_seconds / (60 * i)) >= 2.8:
            number = i
            break
    chunks = audio[::int(audio.duration_seconds / number * 1000 + 1)] 
    # 保存分割后的音频
    for i, chunk in enumerate(chunks):
        print('分割后的时长:', chunk.duration_seconds / 60)
        chunk.export("path/to/new/file{}.wav".format(i), format="wav")

    應用案例

    1. 將音訊檔案轉換為指定格式

    from pydub import AudioSegment
    
    # 读取音频文件
    audio = AudioSegment.from_file("path/to/file")
    
    # 转换为mp3格式并保存
    audio.export("path/to/new/file.mp3", format="mp3")

    2. 將多個音訊檔案合併為一個檔案

    from pydub import AudioSegment
    
    # 读取音频文件
    audio1 = AudioSegment.from_file("path/to/file1")
    audio2 = AudioSegment.from_file("path/to/file2")
    
    # 合并音频文件并保存
    combined_audio = audio1 + audio2
    combined_audio.export("path/to/new/file", format="wav")

    3 . 製作鈴聲

    from pydub import AudioSegment
    
    # 读取音频文件
    audio = AudioSegment.from_file("path/to/file")
    
    # 切割并保存
    start = 10000
    end = 15000
    ringtone = audio[start:end]
    ringtone.export("path/to/new/file", format="mp3")

    4. 調整音訊音量

    from pydub import AudioSegment
    
    # 读取音频文件
    audio = AudioSegment.from_file("path/to/file")
    
    # 增加10分贝
    louder_audio = audio + 10
    
    # 减小10分贝
    quieter_audio = audio - 10
    
    # 保存调整后的音频
    louder_audio.export("path/to/new/file", format="wav")
    quieter_audio.export("path/to/new/file", format="wav")

    案例:透過辨識空白音,分割音訊中的歌曲

    from pydub import AudioSegment
    from pydub.silence import split_on_silence
    
    # 读取音频文件
    audio = AudioSegment.from_file("audio.mp3", format="mp3")
    
    # 设置分割参数
    min_silence_len = 700  # 最小静音长度
    silence_thresh =-10  # 静音阈值,越小越严格
    keep_silence = 600  # 保留静音长度
    
    # 计算分割数量
    num_segments = int(audio.duration_seconds/60/3)  # 每首歌曲大概三分钟,计算歌曲数量
    
    # 分割音频文件
    for i in range(-10, 0):
        segments = split_on_silence(audio, min_silence_len=min_silence_len, silence_thresh=i, keep_silence=keep_silence)
        if len(segments) <= num_segments:
            print(f"分割成功,共分割出 {len(segments)} 段")
            break
        else:
            print(f"当前阈值为 {i},分割出 {len(segments)} 段,继续尝试")

    首先,我們使用AudioSegment.from_file()方法讀取音訊文件,並設定分割參數min_silence_len、silence_thresh和keep_silence分別表示最小靜音長度、靜音閾值和保留靜音長度。其中,靜音閾值越小,分割出的小段越多,但可能會出現誤分割的情況;反之,靜音閾值越大,分割出的小段越少,但可能會出現漏分割的情況。

    然後,我們計算分割數量num_segments,即將音訊檔案分割成多少段。這裡我們假設每首歌大概三分鐘,計算出總共需要分割成多少段。

    最後,我們使用split_on_silence()方法對音訊檔案進行分割,設定分割參數,並透過循環來不斷調整靜音閾值,直到分割出的小段數量符合預期為止。如果分割成功,則跳出循環;否則,繼續嘗試。

    總而言之,pydub是一個非常實用的音訊處理庫,可以方便地進行音訊處理、轉換、合併等操作。同時,pydub還有豐富的應用場景,如製作鈴聲、調整音量等。值得注意的是,在使用pydub的過程中,需要注意音訊格式的相容性問題。

    此外,還可以透過pydub對音訊進行編解碼、混音、重採樣等操作。下面是一些常見的操作範例。

    編解碼、混音、重取樣

    1. 編解碼

    from pydub import AudioSegment
    
    # 读取音频文件
    audio = AudioSegment.from_file("path/to/file")
    
    # 编码
    encoded_audio = audio.set_frame_rate(16000).set_sample_width(2).set_channels(1)
    
    # 解码
    decoded_audio = encoded_audio.set_frame_rate(44100).set_sample_width(4).set_channels(2)

    2. 混音

    from pydub import AudioSegment
    
    # 读取音频文件
    audio1 = AudioSegment.from_file("path/to/file1")
    audio2 = AudioSegment.from_file("path/to/file2")
    
    # 混音
    mixed_audio = audio1.overlay(audio2)
    
    # 保存混音后的音频
    mixed_audio.export("path/to/new/file", format="wav")

    3.重採樣

    from pydub import AudioSegment
    
    # 读取音频文件
    audio =AudioSegment.from_file("path/to/file")
    
    # 重采样为44100Hz
    resampled_audio = audio.set_frame_rate(44100)
    
    # 保存重采样后的音频
    resampled_audio.export("path/to/new/file", format="wav")

    透過pydub,我們可以方便地進行音訊編解碼、混音、重採樣等操作,進一步擴展了pydub的應用場景。需要注意的是,在進行音訊混音操作時,需要確保兩個音訊檔案的取樣率、取樣位數和聲道數相同。

    最後,總結一下pydub的優點和缺點。

    優點:

    輕量級:pydub是一個輕量級的音訊處理庫,安裝方便,使用簡單。

    功能豐富:pydub提供了豐富的音訊處理功能,包括切割、合併、轉換、調整音量、編解碼、混音、重採樣等。

    應用廣泛:pydub的應用場景非常廣泛,包括音訊處理、鈴聲製作、音訊格式轉換、語音辨識等等。

    缺點:

    對格式的兼容性有限:pydub對音訊格式的兼容性有限,不支援所有的音訊格式,需要先將音訊轉換為支援的格式後才能進行處理。

    效能一般:pydub在處理大檔案時,效能可能會比較一般,需要耗費一定的時間和運算資源。

    不支援串流處理:pydub不支援串流處理,需要將整個音訊檔案讀取到記憶體中,導致記憶體佔用較大。

    綜上所述,pydub是一個功能豐富、應用廣泛的音訊處理庫。在使用pydub時,需要注意音訊格式的相容性問題,並注意處理大檔案時的效能和記憶體佔用。如果需要處理更複雜的音訊任務,可以考慮使用其他更專業的音訊處理庫。

    以上是Python音訊處理庫pydub如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除