用Python進行音頻降噪處理

對於需要處理音頻的開發人員來說,音頻降噪處理是一個非常重要的環節。通過使用Python,可以輕鬆地進行音頻降噪。本文將從以下幾個方面對Python音頻降噪處理進行詳細的闡述:

一、Python中的音頻文件讀取

在Python中,可以使用“wave”模塊來進行wav格式音頻文件的讀取。下面是一個簡單的讀取wav文件的示例代碼:

import wave
import numpy as np

with wave.open("audio.wav", "rb") as wav:
    params = wav.getparams()
    nframes = wav.getnframes()
    data = wav.readframes(nframes)

    signal = np.frombuffer(data, dtype=np.short)

上述代碼中,“wav”用於打開一個指定的音頻文件,參數“rb”表示以二進制只讀方式打開文件。通過“getparams”方法可以獲取音頻文件的參數信息,“getnframes”方法可以獲取音頻信號的採樣數量,“readframes”方法可以讀取出全部的音頻信號。最後,使用“np.frombuffer”方法將讀取的二進制字符串轉換為短整數數組,即可得到原始的音頻信號。

二、消除常見的音頻噪聲

在實際的音頻信號處理中,常見的噪聲有白噪聲、背景噪聲等。消除這些噪聲可以提升音頻質量,提高後續處理的效果。下面是一種可用於消除背景噪聲的簡單方法:

import wave
import numpy as np

def remove_background_noise(signal):
    noise_threshold = 5000
    noisy_indices = np.where(np.abs(signal) > noise_threshold)[0]
    clean_signal = np.copy(signal)

    for i in noisy_indices:
        if i < 100:
            clean_signal[max(0, i-100):i+100] = 0
        else:
            clean_signal[i-100:i+100] = 0

    return clean_signal

with wave.open("audio.wav", "rb") as wav:
    params = wav.getparams()
    nframes = wav.getnframes()
    data = wav.readframes(nframes)

    signal = np.frombuffer(data, dtype=np.short)
    clean_signal = remove_background_noise(signal)

    with wave.open("clean_audio.wav", "wb") as clean_wav:
        clean_wav.setparams(params)
        clean_wav.writeframes(clean_signal.tobytes())

上述代碼中,“noise_threshold”表示噪聲閾值,如果信號的幅值超過該閾值,則認為是噪聲信號。使用“np.where”可以獲得所有包含噪聲的樣本的索引值,“np.copy”方法複製原始信號的數據,使用“max”函數將信號剪裁在有效區間內,最後輸出去噪後的結果。

三、基於卷積的降噪算法

基於卷積的降噪算法是一種經典的音頻信號處理方法,其主要思想是通過卷積運算來抑制噪聲信號。下面是一個簡單的基於卷積的降噪算法的Python實現:

import wave
import numpy as np

def convolve(signal, kernel):
    kernel_size = len(kernel)
    half_kernel = kernel_size // 2
    conv_signal = np.zeros_like(signal)

    for i in range(half_kernel, len(signal)-half_kernel):
        conv_signal[i] = np.sum(signal[i-half_kernel:i+half_kernel] * kernel)

    return conv_signal

with wave.open("audio.wav", "rb") as wav:
    params = wav.getparams()
    nframes = wav.getnframes()
    data = wav.readframes(nframes)

    signal = np.frombuffer(data, dtype=np.short)
    kernel = np.ones(100) / 100
    clean_signal = convolve(signal, kernel)

    with wave.open("clean_audio.wav", "wb") as clean_wav:
        clean_wav.setparams(params)
        clean_wav.writeframes(clean_signal.tobytes())

上述代碼中,“kernel”表示卷積核,使用了一個長度為100的平均濾波器。在“for”循環中,對於每一個信號樣本,使用卷積核進行加權平均計算,得到去噪後的信號,最後輸出文件即可。

四、小波降噪算法

小波降噪算法是一種非常經典的音頻降噪算法,其主要思想是通過小波變換將信號分解成多個頻帶子信號,對每個子信號進行去噪處理,最後再進行小波反變換得到去噪後的信號。下面是一個簡單的小波降噪算法的Python實現:

import wave
import pywt
import numpy as np

def wavelet_denoise(signal, wavelet='db4', level=1):
    coeffs = pywt.wavedec(signal, wavelet, level=level)
    threshold = np.sqrt(2*np.log(len(signal))) #估計噪聲標準差
    denoised_coeffs = np.copy(coeffs)

    for i in range(1, len(coeffs)):
        denoised_coeffs[i] = pywt.threshold(coeffs[i], threshold)

    return pywt.waverec(denoised_coeffs, wavelet)

with wave.open("audio.wav", "rb") as wav:
    params = wav.getparams()
    nframes = wav.getnframes()
    data = wav.readframes(nframes)

    signal = np.frombuffer(data, dtype=np.short)
    clean_signal = wavelet_denoise(signal)

    with wave.open("clean_audio.wav", "wb") as clean_wav:
        clean_wav.setparams(params)
        clean_wav.writeframes(clean_signal.astype(np.short).tobytes())

上述代碼中,“wavelet”表示小波基函數,本例使用Daubechies小波函數族的“db4”函數;“level”表示小波變換的階數,默認為1。使用pywt.wavedec對信號進行小波分解,然後使用pywt.threshold方法進行去噪處理,最終使用pywt.waverec方法進行反變換得到去噪後的信號,最後輸出文件即可。

原創文章,作者:OEQCP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/375445.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
OEQCP的頭像OEQCP
上一篇 2025-04-29 12:49
下一篇 2025-04-29 12:49

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論