戴旭 沈金民 殳佳洁 林巧民
摘要: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—),男,江苏南京人,副教授,博士,主要研究方向为情感计算与情感教育、物联网关键技术研究与应用。