如何開(kāi)發(fā)出你自己的Siri應(yīng)用程序?
譯文什么是移動(dòng)助手應(yīng)用?
【2013年6月26日 51CTO外電頭條】移動(dòng)助手應(yīng)用應(yīng)當(dāng)包含以下功能:
- 它應(yīng)是一款移動(dòng)應(yīng)用(包括Android、iOS、Windows Phone等平臺(tái)),
- 大家可以通過(guò)文字或語(yǔ)音進(jìn)行提問(wèn),
- 大家可以通過(guò)文字、語(yǔ)音、圖像或者活動(dòng)獲得應(yīng)答信息,
- 它應(yīng)涉及移動(dòng)設(shè)備中固有的功能,例如麥克風(fēng)、屏幕、GPS、互聯(lián)網(wǎng)、揚(yáng)聲器以及存儲(chǔ)在設(shè)備中的信息。
移動(dòng)助手應(yīng)用能做些什么?
移動(dòng)助手應(yīng)用能實(shí)現(xiàn)很多功能,我所開(kāi)發(fā)的首個(gè)版本僅僅能夠理解并回應(yīng)十五條指令,但如今它已經(jīng)能夠理解并回應(yīng)超過(guò)五十條指令?;A(chǔ)指令類(lèi)型應(yīng)當(dāng)包含新聞、天氣、鬧鐘設(shè)置以及呼叫聯(lián)系人等。在移動(dòng)市場(chǎng)中搜索移動(dòng)助手軟件時(shí),我發(fā)現(xiàn)以上幾類(lèi)指令最為通用。下面我就列出一份需要預(yù)置在內(nèi)指令列表,幫助大家的移動(dòng)助手具備基本功能。
- 設(shè)置鬧鐘
- 從新聞、天氣、賽事比分及維基百科中獲取信息
- 運(yùn)行應(yīng)用程序
- 打開(kāi)媒體文件(包括視頻與音樂(lè))
- 在Facebook或者twitter等社交平臺(tái)上分享內(nèi)容
- 讀取/編寫(xiě)短信或電子郵件
- 讀取某些社交媒體分享內(nèi)容
- 尋找最近的市場(chǎng)、藥房、醫(yī)院及餐廳等
- 呼叫某人
- 處理基本數(shù)學(xué)問(wèn)題
- 檢查銀行存款余額
- 向某人匯出款項(xiàng)
- 檢查最近的貨幣或證券交易信息
- 讀取/設(shè)置日程表
- 購(gòu)買(mǎi)演唱會(huì)或旅行票據(jù)
- 諸如此類(lèi)
其中一些指令類(lèi)型可以與第三方公司的業(yè)務(wù)相集成。舉例來(lái)說(shuō),大家可以通過(guò)集成讓自己的移動(dòng)助手向Amazon或者Best Buy下達(dá)貨品訂單。
市場(chǎng)上現(xiàn)有移動(dòng)助手匯總
目前市場(chǎng)上已經(jīng)存在六十多種知名手機(jī)助手產(chǎn)品,其中人氣最高的當(dāng)數(shù)Siri以及谷歌語(yǔ)音搜索方案。
以下表格列出了市場(chǎng)上的現(xiàn)有移動(dòng)助手及其開(kāi)發(fā)環(huán)境(編者注:僅包括國(guó)外)。
|
Siri與谷歌語(yǔ)音搜索人氣最高,也就無(wú)需贅述。下面我向大家介紹關(guān)于Nina、Lexee、Dragon移動(dòng)助手以及Turkcell Mobil Asistan的簡(jiǎn)要信息。
Nuance Nina: Nuance公司專(zhuān)為大型企業(yè)提供用于開(kāi)發(fā)自有移動(dòng)助手應(yīng)用的SDK,開(kāi)發(fā)成果可以充當(dāng)企業(yè)客戶(hù)的服務(wù)應(yīng)用。這款SDK可與iOS及Android應(yīng)用相集成。感興趣的朋友不妨點(diǎn)擊此處查看其官方網(wǎng)站的介紹信息。
Lexee: Lexee是一款來(lái)自Angel Labs公司的移動(dòng)助手,同時(shí)也提供足以創(chuàng)建自有移動(dòng)助手的網(wǎng)絡(luò)環(huán)境。大家可以添加、更新及刪除各類(lèi)方案,且無(wú)需通過(guò)網(wǎng)絡(luò)接口進(jìn)行編碼。Lexee另一大值得稱(chēng)道的重點(diǎn)在于分析工具。Angel Labs非常擅長(zhǎng)分析工具的開(kāi)發(fā),因此Lexee環(huán)境也給用戶(hù)帶來(lái)專(zhuān)業(yè)級(jí)別的使用報(bào)告及數(shù)據(jù)匯總選項(xiàng)。
感興趣的朋友可以點(diǎn)擊此處了解更多信息并查看介紹視頻。
Dragon移動(dòng)助手: Dragon移動(dòng)助手是Nuance公司帶來(lái)的又一力作。Dragon移動(dòng)助手允許用戶(hù)通過(guò)自然語(yǔ)言訪(fǎng)問(wèn)各類(lèi)內(nèi)容,并輕松在手機(jī)上完成日常工作。大家可以點(diǎn)擊此處查看更多相關(guān)資料。
點(diǎn)擊此處則能夠下載這款應(yīng)用,并觀(guān)看我個(gè)人最喜愛(ài)的移動(dòng)助手介紹視頻。
Turkcell Mobil Asistan: Turkcell Mobil Asistan是Google Play商店中惟一一款來(lái)自土耳其的移動(dòng)助手應(yīng)用。Turkcell歐洲最大的全球移動(dòng)通信企業(yè)之一。通過(guò)這款應(yīng)用程序,大家可以為客戶(hù)提供包括手機(jī)賬單查詢(xún)、流量資費(fèi)信息在內(nèi)的各種輔助性服務(wù)。另外,它還能回答用戶(hù)關(guān)于伊斯坦布爾本地新聞、天氣、貨幣以及交通情況的問(wèn)題。
大家可以點(diǎn)擊此處了解更多關(guān)于Turkcell Mobil Asistan的信息并下載這款應(yīng)用。
#p#
移動(dòng)助手中的技術(shù)要點(diǎn)
我希望上述信息能幫助大家了解移動(dòng)助手的基本概念。下面我們?cè)賮?lái)看看關(guān)于這類(lèi)應(yīng)用程序的一些技術(shù)要點(diǎn)。移動(dòng)助手應(yīng)用應(yīng)當(dāng)涉及以下技術(shù)項(xiàng)目:
- 語(yǔ)音到文本(簡(jiǎn)稱(chēng)STT)引擎
- 文本到語(yǔ)音(簡(jiǎn)稱(chēng)TTS)引擎
- 標(biāo)簽(智能)
- 降噪引擎
- Voice Biometrics,語(yǔ)音生物識(shí)別技術(shù)
- Speech Compression Engine,語(yǔ)音壓縮引擎
- 應(yīng)答用戶(hù)界面
- STT: Speech2Text引擎能夠?qū)?lái)自用戶(hù)的語(yǔ)音轉(zhuǎn)化為文本信息。語(yǔ)音內(nèi)容應(yīng)可以來(lái)自語(yǔ)音文件或者數(shù)媒體信息。
- TTS: Text2Speech引擎能夠?qū)⑽谋緝?nèi)容轉(zhuǎn)化為語(yǔ)音信息。將回答文本轉(zhuǎn)化為語(yǔ)音形式非常重要,在用戶(hù)駕車(chē)等特殊情況下尤其如此。
- 標(biāo)簽: 由STT創(chuàng)建出的文本內(nèi)容有時(shí)候會(huì)比較復(fù)雜。標(biāo)簽技術(shù)的介入能夠快速識(shí)別出用戶(hù)希望通過(guò)語(yǔ)音表達(dá)的主要意見(jiàn)。舉例來(lái)說(shuō),如果用戶(hù)詢(xún)問(wèn)明天應(yīng)該穿什么樣的衣物,標(biāo)簽引擎會(huì)將信息記入天氣或者日程表標(biāo)簽。
- 降噪引擎: 用戶(hù)輸入的語(yǔ)音信息有時(shí)候不太清晰,其中混入的噪音(例如空調(diào)機(jī)噪音)可能影響識(shí)別效果。降噪引擎會(huì)從語(yǔ)音中將白噪音消除掉。
- 語(yǔ)音生物識(shí)別技術(shù): 移動(dòng)助手能夠提供基于賬戶(hù)的細(xì)節(jié)信息,例如信用卡月度報(bào)告等。跟金錢(qián)掛鉤的當(dāng)然是大事,因此身份識(shí)別機(jī)制就顯得極為重要。語(yǔ)音生物識(shí)別技術(shù)正是身份驗(yàn)證方案中的一種。通過(guò)這種技術(shù),移動(dòng)助手能夠驗(yàn)證使用者的身份,從而決定是否允許其進(jìn)行系統(tǒng)操作。
- 語(yǔ)音壓縮引擎: 如果助手工作起來(lái)速度緩慢,用戶(hù)很可能由于失去耐心轉(zhuǎn)而打開(kāi)瀏覽器去網(wǎng)上尋找答案,這就讓大家的心血付之東流了?;ヂ?lián)網(wǎng)通信狀態(tài)非常重要,而傳輸過(guò)程中所使用的數(shù)據(jù)包大小也同樣關(guān)鍵。小數(shù)據(jù)包的傳輸速度更快、獲取結(jié)果的速度也更為出色。有鑒于此,一款優(yōu)秀的移動(dòng)助手應(yīng)用必須具備語(yǔ)音壓縮引擎。客戶(hù)端需要通過(guò)發(fā)送語(yǔ)音壓縮包來(lái)實(shí)現(xiàn)快速反應(yīng)。不過(guò)語(yǔ)音壓縮與普通壓縮有所區(qū)別,這是因?yàn)檎Z(yǔ)音文件中并不存在我們平時(shí)所見(jiàn)的重復(fù)數(shù)據(jù)。大家最好選用G711壓縮算法,它的勝出主要因?yàn)檫@種算法不會(huì)造成數(shù)據(jù)丟失。
- 應(yīng)答用戶(hù)界面: 在服務(wù)器發(fā)回處理結(jié)果后,應(yīng)用會(huì)播放一段語(yǔ)音應(yīng)答,而設(shè)備屏幕中的應(yīng)答界面也需給出對(duì)應(yīng)信息提供。我個(gè)人的建議是,請(qǐng)不要使用本機(jī)組件,因?yàn)檫@樣會(huì)給應(yīng)用造成限制。最好采用基于網(wǎng)絡(luò)的用戶(hù)界面,這種應(yīng)用界面能夠更方便地在不同系統(tǒng)平臺(tái)中正確運(yùn)作。
移動(dòng)助手架構(gòu)解析
移動(dòng)設(shè)備與主服務(wù)器之間必然存在通信流,因?yàn)橛脩?hù)當(dāng)然不希望在使用應(yīng)用的同時(shí)還要苦等語(yǔ)音數(shù)據(jù)下載完成。對(duì)于助手類(lèi)應(yīng)用而方,速度的重要性不言而喻——速度越快、用戶(hù)的使用感受也就越自然。在理想狀況下,用戶(hù)甚至?xí)械阶约合袷钦娴脑谂c客戶(hù)代表或者助理開(kāi)展交流。
當(dāng)用戶(hù)按下按鈕、通過(guò)客戶(hù)端提出問(wèn)題,客戶(hù)端會(huì)立即將問(wèn)題一字節(jié)一字節(jié)地提交至主服務(wù)器(Main Server)。主服務(wù)器又將數(shù)據(jù)發(fā)送至STT服務(wù)器(STT Server),STT服務(wù)器從語(yǔ)音中整理出文本內(nèi)容,然后將其傳回主服務(wù)器。接下來(lái),主服務(wù)器將文本發(fā)送至標(biāo)簽服務(wù)器(Tagging Server),旨在了解用戶(hù)的實(shí)際需要。標(biāo)簽服務(wù)器為該條請(qǐng)求創(chuàng)建標(biāo)簽,例如“weather_info”。標(biāo)簽被發(fā)回之后,主服務(wù)器再次負(fù)責(zé)將標(biāo)簽信息傳送至信息服務(wù)器(Information Server)。如果標(biāo)簽內(nèi)容涉及身份驗(yàn)證機(jī)制,那么安全服務(wù)器(Security Server)將率先對(duì)其進(jìn)行檢查,然后才放行至信息服務(wù)器。最后,響應(yīng)結(jié)果進(jìn)入主服務(wù)器,主服務(wù)器據(jù)此創(chuàng)建響應(yīng)文本、響應(yīng)圖像以及語(yǔ)音文本(借助TTS服務(wù)器)并將響應(yīng)結(jié)果發(fā)送至移動(dòng)設(shè)備。
信息服務(wù)器可以與第三方服務(wù)器進(jìn)行通信,以獲取某些原本并未存儲(chǔ)在信息服務(wù)器當(dāng)中的資訊。安全服務(wù)器則可以包含多種身份驗(yàn)證技術(shù),例如語(yǔ)音生物識(shí)別技術(shù)、IMSI-IP半徑查找、賬號(hào)密碼認(rèn)證等等。
#p#
應(yīng)答用戶(hù)界面
如果大家打算利用本機(jī)組件開(kāi)發(fā)應(yīng)答界面,那么最終軟件成果將很難在不同類(lèi)型的客戶(hù)機(jī)上順利實(shí)現(xiàn)顯示格式與項(xiàng)目滾動(dòng)的統(tǒng)一效果。我個(gè)人建議大家創(chuàng)建一套自定義Web視圖,這樣會(huì)讓?xiě)?yīng)答格式的添加變得更為輕松。
上面圖片顯示的是SiriWebView在屏幕中的顯示效果。Web視圖可由用戶(hù)任意滾動(dòng),而且當(dāng)新應(yīng)答出現(xiàn)后、整個(gè)視圖會(huì)自動(dòng)向上移動(dòng)。
在本節(jié)中,我將向大家簡(jiǎn)要介紹自己編寫(xiě)SiriWebView的過(guò)程。在這里大家將看到關(guān)于web視圖的所有示例項(xiàng)目。向其它平臺(tái)的用戶(hù)們說(shuō)聲抱歉,此處所舉的范例只適用于A(yíng)ndroid平臺(tái)。
首先,創(chuàng)建一個(gè)新類(lèi),并將其命名為SiriWebView。它基本上屬于由基本Android web視圖做出的擴(kuò)展。這個(gè)類(lèi)應(yīng)該包含并覆蓋OnDraw函數(shù),另外我們還應(yīng)向其中添加兩個(gè)新函數(shù)。其一用于創(chuàng)始化,其二則用于添加新應(yīng)答內(nèi)容。以下代碼片段顯示的就是如何添加新應(yīng)答內(nèi)容。
- public void AddNewCallOut(String message, Boolean ismsgResponse) {
- elementId = elementId + 1;
- StringBuilder messageBuilder = new StringBuilder();
- if (!message.contentEquals("")) {
- if (!ismsgResponse) {
- messageBuilder
- .append("<table class='bubble-gray' cellspacing='0' cellpadding='0'><tr><td class='head'></td></tr>");
- messageBuilder
- .append("<tr><td class='mid'><div class='txt shadow'>"
- + message + "</div></td></tr>");
- messageBuilder
- .append("<tr><td class='foot'></td></tr></table>");
- } else {
- messageBuilder
- .append("<table class='bubble-blue' cellspacing='0' cellpadding='0'><tr><td class='bhead'></td></tr>");
- messageBuilder
- .append("<tr><td class='bmid'><div class='txt shadow'>"
- + message + "</div></td></tr>");
- messageBuilder
- .append("<tr><td class='bfoot'></td></tr></table>");
- }
- loadUrl("javascript:document.getElementById(\"div" + elementId
- + "\").innerHTML=\"" + messageBuilder.toString() + "\";");
- }
- StringBuilder jvscr = new StringBuilder();
- if (!ismsgResponse) {
- if (elementId != 1) {
- if (!ismsgResponse) {
- jvscr.append("var elem = document.getElementById('div"
- + (elementId - 1)
- + "'); var x = 0; var y = 0; while (elem != null) { x += elem.offsetLeft; y += elem.offsetTop; elem = elem.offsetParent; } ");
- jvscr.append("var endj=500; var i=window.scrollY; for(i=window.scrollY;i<y;i++){ var j=0; var a=0; for(j=0;j<endj;j++) {a=a+1; } window.scrollTo(x, i); } ");
- loadUrl("javascript:" + jvscr.toString());
- }
- }
- }
- }
該函數(shù)中涉及兩個(gè)參數(shù),分別是message與isResponse。大家可以在需要添加新應(yīng)答內(nèi)容時(shí)隨意寫(xiě)入消息字串,并設(shè)定isResponse參數(shù)的值以調(diào)用該函數(shù)。該參數(shù)的作用是改變應(yīng)答信息的字體顏色并滾動(dòng)屏幕。在函數(shù)的第一行中,大家可以看到elementId參數(shù)。該參數(shù)對(duì)于對(duì)象的滾動(dòng)處理非常重要。
在創(chuàng)建好自己的界面組件后,大家可以將成果添加到main_activity.xml當(dāng)中,如下所示。
- <com.example.siriui.SiriWebView
- android:id="@+id/webview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:keepScreenOn="true"
- android:layout_marginTop="0dp"
- android:layout_gravity="fill"
- android:layout_marginBottom="0dp"
- android:layout_marginLeft="0dp"
- android:layout_marginRight="0dp"
- android:scrollbars="horizontal"
- />
最終效果是什么樣?大家可以參照前面給出的截圖。