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

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

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

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 供大家評測。

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

項目地址:

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

轉載于:https://www.cnblogs.com/cpuimage/p/9747247.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281957.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281957.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281957.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全新升級的AOP框架Dora.Interception[5]: 實現任意的攔截器注冊方式

Dora.Interception提供了兩種攔截器注冊方式,一種是利用標注在目標類型、屬性和方法上的InterceptorAttribute特性,另一種采用基于目標方法或者屬性的調用表達式。通過提供的擴展點,我們可以任何我們希望的攔截器注冊方式。目錄一、IIntercep…

SCAU 算法課的題

8594 有重復元素的排列問題(優先做) 時間限制:1000MS 內存限制:1000K提交次數:1610 通過次數:656 題型: 編程題 語言: G;GCC;VC Description 設集合R{r1,r2,...,rn}是要進行排列的n個元素,其中r1,r2,...,rn可能相同。 試著設計一個算法&am…

react 數組新增_React 新特性 Hooks 講解及實例(二)

本文是 React 新特性系列的第二篇,第一篇請點擊這里:React 新特性講解及實例什么是 HooksHook 是 React 16.8 的新增特性。它可以讓你在不編寫 類組件 的情況下使用 state以及其他的 React 特性。類組件的不足狀態邏輯復用難缺少復用機制渲染屬性和高階組…

智課雅思詞匯---二十二、-al即是名詞性后綴又是形容詞后綴

智課雅思詞匯---二十二、-al即是名詞性后綴又是形容詞后綴 一、總結 一句話總結: 后綴:-al ②[名詞后綴] 1、構成抽象名詞,表示行為、狀況、事情 refusal 拒絕 proposal 提議 withdrawal 撤退 1、名詞性后綴acy是什么意思? 后綴&a…

javascript事件處理程序

javascript 事件處理程序 1、普通事件處理程序 <input type"button" value"click me" οnclick"showMessage()" /> function showMessage(){alert("clicked");} 2、DOMO 級事件處理程序 <span style"white-space:pre&…

eclipse新發現功能之dos和terminal(ssh連接)

dos功能&#xff1a; window——》show view——》other——》remote systems&#xff0c;選擇remote shell&#xff0c;選擇確定或者雙擊&#xff0c;打開了一個新工具窗口。點擊remote shell窗口最右上角的小三角&#xff0c;在launch子菜單中選擇local&#xff0c;點擊即可。…

7天學會python_7天學會Python最佳可視化工具Seaborn(五):結構化展示多維數據

當探索具有中等數量(不多不少的意思……)維度的數據集時&#xff0c;一個很好的方式是基于不同的子數據集構建不同的實例&#xff0c;并將它們以網格的方式組織在一張圖之中。這種技術有時被稱為“lattice”或“trellis”(大概是格子圖、網格圖)&#xff0c;這跟“small multip…

面對峰值響應沖擊,解決高并發的三大策略

2019獨角獸企業重金招聘Python工程師標準>>> 當前在互聯網的大潮下&#xff0c;眾所周知淘寶、京東這些交易系統每天產生的數據量都是海量的&#xff0c;每天的交易并發也是驚人的&#xff0c;尤其是“雙11”、“6.18”這些活動&#xff0c;對系統的峰值響應提出了非…

.NET 采用 SkiaSharp 生成二維碼和圖形驗證碼及圖片進行指定區域截取方法實現

在最新版的 .NET 平臺中&#xff0c;微軟在逐步放棄 System.Drawing.Imaging &#xff0c;給出的理由如下&#xff1a;System.Drawing命名空間對某些操作系統和應用程序類型有一些限制。在Windows&#xff0c; System.Drawing 依賴于GDI操作系統附帶的本機庫。 某些Windows SKU…

Linux運維人員必會開源運維工具體系

新手必會用深&#xff08;8-15k&#xff09;標記&#xff0c;老鳥必會深淺藍色(15-25K)標記操作系統&#xff1a;Centos,Ubuntu,Redhat,suse,Freebsd網站服務&#xff1a;nginx,apache,lighttpd,php,tomcat,resin數據 庫&#xff1a;MySQL,MariaDB,PostgreSQLDB中間件&#x…

unity讀取Text

sing UnityEngine;using System.Collections;using System.IO; //需要導入System.IO&#xff0c;主要使用它的File類public class TextTest : MonoBehaviour { private string Mytxt; //用來存放文本內容 void Start() { Mytxt ReadFile("C:\\Users\\Admin\\Desktop\\測試…

hibernate mysql 主從_MYSQL主從復制和寫分離

基礎篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

深入剖析Redis系列(五) - Redis數據結構之字符串

前言 字符串類型 是 Redis 最基礎的數據結構。字符串類型 的值實際可以是 字符串&#xff08;簡單 和 復雜 的字符串&#xff0c;例如 JSON、XML&#xff09;、數字&#xff08;整數、浮點數&#xff09;&#xff0c;甚至是 二進制&#xff08;圖片、音頻、視頻&#xff09;&am…

全新升級的AOP框架Dora.Interception[6]: 框架設計和實現原理

本系列前面的五篇文章主要介紹Dora.Interception的編程模式以及對它的擴展定制&#xff0c;現在我們來聊聊它的設計和實現原理。目錄一、調用鏈抽象二、基于約定的攔截器定義三、基于調用上下文的依賴注入容器四、攔截器的提供五、調用鏈的構建六、方法攔截的實現原理七、依賴注…

activemq 安全連接

一、定義用戶組1.1 simpleAuthenticationPlugin通過在activemq.xml中配置用戶組<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username"admin" password"password" groups"admins,publishers,consumer…

React Native在Android當中實踐(五)——常見問題

React Native在Android當中實踐&#xff08;一&#xff09;——背景介紹 React Native在Android當中實踐&#xff08;二&#xff09;——搭建開發環境 React Native在Android當中實踐&#xff08;三&#xff09;——集成到Android項目當中 React Native在Android當中實踐&#…

完成登錄與注冊頁面的前端

完成登錄與注冊頁面的HTMLCSSJS&#xff0c;其中的輸入項檢查包括&#xff1a; 用戶名6-12位 首字母不能是數字 只能包含字母和數字 密碼6-12位 注冊頁兩次密碼是否一致 JS&#xff1a; function fnLogin() {var uSer document.getElementById("user");var pAss do…

mysql505復位密碼_mysql5 如何復位根用戶密碼[官方文檔]

如何復位根用戶密碼如果你從未為MySQL設置根用戶密碼&#xff0c;服務器在以根用戶身份進行連接時不需要密碼。但是&#xff0c;建議你為每個賬戶設置密碼如果你以前設置了根用戶密碼&#xff0c;但卻忘記了該密碼&#xff0c;可設置新的密碼。下述步驟是針對Windows平臺的。在…

WPF效果第二百零一篇之實現合并單元格

早一段時間又一次出差青海省西寧市;回來又是總結又是各種瑣事,也沒顧得上去分享點東西;大周末的就在家分享一下,這二天再次基于ListBox實現的合并單元格的效果:1、ListBox嵌套ListBox的前臺布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

轉載 maven 詳解 http://www.cnblogs.com/binyue/p/4729134.html

--聲明規范 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--聲…