如何開發出你自己的Siri應用程序?
譯文什么是移動助手應用?
【2013年6月26日 51CTO外電頭條】移動助手應用應當包含以下功能:
- 它應是一款移動應用(包括Android、iOS、Windows Phone等平臺),
- 大家可以通過文字或語音進行提問,
- 大家可以通過文字、語音、圖像或者活動獲得應答信息,
- 它應涉及移動設備中固有的功能,例如麥克風、屏幕、GPS、互聯網、揚聲器以及存儲在設備中的信息。
移動助手應用能做些什么?
移動助手應用能實現很多功能,我所開發的首個版本僅僅能夠理解并回應十五條指令,但如今它已經能夠理解并回應超過五十條指令。基礎指令類型應當包含新聞、天氣、鬧鐘設置以及呼叫聯系人等。在移動市場中搜索移動助手軟件時,我發現以上幾類指令最為通用。下面我就列出一份需要預置在內指令列表,幫助大家的移動助手具備基本功能。
- 設置鬧鐘
- 從新聞、天氣、賽事比分及維基百科中獲取信息
- 運行應用程序
- 打開媒體文件(包括視頻與音樂)
- 在Facebook或者twitter等社交平臺上分享內容
- 讀取/編寫短信或電子郵件
- 讀取某些社交媒體分享內容
- 尋找最近的市場、藥房、醫院及餐廳等
- 呼叫某人
- 處理基本數學問題
- 檢查銀行存款余額
- 向某人匯出款項
- 檢查最近的貨幣或證券交易信息
- 讀取/設置日程表
- 購買演唱會或旅行票據
- 諸如此類
其中一些指令類型可以與第三方公司的業務相集成。舉例來說,大家可以通過集成讓自己的移動助手向Amazon或者Best Buy下達貨品訂單。
市場上現有移動助手匯總
目前市場上已經存在六十多種知名手機助手產品,其中人氣最高的當數Siri以及谷歌語音搜索方案。
以下表格列出了市場上的現有移動助手及其開發環境(編者注:僅包括國外)。
|
Siri與谷歌語音搜索人氣最高,也就無需贅述。下面我向大家介紹關于Nina、Lexee、Dragon移動助手以及Turkcell Mobil Asistan的簡要信息。
Nuance Nina: Nuance公司專為大型企業提供用于開發自有移動助手應用的SDK,開發成果可以充當企業客戶的服務應用。這款SDK可與iOS及Android應用相集成。感興趣的朋友不妨點擊此處查看其官方網站的介紹信息。
Lexee: Lexee是一款來自Angel Labs公司的移動助手,同時也提供足以創建自有移動助手的網絡環境。大家可以添加、更新及刪除各類方案,且無需通過網絡接口進行編碼。Lexee另一大值得稱道的重點在于分析工具。Angel Labs非常擅長分析工具的開發,因此Lexee環境也給用戶帶來專業級別的使用報告及數據匯總選項。
感興趣的朋友可以點擊此處了解更多信息并查看介紹視頻。
Dragon移動助手: Dragon移動助手是Nuance公司帶來的又一力作。Dragon移動助手允許用戶通過自然語言訪問各類內容,并輕松在手機上完成日常工作。大家可以點擊此處查看更多相關資料。
點擊此處則能夠下載這款應用,并觀看我個人最喜愛的移動助手介紹視頻。
Turkcell Mobil Asistan: Turkcell Mobil Asistan是Google Play商店中惟一一款來自土耳其的移動助手應用。Turkcell歐洲最大的全球移動通信企業之一。通過這款應用程序,大家可以為客戶提供包括手機賬單查詢、流量資費信息在內的各種輔助性服務。另外,它還能回答用戶關于伊斯坦布爾本地新聞、天氣、貨幣以及交通情況的問題。
大家可以點擊此處了解更多關于Turkcell Mobil Asistan的信息并下載這款應用。
#p#
移動助手中的技術要點
我希望上述信息能幫助大家了解移動助手的基本概念。下面我們再來看看關于這類應用程序的一些技術要點。移動助手應用應當涉及以下技術項目:
- 語音到文本(簡稱STT)引擎
- 文本到語音(簡稱TTS)引擎
- 標簽(智能)
- 降噪引擎
- Voice Biometrics,語音生物識別技術
- Speech Compression Engine,語音壓縮引擎
- 應答用戶界面
- STT: Speech2Text引擎能夠將來自用戶的語音轉化為文本信息。語音內容應可以來自語音文件或者數媒體信息。
- TTS: Text2Speech引擎能夠將文本內容轉化為語音信息。將回答文本轉化為語音形式非常重要,在用戶駕車等特殊情況下尤其如此。
- 標簽: 由STT創建出的文本內容有時候會比較復雜。標簽技術的介入能夠快速識別出用戶希望通過語音表達的主要意見。舉例來說,如果用戶詢問明天應該穿什么樣的衣物,標簽引擎會將信息記入天氣或者日程表標簽。
- 降噪引擎: 用戶輸入的語音信息有時候不太清晰,其中混入的噪音(例如空調機噪音)可能影響識別效果。降噪引擎會從語音中將白噪音消除掉。
- 語音生物識別技術: 移動助手能夠提供基于賬戶的細節信息,例如信用卡月度報告等。跟金錢掛鉤的當然是大事,因此身份識別機制就顯得極為重要。語音生物識別技術正是身份驗證方案中的一種。通過這種技術,移動助手能夠驗證使用者的身份,從而決定是否允許其進行系統操作。
- 語音壓縮引擎: 如果助手工作起來速度緩慢,用戶很可能由于失去耐心轉而打開瀏覽器去網上尋找答案,這就讓大家的心血付之東流了。互聯網通信狀態非常重要,而傳輸過程中所使用的數據包大小也同樣關鍵。小數據包的傳輸速度更快、獲取結果的速度也更為出色。有鑒于此,一款優秀的移動助手應用必須具備語音壓縮引擎。客戶端需要通過發送語音壓縮包來實現快速反應。不過語音壓縮與普通壓縮有所區別,這是因為語音文件中并不存在我們平時所見的重復數據。大家最好選用G711壓縮算法,它的勝出主要因為這種算法不會造成數據丟失。
- 應答用戶界面: 在服務器發回處理結果后,應用會播放一段語音應答,而設備屏幕中的應答界面也需給出對應信息提供。我個人的建議是,請不要使用本機組件,因為這樣會給應用造成限制。最好采用基于網絡的用戶界面,這種應用界面能夠更方便地在不同系統平臺中正確運作。
移動助手架構解析
移動設備與主服務器之間必然存在通信流,因為用戶當然不希望在使用應用的同時還要苦等語音數據下載完成。對于助手類應用而方,速度的重要性不言而喻——速度越快、用戶的使用感受也就越自然。在理想狀況下,用戶甚至會感到自己像是真的在與客戶代表或者助理開展交流。
當用戶按下按鈕、通過客戶端提出問題,客戶端會立即將問題一字節一字節地提交至主服務器(Main Server)。主服務器又將數據發送至STT服務器(STT Server),STT服務器從語音中整理出文本內容,然后將其傳回主服務器。接下來,主服務器將文本發送至標簽服務器(Tagging Server),旨在了解用戶的實際需要。標簽服務器為該條請求創建標簽,例如“weather_info”。標簽被發回之后,主服務器再次負責將標簽信息傳送至信息服務器(Information Server)。如果標簽內容涉及身份驗證機制,那么安全服務器(Security Server)將率先對其進行檢查,然后才放行至信息服務器。最后,響應結果進入主服務器,主服務器據此創建響應文本、響應圖像以及語音文本(借助TTS服務器)并將響應結果發送至移動設備。
信息服務器可以與第三方服務器進行通信,以獲取某些原本并未存儲在信息服務器當中的資訊。安全服務器則可以包含多種身份驗證技術,例如語音生物識別技術、IMSI-IP半徑查找、賬號密碼認證等等。
#p#
應答用戶界面
如果大家打算利用本機組件開發應答界面,那么最終軟件成果將很難在不同類型的客戶機上順利實現顯示格式與項目滾動的統一效果。我個人建議大家創建一套自定義Web視圖,這樣會讓應答格式的添加變得更為輕松。
上面圖片顯示的是SiriWebView在屏幕中的顯示效果。Web視圖可由用戶任意滾動,而且當新應答出現后、整個視圖會自動向上移動。
在本節中,我將向大家簡要介紹自己編寫SiriWebView的過程。在這里大家將看到關于web視圖的所有示例項目。向其它平臺的用戶們說聲抱歉,此處所舉的范例只適用于Android平臺。
首先,創建一個新類,并將其命名為SiriWebView。它基本上屬于由基本Android web視圖做出的擴展。這個類應該包含并覆蓋OnDraw函數,另外我們還應向其中添加兩個新函數。其一用于創始化,其二則用于添加新應答內容。以下代碼片段顯示的就是如何添加新應答內容。
- 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());
- }
- }
- }
- }
該函數中涉及兩個參數,分別是message與isResponse。大家可以在需要添加新應答內容時隨意寫入消息字串,并設定isResponse參數的值以調用該函數。該參數的作用是改變應答信息的字體顏色并滾動屏幕。在函數的第一行中,大家可以看到elementId參數。該參數對于對象的滾動處理非常重要。
在創建好自己的界面組件后,大家可以將成果添加到main_activity.xml當中,如下所示。
- <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"
- />
最終效果是什么樣?大家可以參照前面給出的截圖。