蒋莹
(中山大学新华学院,东莞 523133)
移动互联网快速发展的今天,移动设备已成为人们生活中必不可少的生活用品之一。移动互联彻底改变了我们的生活方式,越来越多的沟通和交流都可以通过移动平台及时得到实现,很多以前需要电脑或专门设备才能实现的操作都可以通过移动平台方便地进行,手机语音识别技术也受到越来越多的关注[1]。录音,作为移动系统中一项重要的功能,Android平台也好iOS平台也好,都有自带的录音程序,这些录音程序都能满足最基本的录音操作。但是当进行较长时间的音频录制且音频是分段录制的时候,这些系统自带的录音软件,往往无法满足要求。例如:如果想在录音过程中任意时刻添加书签或笔记,这样在进行录音回放和整理的时候就会明确知道从哪里开始回放,不至于频繁倒退而浪费时间。这样的功能,目前系统自带的录音软件是无法满足的。
本文基于以上分析,考虑Android平台的开放性和易用性[2],在原有录音技术的基础上,增加书签功能,系统在每次暂停录制时,可以增加录音标签信息的界面写下文字说明,方便用户了解当前子音频的主要内容。在全部子音频信息录制完毕后,可以将所有子音频合并成一个完整的音频。
系统共包括5大模块:开始录音、暂停录音、继续录音、全部播放以及停止录音模块,这5大模块简单说明如下:
(1)开始录音:在进入系统后点击“开始录音”按钮,开始第一段音频的录制;(2)暂停录音:在系统录音过程中,随时可按下“暂停录音”按钮。点击“暂停录音”按钮,弹出需要添加书签的界面,添加完书签信息后点击确定,可回到录音界面,且刚刚录制的音频已添加到录音界面的录音列表中;(3)继续录音:在暂停录音添加完书签信息后,点击“继续录音”可以接着录制音频;(4)全部播放:在录音界面下,点击“全部播放”按钮,可以播放从最开始录制的每一段音频信息;(5)停止录音:该按钮按下之后,会将每一段录制的音频文件整合成一整段完整的音频保存起来。
在每段音频列表中,都有播放和删除按钮,点击播放则可以播放当段音频,点击删除,则可以将其删除。以上模块的功能流程如图1所示。
图1 系统功能流程图
根据需求分析,得出系统界面原型设计图。系统界面原型设计图如图2所示。进入系统后,最上面是系统状态提示区,主要用于指示当前系统所处状态;接着是主要按钮区,包含“开始录音”、“暂停播放”、“继续播放”、“全部播放”以及“停止录音”按钮。将这5个主要按钮放置在一个LinearLayout布局下。初始状态下只有“开始录音”按钮可以用,随着系统状态不同,各个按钮的可用状态也不同。按钮的可用状态为黑色,不可用状态为灰色;最下面是子音频区,每暂停录音一次,生成一个子音频文件。子音频文件暂时保存在ListView中,每个子音频都能进行独立播放和删除操作。点击停止录音则会将ListView中的所有子音频文件整合为一个音频文件。
图2 系统界面原型
系统初始化界面后,对界面中各个按钮进行监听。采用MediaRecorder录音类进行音频录制,采用MediaPlayer播放类播放录音。将每次暂停录音得到的子录音音频文件暂时保存在SD卡根目录下。系统主要设置了4个类,分别为MainActivity类、MyDetailsDialog类、MyAdapter类和MergeAMR类。MainActivity类主要是对系统主界面的控制,程序从这个类开始;MyAdapter类是用于处理ListView的适配器;MyDetailsDialog类则用于暂停录音时的添加标签功能;MergeAMR类主要处理ListView中子音频文件,将其合成为一个音频文件。系统的关键抽象如图3所示。
图3 关键抽象
本录音系统采用release版本的Android开发环境“adt-bundle-windows-x86_64-20140702”,以及 Redmi4真机进行调试,MIUI版本为9.2。
系统调试界面如下图所示,图4是初始时进入系统的界面,此时只有“开始录音”按钮可以用。当点击“开始录音”按钮后,系统进入录音状态,录音状态界面如图5所示。点击“暂停录音”按钮则弹出输入标签信息的界面,添加标签界面如图6所示。图7展示已经添加了两个子音频的录音列表。
系统实现过程中,主要有2个关键难点,分别是ListView列表的监控和子音频文件的合成。现分别就这2个方面的具体实现进行阐述。
(1)ListView列表的按钮监控
在类MyAdapter中定一个CallBack接口,该接口用于回调按钮点击事件到MainActivity类,MainActivity类中实现CallBack接口的click()方法,当ListView中有按钮按下时,系统调用click()方法,实现子音频播放和删除。
定义的接口CallBack的代码实现如下,接口中只有一个click方法:
设置监听代码如下,其中holder为每个ListView子Item对应的子类,该类在MyAdapter中定义。
当有ListView中有按钮按下时,在onclick()方法里调用click()方法。
MainActivity类中click()方法代码如下。
(2)子音频的合成
由于音频在录制的时候采用的是AMR-NB格式,而AMR文件前6个字节为文件头,要进行子音频文件的拼接,只需要在拼接过程中去掉除第一段音频以外所有音频的前6个字节即可。新建文件fileMerge.amr作为拼接后的文件,以文件流的形式依次读入已有amr文件,代码片断如下:
其中out是文件输出流,b是字节数组,inpu_i是第i个已存在的音频文件。从图8中可以看出,保存的文件fileMerge.amr大小是其他子音频文件之和。
图4 初始界面
图5 录音状态
图6 添加标签
图7 已添加两个子音频列表
图8 系统内存中 保存的音频文件
整个系统按照如下的顺序,在完成模块代码进行对应性能测试:首先在完成录音与播放代码实现后,反复对录音以及播放功能测试,以完成正常录音功能;其次,实现每暂停录音一次则保存录音的子音频文件在ListView中的代码,对列表中的子音频文件进行播放和删除,确保每段音频能正常播放或删除;第三为每次子音频设置标签代码实现后,测试添加的标签能正常显示;最后完成所有子音频的合并的代码后,反复测试停止录音功能并播放合成后的音频文件,以确保录音能正常合成并且合并后的音频能够正常播放。经过调试运行,系统完成了“开始录音”、“暂停录音”、“添加标签”、“继续录音”、“播放全部录音”和“停止录音”等基本功能。并且Android工程导出的apk安装包能在Android 6.0.1以下版本的真机中正常运行。
Android平台下的时间戳录音系统的设计与实现,通过增加书签功能使在进行长时间录音时,对录音进行分段,以便更好地对音频进行更加精准的操作,弥补了当前移动系统自带录音软件的不足。系统还存在一些可以改进的地方,首先本系统是仅仅实现了基本功能,并且系统实现的界面不够美观;其次在于音频文件存放在SD卡根目录下占用系统内存,这些都有待进一步完善。最后,为系统设计不同主题、云存储读写录音文件[3]等功能,可以提高系统的实际应用价值。