黎思泉,王泓程,顧思恒,張杰霖,萬永菁
(華東理工大學(xué) 信息科學(xué)與工程學(xué)院,上海 200237)
鋼琴是“樂器之王”,鋼琴學(xué)習(xí)者的數(shù)量也十分龐大。為了提高習(xí)琴者的學(xué)習(xí)效率,各式各樣的鋼琴陪練軟件應(yīng)運而生。為了能準(zhǔn)確評價習(xí)琴者的演奏效果,必須采用有效的樂音識別技術(shù)提取出隱含在鋼琴音頻中的節(jié)奏和音符。
正確的音符端點檢測是實現(xiàn)樂音識別的前提。文獻[1]改進了短時能量算法,采用自適應(yīng)閾值尋找音符段起始位置,該算法能夠大致分割出不同的音符段。Masri[4]提出了一種對高頻能量進行加權(quán)的算法,能夠加強時域特征,使音符端點識別更加準(zhǔn)確,但是,2種算法在識別大字組的音頻時準(zhǔn)確率比較低。Bello[3]等提出用相位特征來表征音符起始點,但僅對部分音頻有較好的效果,在相位特征不夠明顯的樂譜中,檢測準(zhǔn)確率低于基于幅值的識別方法。
在端點的識別算法中,識別準(zhǔn)確率更高的有基于距離的算法,比較有代表性的有基于短時傅里葉變換以及諧波結(jié)構(gòu)計算頻譜距離[4]和基于短時MFCC倒譜計算距離[5]?;诰嚯x的算法能夠有效切分音符,但是,鋼琴由于自身諧波規(guī)律,識別某些頻譜突變的和弦可能會導(dǎo)致同一個音符段被切分;在快節(jié)奏樂曲中出現(xiàn)2個連彈的相同琴鍵的情況下,也無法準(zhǔn)確識別。
近年來提出了一些基于先驗知識的識別算法,預(yù)先提取樂譜的音頻特征,再與待識別鋼琴音頻進行校對得出音頻的頻域信息,從而實現(xiàn)音符切分,效果比較好的有采用改進的非負矩陣分解(Non-negative Matrix Factorization,NMF)提取音頻特征的算法[6]和基于Chroma-based BOW特征的算法[7]。通過預(yù)先提取單音的頻譜特征可有效識別音符起始點,但是,必須在識別鋼琴曲音頻前預(yù)先對鋼琴曲的標(biāo)準(zhǔn)音頻進行特征提取,準(zhǔn)備工作量大。
針對鋼琴樂音音符端點檢測問題,本文提出了一種融合時頻信息的算法,在能量峰值確定音符端點的基礎(chǔ)上,利用頻域的信息再進行端點篩選,并通過分析能量衰減的程度保證篩選的準(zhǔn)確性。通過改進能夠?qū)崿F(xiàn)對大字組音頻的準(zhǔn)確識別,并且不需要先驗知識,以準(zhǔn)確地識別出音符起始點。
算法首先基于音頻幀能量突變信息進行端點預(yù)檢測,然后依據(jù)音頻鍵號頻譜信息進行端點過濾,實現(xiàn)音符端點的精準(zhǔn)切分。
鋼琴的音符能量來源于琴槌對琴弦的短時敲擊,并經(jīng)過鋼琴腔體后傳入人耳,因此,可將人耳感知到的鋼琴音符視作一個短時能量脈沖。
首先對音頻信號進行分幀處理,計算每一幀信號的絕對幅度平方和,獲得每一幀信號的能量Ei,如式(1)所示:
式(1)中:si(m)為第i幀音頻信號的第m個點的幅值;L為幀長,幀長的取值與采樣頻率相關(guān),為了簡化運算并保證準(zhǔn)確率,通常取采樣頻率的1.5%~2%作為幀長。
然后,計算相鄰兩幀的能量差△Ei,如式(2)所示,即:
式(2)中:△Ei為音頻幀能量的變化信息。
由于計算了幀與幀之間,而非點與點之間的能量差信息,△Ei其實已經(jīng)過濾了一些原始音頻信號中的微小能量起伏,對計算整體音頻信息的能量變化起到了平滑的作用。此外,由于采用了差分運算,相鄰兩幀的能量差值△Ei比每一幀能量Ei更易用于音符起始點的判斷,超過某一門限的△Ei的正峰值位置對應(yīng)初始音符預(yù)測點。
鋼琴曲《波爾卡舞曲》的樂譜片段和對應(yīng)音頻如圖1所示,基于短時能量與短時能量求差值的檢測函數(shù)如圖2所示。
圖1 鋼琴曲《波爾卡舞曲》的樂譜片段和對應(yīng)音頻圖
圖2 基于短時能量與短時能量求差值的檢測函數(shù)
為了避免初始音符預(yù)測點中存在相鄰過近的偽預(yù)測點,本文采用以下步驟處理初始音符起始點:①求相鄰兩幀的能量差值△Ei的極大值,將△Ei>0的極大值點標(biāo)記為候選預(yù)測點,并存于集合A中;②尋找集合A中所有候選預(yù)測點的最大值,并標(biāo)記此點為預(yù)測起始點;③尋找所有與步驟②中標(biāo)記的預(yù)測起始點之間的距離小于D的候選預(yù)測點,將這些點從集合A中清除;④重復(fù)步驟②和步驟③,直至集合A中沒有可以再標(biāo)記的候選預(yù)測點為止。
在上述步驟中,D定義為相鄰音符端點的最小間隔,計算公式為:
式(3)中:Sp為鋼琴演奏的拍速,單位為“拍/分”;n為樂譜最小音符為n分音符;fs為采樣頻率;b為誤差參數(shù),b的取值與樂音的拍數(shù)有關(guān),為了盡量降低預(yù)測過程的漏檢率,b的取值通常在20~40之間。
圖3 基于檢測函數(shù)極值點進行切分
圖3是圖1基于檢測函數(shù)極值點進行音頻切分所得圖像,在沒有進行極值點過濾時存在很多冗余點,經(jīng)過上述步驟的處理,得出圖4所切分圖像,在保留所有可能的音符端點的前提下,過濾冗余點,但要保持音頻處于過切分狀態(tài)。
圖4 過濾之后所得的極值點
基于音頻幀能量突變信息的端點預(yù)檢測可以保證在低漏檢率下,提取出音頻中的初始端點位置。但是,由于算法中的門限尺度較為寬松,這些預(yù)測的端點中仍有部分音符偽端點,需要進行二次濾除。本文基于音頻鍵號頻譜信息對初始音符端點進行過濾。鋼琴琴鍵對應(yīng)基頻如圖5所示。
圖5 鋼琴琴鍵分布圖
由圖5可知,每上升12個音高,基音頻率將會加倍,即鋼琴符合12平均率。每個琴鍵對應(yīng)1個基頻,第i個琴鍵的基頻為fi,其公式為:
式(4)中:fi為第i號琴鍵的基頻,1≤i≤88;f0=440 Hz,是一個常數(shù)。
鋼琴音頻的諧波頻率如式(5)所示,在基頻為f的琴鍵音頻中,第k次諧波頻率fk的計算公式為:式(5)中:B為鋼琴的不諧和系數(shù),由琴弦的材料、長度等因素決定,一般介于50×10-6~1 000×10-6之間。
對相鄰的2個初始音符端點之間的音頻段進行傅里葉變換,得到其頻譜A(f)。將音頻段頻譜A(f)按照鋼琴基頻規(guī)律歸并為琴鍵鍵號對應(yīng)的譜值A(chǔ)(i)。對應(yīng)關(guān)系如式(6)所示:
然后,計算兩相鄰音頻段的頻譜特征相似度,即:
式(7)中:Aj和Aj+1為相鄰的2個音頻段的鍵號譜值,均為 1×88 的一維向量;Aj+1T代表Aj+1進行轉(zhuǎn)置。
當(dāng)C(Aj,Aj+1)為 1 時,說明Aj和Aj+1兩段音頻譜特征完全相似;當(dāng)C(Aj,Aj+1)為 0 時,說明Aj和Aj+1兩段音頻譜特征不相似。
新音符產(chǎn)生時,單個或部分音符頻段的能量將會大幅上升,即頻率特征中的部分元素將會發(fā)生突變,相似度值將會比較小,由此可以辨別兩段音頻是否有不同的音符頻譜信息。鋼琴音頻在不改變觸鍵音符時,會隨著時間延長出現(xiàn)部分諧音甚至基頻頻譜成分衰減的情況,而在時域中又體現(xiàn)出一個能量的偽峰,極易造成音符端點錯誤切分。如圖4中第一個音符被切分的情況,通過基于音頻幀能量突變信息的端點預(yù)檢測后,出現(xiàn)了第二根冗余的音符端點分割線。但是,由于琴鍵觸鍵時間較長引起頻譜成分衰減,第一段和第二段的鍵號頻譜相似度也不大,仍然無法去除第二個冗余端點。
為了解決此問題,本文采用能量補償?shù)姆椒ㄟM行修正,即將前一個音頻段的鍵號頻譜減去后一個音頻段的鍵號頻譜,如果某一鍵號譜值的差值為正,將此差值補償?shù)胶笠欢我纛l的對應(yīng)的鍵號譜值中;如果某一鍵號譜值的差值為負,則不予補償。計算補償后的相鄰音頻段的鍵號頻譜相似度,并以此相似度的值判斷后一段音頻端點是否為偽端點。如圖6所示,通過鍵號譜值補償,前后2個音頻段的相似度極高,即可判定為2個音符的觸鍵鍵號是一致的。
圖6 切分了同一個音符段相鄰音頻的補償前后的頻譜特征
當(dāng)連續(xù)2個相同的按鍵出現(xiàn)時,余弦相似度的計算就會過濾掉正確的音符起始點,如圖7所示,鋼琴曲《小星星》的前2個音符是一樣的,連續(xù)敲擊相同琴鍵,所得兩段音頻的頻譜特征一定是相似的。為了避免誤刪除相鄰音符觸鍵相同的音頻端點,本文采用基于相鄰音頻鍵號頻譜的曼哈頓距離的音頻端點修正算法。
圖7 《小星星》部分樂譜以及前2個音符的音頻時域圖
無法用相似度區(qū)分的相鄰音頻段能量分布如圖8所示。
圖8 無法用相似度區(qū)分的相鄰音頻段能量分布
相鄰音頻鍵號頻譜的曼哈頓距離為:
本文取相似度門限為Si,曼哈頓距離門限為Di。當(dāng)相鄰音頻的鍵號頻譜相似度大于Si時,再進行曼哈頓距離的驗證。如果曼哈頓距離小于Di,說明能量衰減程度比較低,有新的音符按下,則不刪除該音符端點;反之,如果曼哈頓距離大于Di,則判定能量衰減了,兩段音頻為同一個音符段,刪除該冗余端點。經(jīng)過多次實驗發(fā)現(xiàn),Si取0.94~0.96,Di取0.04~0.08為宜。
圖12 不同節(jié)奏下鋼琴曲《波爾卡舞曲》的評價參數(shù)
圖9和圖10是經(jīng)過余弦相似度和曼哈頓距離篩選之后的切分音頻圖,圖4是篩選之前的切分音頻圖,對應(yīng)圖1和圖7中的樂譜,可以確定在經(jīng)過音符端點的篩選之后,有效濾除錯誤的音符端點。
圖10 經(jīng)過篩選后的《小星星》選段切分圖
本文采用準(zhǔn)確率P(Precision)、召回率R(Recall)和F度量(F-Measure)等指標(biāo)評價音符端點的識別效果。其中,F(xiàn)度量是結(jié)合準(zhǔn)確率與召回率的一個綜合性評價指標(biāo)。準(zhǔn)確率P、召回率R和F度量3個指標(biāo)公式為[8]:
式(9)(10)(11)中:Ncorrect為檢測出的正確音符個數(shù);Nmiss為在檢測過程中遺漏的未被檢測出來的音符個數(shù)。
圖11和圖12為采用本文算法對不同節(jié)拍樂曲進行識別的效果評價。從圖11和圖12中可以看出,本文算法對鋼琴曲《波爾卡舞曲》和《小星星》識別的F度量參數(shù)在95%以上,在不同節(jié)奏的端點檢測中有較好的準(zhǔn)確率和召回率。對比圖11和圖12,《小星星》的端點檢測效果不如《波爾卡舞曲》,原因在于本文基于余弦相似度進行篩選,小星星樂譜中出現(xiàn)過多的重復(fù)音符,在一定程度上影響了識別效果。圖10是138拍每分鐘的一段《小星星》音頻切分圖,對照圖7中的樂譜圖,第9個音符被切分成兩段,在快節(jié)奏按壓琴鍵時,音符衰減不明顯,曼哈頓距離判斷衰減的難度比較大。識別樂曲中有較多重復(fù)音符會影響識別準(zhǔn)確率,對于一般音頻可以保證較高的準(zhǔn)確率。在重復(fù)音符的影響下,對音頻進行端點檢測的準(zhǔn)確率和召回率仍能保證在95%以上。
圖11 不同節(jié)奏的鋼琴曲《小星星》的評價參數(shù)
本文算法融合時頻信息,基于時域能量進行端點預(yù)檢測,找出能量差值突變的點作為預(yù)檢測的端點,通過頻域分析篩除過切分的音符端點。運用本文算法進行端點檢測,在不遺漏音符端點的基礎(chǔ)上能夠有效減少識別錯誤的音符端點。實驗表明,對不同節(jié)奏的音頻進行端點檢測,本文算法能夠保證有較好的檢測效果。
[1]卞毓偉,郭玲.基于權(quán)值分配的音符識別研究[J].計算機與現(xiàn)代化,2017(3):122-126.
[2]Rodet X,Jaillet F.Detection and Modeling of Fast Attack Transients[J].Proceedings of the Icmc01 La Habana,2001(12).
[3]Bello J P,Sandler M.Phase-based note onset detection for music signals[C]//IEEE International Conference on Acoustics,Speech,and Signal Processing.Proceedings,IEEE,2003:441-444.
[4]Masri P.Computer Modeling of Sound for Transformation and Synthesis of Musical Signals[D].Bristol:University of Bristol,1996.
[5]卞毓偉.鋼琴彈奏樂曲識別算法研究及其APP設(shè)計與實現(xiàn)[D]南京:南京理工大學(xué),2017.
[6]萬玉龍,王憲亮,周若華,等.基于非負矩陣分解的鋼琴多音符估計[J].網(wǎng)絡(luò)新媒體技術(shù),2014,3(5):23-27.
[7]張秀,李念祖,李曉強,等.基于Chroma-based BOW特征的多版本音樂識別[J].小型微型計算機系統(tǒng),2015,36(2):397-400.
[8]陳雪梅.樂音信號的多基頻估計[D].濟南:山東大學(xué),2014.