蔣瑩
(中山大學(xué)新華學(xué)院,東莞 523133)
移動互聯(lián)網(wǎng)快速發(fā)展的今天,移動設(shè)備已成為人們生活中必不可少的生活用品之一。移動互聯(lián)徹底改變了我們的生活方式,越來越多的溝通和交流都可以通過移動平臺及時得到實現(xiàn),很多以前需要電腦或?qū)iT設(shè)備才能實現(xiàn)的操作都可以通過移動平臺方便地進(jìn)行,手機(jī)語音識別技術(shù)也受到越來越多的關(guān)注[1]。錄音,作為移動系統(tǒng)中一項重要的功能,Android平臺也好iOS平臺也好,都有自帶的錄音程序,這些錄音程序都能滿足最基本的錄音操作。但是當(dāng)進(jìn)行較長時間的音頻錄制且音頻是分段錄制的時候,這些系統(tǒng)自帶的錄音軟件,往往無法滿足要求。例如:如果想在錄音過程中任意時刻添加書簽或筆記,這樣在進(jìn)行錄音回放和整理的時候就會明確知道從哪里開始回放,不至于頻繁倒退而浪費(fèi)時間。這樣的功能,目前系統(tǒng)自帶的錄音軟件是無法滿足的。
本文基于以上分析,考慮Android平臺的開放性和易用性[2],在原有錄音技術(shù)的基礎(chǔ)上,增加書簽功能,系統(tǒng)在每次暫停錄制時,可以增加錄音標(biāo)簽信息的界面寫下文字說明,方便用戶了解當(dāng)前子音頻的主要內(nèi)容。在全部子音頻信息錄制完畢后,可以將所有子音頻合并成一個完整的音頻。
系統(tǒng)共包括5大模塊:開始錄音、暫停錄音、繼續(xù)錄音、全部播放以及停止錄音模塊,這5大模塊簡單說明如下:
(1)開始錄音:在進(jìn)入系統(tǒng)后點擊“開始錄音”按鈕,開始第一段音頻的錄制;(2)暫停錄音:在系統(tǒng)錄音過程中,隨時可按下“暫停錄音”按鈕。點擊“暫停錄音”按鈕,彈出需要添加書簽的界面,添加完書簽信息后點擊確定,可回到錄音界面,且剛剛錄制的音頻已添加到錄音界面的錄音列表中;(3)繼續(xù)錄音:在暫停錄音添加完書簽信息后,點擊“繼續(xù)錄音”可以接著錄制音頻;(4)全部播放:在錄音界面下,點擊“全部播放”按鈕,可以播放從最開始錄制的每一段音頻信息;(5)停止錄音:該按鈕按下之后,會將每一段錄制的音頻文件整合成一整段完整的音頻保存起來。
在每段音頻列表中,都有播放和刪除按鈕,點擊播放則可以播放當(dāng)段音頻,點擊刪除,則可以將其刪除。以上模塊的功能流程如圖1所示。
圖1 系統(tǒng)功能流程圖
根據(jù)需求分析,得出系統(tǒng)界面原型設(shè)計圖。系統(tǒng)界面原型設(shè)計圖如圖2所示。進(jìn)入系統(tǒng)后,最上面是系統(tǒng)狀態(tài)提示區(qū),主要用于指示當(dāng)前系統(tǒng)所處狀態(tài);接著是主要按鈕區(qū),包含“開始錄音”、“暫停播放”、“繼續(xù)播放”、“全部播放”以及“停止錄音”按鈕。將這5個主要按鈕放置在一個LinearLayout布局下。初始狀態(tài)下只有“開始錄音”按鈕可以用,隨著系統(tǒng)狀態(tài)不同,各個按鈕的可用狀態(tài)也不同。按鈕的可用狀態(tài)為黑色,不可用狀態(tài)為灰色;最下面是子音頻區(qū),每暫停錄音一次,生成一個子音頻文件。子音頻文件暫時保存在ListView中,每個子音頻都能進(jìn)行獨立播放和刪除操作。點擊停止錄音則會將ListView中的所有子音頻文件整合為一個音頻文件。
圖2 系統(tǒng)界面原型
系統(tǒng)初始化界面后,對界面中各個按鈕進(jìn)行監(jiān)聽。采用MediaRecorder錄音類進(jìn)行音頻錄制,采用MediaPlayer播放類播放錄音。將每次暫停錄音得到的子錄音音頻文件暫時保存在SD卡根目錄下。系統(tǒng)主要設(shè)置了4個類,分別為MainActivity類、MyDetailsDialog類、MyAdapter類和MergeAMR類。MainActivity類主要是對系統(tǒng)主界面的控制,程序從這個類開始;MyAdapter類是用于處理ListView的適配器;MyDetailsDialog類則用于暫停錄音時的添加標(biāo)簽功能;MergeAMR類主要處理ListView中子音頻文件,將其合成為一個音頻文件。系統(tǒng)的關(guān)鍵抽象如圖3所示。
圖3 關(guān)鍵抽象
本錄音系統(tǒng)采用release版本的Android開發(fā)環(huán)境“adt-bundle-windows-x86_64-20140702”,以及 Redmi4真機(jī)進(jìn)行調(diào)試,MIUI版本為9.2。
系統(tǒng)調(diào)試界面如下圖所示,圖4是初始時進(jìn)入系統(tǒng)的界面,此時只有“開始錄音”按鈕可以用。當(dāng)點擊“開始錄音”按鈕后,系統(tǒng)進(jìn)入錄音狀態(tài),錄音狀態(tài)界面如圖5所示。點擊“暫停錄音”按鈕則彈出輸入標(biāo)簽信息的界面,添加標(biāo)簽界面如圖6所示。圖7展示已經(jīng)添加了兩個子音頻的錄音列表。
系統(tǒng)實現(xiàn)過程中,主要有2個關(guān)鍵難點,分別是ListView列表的監(jiān)控和子音頻文件的合成。現(xiàn)分別就這2個方面的具體實現(xiàn)進(jìn)行闡述。
(1)ListView列表的按鈕監(jiān)控
在類MyAdapter中定一個CallBack接口,該接口用于回調(diào)按鈕點擊事件到MainActivity類,MainActivity類中實現(xiàn)CallBack接口的click()方法,當(dāng)ListView中有按鈕按下時,系統(tǒng)調(diào)用click()方法,實現(xiàn)子音頻播放和刪除。
定義的接口CallBack的代碼實現(xiàn)如下,接口中只有一個click方法:
設(shè)置監(jiān)聽代碼如下,其中holder為每個ListView子Item對應(yīng)的子類,該類在MyAdapter中定義。
當(dāng)有ListView中有按鈕按下時,在onclick()方法里調(diào)用click()方法。
MainActivity類中click()方法代碼如下。
(2)子音頻的合成
由于音頻在錄制的時候采用的是AMR-NB格式,而AMR文件前6個字節(jié)為文件頭,要進(jìn)行子音頻文件的拼接,只需要在拼接過程中去掉除第一段音頻以外所有音頻的前6個字節(jié)即可。新建文件fileMerge.amr作為拼接后的文件,以文件流的形式依次讀入已有amr文件,代碼片斷如下:
其中out是文件輸出流,b是字節(jié)數(shù)組,inpu_i是第i個已存在的音頻文件。從圖8中可以看出,保存的文件fileMerge.amr大小是其他子音頻文件之和。
圖4 初始界面
圖5 錄音狀態(tài)
圖6 添加標(biāo)簽
圖7 已添加兩個子音頻列表
圖8 系統(tǒng)內(nèi)存中 保存的音頻文件
整個系統(tǒng)按照如下的順序,在完成模塊代碼進(jìn)行對應(yīng)性能測試:首先在完成錄音與播放代碼實現(xiàn)后,反復(fù)對錄音以及播放功能測試,以完成正常錄音功能;其次,實現(xiàn)每暫停錄音一次則保存錄音的子音頻文件在ListView中的代碼,對列表中的子音頻文件進(jìn)行播放和刪除,確保每段音頻能正常播放或刪除;第三為每次子音頻設(shè)置標(biāo)簽代碼實現(xiàn)后,測試添加的標(biāo)簽?zāi)苷o@示;最后完成所有子音頻的合并的代碼后,反復(fù)測試停止錄音功能并播放合成后的音頻文件,以確保錄音能正常合成并且合并后的音頻能夠正常播放。經(jīng)過調(diào)試運(yùn)行,系統(tǒng)完成了“開始錄音”、“暫停錄音”、“添加標(biāo)簽”、“繼續(xù)錄音”、“播放全部錄音”和“停止錄音”等基本功能。并且Android工程導(dǎo)出的apk安裝包能在Android 6.0.1以下版本的真機(jī)中正常運(yùn)行。
Android平臺下的時間戳錄音系統(tǒng)的設(shè)計與實現(xiàn),通過增加書簽功能使在進(jìn)行長時間錄音時,對錄音進(jìn)行分段,以便更好地對音頻進(jìn)行更加精準(zhǔn)的操作,彌補(bǔ)了當(dāng)前移動系統(tǒng)自帶錄音軟件的不足。系統(tǒng)還存在一些可以改進(jìn)的地方,首先本系統(tǒng)是僅僅實現(xiàn)了基本功能,并且系統(tǒng)實現(xiàn)的界面不夠美觀;其次在于音頻文件存放在SD卡根目錄下占用系統(tǒng)內(nèi)存,這些都有待進(jìn)一步完善。最后,為系統(tǒng)設(shè)計不同主題、云存儲讀寫錄音文件[3]等功能,可以提高系統(tǒng)的實際應(yīng)用價值。