音樂旋律提取演算法 附可執行demo

来源:https://www.cnblogs.com/cpuimage/archive/2018/10/06/9747247.html
-Advertisement-
Play Games

前面提及過,音頻指紋演算法的思路。 也梳理開源了兩個比較經典的演算法。 https://github.com/cpuimage/shazam https://github.com/cpuimage/AudioFingerprinter 後來一段時間,稍微看了下這兩個演算法,還有不少可以精簡優化的空間。 例 ...


前面提及過,音頻指紋演算法的思路。

也梳理開源了兩個比較經典的演算法。

https://github.com/cpuimage/shazam

https://github.com/cpuimage/AudioFingerprinter

後來一段時間,稍微看了下這兩個演算法,還有不少可以精簡優化的空間。

例如抗噪,特征有效性等優化思路。

音頻指紋切片後的hash特征信息還是太多了,

不過作為哼唱搜歌的基本應用,是足夠的了。

不過我覺得還是可以再進一步提取歌曲的旋律特征的,在音頻指紋的基礎上更進一步。

  旋律是最重要的音樂要素之一,多應用於音樂內容分析、音樂創作、音樂教育、抄襲檢測等方面。

主旋律提取旨在從一段音樂中自動估計對應於主旋律單音音符序列的音高或基頻。

流行音樂一般屬於複雜的多音音樂,因此主旋律提取面臨著許多挑戰。

  在這裡要特別說一下,音頻處理領域碰到的問題都是相似的。首當其衝主要是雜訊,其次是音量和語速。

特別是在一些場景下的asr識別,例如實時對話,同聲傳譯之類環境下,語速和音量的干擾影響很多時候多過於雜訊。

而很多提供asr服務的廠商對這類情況支持不佳,而據我所知,訊飛的asr中是有內置前處理演算法的。

好像有點偏題了,回到主題上來。

也就是說不管做音頻還是音樂 上面提到的問題都會造成一定精度影響。

音頻前處理演算法是非常重要的,一直在做這方面的研究工作,前面著重於降噪和增益方向,下一步應該會著重在語速方面的研究。 

而剛纔提到的旋律,也可以認為是語速的一個點。

旋律,節奏,節拍,精確準確度從另一個側面就可以評估語速,以及風格內容。

所以提取旋律節奏是一個非常值得研究的課題。

也許大家最熟悉的應用場景應該是 游戲節奏類app或者唱K的旋律評分系統。

關於旋律提取這方面的資料比較有限。

在這方向上面,一開始我也是有點蒙圈。

直到我看到一個思路,我突然間豁然開朗。

那就是將歌曲音頻 轉換為midi電子音樂。

眾所周知,midi電子音樂體積非常非常小,在游戲領域應用非常廣,幾乎是標配。

例如超級瑪麗的背景音樂,經典中的經典。

那麼是不是可以實現一種演算法,將音頻轉為midi,作為此段音頻的指紋呢?

理論上,完全可行,而且剛纔提到的唱K的評分系統就是類似的實現。

參照下圖:

上面是一段音樂,下麵是其對於的midi。

把這個圖放大給大家感受一下。

是不是有似曾相識的感覺。

KTV 的節奏條。

所以毫無疑問,KTV的評分系統極其有可能就是採用了MIDI作為聲紋進行相似度匹配,

最後給出評分。

當然關於旋律提取有很多不同的實現,不過,大多數演算法都有3個共同的目的,

分別是演算法的速度性能(複雜度),最終效果,抗噪抗干擾。

針對這三個方面,各有各的技巧。

如果能兼顧三者,無疑是最佳的。

而關於wav轉midi的資料,真的是極其稀少。

大概有:

1. https://github.com/mrk21/wav2midi

https://mrk21.kibe.la/shared/entries/3931bfea-0f31-4aa1-9e72-b7cd6f010697

2.https://github.com/justinsalamon/audio_to_midi_melodia

http://www.justinsalamon.com/melody-extraction.html

仔細學習查閱之後,你會跟我一開始一樣,一臉懵逼。

首先,第三方依賴特別多,也就意味著,這個演算法並不簡單。

就效果對比而言,audio_to_midi_melodia 更佳,當然深度學習大火之後

也有人在嘗試通過深度學習的方式,建立wav 到 midi的映射。以尋求新的突破。

當然還在試驗階段,暫時還沒看到有特別優秀的模型放出。

不過可以拭目以待。

而這個演算法有多複雜,看下演算法的流程圖:

說難也不難,說簡單也不簡單。

大部分環節是為瞭解決語速,音量,噪音所造成的誤差問題,使得演算法更佳穩定,更魯棒。

根據這個思路,自行實現演算法並不困難。

改進演算法思路的首要前提,理解演算法的核心思想,

所以至少你要把整個演算法思路實現一遍,加深理解,不管能否理解到精髓。

然後站在巨人的肩膀上,繼續改進。

這個演算法花了我一段時間去實現,原本預計幾個星期可以搞定,

但是後來因為其他原因擱置了。

趁國慶假期,撿起來,把一些工作繼續推進,復現了該演算法。

這個過程挺漫長的,有不少環節還可以進一步改進優化。

不過這是後面的工作了。

演算法暫沒有開源計劃,放出demo 供大家評測。

這個方向的演算法,

有一個專用名詞叫做mir, 全稱 為 music/audio information retrieval/signal processing 。

有興趣的朋友,可以查閱一下相關資料。

基本上都是dsp(數字信號處理)。

學習dsp必須把傅里葉變換好好理解一下。

為了理解傅里葉變換的演算法思路,我把市面上能找到的實現,都過了一遍。

用純c 進行學習復現,也足足花了我1個多月的業餘時間,

就差噴一口老血出來。

 

可執行demo下載地址:

https://files.cnblogs.com/files/cpuimage/wav2midi.zip

使用方法:拖放wav文件到可執行文件上即可。

或者採用命令行 wav2midi.exe demo.wav

執行後生成 demo.mid 文件。

目前僅支持wav的1通道和2通道格式,其他的格式暫沒做支持。

在學習音頻演算法的時候,經常會聯繫到圖像方面的演算法,進行類比,舉一反三。

都有共通的地方,就看你怎麼應用了,溫故而知新。

用以前說過的一句話來總結就是,

任何演算法都有缺點,但是一定要用它最優秀的思路。

就好比說,用人只要用其長處,天下皆是可用之才。

 

若有其他相關問題或者需求也可以郵件聯繫俺探討。

郵箱地址是: 
[email protected]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題意: 設一個1-n的空間,初始1-k位置占了人,每次操作將x位置的人移動到y位置,保證輸入操作合法,求,每次操作後,空間無人的間隔,有多少個(比如01000100100有4個)。 思路: 題目給的N很大,無法用數組去模擬,一開始很蒙,但是感謝隊友的想法,我寫了很短的代碼解了這道題。首先,要觀察到, ...
  • 一、本節課程 Arx二次開發創建直線、圓、圓弧和修改對象屬性 二、本節要講解的知識點 1、如何應用C++ ARX二次開發創建直線。 2、如何應用C++ ARX二次開發創建圓。 3、如何應用C++ ARX二次開發創建圓弧。 4、如何修改對象的屬性。 5、騰訊課堂雲幽學院詳細的內容講解。 三、具體內容 ...
  • SpringData 整合源碼:鏈接: https://pan.baidu.com/s/1_dDEEJoqaBTfXs2ZWsvKvA 提取碼: cp6s(jar包自行尋找) author:SimpleWu time: 2018 10 06 20:51 1.SpringData概述 Spring D ...
  • The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better tha ...
  • 鏈接:https://www.nowcoder.com/acm/contest/206/B來源:牛客網 題目描述 恬恬有一個nx n的數組。她在用這個數組玩游戲: 開始時,數組中每一個元素都是0。 恬恬會做某些操作。在一次操作中,她可以將某一行的所有元素同時加上一個值,也可以將某一列的所有元素同時加 ...
  • 我先說說feed流吧,它就是社交網站中用戶活動信息流,例如用戶寫了博客、發了照片、評論了什麼等等。Facebook叫newsFeed、推特叫TimeLineFeed。ActivityStream是這些feed規範,它有演員、動作、對象、目標等重要元素組成。用ActivityStream作為信息模型具 ...
  • if語句 * if語句有三種格式 * * if語句格式1: * if(關係表達式){ * 語句體; * } * * 執行順序: * A:首先計算關係表達式的值,看是true還是false * B: 如果是true,執行語句體, * C:如果是false,就不做執行語句體 * * 不影響其它語句的執行 ...
  • 1003 我要通過! (20 分) “ 答案正確 ”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“ 答案正確 ”大派送 —— 只要讀入的字元串滿足下列條件, 系統就輸出“ 答案正確 ”,否則輸出“ 答案錯誤”。 得到“ 答案正確 ”的條件是: 字元串中必須僅有 P 、 A 、 T 這三 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...