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