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

前面說起過,音頻指紋算法的思路。html

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

https://github.com/cpuimage/shazamgithub

https://github.com/cpuimage/AudioFingerprinter算法

後來一段時間,稍微看了下這兩個算法,還有很多能夠精簡優化的空間。app

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

音頻指紋切片後的hash特徵信息仍是太多了,學習

不過做爲哼唱搜歌的基本應用,是足夠的了。優化

不過我以爲仍是能夠再進一步提取歌曲的旋律特徵的,在音頻指紋的基礎上更進一步。ui

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

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

流行音樂通常屬於複雜的多音音樂,所以主旋律提取面臨着許多挑戰。

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

特別是在一些場景下的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 供你們評測。

預處理算法,等響度濾波已經開源:

項目地址:

https://github.com/cpuimage/EqualLoudness

其餘相關算法也將陸續開源.

這個方向的算法,

有一個專用名詞叫作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通道格式,其餘的格式暫沒作支持。

在學習音頻算法的時候,常常會聯繫到圖像方面的算法,進行類比,觸類旁通。

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

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

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

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

 

如有其餘相關問題或者需求也能夠郵件聯繫俺探討。

郵箱地址是: gaozhihan@vip.qq.com

相關文章
相關標籤/搜索