python音頻庫dejavu原理淺析

2021-02-17 點融黑幫

由於近一段時間正在學習音頻分析方面的知識。


古人有云:要想快速掌握知識,就要學會站在巨人的肩膀上。


因此特意研究了一下dejavu的源碼。

這篇文章主要是記錄學習的過程以及庫的核心方法,權當做讀書筆記。

關於庫的使用方法,本篇不做進一步說明,作者已進行了詳細介紹,需要說明的是庫的開發者目前已不再維護該庫。


1

【前言】


在音頻分析中,最簡單的是時域分析,音頻信號的時域分析是指對聲音信號幅值隨時間變化曲線進行分析。利用pydub讀取「我.mp3」的文件(音頻的內容只有一個字為「我」),將其波形畫出如下圖,橫軸為時間,縱軸為音頻的幅值。從圖中可以看出,在時域內只能分析聲音信號的強弱,從波形中很難看出頻率的變化,無法對不同的音頻信號做出有效的區分。




音頻信號分析的另外一種方法是頻域分析,具體來說就是藉助傅立葉變化將原始信號從時域空間轉換至頻域空間,揭示出構成音頻信號的不同頻率成分。下圖為「我.mp3」文件的頻譜圖,從中可以看出音頻信號的頻率分布,這種分析方法可以有效的區分不同的音頻文件。但是頻譜分析無法反映音頻信號的時間信息,只能提供全局的頻率信息,不能提供某一時刻的頻率信息,只能用於穩態信號的分析,不能用來進行時變信號的分析,單純的利用頻譜分析無法達到聽歌識曲的目的。


下面介紹聲音的時頻分析,獲取時頻信息最常用的方法是短時傅立葉變換,也是dejavu庫所採用的方法。短時傅立葉變換的原理如下,在計算音頻文件的頻率信息時,不同於頻域分析計算整段音頻文件的頻率信息,短時傅立葉變換方法會對音頻文件進行加窗操作,選擇一個較短的窗函數對音頻信號進行截斷,利用快速傅立葉變換計算該窗口內的信號的頻率信息,然後移動窗函數,以得到音頻文件不同時刻內的頻率信息。這樣就得到了聲音信號不同時刻的頻率分布。


dejavu庫會讀取音頻文件,利用時頻分析的方法得到不同時刻的頻率分布,然後按照一定的算法將音頻的指紋信息從音頻文件的時頻信息中提取出來。通過指紋信息來識別和區分聲音文件,每個音頻文件都有其單獨的指紋庫,比對指紋庫可以根據聲音片段以識別出整個音頻文件,以達到聽歌識曲的目的。


2

【音頻內容的讀取】


通過fingerprint_file()方法進行音頻的讀入,該方法返回音頻的各個通道的raw_data、frame_rate以及文件的unique_hash(該方法通過獲取文件MD5來對文件進行標記,主要是為了後續的文件去重)。在read()方法內引入了兩個外部庫來進行音頻文件的讀取,一個是pydub(基於ffmpeg),一個是wavio,這兩個庫都是用來進行對音頻的讀取,作者在源碼內注釋


Reads any file supportedby pydub (ffmpeg) and returns the data contained within.If filereading fails due to input being a 24-bit wav file, wavio is used asa backup.

pydub在讀取24位wav文件時可能會出錯,因此使用wavio來進行wav文件處理。另外在讀取文件時還提供另外一種方法fingerprint_directory()以支持文件的批量讀取。


3

【音頻指紋提取】


首先介紹一下本庫所利用的指紋提取的方法,在讀取完音頻文件之後,會利用短時傅立葉轉化對音頻文件的各個通道的raw_data進行轉換,以獲取時頻信息,通過指定的算子進行過濾,獲取時頻信息內突出的點,時頻圖如下(獲取顏色相較周圍重的幾個點)(該圖片取自github)。通過比較獲取同一時間上突出點頻率最大的峰值點,然後求出每個峰值點及其後面相鄰的15個峰值點的時間差,並將相應的峰值點和時間差哈希化,這樣就完成音頻文件的指紋提取。



指紋提取的方法在fingerprint內的fingerprint方法內,利用matplotlib內的specgram方法獲取頻率的信息,之前對於音頻分析方面並不太熟悉,通過對這個庫的學習算是初識音頻分析。下面做一個簡要的說明,在第一步內獲取了音頻的raw_data,這是音頻的時間與音頻幅度(也就是聲音大小)的數值列表,區分聲音不同的指標主要是聲音的頻率,因此為了進行音頻指紋的提取,需要獲取音頻的時間與頻率的對應值。使用specgram方法獲得的頻率是由一個二維列表組成的列表,列表的長度代表著音頻的時間長度單位為ms,二維列表內單個列表是各個時間點的頻率構成,每個時間點的聲音是由多個不同頻率的波組合而成。


獲取時頻信息之後,在fingerprint內的get_2D_peak方法就是對其進行過濾並提取特徵值,使用了scipy內的max_filter方法進行頻率峰值的篩選,在進行過濾時選擇的原始算子如下,中間一行和中間一列全部為true,然後逐次上下遞減,呈對稱金子塔狀。

[0,1, 0]

[1,1, 1]

[0,1, 0]

該庫採用的算子長度為41*41,代碼如下:

struct= generate_binary_structure(2, 1)neighborhood= iterate_structure(struct, 20)

獲取到所有的突出點之後,通過比較獲取同一時間上突出點頻率最大的峰值點,下圖為「我.mp3」所提取出來的突出點以及峰值點,其中紅點為按照上述算子所過濾出來的突出點,藍點為各個時間點內所提取出來的峰值點,圖示如下。

在dejavu庫的源碼當中,圖標顯示的方法有一些錯誤,目前已經pullrequest了,但是項目已經沒人維護了,修復見這裡(https://github.com/worldveil/dejavu/pull/107)



在提取出所有的峰值點後(圖中藍點),計算出和後續相鄰的的十五個峰值點的時間差(峰值點的數目可以可以根據自己的需求進行更改),然後利用generate_hashes對相應的峰值點和時間差進行hash化處理。generate_hashes函數如下:

for i in range(len(peaks)):        for j in range(1, fan_value):              if (i + j) < len(peaks):                freq1 = peaks[i][IDX_FREQ_I]                freq2 = peaks[i + j][IDX_FREQ_I]                t1 = peaks[i][IDX_TIME_J]                t2 = peaks[i + j][IDX_TIME_J]                t_delta = t2 - t1                if t_delta >= MIN_HASH_TIME_DELTA and t_delta <= MAX_HASH_TIME_DELTA:                    h = hashlib.sha1(                        "%s|%s|%s" % (str(freq1), str(freq2), str(t_delta)))                    yield (h.hexdigest()[0:FINGERPRINT_REDUCTION], t1)

至此,整個音頻文件的指紋信息已經提取出來了,在整個提取過程中,最重要的是特徵點的提取。在不同的指紋提取方法中,特徵點的提取方法也不相同,文章末尾所推薦的parper中有介紹另外的方法,有興趣的同學可以看看。

4

【存儲與比對】


指紋提取完畢後,會將提取到的指紋存儲至資料庫內,默認存儲為Mysql,database類為資料庫的抽象類,裡面定義了必須重寫的一些方法,database_sql為具體的實現。這方面不做過多描述。

通過麥克風或者硬碟讀取完一段音頻文件後,會提取出這段音頻文件的所有指紋,然後與資料庫內的指紋庫進行比對,將匹配成功的音頻信息返回。


5

【總結】


音頻識別最主要的是對於音頻特徵值的提取分析,難點也在這裡。由於本人是音頻分析的新手,通過閱讀這些源碼似的我對音頻方面的分析方法和流程的學習更加深入,因此寫下這篇文章以示記錄。下面是我在進行學習過程中讀到的幾篇parper,很不錯,同樣推薦給大家。


Shazam

(http://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf)

基於哈希的音頻指紋提取算法的研究

(http://gb.oversea.cnki.net/KCMS/detail/detail.aspx?filename=1016092927.nh&dbcode=CMFD&dbname=CMFD2017)

相關焦點

  • 一文總結數據科學家常用的Python庫(下)
    用於音頻處理的Python庫音頻處理或音頻分析是指從音頻信號中提取信息和含義以進行分析或分類或任何其他任務。它正在成為深度學習中的一種流行功能,所以要留意這一點。/* LibROSA */LibROSA是一個用於音樂和音頻分析的Python庫。它提供了創建音樂信息檢索系統所需的構建塊。
  • 基於python將音頻文件轉化為文本輸出
    實驗目的:學習利用python進行音頻轉文本文件實驗環境:已正確安裝python3.51、需要安裝的第三方庫(1)安裝speechrecognition>speechrecognition集合了幾個語音識別庫的接口,非常的實用,本節主要用到能脫網工作的識別方法recognize_sphinx(),該方法會依賴pocketsphinx庫。
  • Python常用庫大全
    python-magic- 文件類型檢測的第三方庫 libmagic 的 Python 接口。 python-tesseract – Google Tesseract OCR 的一個包裝類。 音頻用來操作音頻的庫audiolazy -Python 的數位訊號處理包。
  • 讓所有程式設計師絕不能錯過的59個Python庫總結!
    Python有以下三個特點:易用性和靈活性全行業高接受度:Python無疑是業界最流行的數據科學語言用於數據科學的Python庫的豐富數量優勢本文介紹了python人最常用的59個python庫。一起來看看吧~用於數據收集的Python庫1.
  • 淺析Python五大領域應用
    requests模塊在python內置模塊的基礎上進行了高度的封裝,從而使得python進行網絡請求時,變得人性化,使用Requests可以輕而易舉完成瀏覽器可有的任何操作。Beautiful Soup 是用Python寫的一個HTML/XML的解析器,它可以大大節省你的編程時間。
  • 掌握了這24個頂級Python庫,你就是大神!
    它是一個為繪製有吸引力的圖像而提供高級接口的python庫。matplotlib能實現功能,Seaborn只是以另一種更吸引人的視覺方式來實現。《機器學習可解釋性》用於音頻處理的Python庫音頻處理或音頻分析是指從音頻信號中提取信息和含義以進行分析、分類或任何其他任務。這正在成為深度學習中的一種流行功能,所以要留意這一點。LibROSALibROSA是一個用於音樂和音頻分析的Python庫。它提供了創建音樂信息檢索系統所需的構建塊。
  • Python爬蟲--Requests 庫用法大全
    往期知識回顧:Python爬蟲基本原理12.奇怪知識(1) --Matlab爬蟲獲取王者榮耀英雄皮膚在了解完爬蟲相關的基礎知識以後,我們就可以嘗試去開發自己的爬蟲程序了。我們使用的是Python 語言來開發爬蟲,其中不得不學習的就是關於 requests 庫的使用了1、安裝 requests 庫因為學習過程使用的是 Python 語言,需要提前安裝 Python ,我安裝的是 Python 3.8,可以通過命令 python --version 查看自己安裝的 Python 版本,建議安裝 Python
  • Python爬蟲之基本庫的使用
    需要直到伺服器的響應和應答原理嗎?可能你對這些根本不了解,也沒辦法下手。但是沒關係,python為我們提供了功能齊全的類庫來幫助我們完成這些請求。最基礎的HTTP庫有urllib、requests、treq等。以urllib為例,有了它,我們只需要關心請求的連接是什麼。需要傳的參數是什麼,以及如何設置可選的請求頭就好了,不用深入到底層去了解它到底是怎樣傳輸和通信的。
  • 2019 必知的 10 大頂級 python 庫
    在本文中,我們將討論一些 python 中的頂級庫,開發人員可以使用這些庫在現有的應用程式中應用、清洗和表示數據,並進行機器學習研究。然而,最重要的一點是它有大量的庫供用戶使用。python 的簡單性吸引了許多開發人員為機器學習創建新的庫。由於有大量的庫,python 在機器學習專家中變得非常流行。所以,這裡要介紹的第一個庫是 TensorFlow。
  • 每個python人都離不開的12個python庫
    如果說python能取得今天的成就,一方面是它簡介的語法,更重要的一方面就是它豐富的第三方庫,可以毫不誇張的說,只要你能想到的任何一個功能模塊,都有對應的python庫,可以說正是因為有了豐富的python庫,python才發展得如此迅速,下面我們來看看python人最常用的20個python
  • 盤點python數據工程師需要掌握的18個庫
    今天我們就來整理一下Python中在數據分析領域使用最廣泛的一些庫。掌握這些庫,進行數據分析相關任務時就可以隨心所欲了!所以使用 來安裝,然後使用 來安裝scrapy就可以了數據獲取Beautiful SoupBeautiful Soup也是一個從網站爬取數據的庫,他提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程式。
  • python推薦 | 面向地學領域的Python庫匯總
    數據處理•NetCDF格式 : netCDF4-python,h5py,h5netcdf,xarray等。除了上述簡單的數據處理庫之外,python還提供了NCO和CDO工具的封裝,pynco和cdo,提供了更多的便捷操作。•Grib格式:xarray,Iris,pygrib等,有些僅支持類Unix系統。
  • 5個奇妙的Python庫
    點擊上方「深度學習愛好者」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達引言Python是一個非常神奇語言,無論我們要做什麼任務,python都有其解決方案,無論它與機器學習,數據可視化Python為各種簡單和困難的任務提供了大量的庫。大多數人都知道類似Pandas,Numpy,Matplotlib,Seaborn,OpenCV,Plotly這樣的庫,還有很多其他在機器學習中使用的庫。但是對於很多小的需求,python同樣有很多奇妙的庫。本文將分享一些在項目中遇到的一些庫,這些庫具有很高的可移植性,對於每個庫我都將用一個代碼段來介紹。
  • 140種Python標準庫、第三方庫和外部工具都有了
    這些庫可用於文件讀寫、網絡抓取和解析、數據連接、數清洗轉換、數據計算和統計分析、圖像和視頻處理、音頻處理、數據挖掘/機器學習/深度學習、數據可視化、交互學習和集成開發以及其他Python協同數據工作工具。
  • 神奇的Python圖片處理庫exifread
    來源:掙扎的藍藻 【導語】:用 python 怎樣獲得圖片的GPS信息?今天推薦一下 exifread 這個神奇的庫,不僅僅是 GPS 信息,幾乎能能獲得圖片的所有信息,快進來看看!! 要怎樣獲得拍攝圖片的GPS呢?
  • python機器學習:常用庫的介紹及安裝
    1、為了學習方便,建議大家安裝Anaconda(由於平臺不讓給出網站連結,所以具體連結直接百度搜一下就可以得到),為什麼建議使用這個軟體呢,因為安裝了這個軟體後本身就自帶了IPython、Numpy、pandas,scikit-learn等庫,不用你去在一步一步的去安裝其他的庫;並且該軟體兼容性不錯,可以在Mac OS, windows和linux上運行,一勞永逸,非常方便。
  • 使用Python圖像處理庫Pillow處理圖像文件
    本案例使用圖像處理庫Pillow中的模塊、對象來處理圖像:實現讀取圖像、獲取圖像信息、調整圖像大小、旋轉圖像、平滑圖像、剪切圖像等基本圖像處理任務。注意,Anaconda包含了Pillow庫。以管理員身份運行命令行提示符,輸入命令:pip3 installPillow,安裝Pillow庫。如圖CS-19所示。
  • 推薦一些相見恨晚的 Python 庫 「二」
    Python 庫,那麼這篇文章繼續安利一些相見恨晚的庫,旨在讓你在需要的時候能夠派上用場。好了說正事,這篇文章同樣是翻譯自 Awesome Python 的匯總,主要包括:命令行工具庫、Python 版本兼容性庫、計算機視覺庫、並發和並行庫、Python 配置庫、密碼學
  • 如何在Visual Studio開發工具安裝python庫
    >技術pythonDjango在python語言開發工具的pycharm中,可以安裝第三方庫。那麼,在Visual Studio開發工具中,如何安裝python第三方庫呢?下面利用實例說明:操作步驟:1、打開Visual Studio 2019開發工具,創建python項目
  • 推薦一些能提高生產力的 Python 庫
    一些回答直接把 awesome-python 貼過來,點讚非常多,當然多歸多,但是裡面很多都是些過期的或者其實沒太有什麼價值的庫,反而會增加了挑選庫的成本。我大體上把一些回答過了一遍,另外結合自己平時了解的內容,稍微對一些基礎生產力庫做了簡單的梳理,在這裡分享給大家。