大家在日常聽音樂時,偶爾會有對一些音調低弱的、或相反音調高昂的樂曲有需求。例如:傷感輕柔的流行歌曲,或輕音樂、或高昂的振動人心的樂曲。普遍滿足這類需求的方式是通過人工編輯的歌單、分類。今天給大家分享的是我個人尋索的一種通過程序計算樂曲波形自動匹配、區分樂曲音調強弱的方法。
傳統解決方案缺點
面對上文中所描述的需求,傳統的解決方案是從分類或者歌單當中選取歌曲。這種選取歌曲的方式是通過人工編輯的方式實現的,缺點非常明顯:
1、會存在主觀層面的局限性,聽覺、感覺、理解上,人人各異,選出來的同類強弱音調的歌曲自然會不同,即:無一個標準。
2、缺乏可維護性。一個分類、歌單如果人工篩選挑出一遍,那麼再人工去維護優化一遍,這幾乎是無意義的,也無標準可參考去優化。在沒有明顯的錯誤情況下,人工優化空間很小。隨著不斷新的歌曲的出現,人工去翻舊帳優化歷史歌單、分類的意義又不大。
3、人工成本的耗費。不僅僅薪酬的消耗,人工精力也是消耗。不可能像機器一樣,一致保持一種「性能」。精力、狀態不同,導致的工作結果也會不同,最終選出的分類、歌單自然也質量參差不齊。
4、曲庫一般量非常大,多則千萬首樂曲,人工挑選不太可能百分百的將歌曲都予以篩選一遍,如果再加上返工優化,那麼工作量是非常大的。曲庫不能全部輸出,它的存在意義就會折扣。
波形測算方法
聲音的波形表示著它自身的物理屬性。波形中隨著時間軸幅值的變化表示音的強弱變化。
振幅的物理意義,振幅描述了物體振動幅度的大小和振動的強弱。發音體振動的位移幅度,振幅大小同發音受到的外力大小有關,振幅的大小決定聲音的強弱。——互動百科
在聲振動中,振幅是聲壓與靜止壓強之差的最大值。聲波的振幅以分貝為單位。聲波振幅的大小能夠決定音強。——百度百科
即按照此原理,進行以下工作:
1、將樂曲的波形幅值一一取值。
2、對音調進行強弱等級劃分,我個人的具體劃分等級為「強中弱」三個等級音調。具體的劃分幅值區間是非線性的。之所選擇非線性是因為人們對音強弱感知是非線性的。這種非線性的劃分其實也具有人工主管性,不過這個僅僅是一個程序參數,完全可以不斷進行大量歌曲的實驗,進行優化。所以初始的誤差並不影響整體。
3、將一首樂曲的所有波形幅值進行按等級區間進行比較,分別落在每個等級區間的佔比如何。在哪個等級區間佔比越大,說明樂曲越傾向於哪個區間的音調強弱程度。
在這裡,我著重說一下,其實樂曲在數字流媒體中播放時,是數位訊號,離散的。類似視頻是一幀一幀的連續,樂曲也是由有限個「音點」組成的。例如我們看到的上面一張波形圖,被放大後其實是:
相信大家看到這裡便一目了然了。明白我說的取值、然後匹配所在每個區間的比例等等的意思了。
4、得到每首樂曲的在每個強弱等級的佔比,然後再進行樂曲之間的相似對比,即可將同類的歌曲分為一類。如此一來,強音、弱音即可分辨而來。其實可以幾秒即可跑完一首歌曲的,面對百萬、千萬的樂曲庫,在伺服器端同時跑一定數據樂曲,估計很快即可跑完。
5、以上都是程序中的原理,至於產品層面的設計,其實非常類似於現在的歌單、分類,並無多難、深層次的東西在裡面。
好了,說了這麼多,不Demo一下,是不是只管賣弄,不夠意思?就把自己用Java編寫的效果圖拿出來獻醜啦~(在圖片最下面不斷變化的就是這首樂曲音的強中弱音在已播放音中的佔比值,是滾動動態的,因為程序不知道後面的音的強弱多少,程序跑多少才能知道多少佔比值。)
我也整理了一些歌曲的測算結果,大家也可以用播放器軟體試聽一下強弱度是不是我個人測出來的順序:
整個過程就是這樣了。但可能有些人會提到,波形是複雜的各個頻率波形的「集合」,而人們對不同頻率的強弱聽覺是不同的,正如韓寶強先生的著作《音的歷程-現代音樂聲學導論》所講:「相同音量的聲音出現在不同音區時,我們聽起來響度會有差異。」(並且該書中給出了「等響度曲線」。)
然而按我個人以上的算法其實是把不同頻率下的音強弱感知視為同一了。下面我來解釋一下:其實歌曲音頻的確是複雜。按照「等響度曲線」所描述的,只有高頻或低頻中的感覺會差異比較大,而一首樂曲並非只有高頻和低頻階段,往往是各個頻段都包含在內。儘管我可以這麼解釋,但的確是存在誤差的,尤其是對高頻或低頻佔比比較大的樂曲,誤差較大,仍然有待優化。
就到這兒了。周末無所事事,寫了這篇稿子,把2016年的想法和大家分享一下。這也是我計劃寫一個《產品與技術》系列的第一篇文章。雖然有些偏向技術,但回看一下你會發現,這其實是產品的體驗思維貫穿始終。以解決用戶聽音樂的需求為出發點,以用戶對樂曲強弱的感知為體驗點,技術依然只是實現手段。我們產品經理的口號是:「技術改變產品,產品改變世界」,耶~~~
新的一周,祝大家工作順利。
對了,別忘了來我的其他文章看看哦~~評論,點讚、打個賞~~
本文由 @中人PM 原創發布於人人都是產品經理。未經許可,禁止轉載。