武漢理工大學 袁 帥 熊紹潘 付天純
音樂歷史悠久,是人類情感的重要載體,是人類智慧的結晶。音樂記譜,是根據一段音樂寫出其相應的樂譜。一般的樂音愛好者將樂譜演奏出音樂不是一件很困難的事情,但是反過來將音樂記錄成對應的樂譜卻非常困難。手工音樂記譜,更是需要非常專業(yè)的樂理知識。基于Android 的自動音樂記譜,就是讓移動終端具有音樂家的這種記譜能力,而音高估計是自動繪譜研究的核心。
音高估計有兩個基本任務,一是對頻率分析并解析成音符,這可由樂理的相關知識得到[1],二是估計樂音的頻率,即基音周期。國內有很多學者在基音周期的提取方面進行了研究。高戈等提出了一種基音周期估計算法,以實現甚低碼率下的透明質量語音編碼[2]。黃海亮等利用人工神經網絡和動態(tài)規(guī)劃算法提出了一種高精度的基音提取方案[3]。徐國慶等提出了一種音樂識別方法,為實現自動作曲系統(tǒng)提供了較高的識別精度[4]。成新民等通過線性變換等方法將求取“最小谷值點”轉換為求取最大值,實現了精確的基音檢測[5]。翟景瞳等基于自相關處理和快速傅里葉變換(FFT)提出了一種的改進的單音音高識別算法[6]。夏殿松等進一步對平均幅度差函數(AMDF)和短時自相關函數(ACF)進行研究[7]。
本文研究的主要內容是,基于Android平臺的聽曲繪譜的研究及實現,主要包括以下內容。第一,選擇合適的音高提取算法,在保證音符識別效果的前提下,滿足移動端的計算能力;其次,對由頻率轉換為音高的算法進行研究,生成樂譜數據;最后,對在Android平臺的樂譜表示系統(tǒng)進行設計并實現聽曲繪譜功能。
聽曲繪譜系統(tǒng)的概念設計如圖1所示,音樂采集模塊使用Android的錄音設備進行樂音輸入,并將音頻文件存入存儲器中,特征提取模塊獲取音頻文件,進行特征頻率計算,由樂譜生成模塊進行音符映射和小節(jié)劃分,形成樂譜數據,最后將傳入樂譜顯示模塊中進行顯示。同時樂譜優(yōu)化模塊提供對自動生成的樂譜的校正功能,以提高聽曲繪譜系統(tǒng)的實用性。
圖1 聽曲繪譜系統(tǒng)模塊設計
在Android系統(tǒng)上實現聽曲繪譜的基本流程,主要是錄音采集,基音周期提取,頻率音高映射和樂譜在UI界面顯示,如圖2所示。
圖2 聽曲繪譜系統(tǒng)算法流程圖
在錄音的過程中,將錄音緩存數據以四分之一節(jié)拍時值的長度分發(fā)到圖1中的特征提取模塊,進行基音周期提取,然后由樂譜生成模塊進行頻率音高映射,判定該四分之一節(jié)拍的音符值,存入樂譜數據中。由樂譜顯示模塊進行樂譜數據的再處理和實時顯示新生成的樂譜數據。
基音周期提取算法是特征提取模塊的核心,所選取的基音周期提取算法需要進行時間復雜度和基音周期提取準確率上的權衡,以達到在Android移動終端的計算能力之內進行準確的音高判別,進而實現實時的樂譜繪制效果。在文獻[8]中提到了短時平均幅度差函數基音周期提取法在計算上要比短時自相關函數法更為簡單,并且也更易于實現。
設模塊輸入語音信號的時間序列為x(n),首先消去語音信號的直流分量,再進行幅值歸一化處理。在之后的短時時域分析中,經加窗和分幀處理后得到第幀的語音信號xi(m),定義xi(m)的短時平均幅度差函數Di(k)為:
其中,下標 i 表示第 i 幀,每幀長度表示為N。對于周期性樂音信號,Di(k)呈現出與樂音周期相一致的周期特性,即在樂音的基音周期的各個整數點上達到谷值。根據Di(k)的這種特性,可以估計出樂音信號的基音周期。
在使用平均幅度差函數檢測基音周期時,是進行谷值點搜尋,而尋求峰值更容易計算。在文獻[5,8]中,提出了一種通過線性變換(公式)把尋找谷值改為尋找峰值的辦法:
經分析可以發(fā)現,平均幅度差函數的周期性都發(fā)生在谷值點的位置上,而且前兩個谷值相接近,容易在基音周期計算中誤判為基音周期的倍頻。而在MAMDF中,把谷值變換成峰值,并且前兩個峰值的大小明顯區(qū)分出來了,可以有效減少誤判。
聲音是由振動產生的,聲音的傳播形式是具有一定頻率的聲波。我們所聽到的各種周期性樂音,如鋼琴音、笛音等,在演奏中具有相同的頻率,在樂譜中的表示即為音高。
在音樂的表示系統(tǒng)中,通常使用的是十二平均律,又被稱作“十二等程律”,是把一組音(一個八度)分成十二個半音音程的律制,各相鄰兩個音律之間的頻率之比完全相等,即將八度的音程按頻率等比例地分成十二等份[1]。以A4與A5為例,A4與A5之間的頻率比是1:2,其間被分為12個半音,每隔半音間的頻率之比都為半音比??傻糜葾4計算出任意音高頻率的方程[9]:
根據將方程進行逆運算,可得方程:
其中,f1為1939年國際標準協(xié)會通過的現行的國際標準音高A4=440Hz,f 2為計算出來的樂音頻率,p為半音比,n為所求的音高與標準音高A4的距離。
我們選擇音樂簡譜[10]作為我們的目標樂譜表示系統(tǒng),并對其在Android移動終端上的表示進行設計。
為了能夠對簡譜表示進行設計,首先構建簡譜表示的簡單模型。在簡譜表示中,對于每個音符,其具體的音符表示有:,依次代表低音、中音和高音的四分之一拍、二分之一拍、四分之三拍和一拍,這樣設計的目的是,便于將按時間序列進行差別得到的音高序列轉換成對應的樂譜。
將以上音符模型按時值由短到長,音高由低到高從零開始進行編號,形成一套完成的音符映射系統(tǒng),便于樂譜顯示模塊調用。將由頻率音高映射得出的樂譜數據進行大調轉換,然后按設計的音符映射體系進行映射,從音符集合中取出對應的音符表示,輸出至Android移動終端的屏幕上。
當樂譜繪制完成后,根據用戶設定的每拍的時長和每小節(jié)的拍數,進行自動小節(jié)劃分,添加小節(jié)線,并將連續(xù)相同的音符進行合并,按合并后的時長更新其音符表示,形成完整的樂譜,圖 1中的樂譜優(yōu)化模塊提供對生成的樂譜進行音符的增刪改操作,以提取最終輸出樂譜的正確性。
本文研究的主要內容是,基于Android平臺的聽曲繪譜的研究及其實現,主要包括以下內容。第一,選擇改進的平均幅度差函數法進行基音周期提取,可以在Android移動終端的計算能力之內,實時的進行準確音高判別。第二,對頻率到音高的映射關系進行了總結。第三,對音樂簡譜進行建模表示,并設計出一套適合于在Android系統(tǒng)上使用的簡譜表示系統(tǒng)。工作的不足之處在于,所設計的簡譜格式并不完備,僅考慮了樂音的音高和時值,未考慮音樂的節(jié)奏問題,并且只實現了只有一種樂音存在的自動繪譜,而針對多音音樂的自動繪譜問題仍有待研究。
[1]李重光.音樂理論基礎[M].人民音樂出版社,2006.
[2]高戈,李明,胡瑞敏.基音周期估計算法研究[J].聲學學報,2003(06)∶540-544.
[3]黃海亮等.一種高精度的基音提取方案[J].計算機工程,2004(S1)∶343-345+372.
[4]徐國慶等.樂音識別方法及應用[J].計算機應用,2005(04)∶968-970.
[5]成新民,曾毓敏,趙力.一種改進的AMDF求取語音基音的方法[J].微電子學與計算機,2005(11)∶ 164-166+169.
[6]翟景瞳,王玲,杜秀偉.改進的音高識別算法[J].計算機工程與應用,2009(20)∶228-230+242.
[7]夏殿松,胡淼,洪夏?。环N基于AMDF和ACF的基音周期提取算法研究[J].軍事通信技術, 2009(01)∶27-31.
[8]宋知用.MATLAB在語音信號分析與合成中的應用[M].北京航空航天大學出版社,2013.
[9]編曲資源,音高與頻率的對應關系,2016.
[10]董麗麗,鄧小峰.讀譜與樂理[M].武漢理工大學出版社,2007.