日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

基于android平台的语音机器人服务娱乐系统

發(fā)布時(shí)間:2024/1/8 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于android平台的语音机器人服务娱乐系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?類 號(hào):TP311

學(xué)校代碼:11460

學(xué) 號(hào):10130920

本科生畢業(yè)論文

基于android平臺(tái)的語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng)

Robot Entertainment Service System Based on Android Platform

所在系(院):

學(xué)?生:

?導(dǎo)??師:

研究起止日期:


學(xué)位論文獨(dú)創(chuàng)性聲明
本人鄭重聲明:
1. 堅(jiān)持以“求實(shí)、創(chuàng)新”的科學(xué)精神從事論文寫作工作。
2. 本論文是我個(gè)人在導(dǎo)師指導(dǎo)下進(jìn)行的研究工作和取得的研究成果。
3. 本論文中除引文外,所有實(shí)驗(yàn)數(shù)據(jù)和有關(guān)材料均是自己研究完成。
4. 本論文中除引文和致謝的內(nèi)容外,本論文沒有抄襲,剽竊他人已經(jīng)發(fā)表的研究成果。

5. 其他同學(xué)和導(dǎo)師對(duì)本文研究所做的貢獻(xiàn)均已在論文中作了聲明并表示了謝意。


作者簽名:劉倩
2013年 4 月 15 日

摘 要

隨著科學(xué)技術(shù)的發(fā)展,人們已不再滿足當(dāng)前人機(jī)交換信息的方式,而希望能用自然語(yǔ)言直接進(jìn)行信息傳遞,以便大大的提高人的工作效率,語(yǔ)音識(shí)別是建立計(jì)算機(jī)聽覺系統(tǒng)的基礎(chǔ),而目前,很大一部分應(yīng)用都是基于移動(dòng)互聯(lián)網(wǎng)技術(shù),也是目前幾年國(guó)家一直推崇發(fā)展的,而近幾年移動(dòng)平臺(tái)上有關(guān)語(yǔ)音識(shí)別的應(yīng)用非?;鸨?#xff0c;國(guó)內(nèi)有像挖財(cái)和UC瀏覽器等推出的語(yǔ)音輸入和控制功能,在助手類應(yīng)用中,語(yǔ)音識(shí)別更是作為一種必不可少的主流技術(shù),比如現(xiàn)在主流的GPS語(yǔ)音導(dǎo)航系統(tǒng),基于Android平臺(tái)的語(yǔ)音播報(bào)器等,不僅能增強(qiáng)較完美的用戶體驗(yàn),還能給客戶增加不少趣味性,但是目前基于安卓移動(dòng)平臺(tái)的機(jī)器人大多數(shù)都以文字輸入形式和機(jī)器人進(jìn)行溝通聊天,內(nèi)容形式比較單一,缺乏趣味性,現(xiàn)在流行的simsimi小黃雞中文版是一款運(yùn)行在Android平臺(tái)上的安卓手機(jī)聊天機(jī)器人,雖然擁有龐大的數(shù)據(jù)庫(kù),但是不支持語(yǔ)音聊天,不智能化,因?yàn)檎Z(yǔ)音識(shí)別是近幾年手機(jī)開發(fā)的主流,所以我想能夠開發(fā)一款基于Android平臺(tái)的語(yǔ)音機(jī)器人娛樂系統(tǒng),能夠語(yǔ)音和我們的機(jī)器人進(jìn)行聊天,還可以通過語(yǔ)音進(jìn)行天氣的查詢,它一樣擁有龐大的數(shù)據(jù)庫(kù),而且會(huì)越來(lái)越智能,越聰明。

關(guān)鍵詞:android;java;語(yǔ)音功能;智能;開源系統(tǒng);數(shù)據(jù)庫(kù);


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 研究背景及現(xiàn)狀11

1.2語(yǔ)音識(shí)別基本原理11語(yǔ)音識(shí)別基本原理1

1.3科大訊飛介紹22科大訊飛介紹2

2語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng)的研究分析33

2.1市場(chǎng)可行性33

2.2研究目的44

2.3 Android介紹44

2.3.1 Android平臺(tái)架構(gòu)44

2.3.2 Android應(yīng)用程序構(gòu)成77

2.4 Eclipse簡(jiǎn)介88

2.4.1 Eclipse的優(yōu)點(diǎn)88

3語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng)的需求分析99

3.1 功能需求99

3.2 需求分析99

4語(yǔ)音識(shí)別應(yīng)用系統(tǒng)的設(shè)計(jì)及相關(guān)技術(shù)1010

4.1 功能框架1010

4.2 系統(tǒng)實(shí)現(xiàn)流程圖1212

4.3 用戶界面設(shè)計(jì)1313

4.4 數(shù)據(jù)存儲(chǔ)設(shè)計(jì)1313

4.5 系統(tǒng)關(guān)鍵技術(shù)設(shè)計(jì)1818

4.5.1 Android用戶界面設(shè)計(jì)問題1818

4.5.2 主界面按鈕選擇問題2020

5語(yǔ)音機(jī)器人服務(wù)娛樂應(yīng)用系統(tǒng)的功能的具體實(shí)現(xiàn)2525

5.1 用戶登錄界面的具體實(shí)現(xiàn)2525

5.2 語(yǔ)音聊天功能的實(shí)現(xiàn)2828

5.2.1 語(yǔ)音記事本主界面的實(shí)現(xiàn)2828

5.3 天氣預(yù)報(bào)功能的實(shí)現(xiàn)3232

5.3.1 天氣功能的實(shí)現(xiàn)3232

5.4 系統(tǒng)設(shè)計(jì)難點(diǎn)4040

總 結(jié)4242

參考文獻(xiàn)4343

致 謝4444

1 緒 論

1.1 研究背景及現(xiàn)狀

早在計(jì)算機(jī)發(fā)明之前,自動(dòng)語(yǔ)音識(shí)別的設(shè)想就已經(jīng)被提上了議事日程,早期的聲碼器可被視作語(yǔ)音識(shí)別及合成的雛形。而1920年代生產(chǎn)的"Radio Rex"玩具狗可能是最早的語(yǔ)音識(shí)別器,當(dāng)這只狗的名字被呼喚的時(shí)候,它能夠從底座上彈出來(lái),這就是第一代語(yǔ)音機(jī)器人的誕生。

隨著現(xiàn)代技術(shù)的發(fā)展,人們對(duì)移動(dòng)終端的依賴性和期望是越來(lái)越大。短信發(fā)送,語(yǔ)音通訊,手機(jī)小游戲等都已經(jīng)無(wú)法滿足人們對(duì)移動(dòng)終端的需求,這些移動(dòng)終端也開始失去了市場(chǎng)。人們現(xiàn)在都想要各種機(jī)器能聽懂人類的語(yǔ)言,并且能做到人說(shuō)什么,機(jī)器就會(huì)按照人說(shuō)的話,去執(zhí)行命令,從而實(shí)現(xiàn)人機(jī)的語(yǔ)言交流。隨著計(jì)算機(jī)科技的發(fā)展,人們的這一想法終于可以實(shí)現(xiàn),這是由于語(yǔ)音識(shí)別技術(shù)的出現(xiàn),使得機(jī)器通過識(shí)別和理解,然后把人的語(yǔ)音信號(hào)轉(zhuǎn)變成機(jī)器相對(duì)應(yīng)的命令。語(yǔ)音識(shí)別技術(shù)的應(yīng)用已經(jīng)成為當(dāng)今社會(huì)上具有競(jìng)爭(zhēng)價(jià)值的新興高科技加高技術(shù)的產(chǎn)業(yè)。它在人機(jī)交互中占的比列將會(huì)越來(lái)越大。所以本課題的研究也正是致力于開發(fā)出一款基于android手機(jī)平臺(tái)的語(yǔ)音娛樂服務(wù)機(jī)器人,除了可以正常的和用戶進(jìn)行語(yǔ)音交流外,還可以實(shí)現(xiàn)一些用戶生活上的幫助功能,來(lái)滿足用戶的使用和需求,比如查詢天氣等。

1.2語(yǔ)音識(shí)別基本原理

語(yǔ)音識(shí)別過程與人對(duì)語(yǔ)音識(shí)別處理的過程基本上是一致的。它實(shí)際上是一種模式識(shí)別系統(tǒng),和常規(guī)的模式系統(tǒng)一樣,有特征提取、模式匹配、參考模式庫(kù)等三個(gè)基本單元。

語(yǔ)音識(shí)別系統(tǒng)的基本結(jié)構(gòu)如圖1-1所示。它分為三個(gè)步驟:

(1) 前端處理:從語(yǔ)音信號(hào)中提取有效的特征參數(shù)來(lái)代表語(yǔ)音特征,具有很好的區(qū)分性。

(2) 聲學(xué)模型與模式匹配:聲學(xué)模型通常將獲取的語(yǔ)音特征通過學(xué)習(xí)算法產(chǎn)生,在識(shí)別時(shí)將輸入的語(yǔ)音特征與聲學(xué)模型進(jìn)行匹配與比較,得到最佳的識(shí)別結(jié)果。[5]

(3) 語(yǔ)言處理: 語(yǔ)言處理可以進(jìn)行語(yǔ)法、語(yǔ)義分析,通過最好有高效的算法,保證語(yǔ)音識(shí)別的實(shí)現(xiàn)。

圖1-1語(yǔ)音識(shí)別的原理框圖

Android手機(jī)上實(shí)現(xiàn)語(yǔ)音識(shí)別的原理:android手機(jī)先將用戶語(yǔ)音輸入的信號(hào),送至科大訊飛的云端,借助于云端技術(shù)可以識(shí)別用戶的語(yǔ)音輸入,云端搜索完畢后,將返回打印數(shù)據(jù)。

1.3科大訊飛介紹

科大訊飛作為中國(guó)最大的智能語(yǔ)音技術(shù)提供商,在智能語(yǔ)音技術(shù)領(lǐng)域有著長(zhǎng)期的研究積累,并在中文語(yǔ)音合成、語(yǔ)音識(shí)別、口語(yǔ)評(píng)測(cè)等多項(xiàng)技術(shù)上擁有國(guó)際領(lǐng)先的成果?;趽碛凶灾髦R(shí)產(chǎn)權(quán)的世界領(lǐng)先智能語(yǔ)音技術(shù),科大訊飛已推出從大型電信級(jí)應(yīng)用到小型嵌入式應(yīng)用,從電信、金融等行業(yè)到企業(yè)和家庭用戶,從PC到手機(jī)到MP3/MP4/PMP和玩具,能夠滿足不同應(yīng)用環(huán)境的多種產(chǎn)品??拼笥嶏w占有中文語(yǔ)音技術(shù)市場(chǎng)70%以上市場(chǎng)份額,語(yǔ)音合成產(chǎn)品市場(chǎng)份額達(dá)到70%以上,在電信、金融、電力、社保等主流行業(yè)的份額更達(dá)80%以上,開發(fā)伙伴超過10000家,以訊飛為核心的中文語(yǔ)音產(chǎn)業(yè)鏈已初具規(guī)模。

要實(shí)現(xiàn)語(yǔ)音機(jī)器人的對(duì)話功能,必須要用到一下兩種技術(shù)

語(yǔ)音合成技術(shù)

語(yǔ)音合成和語(yǔ)音識(shí)別技術(shù)是實(shí)現(xiàn)人機(jī)語(yǔ)音通信,建立一個(gè)有聽和講能力的口語(yǔ)系統(tǒng)所必需的兩項(xiàng)關(guān)鍵技術(shù)。使電腦具有類似于人一樣的說(shuō)話能力,是當(dāng)今時(shí)代信息產(chǎn)業(yè)的重要競(jìng)爭(zhēng)市場(chǎng)。和語(yǔ)音識(shí)別相比,語(yǔ)音合成的技術(shù)相對(duì)說(shuō)來(lái)要成熟一些,并已開始向產(chǎn)業(yè)化方向成功邁進(jìn),大規(guī)模應(yīng)用指日可待。

語(yǔ)音識(shí)別技術(shù)

自動(dòng)語(yǔ)音識(shí)別技術(shù)(Auto Speech Recognize,簡(jiǎn)稱ASR)所要解決的問題是讓計(jì)算機(jī)能夠“聽懂”人類的語(yǔ)音,將語(yǔ)音中包含的文字信息“提取”出來(lái)。ASR技術(shù)在“能聽會(huì)說(shuō)”的智能計(jì)算機(jī)系統(tǒng)中扮演著重要角色,相當(dāng)于給計(jì)算機(jī)系統(tǒng)安裝上“耳朵”,使其具備“能聽”的功能,進(jìn)而實(shí)現(xiàn)信息時(shí)代利用“語(yǔ)音”這一最自然、最便捷的手段進(jìn)行人機(jī)通信和交互。

2語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng)的研究分析

本文系統(tǒng)設(shè)計(jì)采用的開發(fā)環(huán)境為Windows下的Google Android開發(fā)平臺(tái)。

所需軟件如下:

  • Eclipse 3.3.2
  • JAVA JDK SE 1.6
  • Google Android SDK
  • ADT
  • 2.1市場(chǎng)可行性

    隨著現(xiàn)今科技技術(shù)的發(fā)展,3G技術(shù)的發(fā)展帶來(lái)了3G手機(jī)的到來(lái),基于Android操作系統(tǒng)的手機(jī)市場(chǎng)逐步發(fā)展壯大,愈來(lái)愈多的人開始選擇谷歌的Android手機(jī),因此這個(gè)市場(chǎng)的商業(yè)價(jià)值很高,所以我們選擇了開發(fā)基于Android平臺(tái)的語(yǔ)音識(shí)別應(yīng)用系統(tǒng)。由于科學(xué)技術(shù)的不斷發(fā)展,讓各種機(jī)器能聽懂人類的語(yǔ)言并能按人的命令來(lái)行動(dòng),從而實(shí)現(xiàn)了人類與機(jī)器的語(yǔ)言交流。而Android自帶的語(yǔ)音功能卻很少被開發(fā)和應(yīng)用,沒能給人們帶來(lái)快捷和便利,正因?yàn)槿绱?#xff0c;我決定開發(fā)此語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng),不僅可以和機(jī)器人進(jìn)行簡(jiǎn)單的聊天交流,同時(shí)還可以通過語(yǔ)音來(lái)查詢天氣,并且加入動(dòng)畫增加趣味性,因此我希望我的研發(fā)不僅可以成為人們生活的好伙伴,還可以作為兒童們的玩具,而目前正缺少這種帶有趣味性,類似湯姆貓,功能也比較多的機(jī)器人服務(wù)娛樂系統(tǒng)了,它會(huì)讓你覺得有一個(gè)真正的伙伴站你的面前,和你輕松交談,所以從市場(chǎng)角度來(lái)看,十分有必要開發(fā)基于Android的機(jī)器人服務(wù)娛樂系統(tǒng)。

    2.2研究目的

    隨著一批又一批的移動(dòng)應(yīng)用不斷發(fā)布的今天,開發(fā)一個(gè)具有對(duì)話功能的語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng),會(huì)受到大部分小朋友,學(xué)生以及年輕上班族的青睞,并且該系統(tǒng)必須具備操作簡(jiǎn)單,功能俱全,可擴(kuò)展性好,娛樂性豐富,不單一等特點(diǎn),現(xiàn)在市場(chǎng)已經(jīng)有類似的語(yǔ)音機(jī)器人,如湯姆貓等,但玩法大多比較單一,對(duì)話簡(jiǎn)單,而這款具有對(duì)話功能的語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng),玩法多樣化,能真正的實(shí)現(xiàn)智能語(yǔ)音對(duì)話的功能,讓它成為你工作,娛樂,生活中的好伙伴另外。
    通過此次設(shè)計(jì),能夠掌握android軟件開發(fā),掌握控件、數(shù)據(jù)庫(kù)SQLite和多線程編程技術(shù)。 能夠在實(shí)踐中了解語(yǔ)音識(shí)別技術(shù),掌握android語(yǔ)音播報(bào)天氣等功能,因?yàn)檎Z(yǔ)音機(jī)器人可不斷的完善的功能很多,所以可以涉及到很多android的應(yīng)用功能,所以希望自己在程序開發(fā)的過程中,不斷的總結(jié)錯(cuò)誤,提高自己的實(shí)踐能力。

    2.3 Android介紹

    Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。尚未有統(tǒng)一中文名稱,中國(guó)大陸地區(qū)較多人使用“安卓”或“安致”。

    2.3.1 Android平臺(tái)架構(gòu)

    圖2-1 Android的架構(gòu)流程圖

  • 應(yīng)用程序?qū)?#xff08;Applications)
    該層主要有移動(dòng)終端常常自帶的一些手機(jī)軟件,如:email客戶端,SMS 短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。這些應(yīng)用主要的開發(fā)語(yǔ)言是JAVA語(yǔ)言。因此使得熟悉JAVA開發(fā)的開發(fā)者,能很快的過渡到android系統(tǒng)軟件的開發(fā)中。開發(fā)者開發(fā)的軟件也是應(yīng)用在該層上面。
  • 應(yīng)用程序框架 (Application Framework)
    開發(fā)人員通過API框架來(lái)了解核心應(yīng)用技術(shù)。任何應(yīng)用程序可以通過發(fā)布它的功能塊同時(shí)任何其它的應(yīng)用程序都能夠使用其所發(fā)布的功能塊(不過得遵循框架的安全性限制)。同樣,任何應(yīng)用程序重用機(jī)制都可以使用戶方便的替換程序組件。
    隱藏在每個(gè)應(yīng)用程序后面的是一系列的服務(wù)系統(tǒng), 其中包括:
    視圖(Views)——可以用來(lái)創(chuàng)建應(yīng)用程序,它包括:列表(lists),文本框(text boxes),按鈕(buttons),網(wǎng)格(grids)。
    內(nèi)容提供器(Content Providers)——它使應(yīng)用程序能夠訪問另一個(gè)應(yīng)用程序的數(shù)據(jù),或者分享他們已有的資源。
    資源管理器(Resource Manager)——提供了訪問資源并且非代碼的形式,例如圖形,字符串,和一些布局文件(layout files)。
    活動(dòng)管理器(Activity Manager)——專門管理一些程序的生命周期同時(shí)提供了常用的導(dǎo)航返回功能。
    通知管理器 (Notification Manager)——它讓應(yīng)用程序在顯示框中可以顯示出自己定義的一些提示信息。
  • 程序庫(kù)(Libraries)
    Android 包含了C/C++庫(kù),這些程序庫(kù)能被Android的系統(tǒng)不同的組件使用。這些組件可以通過Android的程序框架來(lái)為開發(fā)者提供已設(shè)置的服務(wù)。以下是已有的核心庫(kù):
    系統(tǒng)C庫(kù)——一個(gè)繼承了BSD而來(lái)的標(biāo)準(zhǔn) C系統(tǒng)的函數(shù)庫(kù)(libc),這是專門為基于嵌入式linux的設(shè)備而定制的。
    媒體庫(kù)——該庫(kù)支持了多種最常用的關(guān)于音頻、視頻的回放和錄制,同時(shí)還支持靜態(tài)的圖像文件。編碼格式包括MP3、JPG、AAC、PNG、AMR。
    Surface Manager——它是專門管理顯示的子系統(tǒng),而且應(yīng)用程序還可以將2D和3D的圖層的融合起來(lái)。
    SGL——底層2D的圖形驅(qū)動(dòng)引擎。
    3D libraries——圖形庫(kù),該庫(kù)使用了3D的硬件和軟件加速。
    FreeType——位圖和矢量,顯示字體。
    SQLite——任何開發(fā)程序都能使用,功能非常好的輕型數(shù)據(jù)庫(kù)。
  • Android 運(yùn)行庫(kù)層(Android Runtime)
  • Android中有自己的核心庫(kù),此核心庫(kù)給予了大多數(shù)JAVA編程中的核心庫(kù)擁有語(yǔ)言功能。所有Android開發(fā)程序都是自己在進(jìn)程中各自運(yùn)行,它們都有自己的虛擬機(jī)實(shí)例。JAVA虛擬機(jī)被專門設(shè)計(jì)成專有設(shè)備,它能夠運(yùn)行多個(gè)虛擬系統(tǒng)。

    Android包含一個(gè)c/c++的集合,當(dāng)開發(fā)者使用android應(yīng)用程序架構(gòu)時(shí),android系統(tǒng)會(huì)通過這些集合來(lái)支持對(duì)開發(fā)者使用的各個(gè)組件,下面是一些庫(kù):

    • Surface Manager
      管理多個(gè)程序執(zhí)行時(shí)候的相互存取和顯示,同時(shí)也負(fù)責(zé)對(duì)2D與3D的繪圖進(jìn)行合成顯示。
    • Media Framework
      中文是多媒體庫(kù),支持多種常用的視頻,音頻格式的播放和錄制,比如:MPEG4、MP3、H.264、AAC、ARM等。
    • SQLite
      這是相對(duì)于Oracle、mysql、sqlserver等一些數(shù)據(jù)庫(kù)還小的小型數(shù)據(jù)庫(kù),它是關(guān)系型數(shù)據(jù)引擎。
    • OpenGL|ES
      是根據(jù)OpenGL ES API的標(biāo)準(zhǔn)實(shí)現(xiàn)的3D繪圖函數(shù)庫(kù)。
    • FreeType
      提供矢量和位圖。
    • WebKit

    Web瀏覽引擎。

    每個(gè)android應(yīng)用程序都是采用Java語(yǔ)言編寫的而且,它都運(yùn)行在Dalvik虛擬機(jī)上,而Dalvik虛擬機(jī)只執(zhí)行“.dex”的文件,Java程序通過編譯時(shí),還需要通過android的SDK中的“dx”工具將其轉(zhuǎn)化為“.dex”的后綴文件,才能正常的運(yùn)行。

  • Linux 內(nèi)核(Linux kernel)
  • Android的核心系統(tǒng)的服務(wù)依是基于 Linux的內(nèi)核,如安全性,內(nèi)存管理,進(jìn)程管理,網(wǎng)絡(luò)的協(xié)議棧和驅(qū)動(dòng)模型。

    2.3.2 Android應(yīng)用程序構(gòu)成

    對(duì)一個(gè)Android應(yīng)用程序而言,一般是由下面4大組件構(gòu)造而成:

    • Activity(活動(dòng))
    • Broadcast Receiver(廣播接收器)
    • Service(服務(wù))
    • Content Provider(內(nèi)容提供器)
  • Activity
    應(yīng)用程序的每個(gè)界面都將是Activity類的擴(kuò)展。Acitvities用視圖(View)構(gòu)成GUI來(lái)顯示信息、響應(yīng)用戶操作。就桌面開發(fā)而言,一個(gè)活動(dòng)(Activity)相當(dāng)于一個(gè)窗體(Form)。
  • Intent Receiver
    應(yīng)用程序消息傳遞框架,它是各個(gè)組件之間的橋梁,它可以在給特定的服務(wù)傳播消息來(lái)執(zhí)行你的意圖。
  • Service
    Service組件在后臺(tái)運(yùn)行,更新你的數(shù)據(jù)源和可見的Activities,觸發(fā)通知(Notification)。在應(yīng)用程序的Activities不激活或不可見時(shí),用于執(zhí)行依然需要繼續(xù)的長(zhǎng)期處理。
  • Content Provider
  • Content Providers用于管理和共享應(yīng)用程序數(shù)據(jù)庫(kù)。是跨應(yīng)用程序邊界數(shù)據(jù)共享的優(yōu)先方式。

    2.4 Eclipse簡(jiǎn)介

    Eclipse是一種可擴(kuò)展的開放源代碼IDE。2001年11月,IBM公司捐出價(jià)值4,000萬(wàn)美元的源代碼組建了Eclipse聯(lián)盟,并由該聯(lián)盟負(fù)責(zé)這種工具的后續(xù)開發(fā)。集成開發(fā)環(huán)境(IDE)經(jīng)常將其應(yīng)用范圍限定在“開發(fā)、構(gòu)建和調(diào)試”的周期之中。為了幫助集成開發(fā)環(huán)境(IDE)克服目前的局限性,業(yè)界廠商合作創(chuàng)建了Eclipse平臺(tái)。Eclipse允許在同一IDE中集成來(lái)自不同供應(yīng)商的工具,并實(shí)現(xiàn)了工具之間的互操作性,從而顯著改變了項(xiàng)目工作流程,使開發(fā)者可以專注在實(shí)際的嵌入式目標(biāo)上。

    Eclipse框架的這種靈活性來(lái)源于其擴(kuò)展點(diǎn)。它們是在XML中定義的已知接口,并充當(dāng)插件的耦合點(diǎn)。擴(kuò)展點(diǎn)的范圍包括從用在常規(guī)表述過濾器中的簡(jiǎn)單字符串,到一個(gè)Java類的描述。任何Eclipse插件定義的擴(kuò)展點(diǎn)都能夠被其它插件使用,反之,任何Eclipse插件也可以遵從其它插件定義的擴(kuò)展點(diǎn)。除了解由擴(kuò)展點(diǎn)定義的接口外,插件不知道它們通過擴(kuò)展點(diǎn)提供的服務(wù)將如何被使用。

    2.4.1 Eclipse的優(yōu)點(diǎn)

    Eclipse的最大特點(diǎn)是它能接受由Java開發(fā)者自己編寫的開放源代碼插件,這類似于微軟公司的Visual Studio和Sun 微系統(tǒng)公司的NetBeans平臺(tái)。Eclipse為工具開發(fā)商提供了更好的靈活性,使他們能更好地控制自己的軟件技術(shù)。Eclipse 聯(lián)盟已經(jīng)宣布將在2004年中期發(fā)布其3.0版軟件。這是一款非常受歡迎的java開發(fā)工具,這國(guó)內(nèi)的用戶越來(lái)越多,實(shí)際上實(shí)用它java開發(fā)人員是最多的。缺點(diǎn)就是較復(fù)雜,對(duì)初學(xué)者來(lái)說(shuō),理解起來(lái)比較困難。

    3語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng)的需求分析

    3.1 功能需求

    基于android平臺(tái)的語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng),是通過語(yǔ)音與手機(jī)交換講話娛樂的系統(tǒng),通過系統(tǒng)能夠輸入對(duì)話的信息并語(yǔ)音閱讀出來(lái),實(shí)現(xiàn)了通過手機(jī)象對(duì)語(yǔ)音機(jī)器人一樣講話服務(wù)娛樂的功能。以下是語(yǔ)音識(shí)別應(yīng)用系統(tǒng)具備的功能:

  • 能夠和機(jī)器人進(jìn)語(yǔ)音進(jìn)行聊天,可以由軟件開發(fā)者修改數(shù)據(jù)庫(kù)里的對(duì)話內(nèi)容
  • 設(shè)有語(yǔ)音查詢天氣功能
  • 3.2 需求分析

    在軟件設(shè)計(jì)之前,我們需要做的就是在市場(chǎng)針對(duì)這一類型的軟件進(jìn)行調(diào)查,看是否能夠滿足于大部分人生活的需要,我們要做的工作就是對(duì)語(yǔ)音識(shí)別應(yīng)用系統(tǒng)實(shí)現(xiàn)的流程、操作等做出詳細(xì)的調(diào)查,從而了解系統(tǒng)需要實(shí)現(xiàn)的功能。系統(tǒng)在開發(fā)的過程中,經(jīng)過了較長(zhǎng)時(shí)間的設(shè)計(jì)階段,需要不斷的優(yōu)化和完善,

    4語(yǔ)音識(shí)別應(yīng)用系統(tǒng)的設(shè)計(jì)及相關(guān)技術(shù)

    4.1 功能框架

    本系統(tǒng)旨在建立Android手機(jī),主要有如下幾個(gè)核心功能模塊,如圖4-1所示:

    Android語(yǔ)音控制系統(tǒng)

    圖4.1 系統(tǒng)功能框架

    功能選擇

    語(yǔ)音記事本

    控制電燈

    添加

    刪除

    通過按鈕控制電燈開關(guān)

    通過語(yǔ)音控制電燈開關(guān)

    添加標(biāo)題

    添加的內(nèi)容存儲(chǔ)到數(shù)據(jù)庫(kù)中

    刪除對(duì)應(yīng)在數(shù)據(jù)庫(kù)的內(nèi)容

    圖4-1 軟件功能模塊流程圖

    各個(gè)模塊具體功能如下:

    語(yǔ)音記事本:

  • 添加模塊
    點(diǎn)擊menu后點(diǎn)擊添加進(jìn)入新的記事本,輸入標(biāo)題和添加記錄內(nèi)容,點(diǎn)擊確定BUTTON,保存到數(shù)據(jù)庫(kù)中
  • 刪除模塊
  • 點(diǎn)擊menu后,點(diǎn)擊刪除按鈕,即可刪除記錄

    控制電燈:

  • 按鈕控制模塊
    通過開/關(guān)Button,來(lái)控制燈的開關(guān)
  • 語(yǔ)音控制模塊
  • 通過按下語(yǔ)音Button,當(dāng)說(shuō)開燈/關(guān)燈時(shí)來(lái)控制燈的開/關(guān)

    4.2 系統(tǒng)實(shí)現(xiàn)流程圖

    啟動(dòng)模擬器后,首先進(jìn)入的是登錄界面,輸入用戶名和密碼后,進(jìn)入主界面,然后通過兩個(gè)下面的Button來(lái)選擇功能界面,并且進(jìn)行不同的操作,整個(gè)流程如圖4-2所示:

    開始

    主界面

    功能選擇

    功能選擇

    返回

    返回

    yes

    no

    說(shuō)笑話

    退出

    查詢地理位置

    系統(tǒng)幫助

    圖4-2系統(tǒng)實(shí)現(xiàn)流程圖

    4.3 用戶界面設(shè)計(jì)

  • 用戶登錄界面
    用戶登錄界面是系統(tǒng)運(yùn)行之后進(jìn)入的第一個(gè)顯示界面,用來(lái)完成用戶的用戶名和密碼登錄,確認(rèn)以后進(jìn)入主界面。
  • 主界面
    一進(jìn)入主界面通過按發(fā)音按鈕,可以和語(yǔ)音機(jī)器人進(jìn)行簡(jiǎn)單的語(yǔ)音聊天,可以通過發(fā)出“北京”等,查詢各個(gè)城市的天氣,并且由語(yǔ)音機(jī)器人進(jìn)行語(yǔ)音播報(bào)
    通過一個(gè)BUTTON按鈕,散開式樣的風(fēng)格進(jìn)行不同的功能選擇。
    說(shuō)笑話,可以讓機(jī)器人語(yǔ)音說(shuō)笑話
    查詢地址位置,當(dāng)選擇進(jìn)入語(yǔ)音記事本后,將進(jìn)入地理位置功能,將定位你目前的地理位置,自動(dòng)播報(bào)你當(dāng)前的所在位置。
    系統(tǒng)幫助界面,可以顯示機(jī)器人服務(wù)娛樂系統(tǒng)的玩法。
    退出,退出系統(tǒng)
    4.4 數(shù)據(jù)存儲(chǔ)設(shè)計(jì)
    數(shù)據(jù)存儲(chǔ)方式。可分為:SharePreference、SQLite、Content Provider和File。作為一個(gè)完整的應(yīng)用程序,數(shù)據(jù)存儲(chǔ)操作是不能缺少的。因此,Android系統(tǒng)一共提供了四種數(shù)據(jù)存儲(chǔ)方式。
    SQLite: SQLite是一個(gè)擁有強(qiáng)大功能的輕量級(jí)數(shù)據(jù)庫(kù),支持基本SQL語(yǔ)法,是常被使用的一種數(shù)據(jù)存儲(chǔ)方式。Android為此數(shù)據(jù)庫(kù)提供了一個(gè)名為SQLiteDatabase的類,封裝了一些操作數(shù)據(jù)庫(kù)的API。
    SharedPreference: 除了SQLite數(shù)據(jù)庫(kù)以外,另一種經(jīng)常被使用的數(shù)據(jù)存儲(chǔ)方式,其本質(zhì)就是一個(gè)xml文件,常用于存儲(chǔ)較簡(jiǎn)單的參數(shù)設(shè)置。
    File: 即常說(shuō)的文件(I/O)存儲(chǔ)方法,常用存儲(chǔ)大數(shù)量的數(shù)據(jù),但是缺點(diǎn)是在更新數(shù)據(jù)時(shí)效率低。
    ContentProvider: Android系統(tǒng)中用來(lái)實(shí)現(xiàn)所有應(yīng)用程序共享的一種數(shù)據(jù)存儲(chǔ)方式,由于數(shù)據(jù)通常在各自應(yīng)用間的是互相私密的,因而此存儲(chǔ)方式使用比較少,但是其又是必不可少的一種存儲(chǔ)方式。例如音頻,視頻,通訊錄,一般都可以使用此存儲(chǔ)方式。每個(gè)Content Provider都會(huì)對(duì)外提供一個(gè)公共的URI,當(dāng)有應(yīng)用程序有數(shù)據(jù)需要共享時(shí),就需要使用Content Provider為這些數(shù)據(jù)定義一個(gè)URI,之后其他的應(yīng)用程序就可以通過Content Provider傳入這個(gè)URI來(lái)對(duì)數(shù)據(jù)進(jìn)行操作。
    本文使用了SQLite數(shù)據(jù)庫(kù)來(lái)保存語(yǔ)音聊天的對(duì)話信息。系統(tǒng)保存了語(yǔ)音主人的問題和機(jī)器人的回答,通過SQLite數(shù)據(jù)庫(kù)中的保存的主人問題和TTS返回的resultString進(jìn)行模糊查詢。如果匹配成功,則返回機(jī)器人的回答,機(jī)器人的回答就是SQLite里保存的constant.ANS字段,當(dāng)然,實(shí)現(xiàn)這樣一個(gè)語(yǔ)音對(duì)話需要解決一系列技術(shù)問題。比如谷歌的語(yǔ)音包是不支持中文的,為了很快的進(jìn)行服務(wù)器的語(yǔ)音數(shù)據(jù)提取,目前最主流的語(yǔ)音包是來(lái)自科大訊飛的TTS語(yǔ)音包,支持中文,還有就是,數(shù)據(jù)庫(kù)如何創(chuàng)建;該數(shù)據(jù)庫(kù)包含哪些操作;接下來(lái)對(duì)數(shù)據(jù)庫(kù)的一些操作性的問題做個(gè)簡(jiǎn)單的解答:
  • SQLite數(shù)據(jù)庫(kù)如何創(chuàng)建?
  • 解答:我們都知道Android編程用的也是Java語(yǔ)言,傳統(tǒng)的數(shù)據(jù)庫(kù)創(chuàng)建和操作是基于一塊操作的,那么我們?cè)谧鯦AVA編程的時(shí)候就要很好地利用JAVA面向?qū)ο蟮奶攸c(diǎn),首先我們寫一個(gè)初始化的類,用來(lái)進(jìn)行數(shù)據(jù)庫(kù)和數(shù)據(jù)表的初始化,創(chuàng)建一個(gè)類constants,這個(gè)類專門對(duì)數(shù)據(jù)庫(kù)進(jìn)行初始化。這樣做的目的就是為了方便以后直接利用這個(gè)對(duì)象進(jìn)行數(shù)據(jù)庫(kù)的操作,這個(gè)類如圖4-3所示:

    圖4-3 數(shù)據(jù)庫(kù)的操作類圖

    代碼如下:

    public class constants extends Activity{

    //這里的代碼很重要,用來(lái)進(jìn)行數(shù)據(jù)庫(kù)的初始化工作

    public static final String DATABASE_NAME = "chat.db";

    public static final int DATABASE_VERSION = 1;

    public static final String CHAT_TABLE_NAME = "chat_table";//對(duì)話表名

    public static final String ANS = "ans";//對(duì)話問題 問題字段名

    public static final String QUS= "qus";//對(duì)話答案 答案字段名

    public static SQLiteDatabase db;

    public static final int ACTIVITY_CREATE = 0;

    public static final int ACTIVITY_EDIT = 1;

    }

    如上代碼所示,創(chuàng)建一個(gè)constants類來(lái)初始化數(shù)據(jù),在這里數(shù)據(jù)名為chat.db,數(shù)據(jù)表為chat_table,有兩個(gè)字段ans(主人的問題)和qus(機(jī)器人的回答).

    2.系統(tǒng)應(yīng)用到的數(shù)據(jù)庫(kù)主要就是查詢,事先就應(yīng)該將對(duì)話的數(shù)據(jù)全部寫進(jìn)去,在昨晚數(shù)據(jù)信息的初始化以后,下一步要做的就是繼承SQLiteOpenHelper來(lái)創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表,在public void Oncreate(SQLiteDatabase db)中進(jìn)行數(shù)據(jù)添加,

    代碼如下:

    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('你是大笨蛋','本機(jī)器人不是大笨蛋');";

    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('快點(diǎn)吃飯吧', '嗯,好的');";

    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('吵死了', '其實(shí)我一點(diǎn)也不吵');";

    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 系統(tǒng)關(guān)鍵技術(shù)設(shè)計(jì)

    4.5.1 Android用戶界面設(shè)計(jì)問題

    不去思考Android應(yīng)用程序的開發(fā)過程,對(duì)于用戶來(lái)說(shuō)最直觀的就是Android界面的美化,它直接的影響了用戶體驗(yàn),美工占據(jù)程序開發(fā)的一個(gè)很大一個(gè)部分的比重,因此對(duì)于Android應(yīng)用程序的界面布局來(lái)說(shuō)是很重要的。ndroid有三種方式來(lái)生成用戶的界面:xml配置生成,通過用戶自己來(lái)生成界面接口,通過用代碼來(lái)直接生成。依據(jù)MVC的原則,界面與程序的邏輯應(yīng)該互相分離開來(lái),所以xml配置生成界面的方式是最好的。下面主要介紹一下Android界面的布局問題:

  • FrameLayout(框架布局)
    FrameLayout是布局中最為簡(jiǎn)單的一個(gè)布局對(duì)象。它為你屏幕上定制一個(gè)空白備用區(qū)域,然后你就可以在其中填充一個(gè)單一對(duì)象 ,比如一張你要發(fā)布的圖片。但是你不能為FrameLayout中的一個(gè)子元素指定一個(gè)位置,因?yàn)樗鼤?huì)把其他元素中的一部份或全部擋住。
  • LinearLayout(線性布局)
    LinearLayout是自上而下或者自左向右來(lái)進(jìn)行排列。所有的子元素都會(huì)被排放在其它元素的后面,所以一個(gè)垂直的列表每行只有一個(gè)元素,不管他們寬度有多少。而每個(gè)水平方向的列表只會(huì)有一個(gè)行高。LinearLayout將會(huì)保持子元素之間的間隔以及互相對(duì)齊。
    LinearLayout同時(shí)還支持為單獨(dú)的子元素來(lái)指定weight。優(yōu)點(diǎn)就是允許子元素可以填充屏幕中的剩余空間。當(dāng)子元素被指定一個(gè)weight 值,剩余的空間就會(huì)按這些子元素所被指定的weight比例來(lái)分配給這些子元素。默認(rèn)的weight值為0。
  • AbsoluteLayout(絕對(duì)布局)
    AbsoluteLayout可以讓子元素按照x/y坐標(biāo)值來(lái)顯示在屏幕上。其中(0, 0)為左上角,當(dāng)向下或向右移動(dòng)時(shí),坐標(biāo)值將會(huì)變大。AbsoluteLayout布局中沒有頁(yè)邊框,因此允許元素之間互相重疊。
  • RelativeLayout(相對(duì)布局)
    RelativeLayout允許子元素來(lái)指定他們自己相對(duì)于其它元素的位置(通過ID指定)。因此,你可以通過對(duì)齊方式,或置于屏幕中央的形式來(lái)對(duì)兩個(gè)元素進(jìn)行排列。其中元素是按順序排列,因此如果第一個(gè)元素是在屏幕的中央,那么相對(duì)于這個(gè)元素的其它元素會(huì)以屏幕中央的位置來(lái)進(jìn)行排列。
  • TableLayout(表格布局)
  • TableLayout按表格的行列來(lái)指定位置。其中一個(gè)TableLayout是由很多的TableRow來(lái)組成,每個(gè)TableRow 自己都會(huì)定義一個(gè)row。TableLayout容器是不顯示邊框線的。每個(gè)row都會(huì)擁有0個(gè)或多個(gè)的cell;每個(gè)cell都將擁有一個(gè)View對(duì)象。而表格是由列和行來(lái)組成單元格的。

    4.5.2 主界面按鈕選擇問題

    在主界面中,想做到如果有特色的將按鈕一次性分布在主界面里,但是發(fā)現(xiàn)那樣做占據(jù)了空間,于是利用Animation動(dòng)畫實(shí)現(xiàn)了發(fā)散式按鈕的設(shè)計(jì),主要代碼如下:

    private void initialButton() // 加載個(gè)性按鈕的方法

    {

    // 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;

    // 設(shè)置邊距 (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都是按鈕的初始橫坐標(biāo)與縱坐標(biāo)的位置, TDelta和Delta都是后面的結(jié)束位置,實(shí)現(xiàn)的方法如下:

    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;

    }

    實(shí)現(xiàn)的效果如下圖:

    點(diǎn)擊前:

    點(diǎn)擊后:

    5語(yǔ)音機(jī)器人服務(wù)娛樂應(yīng)用系統(tǒng)的功能的具體實(shí)現(xiàn)

    5.1 用戶登錄界面的具體實(shí)現(xiàn)

    系統(tǒng)運(yùn)行后首先進(jìn)入用戶登錄界面圖(圖5-1):

    圖5-1 用戶登錄界面圖

    用戶登錄界面中用了可愛的風(fēng)格,用了固定的用戶名和密碼登錄的方式,判斷用戶名和密碼是否正確,如果正確,則進(jìn)入系統(tǒng)主界面。

    代碼實(shí)現(xiàn)如下:

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.login);

    //得到登錄按鈕對(duì)象

    login = (Button)findViewById(R.id.signin_button);

    //給登錄按鈕設(shè)置監(jiān)聽器

    login.setOnClickListener(lq);

    MyApplication.getInstance().addActivity(this);

    }

    //創(chuàng)建登錄按鈕監(jiān)聽器對(duì)象

    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);

    //判斷用戶輸入的用戶名和密碼是否與設(shè)置的值相同,必須要有toString()

    if("liuqian".equals(username.getText().toString())&&

    "123456".equals(password.getText().toString())){

    System.out.println("你點(diǎn)擊了按鈕");

    //創(chuàng)建Intent對(duì)象,傳入源Activity和目的Activity的類對(duì)象

    intent = new Intent(StartActivity.this, MainActivity.class);

    //啟動(dòng)Activity

    startActivity(intent);

    }else{

    //登錄信息錯(cuò)誤,通過Toast顯示提示信息

    Toast.makeText(StartActivity.this,"用戶登錄信息錯(cuò)誤" , 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 語(yǔ)音聊天功能的實(shí)現(xiàn)

    5.2.1 語(yǔ)音記事本主界面的實(shí)現(xiàn)

    圖5-2 語(yǔ)音聊天的主界面圖

    如上圖5-2所示,為語(yǔ)音聊天的主界面,點(diǎn)擊語(yǔ)音,就可以和機(jī)器人進(jìn)行語(yǔ)音聊天,如果單純是用谷歌的TTS的話,是不支持中文發(fā)音的,在網(wǎng)上查找了相關(guān)資料,找到了科大訊飛的語(yǔ)音包和TTS程序,首先要做的就是讓用戶說(shuō)話,進(jìn)行語(yǔ)音搜索,代碼如下:

    speakButton.setOnTouchListener(new Button.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {

    int action = event.getAction();

    switch (action) {

    // 按下按鈕先執(zhí)行一次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傳遞語(yǔ)音識(shí)別的模式,開啟語(yǔ)音

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

    // 語(yǔ)言模式和自由模式的語(yǔ)音識(shí)別

    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

    RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);

    // 提示語(yǔ)音開始

    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "開始語(yǔ)音");

    // 開始語(yǔ)音識(shí)別

    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);

    } catch (Exception e) {

    e.printStackTrace();

    Toast.makeText(getApplicationContext(), "找不到語(yǔ)音設(shè)備", 1).show();

    }

    }

    @SuppressLint("NewApi")

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    id = "";// 天氣編號(hào)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和數(shù)據(jù)庫(kù)中的字段進(jìn)行模糊匹配,能夠達(dá)到查詢的目的,再用tts.speak(text, queueMode, params);用來(lái)語(yǔ)音朗讀出返回的字段,注意這里的字段必須是String類型的,這也是開發(fā)中遇到的一個(gè)關(guān)于怎么樣將數(shù)據(jù)庫(kù)里的字段轉(zhuǎn)換為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);

    }

    }

    // 回調(diào)獲取從谷歌得到的數(shù)據(jù)

    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE

    && resultCode == RESULT_OK) {

    results = data

    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);// 取得語(yǔ)音的字符

    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 + "%" });

    // 模糊匹配的時(shí)候要加 兩個(gè) %,很重要的一句話

    if (c == null) {

    Log.i("cuolecuolecuolecuole", resultString);

    } else {

    if (c.moveToFirst()) {

    System.out.println(c.toString());

    Log.i("duile對(duì)了對(duì)了對(duì)了", c.toString());

    tts.speak(c.getString(c.getColumnIndex("ans")),

    TextToSpeech.QUEUE_ADD, null);

    // tts.speak("對(duì)哈對(duì)哈對(duì)哈", TextToSpeech.QUEUE_ADD, null);

    }

    }

    super.onActivityResult(requestCode, resultCode, data);

    }

    }

    下面是關(guān)于在Android中使用模糊查詢的三種方法:

    //1.使用這種query方法%號(hào)前不能加' ;

    Cursor c_test = mDatabase.query(tab_name, new String[]{tab_field02}, tab_field02+" LIKE ? ",

    new String[] { "%" + str[0] + "%" }, null, null, null);

    //2.使用這種query方法%號(hào)前必須加' ;

    // Cursor c_test=mDatabase.query(tab_name, new String[]{tab_field02},tab_field02+" like '%" + str[0] + "%'", null, null, null, null);

    //3.使用這種方式必須在%號(hào)前加' ;

    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 天氣預(yù)報(bào)功能的實(shí)現(xiàn)

    5.3.1 天氣功能的實(shí)現(xiàn)

    天氣預(yù)報(bào),是現(xiàn)在每個(gè)安卓用戶比不可少的一個(gè)應(yīng)用,它是通過從利用服務(wù)器上抓取JSON數(shù)據(jù),獲得天氣信息,并且允許轉(zhuǎn)化為對(duì)象。我們?cè)谶@個(gè)設(shè)計(jì)中,將它轉(zhuǎn)化成String型,用TTS讀出。方便懶人沒時(shí)間看天氣,說(shuō)出“北京”等城市即可,能夠有效地查詢當(dāng)日的天氣情況,查看是否需要添加衣服等,谷歌的天氣預(yù)報(bào)已經(jīng)停用,我們利用最有名的中國(guó)氣象網(wǎng),從那個(gè)網(wǎng)站抓取JSON數(shù)據(jù),那么,手機(jī)客戶端是怎么抓取數(shù)據(jù)的呢?

    看看中國(guó)中央氣象局的天氣數(shù)據(jù)該如何獲取?通過一個(gè)鏈接即可獲取到該城市地區(qū)的天氣數(shù)據(jù)信息,例如獲取揚(yáng)州的數(shù)據(jù)可使用http://m.weather.com.cn/data/101190601.html,來(lái)獲取,101190601是揚(yáng)州的城市ID,我們通過這個(gè)ID用來(lái)查詢中國(guó)中央氣象局里的城市天氣,這個(gè)ID用來(lái)區(qū)別全國(guó)34個(gè)省市及地區(qū)的唯一標(biāo)識(shí),就像是我們的身份證號(hào)一樣,來(lái)區(qū)別我們每一個(gè)人,我們要獲取該城市地區(qū)的天氣數(shù)據(jù)必須要通過他的ID號(hào)來(lái)獲取,不同于其他的一些天氣服務(wù)API,例如有的可直接通過漢語(yǔ)拼音來(lái)獲取,這些相對(duì)于ID來(lái)說(shuō)方便一些,至少我們不用去查該城市地區(qū)的ID號(hào),這也是中國(guó)中央氣象局API使用的一個(gè)局限性的地方。雖然麻煩一點(diǎn),但是我們使用別人的東西當(dāng)然要遵守別人的規(guī)則。

    城市ID,目前我收錄到一份有兩千多個(gè)城市地區(qū)的ID號(hào)。如圖5-3-1

    圖5-3-1 城市ID

    控制電燈的開關(guān),是android手機(jī)通過藍(lán)牙發(fā)送信號(hào)才能控制,因此,在操控時(shí)必須開啟藍(lán)牙,連接藍(lán)牙才能操控電燈的開關(guān)。

    android藍(lán)牙的操作分4步驟:建立本地藍(lán)牙;獲取遠(yuǎn)方藍(lán)牙設(shè)備;連接藍(lán)牙;發(fā)送socket通信。

  • 首先我們將citycode.txt保存在項(xiàng)目目錄的assets下,如圖5-3-2所示.
    我們定義String類型的id,用于將這個(gè)id發(fā)送到中國(guó)天氣網(wǎng)的服務(wù)器上,用于通過這個(gè)id抓取天氣數(shù)據(jù)
    代碼如下:
    id = findId(resultString);
    if (null == id || "".equals(id)) {
    Toast.makeText(MainActivity.this, "在集合中,沒有找到對(duì)應(yīng)城市id", 1).show();
    } else {
    // tts.speak(id.toString(), TextToSpeech.QUEUE_ADD, null);
    queryWeather();
    }
  • findId的方法的實(shí)現(xiàn)代碼如下:
    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])) {
    // 返回對(duì)應(yīng)編號(hào)
    return str[0];
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    return null;
    }
    這是Android中以數(shù)據(jù)流讀取assets文件夾中的文件內(nèi)容的方法,BufferedReader常用于讀取中文字符
  • JAVA開發(fā)是先整體,再局部,接著通過ID讀取從服務(wù)器抓取的天氣信息,實(shí)現(xiàn)代碼如下:
    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);// 寫到這里不會(huì)寫了,嗷嗚
    StringBuffer sb = new StringBuffer();
    sb.append("主人,你要查詢的天氣是:");
    sb.append(WF[0].getName());
    sb.append("今日溫度");
    sb.append(WF[0].getTemp() + "度");
    sb.append("今天風(fēng)向");
    sb.append(WF[0].getWind());
    sb.append("風(fēng)力指數(shù)");
    sb.append(WF[0].getWs());
    String str = sb.toString();
    tts.speak(str, TextToSpeech.QUEUE_ADD, null);
    }
    };
    thread.start();
    }
  • WeatherForm, JAVA Bean對(duì)象,如果關(guān)系到從服務(wù)區(qū)獲取或傳輸數(shù)據(jù),通常都要用到JAVA Bean,代碼如下:
    public class WeatherForm {
    /**城市名*/
    private String name;
    /**城市編號(hào)*/
    private String id;
    /**溫度*/
    private String temp;
    /**天氣描述*/
    private String weather;
    /**風(fēng)力*/
    private String wind;
    /**風(fēng)向*/
    private String ws;

    public WeatherForm(){

    }
    /**
    * 構(gòu)造方法
    * @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 + "]";
    }
    }
  • 那么,客戶端又是怎么樣從服務(wù)器端獲取數(shù)據(jù)的呢?這里用到了json數(shù)據(jù)的傳輸
  • 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對(duì)象

    try {

    HttpClient httpClient = new DefaultHttpClient();

    HttpResponse httpResponse = httpClient.execute(httpRequest);

    if

    (httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK) {

    // 取得返回的數(shù)據(jù)

    Weather_result=EntityUtils.toString(httpResponse.getEntity());

    }

    } catch (Exception e) {

    Log.i(TAG, e.toString());

    WF[0] = new WeatherForm();

    return WF;

    }

    // 以下是對(duì)返回JSON數(shù)據(jù)的解析

    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個(gè)日期暫時(shí)都存放一天的

    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("強(qiáng)制一下咯",WF[0].toString());

    }

    } catch (JSONException e) {

    Log.i(TAG, e.toString());

    WF[0] = new WeatherForm();

    return WF;

    }

    }

    return WF;

    }

    }

    這樣,就實(shí)現(xiàn)通過Http的Get方法獲取到了JSON數(shù)據(jù),從而實(shí)現(xiàn)了語(yǔ)音播報(bào)天氣的功能

    5.4 系統(tǒng)設(shè)計(jì)難點(diǎn)

  • 動(dòng)畫的實(shí)現(xiàn)
  • 如何根據(jù)在TTS發(fā)音的同時(shí),設(shè)計(jì)的動(dòng)畫也跟著運(yùn)動(dòng),在Android中的動(dòng)畫是由anim.xml來(lái)制作的,通過一幀一幀的圖片形成動(dòng)畫,代碼如下:

    <?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>

    利用一幀一幀的圖片形成了動(dòng)畫的效果,如圖5-4-1所示

    圖5-4-1 動(dòng)畫

    在開發(fā)過程中,首先定義private AnimationDrawable background;

    background = (AnimationDrawable) imageView.getBackground();

    發(fā)現(xiàn)在OnActivityResult用

    background.stop();

    background.start();

    并不能實(shí)現(xiàn)根據(jù)講話才播放動(dòng)畫

    解決方案如下:

    總 結(jié)

    本系統(tǒng)闡述了基于android平臺(tái)的語(yǔ)音機(jī)器人服務(wù)娛樂系統(tǒng)。設(shè)計(jì)中顯示出了Android平臺(tái)的優(yōu)勢(shì),分析Android的功能特征、架構(gòu)分析以及應(yīng)用程序的構(gòu)成。探討了本系統(tǒng)的需求分析、具體的功能模塊和界面的設(shè)計(jì),實(shí)現(xiàn)了語(yǔ)音聊天,語(yǔ)音查詢天氣,包括按鈕控制和語(yǔ)音控制,并且提供了一些具體功能的實(shí)現(xiàn)過程,很好地增強(qiáng)了用戶和使用者的體驗(yàn)

    在開發(fā)中也遇到一些調(diào)試錯(cuò)誤的問題,在老師的幫助下,及時(shí)的得到了解決。

    經(jīng)過測(cè)試本系統(tǒng)基本實(shí)現(xiàn)了語(yǔ)音識(shí)別的基本功能,通過本次系統(tǒng)的開發(fā),了解了語(yǔ)音識(shí)別以及語(yǔ)音合成的原理,能夠滿足用戶的基本需求。但是由于時(shí)間緊迫和本人的能力有限,本系統(tǒng)中還存在著一些不足之處,需要進(jìn)一步的完善和改進(jìn)。如果要進(jìn)一步繼續(xù)完善開發(fā),今后將會(huì)從下面幾個(gè)方面進(jìn)行功能的擴(kuò)展:提高語(yǔ)音機(jī)器人的智能性,增加趣味性,界面做的更加人性,美觀。希望在我以后的學(xué)習(xí)和工作生涯中繼續(xù)研究,繼續(xù)完善。

    紙上得來(lái)終覺淺,絕知此事要躬行,時(shí)間是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),總的來(lái)說(shuō),這次的課程設(shè)計(jì)對(duì)我來(lái)說(shuō)是一次非常難得的鍛煉和動(dòng)手實(shí)踐機(jī)會(huì)。使我對(duì)所學(xué)的專業(yè)課知識(shí)得到了融會(huì)貫通,得到了比任何一門課都大的提高和進(jìn)步。

    我認(rèn)為畢業(yè)設(shè)計(jì)對(duì)于我們來(lái)說(shuō)不是一次應(yīng)付學(xué)校,應(yīng)付老師的作業(yè),而是作為計(jì)算機(jī)專業(yè)的學(xué)生在大學(xué)這幾年的學(xué)習(xí)成果的最佳展現(xiàn)


    參考文獻(xiàn)

    [1]胡光銳,語(yǔ)音處理與識(shí)別,上海科學(xué)技術(shù)文獻(xiàn)出版社,1994.

    [2]深入淺出Google Android/E2Ecloud 工作室編著?!本?#xff1a;人民郵電出版2009.8

    [3] Google Android開發(fā)入門與實(shí)戰(zhàn)/靳巖,姚尚朗編著?!本?#xff1a;人民郵電出版社,2009.7

    [4] Google Android SDK開發(fā)范例大全/余志龍等編著;王世江改編?!本?#xff1a;人民郵電出版社,2009.7(2009.8重印)

    [5] 周迪偉.計(jì)算機(jī)語(yǔ)音處理[M].北京:國(guó)防工業(yè)出版社,1987,130-146

    [6] 王炳錫,屈丹,彭煊,實(shí)用語(yǔ)音識(shí)別基礎(chǔ)[M].北京:國(guó)防工業(yè)出版社,2005

    [7] 拉賓納 L,Rabiner Lawrence,阮平望, Juang Biing-Hwang, 語(yǔ)音識(shí)別基本原理, 清華大學(xué)出版社, 1999

    致 謝

    我希望時(shí)間慢點(diǎn)過,因?yàn)榭傆X得還有很多東西需要我們認(rèn)真學(xué)習(xí),回想起以前的大學(xué)生活,覺得來(lái)到了學(xué)校不虛此行,在大學(xué)里,我遇到了很多優(yōu)秀的老師和同學(xué),在我最迷茫的時(shí)候,是老師們給了我鼓勵(lì),指引了我前進(jìn)的方向,在我最失意的時(shí)候,是同學(xué)給了我支持,讓我堅(jiān)持我自己想走的路,感謝他們對(duì)我的幫助.

    此次的畢業(yè)設(shè)計(jì)的順利完成,在這里我要感謝我的指導(dǎo)老師:包依勤老師,從選題到設(shè)計(jì)制作到最后的論文的寫作和修改的整個(gè)過程中,包老師給了我很多指導(dǎo),讓我堅(jiān)持將這個(gè)畢業(yè)設(shè)計(jì)完成了下來(lái),讓我們能夠真正的做到,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),現(xiàn)在論文已快接近尾聲,在這里,我要對(duì)包老師表示最衷心的感謝,感謝他在我的開發(fā)過程中給予的幫助和鼓勵(lì),是他引領(lǐng)了進(jìn)入了實(shí)驗(yàn)室,感受了編程開發(fā)的快樂,也是他帶我們走進(jìn)了android的世界,在下課之余,老師也不厭其煩的回答我們各種在編程中遇到的問題,同時(shí)包老師嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度和刻苦的敬業(yè)精神給我留下了深刻的印象,他對(duì)編程的熱愛同時(shí)也感染了我們這些學(xué)生.謝謝你,老師

    此次畢業(yè)設(shè)計(jì)能夠順利完成,是在老師的指導(dǎo)下,讓我更加了解到了軟件開發(fā)的整個(gè)流程,讓我養(yǎng)成了治學(xué)嚴(yán)謹(jǐn)?shù)膽B(tài)度,這對(duì)我以后走出校園,進(jìn)入工作當(dāng)中是非常有益的.

    希望在我以后的工作和學(xué)習(xí)生活當(dāng)中,能夠像老師一樣,認(rèn)真對(duì)待生活中的每一件事.

    總結(jié)

    以上是生活随笔為你收集整理的基于android平台的语音机器人服务娱乐系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。