音頻數據增強及python實現

2021-01-10 紙鶴視界

博客作者:凌逆戰

博客地址:https://www.cnblogs.com/LXP-Never/p/13404523.html

音頻時域波形具有以下特徵:音調,響度,質量。我們在進行數據增強時,最好只做一些小改動,使得增強數據和源數據存在較小差異即可,切記不能改變原有數據的結構,不然將產生「髒數據」,通過對音頻數據進行數據增強,能有助於我們的模型避免過度擬合併變得更加通用。

我發現對聲波的以下改變是有用的:Noise addition(增加噪音)、增加混響、Time shifting(時移)、Pitch shifting(改變音調)和Time stretching(時間拉伸)。

本章需要使用的python庫:

matplotlib:繪製圖像librosa:音頻數據處理numpy:矩陣數據處理使用先畫出原始語音數據的語譜圖和波形圖

import librosaimport numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示符號fs = 16000wav_data, _ = librosa.load("./p225_001.wav", sr=fs, mono=True)# ########### 畫圖plt.subplot(2, 2, 1)plt.title("語譜圖", fontsize=15)plt.specgram(wav_data, Fs=16000, scale_by_freq=True, sides='default', cmap="jet")plt.xlabel('秒/s', fontsize=15)plt.ylabel('頻率/Hz', fontsize=15)plt.subplot(2, 2, 2)plt.title("波形圖", fontsize=15)time = np.arange(0, len(wav_data)) * (1.0 / fs)plt.plot(time, wav_data)plt.xlabel('秒/s', fontsize=15)plt.ylabel('振幅', fontsize=15)plt.tight_layout()plt.show()

加噪

添加的噪聲為均值為0,標準差為1的高斯白噪聲,有兩種方法對數據進行加噪

第一種:控制噪聲因子

def add_noise1(x, w=0.004): # w:噪聲因子 output = x + w * np.random.normal(loc=0, scale=1, size=len(x)) return outputAugmentation = add_noise1(x=wav_data, w=0.004)

第二種:控制信噪比

通過信噪比的公式推導出噪聲。

$$SNR=10*log_{10}(\frac{S^2}{N^2})$$

$$N=\sqrt{\frac{S^2}{10^{\frac{SNR}{10}}}}$$

def add_noise2(x, snr): # snr:生成的語音信噪比 P_signal = np.sum(abs(x) ** 2) / len(x) # 信號功率 P_noise = P_signal / 10 ** (snr / 10.0) # 噪聲功率return x + np.random.randn(len(x)) * np.sqrt(P_noise)Augmentation = add_noise2(x=wav_data, snr=50)

波形位移

語音波形移動使用numpy.roll函數向右移動shift距離

numpy.roll(a, shift, axis=None)

參數:

a:數組shift:滾動的長度axis:滾動的維度。0為垂直滾動,1為水平滾動,參數為None時,會先將數組扁平化,進行滾動操作後,恢復原始形狀x = np.arange(10)# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])print(np.roll(x, 2))# array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])

波形位移函數:

def time_shift(x, shift): # shift:移動的長度return np.roll(x, int(shift))Augmentation = time_shift(wav_data, shift=fs//2)

波形拉伸

在不影響音高的情況下改變聲音的速度 / 持續時間。這可以使用librosa的time_stretch函數來實現。

def time_stretch(x, rate): # rate:拉伸的尺寸,# rate > 1 加快速度# rate < 1 放慢速度return librosa.effects.time_stretch(x, rate)Augmentation = time_stretch(wav_data, rate=2)

音高修正(Pitch Shifting)

音高修正只改變音高而不影響音速,我發現-5到5之間的步數更合適

def pitch_shifting(x, sr, n_steps, bins_per_octave=12): # sr: 音頻採樣率# n_steps: 要移動多少步# bins_per_octave: 每個八度音階(半音)多少步return librosa.effects.pitch_shift(x, sr, n_steps, bins_per_octave=bins_per_octave)# 向上移三音(如果bins_per_octave為12,則六步)Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=6, bins_per_octave=12)# 向上移三音(如果bins_per_octave為24,則3步)Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=3, bins_per_octave=24)# 向下移三音(如果bins_per_octave為12,則六步)Augmentation = pitch_shifting(wav_data, sr=fs, n_steps=-6, bins_per_octave=12)

相關焦點

  • 利用python進行音頻數據增強
    在這篇文章中,我將向您展示如何使用音頻文件進行數據增強,以便能夠在機器學習數據集中生成更多樣本。數據增強是一種生成合成數據的方法,即通過調整原始樣本來創建新樣本。這樣我們就可獲得大量的數據。這不僅增加了數據集的大小,還提供了單個樣本的多個變體,這有助於我們的機器學習模型避免過度擬合。我們將使用free-spoken-digit-dataset數據集(github.com/Jakobovski/free-spoken-digit-dataset/tree/master/recordings)。它是語音數字的免費音頻數據集。
  • 一文總結數據科學家常用的Python庫(下)
    這是一篇關於音頻處理及其工作原理的深入文章:使用深度學習開始使用音頻數據分析(帶案例研究)(https://www.analyticsvidhya.com/blog/2017/08/audio-voice-processing-deep-learning/)/* Madmom */這個名字可能聽起來很有趣,但Madmom是一個非常漂亮的音頻數據分析Python
  • 數據工程師需要掌握的 18 個 Python 庫
    目錄數據獲取SeleniumScrapyBeautiful Soup數據清洗SpacyNumPyPandas數據可視化MatplotlibPyecharts數據建模Scikit-learnPyTorchTensorFlow模型檢查Lime音頻數據處理Librosa圖像數據處理OpenCV-PythonScikit-image數據通信Pymongo數據分析結果web部署FlaskDjango
  • Python類庫Pillow實現圖片裁剪、縮放、效果增強等功能
    python注意事項1、 Pillow和PIL不能共存;pip更新2、 easy_install 安裝,安裝命令:easy_install Pillow3、 從 PyPI 下載包,解壓安裝python9、增強圖形要進行更高級的圖像增強,可以使用ImageEnhance模塊中的類 。從圖像創建後,可以使用增強對象快速嘗試不同的設置。您可以通過這種方式調整對比度,亮度,色彩平衡和清晰度。
  • 使用Python中的線性回歸通過語音診斷帕金森氏病
    本文,我們將創建一個簡單的python機器學習算法,以便能夠通過聲音來診斷該人是否為患者。我們將使用一組(健康者和帕金森病患者)音頻文件庫,通過對音頻進行一些測量來構建我們的機器學習數據集。建立機器學習數據集後,我們將使用SciKit Learn庫訓練線性回歸模型。最後,我們將構建一個python庫,這個庫可以輕鬆集成到其他應用程式中。數據集首先,我們需要將音頻文件轉換成包含音頻測量值以及患者是否健康標誌的表格。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(6套課程) 資料庫操作(1套課程) python
  • librosa-madmom:音頻和音樂分析
    讀取音頻提取特徵Log-Mel SpectrogramMFCC繪製波形圖和梅爾頻譜圖prerequisitesinstall起始點檢測 onset detection tutoriallibrosaLibrosa是一個用於音頻、音樂分析、處理的python工具包,一些常見的時頻處理、特徵提取、繪製聲音圖形等功能應有盡有,功能十分強大
  • 用Python實現職工信息管理系統
    想要實現一個職工管理系統首先我們看一下想要實現什麼功能最基礎的增刪改查肯定要實現的然後增加一下數據顯示、數據排序、數據統計功能下面直接上代碼1.增加職工數據```python# 接收用戶收入id = input('請輸入職工號')name = input('請輸入姓名')sex = input('請輸入性別')age = input('請輸入年齡')education = input('請輸入學歷')address = input
  • 數據科學的Python軟體包
    Python被認為是實現數據科學和機器學習模型的頂級程式語言之一。現在,讓我們討論一些為什麼開發人員和數據科學家在其數據科學項目中更喜歡使用Python而不是其他程式語言的主要原因。簡單易學與其他任何程式語言相比,選擇Python是一個顯而易見的直接原因。
  • Python輸出數據print,獲取輸入數據input,基礎入門
    python的輸入和輸出一、print輸出print 默認輸出是換行的,如果要實現不換行需要在變量末尾加上 end=""如:print把內容輸出到文件二、input輸入print是輸出,input接收鍵盤的輸入input()函數,是python的內置函數,接收任意數據類型的輸入,將所有輸入的數據,定義為字符串來進行處理
  • Python數據分析:pandas讀取和寫入數據
    使用read_csv將這三列數據讀入到DataFrame。使用cat命令顯示文件內容:import pandas as pddf = pd.read_csv('01.csv')df當使用read_table()時,運行代碼後出現一個Warning,使用的是最新的版本python3.7。
  • 讓數據科學家代替DJ?Python幫你實現
    Spotify為其開發人員提供了許多表徵音軌的音頻特徵(有關音頻特性對象的更全面的解釋,請參見此處)。數據提取部分分三步完成:訪問用戶播放列表;提取每個播放列表的曲目;提取每個曲目的音頻特徵。對於每個步驟,創建一個函數,實現相應的Spotipy方法。(a)訪問用戶的播放列表deffetch_playlists(sp,username):"""Returns theuser's playlists.
  • 用Python實現簡易超市售貨系統
    今天來實現一個簡單的超市售貨系統數據存儲形式為json的數據首先是讀取數據,這裡用到的Python的json庫,用於處理json類型的數據```pythondef load(): # 數據讀取j = open('goods.txt', 'r', encoding='utf-8')# 逐行讀取文件中的數據
  • 掌握了這24個頂級Python庫,你就是大神!
    它是一個為繪製有吸引力的圖像而提供高級接口的python庫。matplotlib能實現功能,Seaborn只是以另一種更吸引人的視覺方式來實現。這是一篇關於音頻處理及其工作原理的深度文章:《利用深度學習開始音頻數據分析(含案例研究)》MadmomMadmom是一個用於音頻數據分析的很棒的Python庫。它是一個用Python編寫的音頻信號處理庫,主要用於音樂信息檢索(MIR)任務。
  • Python數據類型串講(中)
    2、列表在對序列有了大體的認識後,現在開始介紹序列中最具代表性的數據類型——列表。python中列表以中括號'[ ]'為標識,將一個或多個元素(以逗號分隔)括起來為一個列表,其元素可以為python中任意一種數據類型包括列表本身,且各元素不需要具備相同的數據類型。
  • 小白學數據:教你用Python實現簡單監督學習算法
    有很多方法可以實現有監督學習,我們將探討幾種最常用的方法。根據給定的數據集,機器學習可以分為兩大類:分類(Classification)和回歸(Regression)。如果給定的數據集的輸出值是類別,那麼待解決是分類問題。
  • python數據類型總結——列表
    python用列表或元組來幫助我們。python列表一系列元素組成一個集合,可能通過索引,對每個元素進行訪問。這種數據類型統稱為序列。在python中,字符串就是一種序列。列表遍歷這種遍歷也可以用於字符串,如下:字符串遍歷python
  • 用Python做特效,分分鐘碾壓五毛黨
    ,後面就需要我們獲取音頻然後混流了。(7)給新視頻設置音頻這裡同樣使用moviepy,傳入視頻名稱和音頻對象進行混流:def addMusic(video_name, audio):"""實現混流,給video_name添加音頻""" # 讀取視頻
  • 使用PyTorch實現鳥類音頻檢測卷積網絡模型
    大約在一年前,在我高二的時候,我第一次聽到這種音頻深度學習的用例。事實上,鳥音頻檢測是我做深度學習和計算機科學的第一個項目。我參與了一個研究項目,在北阿拉斯加的郊區用純粹的聲音來探測鳥類的存在。跳入其中,鳥的音頻檢測出現了這樣一個利基(有利可圖的形式),在本文中,我將向您展示如何在BirdVox-70k數據集上使用一個簡單的卷積神經網絡(CNN)來實現這一點。
  • 真沒想到,Python還能實現5毛特效
    另外,我們再來看看另外一種效果,相比之下要狂放許多:實現步驟我們都知道,視頻是由一幀一幀的畫面組成的,每一幀都是一張圖片,我們要實現對視頻的修改就需要對視頻中每一幀畫面進行修改。所以在最開始,我們需要獲取視頻每一幀畫面。在我們獲取幀之後,需要摳取畫面中的人物。