基于android平台的语音机器人服务娱乐系统
分?類 號:TP311
學校代碼:11460
學 號:10130920
本科生畢業論文
基于android平臺的語音機器人服務娛樂系統
Robot Entertainment Service System Based on Android Platform
所在系(院):
學?生:
指?導?教?師:
研究起止日期:
學位論文獨創性聲明
本人鄭重聲明:
1. 堅持以“求實、創新”的科學精神從事論文寫作工作。
2. 本論文是我個人在導師指導下進行的研究工作和取得的研究成果。
3. 本論文中除引文外,所有實驗數據和有關材料均是自己研究完成。
4. 本論文中除引文和致謝的內容外,本論文沒有抄襲,剽竊他人已經發表的研究成果。
5. 其他同學和導師對本文研究所做的貢獻均已在論文中作了聲明并表示了謝意。
作者簽名:劉倩
2013年 4 月 15 日
摘 要
隨著科學技術的發展,人們已不再滿足當前人機交換信息的方式,而希望能用自然語言直接進行信息傳遞,以便大大的提高人的工作效率,語音識別是建立計算機聽覺系統的基礎,而目前,很大一部分應用都是基于移動互聯網技術,也是目前幾年國家一直推崇發展的,而近幾年移動平臺上有關語音識別的應用非?;鸨?#xff0c;國內有像挖財和UC瀏覽器等推出的語音輸入和控制功能,在助手類應用中,語音識別更是作為一種必不可少的主流技術,比如現在主流的GPS語音導航系統,基于Android平臺的語音播報器等,不僅能增強較完美的用戶體驗,還能給客戶增加不少趣味性,但是目前基于安卓移動平臺的機器人大多數都以文字輸入形式和機器人進行溝通聊天,內容形式比較單一,缺乏趣味性,現在流行的simsimi小黃雞中文版是一款運行在Android平臺上的安卓手機聊天機器人,雖然擁有龐大的數據庫,但是不支持語音聊天,不智能化,因為語音識別是近幾年手機開發的主流,所以我想能夠開發一款基于Android平臺的語音機器人娛樂系統,能夠語音和我們的機器人進行聊天,還可以通過語音進行天氣的查詢,它一樣擁有龐大的數據庫,而且會越來越智能,越聰明。
關鍵詞:android;java;語音功能;智能;開源系統;數據庫;
Abstract
With the development of science and technology, people are no longer satisfied with the current human ways to exchange information, hope can directlycommunicate with natural language, so as to greatly improve people's working efficiency, speech recognition is the foundation, establishing computer auditory system at present, a large part of the application is based on mobile Internettechnology, is currently a few the state has always promoted development, in recent years, the mobile platform application on speech recognition is very hot,there are like the speech input and control function to dig property and a UC browser launched, in a helper class applications, speech recognition is anecessary mainstream technology, such as the current mainstream GPS voice navigation system based on the Android platform, voice broadcast device, can not only enhance the perfect user experience, can increase the number ofinterest to the customer, but the Android mobile platform robot most on text input form and robot communication based on content, form is single, lack of interest,Chinese version of simsimi chicken is popular now a run on the Android platformAndroid mobile phone chat robot, though With a large database, but does not support the voice chat, not intelligence, because speech recognition is the mainstream of the mobile phone development in recent years, so I want to be able to develop a speech robot entertainment system based on Android platform,capable of speech and our robot to chat, also can be the weather by voicequery, it has the same the large database, and will be more and more intelligent,more clever.
Key Words:?Android;java; SQLite database; SQLite database; open source system; smart; Voice function;
目錄
目錄66
1 緒 論11
1.1 研究背景及現狀11
1.2語音識別基本原理11語音識別基本原理1
1.3科大訊飛介紹22科大訊飛介紹2
2語音機器人服務娛樂系統的研究分析33
2.1市場可行性33
2.2研究目的44
2.3 Android介紹44
2.3.1 Android平臺架構44
2.3.2 Android應用程序構成77
2.4 Eclipse簡介88
2.4.1 Eclipse的優點88
3語音機器人服務娛樂系統的需求分析99
3.1 功能需求99
3.2 需求分析99
4語音識別應用系統的設計及相關技術1010
4.1 功能框架1010
4.2 系統實現流程圖1212
4.3 用戶界面設計1313
4.4 數據存儲設計1313
4.5 系統關鍵技術設計1818
4.5.1 Android用戶界面設計問題1818
4.5.2 主界面按鈕選擇問題2020
5語音機器人服務娛樂應用系統的功能的具體實現2525
5.1 用戶登錄界面的具體實現2525
5.2 語音聊天功能的實現2828
5.2.1 語音記事本主界面的實現2828
5.3 天氣預報功能的實現3232
5.3.1 天氣功能的實現3232
5.4 系統設計難點4040
總 結4242
參考文獻4343
致 謝4444
1 緒 論
1.1 研究背景及現狀
早在計算機發明之前,自動語音識別的設想就已經被提上了議事日程,早期的聲碼器可被視作語音識別及合成的雛形。而1920年代生產的"Radio Rex"玩具狗可能是最早的語音識別器,當這只狗的名字被呼喚的時候,它能夠從底座上彈出來,這就是第一代語音機器人的誕生。
隨著現代技術的發展,人們對移動終端的依賴性和期望是越來越大。短信發送,語音通訊,手機小游戲等都已經無法滿足人們對移動終端的需求,這些移動終端也開始失去了市場。人們現在都想要各種機器能聽懂人類的語言,并且能做到人說什么,機器就會按照人說的話,去執行命令,從而實現人機的語言交流。隨著計算機科技的發展,人們的這一想法終于可以實現,這是由于語音識別技術的出現,使得機器通過識別和理解,然后把人的語音信號轉變成機器相對應的命令。語音識別技術的應用已經成為當今社會上具有競爭價值的新興高科技加高技術的產業。它在人機交互中占的比列將會越來越大。所以本課題的研究也正是致力于開發出一款基于android手機平臺的語音娛樂服務機器人,除了可以正常的和用戶進行語音交流外,還可以實現一些用戶生活上的幫助功能,來滿足用戶的使用和需求,比如查詢天氣等。
1.2語音識別基本原理
語音識別過程與人對語音識別處理的過程基本上是一致的。它實際上是一種模式識別系統,和常規的模式系統一樣,有特征提取、模式匹配、參考模式庫等三個基本單元。
語音識別系統的基本結構如圖1-1所示。它分為三個步驟:
(1) 前端處理:從語音信號中提取有效的特征參數來代表語音特征,具有很好的區分性。
(2) 聲學模型與模式匹配:聲學模型通常將獲取的語音特征通過學習算法產生,在識別時將輸入的語音特征與聲學模型進行匹配與比較,得到最佳的識別結果。[5]
(3) 語言處理: 語言處理可以進行語法、語義分析,通過最好有高效的算法,保證語音識別的實現。
圖1-1語音識別的原理框圖
Android手機上實現語音識別的原理:android手機先將用戶語音輸入的信號,送至科大訊飛的云端,借助于云端技術可以識別用戶的語音輸入,云端搜索完畢后,將返回打印數據。
1.3科大訊飛介紹
科大訊飛作為中國最大的智能語音技術提供商,在智能語音技術領域有著長期的研究積累,并在中文語音合成、語音識別、口語評測等多項技術上擁有國際領先的成果?;趽碛凶灾髦R產權的世界領先智能語音技術,科大訊飛已推出從大型電信級應用到小型嵌入式應用,從電信、金融等行業到企業和家庭用戶,從PC到手機到MP3/MP4/PMP和玩具,能夠滿足不同應用環境的多種產品。科大訊飛占有中文語音技術市場70%以上市場份額,語音合成產品市場份額達到70%以上,在電信、金融、電力、社保等主流行業的份額更達80%以上,開發伙伴超過10000家,以訊飛為核心的中文語音產業鏈已初具規模。
要實現語音機器人的對話功能,必須要用到一下兩種技術
語音合成技術
語音合成和語音識別技術是實現人機語音通信,建立一個有聽和講能力的口語系統所必需的兩項關鍵技術。使電腦具有類似于人一樣的說話能力,是當今時代信息產業的重要競爭市場。和語音識別相比,語音合成的技術相對說來要成熟一些,并已開始向產業化方向成功邁進,大規模應用指日可待。
語音識別技術
自動語音識別技術(Auto Speech Recognize,簡稱ASR)所要解決的問題是讓計算機能夠“聽懂”人類的語音,將語音中包含的文字信息“提取”出來。ASR技術在“能聽會說”的智能計算機系統中扮演著重要角色,相當于給計算機系統安裝上“耳朵”,使其具備“能聽”的功能,進而實現信息時代利用“語音”這一最自然、最便捷的手段進行人機通信和交互。
2語音機器人服務娛樂系統的研究分析
本文系統設計采用的開發環境為Windows下的Google Android開發平臺。
所需軟件如下:
2.1市場可行性
隨著現今科技技術的發展,3G技術的發展帶來了3G手機的到來,基于Android操作系統的手機市場逐步發展壯大,愈來愈多的人開始選擇谷歌的Android手機,因此這個市場的商業價值很高,所以我們選擇了開發基于Android平臺的語音識別應用系統。由于科學技術的不斷發展,讓各種機器能聽懂人類的語言并能按人的命令來行動,從而實現了人類與機器的語言交流。而Android自帶的語音功能卻很少被開發和應用,沒能給人們帶來快捷和便利,正因為如此,我決定開發此語音機器人服務娛樂系統,不僅可以和機器人進行簡單的聊天交流,同時還可以通過語音來查詢天氣,并且加入動畫增加趣味性,因此我希望我的研發不僅可以成為人們生活的好伙伴,還可以作為兒童們的玩具,而目前正缺少這種帶有趣味性,類似湯姆貓,功能也比較多的機器人服務娛樂系統了,它會讓你覺得有一個真正的伙伴站你的面前,和你輕松交談,所以從市場角度來看,十分有必要開發基于Android的機器人服務娛樂系統。
2.2研究目的
隨著一批又一批的移動應用不斷發布的今天,開發一個具有對話功能的語音機器人服務娛樂系統,會受到大部分小朋友,學生以及年輕上班族的青睞,并且該系統必須具備操作簡單,功能俱全,可擴展性好,娛樂性豐富,不單一等特點,現在市場已經有類似的語音機器人,如湯姆貓等,但玩法大多比較單一,對話簡單,而這款具有對話功能的語音機器人服務娛樂系統,玩法多樣化,能真正的實現智能語音對話的功能,讓它成為你工作,娛樂,生活中的好伙伴另外。
通過此次設計,能夠掌握android軟件開發,掌握控件、數據庫SQLite和多線程編程技術。 能夠在實踐中了解語音識別技術,掌握android語音播報天氣等功能,因為語音機器人可不斷的完善的功能很多,所以可以涉及到很多android的應用功能,所以希望自己在程序開發的過程中,不斷的總結錯誤,提高自己的實踐能力。
2.3 Android介紹
Android是一種基于Linux的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由Google公司和開放手機聯盟領導及開發。尚未有統一中文名稱,中國大陸地區較多人使用“安卓”或“安致”。
2.3.1 Android平臺架構
圖2-1 Android的架構流程圖
該層主要有移動終端常常自帶的一些手機軟件,如:email客戶端,SMS 短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。這些應用主要的開發語言是JAVA語言。因此使得熟悉JAVA開發的開發者,能很快的過渡到android系統軟件的開發中。開發者開發的軟件也是應用在該層上面。
開發人員通過API框架來了解核心應用技術。任何應用程序可以通過發布它的功能塊同時任何其它的應用程序都能夠使用其所發布的功能塊(不過得遵循框架的安全性限制)。同樣,任何應用程序重用機制都可以使用戶方便的替換程序組件。
隱藏在每個應用程序后面的是一系列的服務系統, 其中包括:
視圖(Views)——可以用來創建應用程序,它包括:列表(lists),文本框(text boxes),按鈕(buttons),網格(grids)。
內容提供器(Content Providers)——它使應用程序能夠訪問另一個應用程序的數據,或者分享他們已有的資源。
資源管理器(Resource Manager)——提供了訪問資源并且非代碼的形式,例如圖形,字符串,和一些布局文件(layout files)。
活動管理器(Activity Manager)——專門管理一些程序的生命周期同時提供了常用的導航返回功能。
通知管理器 (Notification Manager)——它讓應用程序在顯示框中可以顯示出自己定義的一些提示信息。
Android 包含了C/C++庫,這些程序庫能被Android的系統不同的組件使用。這些組件可以通過Android的程序框架來為開發者提供已設置的服務。以下是已有的核心庫:
系統C庫——一個繼承了BSD而來的標準 C系統的函數庫(libc),這是專門為基于嵌入式linux的設備而定制的。
媒體庫——該庫支持了多種最常用的關于音頻、視頻的回放和錄制,同時還支持靜態的圖像文件。編碼格式包括MP3、JPG、AAC、PNG、AMR。
Surface Manager——它是專門管理顯示的子系統,而且應用程序還可以將2D和3D的圖層的融合起來。
SGL——底層2D的圖形驅動引擎。
3D libraries——圖形庫,該庫使用了3D的硬件和軟件加速。
FreeType——位圖和矢量,顯示字體。
SQLite——任何開發程序都能使用,功能非常好的輕型數據庫。
Android中有自己的核心庫,此核心庫給予了大多數JAVA編程中的核心庫擁有語言功能。所有Android開發程序都是自己在進程中各自運行,它們都有自己的虛擬機實例。JAVA虛擬機被專門設計成專有設備,它能夠運行多個虛擬系統。
Android包含一個c/c++的集合,當開發者使用android應用程序架構時,android系統會通過這些集合來支持對開發者使用的各個組件,下面是一些庫:
- Surface Manager
管理多個程序執行時候的相互存取和顯示,同時也負責對2D與3D的繪圖進行合成顯示。 - Media Framework
中文是多媒體庫,支持多種常用的視頻,音頻格式的播放和錄制,比如:MPEG4、MP3、H.264、AAC、ARM等。 - SQLite
這是相對于Oracle、mysql、sqlserver等一些數據庫還小的小型數據庫,它是關系型數據引擎。 - OpenGL|ES
是根據OpenGL ES API的標準實現的3D繪圖函數庫。 - FreeType
提供矢量和位圖。 - WebKit
Web瀏覽引擎。
每個android應用程序都是采用Java語言編寫的而且,它都運行在Dalvik虛擬機上,而Dalvik虛擬機只執行“.dex”的文件,Java程序通過編譯時,還需要通過android的SDK中的“dx”工具將其轉化為“.dex”的后綴文件,才能正常的運行。
Android的核心系統的服務依是基于 Linux的內核,如安全性,內存管理,進程管理,網絡的協議棧和驅動模型。
2.3.2 Android應用程序構成
對一個Android應用程序而言,一般是由下面4大組件構造而成:
- Activity(活動)
- Broadcast Receiver(廣播接收器)
- Service(服務)
- Content Provider(內容提供器)
應用程序的每個界面都將是Activity類的擴展。Acitvities用視圖(View)構成GUI來顯示信息、響應用戶操作。就桌面開發而言,一個活動(Activity)相當于一個窗體(Form)。
應用程序消息傳遞框架,它是各個組件之間的橋梁,它可以在給特定的服務傳播消息來執行你的意圖。
Service組件在后臺運行,更新你的數據源和可見的Activities,觸發通知(Notification)。在應用程序的Activities不激活或不可見時,用于執行依然需要繼續的長期處理。
Content Providers用于管理和共享應用程序數據庫。是跨應用程序邊界數據共享的優先方式。
2.4 Eclipse簡介
Eclipse是一種可擴展的開放源代碼IDE。2001年11月,IBM公司捐出價值4,000萬美元的源代碼組建了Eclipse聯盟,并由該聯盟負責這種工具的后續開發。集成開發環境(IDE)經常將其應用范圍限定在“開發、構建和調試”的周期之中。為了幫助集成開發環境(IDE)克服目前的局限性,業界廠商合作創建了Eclipse平臺。Eclipse允許在同一IDE中集成來自不同供應商的工具,并實現了工具之間的互操作性,從而顯著改變了項目工作流程,使開發者可以專注在實際的嵌入式目標上。
Eclipse框架的這種靈活性來源于其擴展點。它們是在XML中定義的已知接口,并充當插件的耦合點。擴展點的范圍包括從用在常規表述過濾器中的簡單字符串,到一個Java類的描述。任何Eclipse插件定義的擴展點都能夠被其它插件使用,反之,任何Eclipse插件也可以遵從其它插件定義的擴展點。除了解由擴展點定義的接口外,插件不知道它們通過擴展點提供的服務將如何被使用。
2.4.1 Eclipse的優點
Eclipse的最大特點是它能接受由Java開發者自己編寫的開放源代碼插件,這類似于微軟公司的Visual Studio和Sun 微系統公司的NetBeans平臺。Eclipse為工具開發商提供了更好的靈活性,使他們能更好地控制自己的軟件技術。Eclipse 聯盟已經宣布將在2004年中期發布其3.0版軟件。這是一款非常受歡迎的java開發工具,這國內的用戶越來越多,實際上實用它java開發人員是最多的。缺點就是較復雜,對初學者來說,理解起來比較困難。
3語音機器人服務娛樂系統的需求分析
3.1 功能需求
基于android平臺的語音機器人服務娛樂系統,是通過語音與手機交換講話娛樂的系統,通過系統能夠輸入對話的信息并語音閱讀出來,實現了通過手機象對語音機器人一樣講話服務娛樂的功能。以下是語音識別應用系統具備的功能:
3.2 需求分析
在軟件設計之前,我們需要做的就是在市場針對這一類型的軟件進行調查,看是否能夠滿足于大部分人生活的需要,我們要做的工作就是對語音識別應用系統實現的流程、操作等做出詳細的調查,從而了解系統需要實現的功能。系統在開發的過程中,經過了較長時間的設計階段,需要不斷的優化和完善,
4語音識別應用系統的設計及相關技術
4.1 功能框架
本系統旨在建立Android手機,主要有如下幾個核心功能模塊,如圖4-1所示:
Android語音控制系統
圖4.1 系統功能框架
功能選擇
語音記事本
控制電燈
添加
刪除
通過按鈕控制電燈開關
通過語音控制電燈開關
添加標題
添加的內容存儲到數據庫中
刪除對應在數據庫的內容
圖4-1 軟件功能模塊流程圖
各個模塊具體功能如下:
語音記事本:
點擊menu后點擊添加進入新的記事本,輸入標題和添加記錄內容,點擊確定BUTTON,保存到數據庫中
點擊menu后,點擊刪除按鈕,即可刪除記錄
控制電燈:
通過開/關Button,來控制燈的開關
通過按下語音Button,當說開燈/關燈時來控制燈的開/關
4.2 系統實現流程圖
啟動模擬器后,首先進入的是登錄界面,輸入用戶名和密碼后,進入主界面,然后通過兩個下面的Button來選擇功能界面,并且進行不同的操作,整個流程如圖4-2所示:
開始
主界面
功能選擇
功能選擇
返回
返回
yes
no
說笑話
退出
查詢地理位置
系統幫助
圖4-2系統實現流程圖
4.3 用戶界面設計
用戶登錄界面是系統運行之后進入的第一個顯示界面,用來完成用戶的用戶名和密碼登錄,確認以后進入主界面。
一進入主界面通過按發音按鈕,可以和語音機器人進行簡單的語音聊天,可以通過發出“北京”等,查詢各個城市的天氣,并且由語音機器人進行語音播報
通過一個BUTTON按鈕,散開式樣的風格進行不同的功能選擇。
說笑話,可以讓機器人語音說笑話
查詢地址位置,當選擇進入語音記事本后,將進入地理位置功能,將定位你目前的地理位置,自動播報你當前的所在位置。
系統幫助界面,可以顯示機器人服務娛樂系統的玩法。
退出,退出系統
4.4 數據存儲設計
數據存儲方式??煞譃?#xff1a;SharePreference、SQLite、Content Provider和File。作為一個完整的應用程序,數據存儲操作是不能缺少的。因此,Android系統一共提供了四種數據存儲方式。
SQLite: SQLite是一個擁有強大功能的輕量級數據庫,支持基本SQL語法,是常被使用的一種數據存儲方式。Android為此數據庫提供了一個名為SQLiteDatabase的類,封裝了一些操作數據庫的API。
SharedPreference: 除了SQLite數據庫以外,另一種經常被使用的數據存儲方式,其本質就是一個xml文件,常用于存儲較簡單的參數設置。
File: 即常說的文件(I/O)存儲方法,常用存儲大數量的數據,但是缺點是在更新數據時效率低。
ContentProvider: Android系統中用來實現所有應用程序共享的一種數據存儲方式,由于數據通常在各自應用間的是互相私密的,因而此存儲方式使用比較少,但是其又是必不可少的一種存儲方式。例如音頻,視頻,通訊錄,一般都可以使用此存儲方式。每個Content Provider都會對外提供一個公共的URI,當有應用程序有數據需要共享時,就需要使用Content Provider為這些數據定義一個URI,之后其他的應用程序就可以通過Content Provider傳入這個URI來對數據進行操作。
本文使用了SQLite數據庫來保存語音聊天的對話信息。系統保存了語音主人的問題和機器人的回答,通過SQLite數據庫中的保存的主人問題和TTS返回的resultString進行模糊查詢。如果匹配成功,則返回機器人的回答,機器人的回答就是SQLite里保存的constant.ANS字段,當然,實現這樣一個語音對話需要解決一系列技術問題。比如谷歌的語音包是不支持中文的,為了很快的進行服務器的語音數據提取,目前最主流的語音包是來自科大訊飛的TTS語音包,支持中文,還有就是,數據庫如何創建;該數據庫包含哪些操作;接下來對數據庫的一些操作性的問題做個簡單的解答:
解答:我們都知道Android編程用的也是Java語言,傳統的數據庫創建和操作是基于一塊操作的,那么我們在做JAVA編程的時候就要很好地利用JAVA面向對象的特點,首先我們寫一個初始化的類,用來進行數據庫和數據表的初始化,創建一個類constants,這個類專門對數據庫進行初始化。這樣做的目的就是為了方便以后直接利用這個對象進行數據庫的操作,這個類如圖4-3所示:
圖4-3 數據庫的操作類圖
代碼如下:
public class constants extends Activity{
//這里的代碼很重要,用來進行數據庫的初始化工作
public static final String DATABASE_NAME = "chat.db";
public static final int DATABASE_VERSION = 1;
public static final String CHAT_TABLE_NAME = "chat_table";//對話表名
public static final String ANS = "ans";//對話問題 問題字段名
public static final String QUS= "qus";//對話答案 答案字段名
public static SQLiteDatabase db;
public static final int ACTIVITY_CREATE = 0;
public static final int ACTIVITY_EDIT = 1;
}
如上代碼所示,創建一個constants類來初始化數據,在這里數據名為chat.db,數據表為chat_table,有兩個字段ans(主人的問題)和qus(機器人的回答).
2.系統應用到的數據庫主要就是查詢,事先就應該將對話的數據全部寫進去,在昨晚數據信息的初始化以后,下一步要做的就是繼承SQLiteOpenHelper來創建數據庫和數據表,在public void Oncreate(SQLiteDatabase db)中進行數據添加,
代碼如下:
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, constants.DATABASE_NAME, null,
constants.DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "CREATE TABLE " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + " text not null, " + constants.ANS
+ " text not null " + ");";
Log.i("chenggong:createDB=", sql);
db.execSQL(sql);
String sql1 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS + ") values('你好','你好');";
String sql2 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('你是大笨蛋','本機器人不是大笨蛋');";
String sql3 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('你最討厭什么','寫文檔');";
String sql4 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('你開心嗎?', '我很開心');";
String sql5 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('快點吃飯吧', '嗯,好的');";
String sql6 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('上班咯', '好好工作吧');";
String sql7 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('你能不能給我唱一首歌', '不行,我唱的不好聽');";
String sql8 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('谷歌', '谷歌威武');";
String sql9 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('劉倩大笨蛋', '她姐姐才是大笨蛋');";
String sql10 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('你妹', '你妹是劉倩');";
String sql11 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('滾蛋', '為什么');";
String sql12 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('去死吧', '我又沒惹你,干嗎去死');";
String sql13 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('去死', '為什么');";
String sql14 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('吃飯了', '好吧');";
String sql15 = "insert into " + constants.CHAT_TABLE_NAME + " ("
+ constants.QUS + ", " + constants.ANS
+ ") values('吵死了', '其實我一點也不吵');";
db.execSQL(sql1);
db.execSQL(sql2);
db.execSQL(sql3);
db.execSQL(sql4);
db.execSQL(sql5);
db.execSQL(sql6);
db.execSQL(sql7);
db.execSQL(sql8);
db.execSQL(sql9);
db.execSQL(sql10);
db.execSQL(sql11);
db.execSQL(sql12);
db.execSQL(sql13);
db.execSQL(sql14);
db.execSQL(sql15);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
4.5 系統關鍵技術設計
4.5.1 Android用戶界面設計問題
不去思考Android應用程序的開發過程,對于用戶來說最直觀的就是Android界面的美化,它直接的影響了用戶體驗,美工占據程序開發的一個很大一個部分的比重,因此對于Android應用程序的界面布局來說是很重要的。ndroid有三種方式來生成用戶的界面:xml配置生成,通過用戶自己來生成界面接口,通過用代碼來直接生成。依據MVC的原則,界面與程序的邏輯應該互相分離開來,所以xml配置生成界面的方式是最好的。下面主要介紹一下Android界面的布局問題:
FrameLayout是布局中最為簡單的一個布局對象。它為你屏幕上定制一個空白備用區域,然后你就可以在其中填充一個單一對象 ,比如一張你要發布的圖片。但是你不能為FrameLayout中的一個子元素指定一個位置,因為它會把其他元素中的一部份或全部擋住。
LinearLayout是自上而下或者自左向右來進行排列。所有的子元素都會被排放在其它元素的后面,所以一個垂直的列表每行只有一個元素,不管他們寬度有多少。而每個水平方向的列表只會有一個行高。LinearLayout將會保持子元素之間的間隔以及互相對齊。
LinearLayout同時還支持為單獨的子元素來指定weight。優點就是允許子元素可以填充屏幕中的剩余空間。當子元素被指定一個weight 值,剩余的空間就會按這些子元素所被指定的weight比例來分配給這些子元素。默認的weight值為0。
AbsoluteLayout可以讓子元素按照x/y坐標值來顯示在屏幕上。其中(0, 0)為左上角,當向下或向右移動時,坐標值將會變大。AbsoluteLayout布局中沒有頁邊框,因此允許元素之間互相重疊。
RelativeLayout允許子元素來指定他們自己相對于其它元素的位置(通過ID指定)。因此,你可以通過對齊方式,或置于屏幕中央的形式來對兩個元素進行排列。其中元素是按順序排列,因此如果第一個元素是在屏幕的中央,那么相對于這個元素的其它元素會以屏幕中央的位置來進行排列。
TableLayout按表格的行列來指定位置。其中一個TableLayout是由很多的TableRow來組成,每個TableRow 自己都會定義一個row。TableLayout容器是不顯示邊框線的。每個row都會擁有0個或多個的cell;每個cell都將擁有一個View對象。而表格是由列和行來組成單元格的。
4.5.2 主界面按鈕選擇問題
在主界面中,想做到如果有特色的將按鈕一次性分布在主界面里,但是發現那樣做占據了空間,于是利用Animation動畫實現了發散式按鈕的設計,主要代碼如下:
private void initialButton() // 加載個性按鈕的方法
{
// TODO Auto-generated method stub
Display display = getWindowManager().getDefaultDisplay();
height = display.getHeight();
width = display.getWidth();
Log.v("width & height is:",
String.valueOf(width) + ", " + String.valueOf(height));
params.height = 50;
params.width = 50;
// 設置邊距 (int left, int top, int right, int bottom)
params.setMargins(10, height - 98, 0, 0);
buttonSleep = (Button) findViewById(R.id.button_composer_sleep);
buttonSleep.setLayoutParams(params);
buttonThought = (Button) findViewById(R.id.button_composer_thought);
buttonThought.setLayoutParams(params);
buttonPlace = (Button) findViewById(R.id.button_composer_place);
buttonPlace.setLayoutParams(params);
buttonWith = (Button) findViewById(R.id.button_composer_with);
buttonWith.setLayoutParams(params);
buttonDelete = (Button) findViewById(R.id.button_friends_delete);
buttonDelete.setLayoutParams(params);
buttonDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (isClick == false) {
isClick = true;
buttonDelete
.startAnimation(animRotate(-45.0f, 0.5f, 0.45f));
buttonWith.startAnimation(animTranslate(30.0f, -150.0f, 60,
height - 230, buttonWith, 100));
buttonPlace.startAnimation(animTranslate(70.0f, -120.0f,
110, height - 210, buttonPlace, 120));
buttonThought.startAnimation(animTranslate(90.0f, -90.0f,
140, height - 170, buttonThought, 140));
buttonSleep.startAnimation(animTranslate(120.0f, -60.0f,
170, height - 130, buttonSleep, 160));
} else {
isClick = false;
buttonDelete.startAnimation(animRotate(90.0f, 0.5f, 0.45f));
buttonWith.startAnimation(animTranslate(-50.0f, 130.0f, 10,
height - 98, buttonWith, 160));
buttonPlace.startAnimation(animTranslate(-100.0f, 110.0f,
10, height - 98, buttonPlace, 140));
buttonThought.startAnimation(animTranslate(-160.0f, 40.0f,
10, height - 98, buttonThought, 80));
buttonSleep.startAnimation(animTranslate(-170.0f, 0.0f, 10,
height - 98, buttonSleep, 50));
}
}
});
buttonSleep.startAnimation(animTranslate(120.0f, -60.0f,170, height - 130, buttonSleep, 160));的API是這樣的TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
在這里fromXdelta和from toXdelta都是按鈕的初始橫坐標與縱坐標的位置, TDelta和Delta都是后面的結束位置,實現的方法如下:
protected Animation animTranslate(float toX, float toY, final int lastX,
final int lastY, final Button button, long durationMillis) {
// TODO Auto-generated method stub
animationTranslate = new TranslateAnimation(0, toX, 0, toY);
animationTranslate.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
params = new LayoutParams(0, 0);
params.height = 50;
params.width = 50;
params.setMargins(lastX, lastY, 0, 0);
button.setLayoutParams(params);
button.clearAnimation();
}
});
animationTranslate.setDuration(durationMillis);
return animationTranslate;
}
protected Animation animRotate(float toDegrees, float pivotXValue,
float pivotYValue) {
// TODO Auto-generated method stub
animationRotate = new RotateAnimation(0, toDegrees,
Animation.RELATIVE_TO_SELF, pivotXValue,
Animation.RELATIVE_TO_SELF, pivotYValue);
animationRotate.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
animationRotate.setFillAfter(true);
}
});
return animationRotate;
}
實現的效果如下圖:
點擊前:
點擊后:
5語音機器人服務娛樂應用系統的功能的具體實現
5.1 用戶登錄界面的具體實現
系統運行后首先進入用戶登錄界面圖(圖5-1):
圖5-1 用戶登錄界面圖
用戶登錄界面中用了可愛的風格,用了固定的用戶名和密碼登錄的方式,判斷用戶名和密碼是否正確,如果正確,則進入系統主界面。
代碼實現如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
//得到登錄按鈕對象
login = (Button)findViewById(R.id.signin_button);
//給登錄按鈕設置監聽器
login.setOnClickListener(lq);
MyApplication.getInstance().addActivity(this);
}
//創建登錄按鈕監聽器對象
OnClickListener lq = new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//得到用戶名和密碼的編輯框
username = (EditText)findViewById(R.id.username_edit);
password = (EditText)findViewById(R.id.password_edit);
//判斷用戶輸入的用戶名和密碼是否與設置的值相同,必須要有toString()
if("liuqian".equals(username.getText().toString())&&
"123456".equals(password.getText().toString())){
System.out.println("你點擊了按鈕");
//創建Intent對象,傳入源Activity和目的Activity的類對象
intent = new Intent(StartActivity.this, MainActivity.class);
//啟動Activity
startActivity(intent);
}else{
//登錄信息錯誤,通過Toast顯示提示信息
Toast.makeText(StartActivity.this,"用戶登錄信息錯誤" , Toast.LENGTH_SHORT).show();
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
5.2 語音聊天功能的實現
5.2.1 語音記事本主界面的實現
圖5-2 語音聊天的主界面圖
如上圖5-2所示,為語音聊天的主界面,點擊語音,就可以和機器人進行語音聊天,如果單純是用谷歌的TTS的話,是不支持中文發音的,在網上查找了相關資料,找到了科大訊飛的語音包和TTS程序,首先要做的就是讓用戶說話,進行語音搜索,代碼如下:
speakButton.setOnTouchListener(new Button.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
// 按下按鈕先執行一次searchvoice方法
case MotionEvent.ACTION_DOWN:
searchvoice();
}
return false;
}
});
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}
protected void searchvoice() {// searchvoice的方法
try {
tts.speak("start speaking!", TextToSpeech.QUEUE_ADD, null);
// 通過Intent傳遞語音識別的模式,開啟語音
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
// 語言模式和自由模式的語音識別
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
// 提示語音開始
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "開始語音");
// 開始語音識別
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "找不到語音設備", 1).show();
}
}
@SuppressLint("NewApi")
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
id = "";// 天氣編號89757
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
tts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
最后用返回的resultString和數據庫中的字段進行模糊匹配,能夠達到查詢的目的,再用tts.speak(text, queueMode, params);用來語音朗讀出返回的字段,注意這里的字段必須是String類型的,這也是開發中遇到的一個關于怎么樣將數據庫里的字段轉換為String的問題,代碼如下:
@SuppressLint("NewApi")
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
tts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
// 回調獲取從谷歌得到的數據
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE
&& resultCode == RESULT_OK) {
results = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);// 取得語音的字符
for (int i = 0; i < results.size(); i++) {
resultString = results.get(0);
Log.e("resultString" + i, resultString);
}
Cursor c = dbhelper.getWritableDatabase().rawQuery(
"select * from chat_table where qus like ? ",
new String[] { "%" + resultString + "%" });
// 模糊匹配的時候要加 兩個 %,很重要的一句話
if (c == null) {
Log.i("cuolecuolecuolecuole", resultString);
} else {
if (c.moveToFirst()) {
System.out.println(c.toString());
Log.i("duile對了對了對了", c.toString());
tts.speak(c.getString(c.getColumnIndex("ans")),
TextToSpeech.QUEUE_ADD, null);
// tts.speak("對哈對哈對哈", TextToSpeech.QUEUE_ADD, null);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
下面是關于在Android中使用模糊查詢的三種方法:
//1.使用這種query方法%號前不能加' ;
Cursor c_test = mDatabase.query(tab_name, new String[]{tab_field02}, tab_field02+" LIKE ? ",
new String[] { "%" + str[0] + "%" }, null, null, null);
//2.使用這種query方法%號前必須加' ;
// Cursor c_test=mDatabase.query(tab_name, new String[]{tab_field02},tab_field02+" like '%" + str[0] + "%'", null, null, null, null);
//3.使用這種方式必須在%號前加' ;
String current_sql_sel = "SELECT * FROM "+tab_name +" where "+tab_field02+" like '%"+str[0]+"%'";
//Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);
5.3 天氣預報功能的實現
5.3.1 天氣功能的實現
天氣預報,是現在每個安卓用戶比不可少的一個應用,它是通過從利用服務器上抓取JSON數據,獲得天氣信息,并且允許轉化為對象。我們在這個設計中,將它轉化成String型,用TTS讀出。方便懶人沒時間看天氣,說出“北京”等城市即可,能夠有效地查詢當日的天氣情況,查看是否需要添加衣服等,谷歌的天氣預報已經停用,我們利用最有名的中國氣象網,從那個網站抓取JSON數據,那么,手機客戶端是怎么抓取數據的呢?
看看中國中央氣象局的天氣數據該如何獲取?通過一個鏈接即可獲取到該城市地區的天氣數據信息,例如獲取揚州的數據可使用http://m.weather.com.cn/data/101190601.html,來獲取,101190601是揚州的城市ID,我們通過這個ID用來查詢中國中央氣象局里的城市天氣,這個ID用來區別全國34個省市及地區的唯一標識,就像是我們的身份證號一樣,來區別我們每一個人,我們要獲取該城市地區的天氣數據必須要通過他的ID號來獲取,不同于其他的一些天氣服務API,例如有的可直接通過漢語拼音來獲取,這些相對于ID來說方便一些,至少我們不用去查該城市地區的ID號,這也是中國中央氣象局API使用的一個局限性的地方。雖然麻煩一點,但是我們使用別人的東西當然要遵守別人的規則。
城市ID,目前我收錄到一份有兩千多個城市地區的ID號。如圖5-3-1
圖5-3-1 城市ID
控制電燈的開關,是android手機通過藍牙發送信號才能控制,因此,在操控時必須開啟藍牙,連接藍牙才能操控電燈的開關。
android藍牙的操作分4步驟:建立本地藍牙;獲取遠方藍牙設備;連接藍牙;發送socket通信。
我們定義String類型的id,用于將這個id發送到中國天氣網的服務器上,用于通過這個id抓取天氣數據
代碼如下:
id = findId(resultString);
if (null == id || "".equals(id)) {
Toast.makeText(MainActivity.this, "在集合中,沒有找到對應城市id", 1).show();
} else {
// tts.speak(id.toString(), TextToSpeech.QUEUE_ADD, null);
queryWeather();
}
private String findId(String cityname) {
if (null == cityname || "".equals(cityname))
return null;
try {
InputStreamReader inputReader = new InputStreamReader(
getResources().getAssets().open("citycode.txt"));
BufferedReader bufReader = new BufferedReader(inputReader);
String line = "";
String[] str = new String[2];
while ((line = bufReader.readLine()) != null) {
str = line.split("=");
if (str.length == 2 && null != str[1] && !"".equals(str[1])
&& cityname.equals(str[1])) {
// 返回對應編號
return str[0];
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
這是Android中以數據流讀取assets文件夾中的文件內容的方法,BufferedReader常用于讀取中文字符
private void queryWeather() {
thread = new Thread() {
public void run() {
super.run();
WeatherForm[] WF = new WeatherForm[3];
WeatherQueryManager WQM = new WeaterQueryManageImpl();
// 查詢天氣,返回3天的天氣信息
WF = WQM.weatherquery(id);// 寫到這里不會寫了,嗷嗚
StringBuffer sb = new StringBuffer();
sb.append("主人,你要查詢的天氣是:");
sb.append(WF[0].getName());
sb.append("今日溫度");
sb.append(WF[0].getTemp() + "度");
sb.append("今天風向");
sb.append(WF[0].getWind());
sb.append("風力指數");
sb.append(WF[0].getWs());
String str = sb.toString();
tts.speak(str, TextToSpeech.QUEUE_ADD, null);
}
};
thread.start();
}
public class WeatherForm {
/**城市名*/
private String name;
/**城市編號*/
private String id;
/**溫度*/
private String temp;
/**天氣描述*/
private String weather;
/**風力*/
private String wind;
/**風向*/
private String ws;
public WeatherForm(){
}
/**
* 構造方法
* @param name
@param wind
* @param temp
@param time
@param ws
*/
public WeatherForm(String name, String id, String ddate, String week,
String temp, String weather, String wind, String fx,String time,String ws) {
super();
this.name = name;
this.id = id;
this.temp = temp;
this.ws= ws;
//this.weather = weather;
this.wind = wind;
//this.fx = fx;*/
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
public String getWs() {
return ws;
}
public void setWs(String ws) {
http://this.ws?= ws;
}
public String toString() {
return "WeatherForm [name=" + name + ", temp=" + temp + ",wind=" + wind + ",ws=" + ws + "]";
}
}
public class WeaterQueryManageImpl implements WeatherQueryManager {
private final String TAG = "message";
public String Weather_result;
@Override
public WeatherForm[] weatherquery(String CityId) {
// TODO Auto-generated method stub
WeatherForm[] WF = new WeatherForm[1];
//?http://m.weather.com.cn/data/101070101.html
String URL = "http://www.weather.com.cn/data/sk/" + CityId + ".html";
Weather_result = "";
HttpGet httpRequest = new HttpGet(URL);
// 獲得HttpResponse對象
try {
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpRequest);
if
(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK) {
// 取得返回的數據
Weather_result=EntityUtils.toString(httpResponse.getEntity());
}
} catch (Exception e) {
Log.i(TAG, e.toString());
WF[0] = new WeatherForm();
return WF;
}
// 以下是對返回JSON數據的解析
if (null != Weather_result && !"".equals(Weather_result)) {
try {
JSONObject JO = new JSONObject(Weather_result).getJSONObject("weatherinfo");
for (int i = 0; i < WF.length; i++) {
WeatherForm weaf = new WeatherForm();
// 3個日期暫時都存放一天的
weaf.setName(JO.getString("city"));
String city=JO.getString("city");
Log.i("fdsafdasfdsfsafdsffffffff",city);
/*weaf.setDdate(JO.getString("date_y"));
weaf.setWeek(JO.getString("week"));*/
weaf.setTemp(JO.getString("temp"));
String temp=JO.getString("temp");
Log.i("fdsafdasfdsfsafdsffffffff",temp);
weaf.setWind(JO.getString("WD"));
//weaf.setWeather(JO.getString("weather" + (i + 1)));
String wind=JO.getString("WD");
Log.i("fdsafdasfdsfsafdsffffffff",wind);
weaf.setWs(JO.getString("WS"));
WF[0] = weaf;
Log.i("強制一下咯",WF[0].toString());
}
} catch (JSONException e) {
Log.i(TAG, e.toString());
WF[0] = new WeatherForm();
return WF;
}
}
return WF;
}
}
這樣,就實現通過Http的Get方法獲取到了JSON數據,從而實現了語音播報天氣的功能
5.4 系統設計難點
如何根據在TTS發音的同時,設計的動畫也跟著運動,在Android中的動畫是由anim.xml來制作的,通過一幀一幀的圖片形成動畫,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/duola" android:duration="800"></item>
<item android:drawable="@drawable/duola2" android:duration="400"/>
<item android:drawable="@drawable/duola" android:duration="800"></item>
</animation-list>
利用一幀一幀的圖片形成了動畫的效果,如圖5-4-1所示
圖5-4-1 動畫
在開發過程中,首先定義private AnimationDrawable background;
background = (AnimationDrawable) imageView.getBackground();
發現在OnActivityResult用
background.stop();
background.start();
并不能實現根據講話才播放動畫
解決方案如下:
總 結
本系統闡述了基于android平臺的語音機器人服務娛樂系統。設計中顯示出了Android平臺的優勢,分析Android的功能特征、架構分析以及應用程序的構成。探討了本系統的需求分析、具體的功能模塊和界面的設計,實現了語音聊天,語音查詢天氣,包括按鈕控制和語音控制,并且提供了一些具體功能的實現過程,很好地增強了用戶和使用者的體驗
在開發中也遇到一些調試錯誤的問題,在老師的幫助下,及時的得到了解決。
經過測試本系統基本實現了語音識別的基本功能,通過本次系統的開發,了解了語音識別以及語音合成的原理,能夠滿足用戶的基本需求。但是由于時間緊迫和本人的能力有限,本系統中還存在著一些不足之處,需要進一步的完善和改進。如果要進一步繼續完善開發,今后將會從下面幾個方面進行功能的擴展:提高語音機器人的智能性,增加趣味性,界面做的更加人性,美觀。希望在我以后的學習和工作生涯中繼續研究,繼續完善。
紙上得來終覺淺,絕知此事要躬行,時間是檢驗真理的唯一標準,總的來說,這次的課程設計對我來說是一次非常難得的鍛煉和動手實踐機會。使我對所學的專業課知識得到了融會貫通,得到了比任何一門課都大的提高和進步。
我認為畢業設計對于我們來說不是一次應付學校,應付老師的作業,而是作為計算機專業的學生在大學這幾年的學習成果的最佳展現
參考文獻
[1]胡光銳,語音處理與識別,上??茖W技術文獻出版社,1994.
[2]深入淺出Google Android/E2Ecloud 工作室編著?!本?#xff1a;人民郵電出版2009.8
[3] Google Android開發入門與實戰/靳巖,姚尚朗編著?!本?#xff1a;人民郵電出版社,2009.7
[4] Google Android SDK開發范例大全/余志龍等編著;王世江改編?!本?#xff1a;人民郵電出版社,2009.7(2009.8重印)
[5] 周迪偉.計算機語音處理[M].北京:國防工業出版社,1987,130-146
[6] 王炳錫,屈丹,彭煊,實用語音識別基礎[M].北京:國防工業出版社,2005
[7] 拉賓納 L,Rabiner Lawrence,阮平望, Juang Biing-Hwang, 語音識別基本原理, 清華大學出版社, 1999
致 謝
我希望時間慢點過,因為總覺得還有很多東西需要我們認真學習,回想起以前的大學生活,覺得來到了學校不虛此行,在大學里,我遇到了很多優秀的老師和同學,在我最迷茫的時候,是老師們給了我鼓勵,指引了我前進的方向,在我最失意的時候,是同學給了我支持,讓我堅持我自己想走的路,感謝他們對我的幫助.
此次的畢業設計的順利完成,在這里我要感謝我的指導老師:包依勤老師,從選題到設計制作到最后的論文的寫作和修改的整個過程中,包老師給了我很多指導,讓我堅持將這個畢業設計完成了下來,讓我們能夠真正的做到,實踐是檢驗真理的唯一標準,現在論文已快接近尾聲,在這里,我要對包老師表示最衷心的感謝,感謝他在我的開發過程中給予的幫助和鼓勵,是他引領了進入了實驗室,感受了編程開發的快樂,也是他帶我們走進了android的世界,在下課之余,老師也不厭其煩的回答我們各種在編程中遇到的問題,同時包老師嚴謹的治學態度和刻苦的敬業精神給我留下了深刻的印象,他對編程的熱愛同時也感染了我們這些學生.謝謝你,老師
此次畢業設計能夠順利完成,是在老師的指導下,讓我更加了解到了軟件開發的整個流程,讓我養成了治學嚴謹的態度,這對我以后走出校園,進入工作當中是非常有益的.
希望在我以后的工作和學習生活當中,能夠像老師一樣,認真對待生活中的每一件事.
總結
以上是生活随笔為你收集整理的基于android平台的语音机器人服务娱乐系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】概念、功能、特征、分类、运行
- 下一篇: 2022年湖南省自考考试学前教育幼儿文学