戴旭 沈金民 殳佳潔 林巧民



摘要:21世紀以來,隨著現代信息化技術的快速發展,使原本只能在現實中存在的樂器虛擬化,例如鋼琴等。隨著安卓軟件開發工具Android Studio的不斷完善,該文使用此開發軟件結合MediaPipe框架,使用Java語言設計開發一款虛擬鋼琴App,在實現鋼琴彈奏功能的基礎上添加了節拍器和音樂播放器功能,并利用MediaPipe框架實現手勢識別功能,從而實現人機交互,較大程度地在現實鋼琴的基礎上簡化彈奏難度增加簡便實用性功能從而增加大眾娛樂性。
關鍵詞:Android Studio;java;虛擬鋼琴;手勢識別;MediaPipe
中圖分類號:TP319? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)19-0003-03
1 引言
當今的虛擬化電子樂器軟件是較為受歡迎的一類軟件,而這其中,虛擬鋼琴更是比較熱門的一款[1]。該文選用手機端Android進行開發[2-3],相較于網頁版[4],雖編程復雜,但框架穩固,軟件運行流暢穩定,不受網絡延遲影響。
Android是基于Linux平臺的由Google公司開發的開源手機操作系統。包括操作系統、用戶界面和應用程序三個模塊[5],并且由Java語言編寫,繼承了Java跨平臺的特點。任何Android應用幾乎無須做任何處理就能運行于所有的Android設備[6-7],外加利用MediaPipe框架基于Wing loss檢測算法增加手勢識別功能[8],對App的開發具有創新性的研究。
2 開發工具Android Studio簡介
Android Studio是一個Android集成工具,基于IntelliJ IDEA。類似Eclipse ADT,提供了集成的用于開發和調試的Android開發工具。除此以外Android Studio還提供了其他更多的功能,例如:
1)靈活性非常高的基于Gradle的構建系統。
2)快速且功能豐富的仿真器。
3)一個統一的環境,可為所有Android設備進行開發。
4)將更改應用于代碼和資源更改推送到正在運行的應用,而無須重新啟動應用。
5)代碼模板和GitHub集成,可構建常見應用功能和導入示例代碼。
6)功能豐富的測試工具和框架。
7)用于捕獲性能、可用性、版本兼容性和其他問題的Lint工具。
8)內置對Google Cloud Platform的支持,可輕松集成Google Cloud Messaging和App Engine。
2.1 項目結構
Android Studio中的每個項目都包含一個或多個包含源代碼文件和資源文件的模塊。模塊類型主要包括三個方面:
1)安卓應用模塊。
2)庫模塊。
3)谷歌應用引擎。
默認情況下,Android Studio中項目文件會在Android項目視圖中被顯示,如圖1所示。此視圖可以根據模塊來完成快速訪問項目的關鍵源文件任務。
Gradle腳本下,所有構建文件在其頂層都可見,每個應用程序模塊都包含以下三個文件夾:
1)manifests:包含文件AndroidManifest.xml。
2)java:包含java源代碼文件,包括JUnit測試代碼。
3)res:包含所有非代碼資源,如XML布局、UI字符串和位圖圖像。
2.2 用戶界面
Android Studio主窗口由圖2中標識的幾個邏輯區域組成。
1)工具欄:可執行各種操作,包括運行應用和啟動Android工具。
2)導航欄:幫助項目導航并進行文件編輯。
3)編輯器窗口:創建和修改代碼。根據當前文件類型,編輯器可更改。
4)工具欄窗口:圍繞IDE窗口的外部運行,包含可允許展示或折疊各個工具窗口的按鈕。
5)工具窗口:可訪問特定任務,如項目管理、搜索、版本控制等。可展開或折疊。
6)狀態欄:顯示項目和IDE本身的狀態,以及任何警告或消息。
2.3 Gradle構建系統
Gradle是Android Studio中建立的一個基本架構,通常是默認使用。它的安卓外掛程序為 Android系統提供了更多的特性。該構建系統是以Android Studio功能表中的集成工具而運作,與指令行無關。即可利用構建系統的功能執行以下等操作:
1)自定義、配置和擴展構建流程。
2)為應用創建多個APK,使用相同的項目和模塊使用不同的功能。
3)跨源集重用代碼和資源。
Gradle具有非常高的靈活性,可以達到既不修改應用的核心源文件又實現所有構建目標的效果。在Android Studio中構建文件通常以build.gradle命名。至少包括project根目錄和module根目錄下兩個地方存在,其生命周期從初始化階段去判斷創建整個項目的層次結構,并且為每一個項目創建一個實例對象到配置階段生成整個構建的有向無環圖至執行階段讀取并按順序執行各個任務最終完成工程的構建。
3 App的開發與實現
3.1 界面設計
App設計秉著界面簡約美觀的原則,使用Android的碎片化Fragment和Activity作為視圖容器的承載體用于定義和管理布局,并且使用一系列控件用于布局設計,如圖3。引用自定義控件及可縮放矢量圖(Scalable Vector Graphics,SVG)使UI能夠自適應和適配諸多設備。
打開XML布局文件,顯示布局編輯器,根據Design和Blueprint查看布局渲染后預覽效果和視圖輪廓,并且使用TextView、ImageView或RecyclerView添加示例預覽數據,最終實現App的界面設計,如圖4。
3.2 框架構建
虛擬鋼琴應用App包含琴鍵和音樂播放器兩個主功能模塊,兩個功能模塊之間相互解耦且分工明確。其中琴鍵模塊中包含樂曲庫、節拍器和手勢識別功能,可點擊選擇樂曲庫中的曲目然后跳轉回琴鍵界面,界面播放所選擇的曲目并顯示其所對應簡譜。可打開節拍器,按照設定好的頻率給出節拍。使用手勢識別功能,會打開攝像機對手勢進行捕捉,根據七鍵鋼琴序號做出對應手勢即可實現隔空彈奏。音樂播放器模塊則根據本地數據庫存放的曲目實現音樂播放功能。整體框架流程圖如圖5所示。
1)琴鍵設計
按照點擊琴鍵播放預先存儲好的音頻的方法,將音頻文件存放到res下的raw文件中,外層線性布局設置為水平,在布局中添加Button控件,使用layout_weight屬性使得每個按鍵大小相等,用SoulPool()函數導入音頻資源,再給每個控件設置監聽與點擊事件。
2)節拍器、簡譜設計
采用預存音頻的方式將節拍器和樂曲庫功能放置琴鍵界面。節拍器是用MediaPlayer()函數導入音頻文件,為子菜單中的“節拍器”和“停止節拍”按鍵設置點擊事件,點擊“節拍器”選項后自動播放音頻,點擊“停止節拍”后停止播放。選擇樂曲后琴鍵界面會顯示對應簡譜,音頻簡譜是在外層布局添加兩個TextView控件來展示簡譜和歌曲名稱,通過為子菜單中的“歌曲”選項們添加點擊事件,在點擊相應“歌曲”選項后通過setText()函數來改變兩個控件text屬性的值。
3)播放器設計
最外層使用LinearLayout線性布局,創建控件并綁定,設置監聽器。在包中創建Activity,通過onClick方法控制著音樂的播放、暫停、繼續播放和退出功能,并且和MusicService進行綁定鏈接。在音樂播放時顯示歌曲總時長,歌曲當前播放時長,控制歌曲進度條的移動。創建Class用于顯示歌曲列表,新建layout文件夾,并創建list和item用于垂直布局和條目布局。在res文件夾下新建raw文件夾用于存放曲庫,并將封面背景圖片存放到drawable中。
3.3 手勢識別功能
手勢識別功能是App立足創新的一個功能。根據Wing loss的手部關鍵點檢測算法,利用級聯回歸方式以及轉換機制,通過級聯兩個卷積神經網絡,利用第一階段產生的形狀向平均形狀轉換得到轉換矩陣,進而將手部圖片進行轉換,第二階段減少手部姿態對關鍵點檢測的影響。為了能利用全手的特征信息,同時平衡誤差對關鍵點的影響提出了wing loss函數,兼顧大小誤差對手部關鍵點準確性的影響。給定一個圖像和網絡,可以預測手部關鍵點的損失函數為:
[losss],[s,=i=12Lf(si-s,i)],
其中s是手部關鍵點,函數f(x)就等價于:
. L1 loss
L1[x=x],
.L2 loss
L2[x=12x2],
.[SmoothL1X:]
[smoothL1x=12x2,? ifx<1x-12,? otherwise],
對于小誤差,表現為具有偏移量的對數函數,對于大誤差,則表現為L1。這樣的復合損失函數可以定義為:
[wingx=wln1+x/?,? ifxx-C,? otherwise],
利用MediaPipe框架并將其安裝到開發環境,初始化assets管理器用于MediaPipe應用資源,構建MediaPipe二進制圖并將資源復制到app/src/main/assets中,修改app/build.gradle以添加MediaPipe依賴項和MediaPipe AAR,在配置文件AndroidMainfest.xml中添加相機權限,通過加載獲取一個幀處理器,調用其API完成手21個關鍵點(如圖6)檢測并識別。
通過計算歐氏距離(三維空間兩點之間的距離)判斷手指是否彎曲來判斷手勢,最終實現手勢識別。通過判斷手指彎曲分別設定0~6數字的手勢對應琴鍵的1~7號鍵,手勢識別成功后會觸發對應的琴鍵,從而實現(如圖7)隔空彈奏。
3.4 運行測試
使用Android Profiler對虛擬鋼琴App進行一定時間的性能測試,得出的結果如圖8,測試結果包含琴鍵、節拍器、播放器,手勢識別四個模塊,從圖中可以看出CPU、內存和網絡在沒接收到命令前,基本處于空閑狀態,在接收到命令后或在模擬器剛啟動時會有小幅度的波動,符合預期。
4 結束語
本文利用安卓開發工具Android Studio,基于MediaPipe框架使用java語言開發了一款簡約的虛擬鋼琴App,在簡單的琴鍵功能實現的基礎上,增加的簡樸、節拍器功能,將原本需要一定技術基礎的鋼琴彈奏簡易化,實現了大眾化的娛樂。手勢識別功能的應用更是增加了App的趣味性。引用的自定義控件,優化了App的外觀框架,并且經過性能測試得出,App運行平穩,交互靈敏,達到了預期的實際目標,具有一定的實用價值。
參考文獻:
[1] 張瑋,王金露,陸小彪.基于用戶體驗的智能鋼琴APP界面再設計[J].北京印刷學院學報,2020,28(2):52-58.
[2] 華春夢.基于Android平臺的在線影院APP開發與設計[J].現代信息科技,2021,5(21):29-32.
[3] 熊艷秋.基于Android平臺在線視頻播放APP的設計與實現[D].荊州:長江大學,2020.
[4] 錢立.基于HTML5的Web Audio技術實現手機版簡易鋼琴[J].四川職業技術學院學報,2020,30(6):146-149.
[5] 趙亮,張維.基于Android技術的界面設計與研究[J].電腦知識與技術,2009,5(29):8183-8185.
[6] 崔娜.基于Android的移動終端應用程序開發與研究[J].電腦知識與技術,2016,12(29):38-39,41.
[7] 林辰瑋,池國煜.基于Android智設校園O2O微任務App的設計與實現[J].電子制作,2022,30(7):64-66,63.
[8] 孫洪恩.基于循環神經網絡模型的動態手勢識別系統的設計與實現[D].哈爾濱:哈爾濱工業大學,2021.
收稿日期:2022-03-11
基金項目:南京郵電大學通達學院2021年度“大學生科技創新訓練計劃(STITP)”省級立項項目(項目編號:202113989018Y)
作者簡介:戴旭(2001—),男,江蘇連云港人,學士,主要研究方向為軟件開發;沈金民(2000—),男,云南臨滄人,學士,主要研究方向為軟件開發;殳佳潔(2001—),男,江蘇南通人,學士,主要研究方向為軟件開發;林巧民(1980—),男,江蘇南京人,副教授,博士,主要研究方向為情感計算與情感教育、物聯網關鍵技術研究與應用。