1. 程式人生 > >“螞蟻呀嘿” 刷屏的背後:演算法工程師帶你理性解構神曲

“螞蟻呀嘿” 刷屏的背後:演算法工程師帶你理性解構神曲

前幾天小夥伴們是不是都被魔性的「螞蟻呀嘿」刷屏了?其實背後的技術含量並不複雜,主要依靠的是換臉技術和自動節奏檢測,演算法會找到節奏點,在這些節奏點搖臉換表情,這樣一支魔性而上頭短視訊就誕生了。今天為大家一一解構那些網路神曲,分享音樂資訊檢索演算法,帶你理性看神曲,或許下一個網路神曲締造者就是你! 作者:意姝 審校:泰一 # 什麼是音樂? 《禮記》裡說,“凡音者,生人心者也,情動於中,形於聲,聲成文,謂之音”,音是表情達意的一種方式。從樂理上講,通常音樂是由節奏、旋律、和聲這三要素構成的,十二平均律這些律式和數學緊密相關。所以我們可以說,音樂是一個感性與理性交融的產物。而今天要介紹的音樂資訊檢索(Music Information Retrieval,MIR),便是從音樂裡提取 “資訊” ,用演算法將音樂中理性的一面挖掘出來。 # 哪些是音樂的資訊? ## 1. 節奏 首先我們來聽一首抖音神曲:《鰲拜鰲拜鰲拜拜》 [https://y.qq.com/n/yqq/song/000ZCScz4g4BuM.html](https://y.qq.com/n/yqq/song/000ZCScz4g4BuM.html?ADTAG=h5_playsong&no_redirect=1) 歌曲中讓你忍不住跟著一起搖頭抖腿的強烈的鼓點,就是節奏點,這是對節奏一種感性的認知。 嚴格來說,節奏是被組織起來的音的長短關係,它像是音樂的骨架,把音樂支撐了起來。譬如下圖樂譜上的 “4/4” 是拍號,代表著這首曲子的音長的組織形式為:以四分音符為一拍,每小節 4 拍。每小節的第一拍往往為強拍(downbeat),這裡的 “down” 和指揮的手勢一致。 其它常見的拍號還有:2/4,3/4 等,這些都是單拍子(simple meter),也就是每拍自然二等分的節拍。除此之外還有複拍子(compound meter),指的是每拍自然三等分的節拍,如 6/8,復二拍子,讀作 “一二三,二二三,一二三,二二三” 。 ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153755391-270031151.png) 爵士樂、靈魂樂的魅力很多都在於對節奏的運用,遺憾的是,相當一部分華語流行歌曲都是 4/4 拍子的,導致聽感上有很多雷同之處。 ## 2. 音高 音樂是一種聲音,所以也是由物體震動產生的,音的高低是由振動頻率決定的。樂器發出的聲音或人聲,一般都不會只包含一個頻率,而是可以分解成若干個不同頻率的音的疊加。 這些頻率都是某一頻率的倍數,這一頻率就稱作基頻,也就決定了這個音的音高。下圖為一段男聲朗讀的音訊的語譜圖,最下面藍色框出來的部分就是當前時刻的基頻。通常人聲的音高在 100Hz~200Hz 左右。 對於流行歌曲而言,音高常常指的是它的主旋律,也就是人聲唱的部分。 ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153755764-1278424087.png) ## 3. 和絃 現代音樂概念裡面,由多個不同的音高同時發聲就叫和聲,三個或三個音以上的和聲就叫做和絃。當這些音同時彈奏時,叫做柱式和絃,而當它們先後奏出時,便叫做分解和絃。 不過,並不是隨便按下幾個音,都可以帶來悅耳的聽感。由十二平均律可知,一個八度平均分成十二等份,每份稱為半音,每個半音的頻率為前一個半音的 2 的 12 次方根。常見的有三(個音的)和絃,七(度音的)和絃,基本的三和絃的組成如下圖所示。 ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153756774-19908782.png) ## 4. 段落 像文章一樣,音樂也可以劃分為一個個段落,讓情感的表達有了起承轉合。段落的組織形式多種多樣,常見的有如下幾種: * **AAA**一段旋律的重複,簡潔明瞭,常見於宗教音樂。 [https://y.qq.com/n/yqq/song/004Yc5sF3Rq7Wn.html](https://y.qq.com/n/yqq/song/004Yc5sF3Rq7Wn.html) * **ABAB**兩段旋律交叉重複。 [https://y.qq.com/n/yqq/song/000aKduC3mu0IL.html](https://y.qq.com/n/yqq/song/000aKduC3mu0IL.html) 鋼鐵俠出場音樂 * **AABA**在重複的旋律中新增一段不太一樣的,避免乏味感,如這首聖誕歌曲。 [https://y.qq.com/n/yqq/song/002zL7ur42FYtK.html](https://y.qq.com/n/yqq/song/002zL7ur42FYtK.html) * **古典音樂** 一些古典音樂有自己的內容組織形式,如奏鳴曲式(sonata form),它的結構由呈示部、展開部、再現部三大段依序組成。 * **流行音樂** 大家比較熟悉的結構是 “前奏、(主歌 - 副歌)*n、尾奏” ,當然流行音樂的創作比較自由,有時創作者會在兩段副歌之間新增橋段來避免單調,或在主歌與副歌之間新增過渡段,使得情緒過渡更為自然。 # 如何提取這些資訊 傳統的方法是 “提特徵 + 分類器” ,這些特徵包括時域和頻域的。 音訊訊號常常用二維的特徵來表徵:一維頻率、一維時間。這樣我們可以用對待影象的方式,將音訊特徵輸入到分類器中。不過音訊特徵和影象也有所區別,影象具有區域性相關性,即相鄰的畫素點特徵比較接近,而頻譜的相關性,體現在各個泛音之間,區域性的相似性比較弱。 舉個栗子,我們用周杰倫《簡單愛》的前 10s 的和絃(C,G,Am,F)渲染出一段音訊,下圖所示的 4 個頻譜類的特徵,從左上到右下分別為:短時傅立葉變換、Mel-Spectrogram、Constant-Q Transform、Chromagram,前三個都可以理解為通過濾波器組把原始的音訊訊號做拆分。 在提取特徵的過程中,一些抽象的、隱藏在音樂訊號中的語義便浮出水面。在 Chromagram 中,縱軸是 Pitch Class(音高集合,e.g. “音高集合 C” 包含了 C1,C2,C3....)。從圖中可以看出,0s~3s 最亮的三個音分別是 C、E、G,可以推測出這是一個 C 和絃,合適的特徵讓 “和絃檢測” 這個分類任務的難度有所降低。 隨著深度學習在各個領域的蓬勃發展,深度網路也逐漸成為 “分類器” 的首選,不過也要 “因地制宜” ,像節奏這種對音樂上下文有所依賴的音樂 “資訊”,RNN 類的網路往往效果更佳。 ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153757034-1540888006.png) # 我們現在能做到哪些 因為我們的應用場景同時包含了實時與離線,所以下列演算法很多都有實時的版本,可用在實時音視訊通訊等場景。 ## 1. 節奏檢測 如上文所述,節奏點就是歌曲拍子所在的位置。前陣子比較火的 “螞蟻呀嘿”,照片中頭動起來的樣子非常魔性,這些動作就是按照歌曲的節奏點來設計的。下面我們把利用演算法檢測出來的節拍,用類似於節拍器的聲音呈現出來,學過樂器的同學應該對這 “嗒嗒嗒” 的聲音有印象。通過節奏檢測的演算法自動識別出其他歌曲的節奏點,我們也可以製作自己的 “螞蟻呀嘿” 模板。 https://v.youku.com/v_show/id_XNTExOTA4Mzc2MA==.html 上文還提到了 “強拍” ,可以用來區分小節。我們的方法除了檢測出 beat,還能區分出 downbeat,下面的視訊展示出了 “螞蟻呀嘿” 裡的 downbeat: https://v.youku.com/v_show/id_XNTExOTA4MzQ1Mg==.html 有同學可能會好奇,你們的演算法檢測出 beat、downbeat 有什麼用啊,不就是一些時間點嘛? 其實可以衍生出很多音樂的玩法,譬如說前幾年很火的音樂遊戲,節奏大師,一個跟著旋律、節奏來瘋狂輸出的遊戲。 我們在公開資料集(GTZAN)和由 100 首流行歌曲構成的內部資料集上,評測了我們的方法,結果如下表所示。我們的方法在兩個資料集上均有 0.8 以上的 F 值,具有一定的魯棒性。 ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153757895-221463542.png) ## 2. 實時音高檢測 我們的方法可以做到輸入一幀音訊,然後輸出當前幀的音高,以赫茲為單位。 上面這句話看上去似乎有些乾癟,那這些數字有哪些作用呢? 舉個栗子,很多 K 歌軟體裡都有下圖中紅框中的內容,它們是歌曲的音高線。衡量歌唱得準不準,主要就是看演唱者的音高、節奏和原曲的匹配程度。 在這個場景下,我們的音高檢測演算法可以實時地分析使用者的演唱水平,並給出分數。 除此之外,實時音視訊通訊中的一些場景也依賴音高檢測,如 Voice Activity Detection (VAD),如果當前幀有音高的話,說明有人聲。 ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153758109-562599203.png) ## 3. 段落檢測 流行音樂常見的段落型別有:前奏、主歌、過渡段、副歌、間奏、橋段、尾奏這 7 種。 我們調研了市面上做段落檢測的方法,很多都是基於自相似矩陣(Self-Similarity Matrix, SSM),對音樂結構做了 segmentation,也即它們僅僅能劃分時間區間,而無法給出具體的段落型別;Ullrich et al. 提出了基於 CNN 的有監督學習的方法,可以檢測出不同粒度下段落的邊界。除了 “segmentation” ,我們的方法還可以做到 “classification”,即可以給出每個段落的時間區間和型別(上述 7 種)。 我們選取了音樂軟體上熱門榜單裡的前 100 首歌曲,來作為我們的評測樣本集,評測結果及指標含義如下所示: ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153758445-1894181973.png) 這 100 首中包含了 19 首土味 DJ remix 歌曲,由於這些歌曲動態範圍較小,能量很強,“動詞打次” 的聲音掩蓋了很多原曲的特質,所以在這類歌曲上,段落檢測演算法表現較弱。刨除這些 DJ 歌曲後,演算法的 F_pairwise_chorus 可以達到 0.863。 考慮到現在對音樂的消費越來越快餐,而且有時候為了給視訊配樂,需要擷取音樂的片段,而副歌往往是一首流行樂最 “抓耳” 的部分,我們將演算法封裝為 “副歌檢測” 的功能,一鍵幫使用者篩選出流行歌裡所有的副歌,具體的呼叫方式在[這裡](https://help.aliyun.com/document_detail/170216.html?spm=a2c4g.11186623.6.726.3f716e25WRxXWt#title-cmf-0bz-bqd)。 這裡以周杰倫的[《說好的幸福呢》](https://www.bilibili.com/video/BV1Es411s7P5?from=search&seid=11715531828275620867)為例,演算法的輸出結果如下圖所示,時間單位為秒,大家可以邊欣賞 MV、邊感受副歌的情感與能量~ ![image.png](https://img2020.cnblogs.com/blog/2200703/202103/2200703-20210311153758765-679530005.png) ## 4. 實時聲音場景識別 上文提到了一些 MIR 演算法的效果及應用,不過在哪些場景下可以使用它們呢?也即如何區分出音樂場景呢? 針對這個問題,我們提供有聲音場景識別的演算法能力,可以識別出當前是 “語音、音樂、噪聲” 中的哪一種,而且針對語音,可以進一步區分性別(男 | 女)。 下面是一段《新聞聯播》的音訊,聲音場景識別演算法標記出了其中的音樂、男聲、女聲,以及無聲音(也即沒有能量)的部分。 https://v.youku.com/v_show/id_XNTExOTA4NDQ0NA==.html # 關於我們 阿里雲視訊雲 - 語音與音樂演算法團隊,主要為視訊時代的娛樂、教育等場景提供語音音樂等音訊的解決方案。在這裡你可以瞭解到更多前沿的音訊演算法應用,歡迎與我們一起打造更好的音訊世界! >「視訊雲技術」你最值得關注的音視訊技術公眾號,每週推送來自阿里雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流