台北公車 範例 with Java SDK for Zenbo Junior II
0. 前言
華碩智慧機器人提供許多 Zenbo Junior II 範例程式,使開發者夥伴能更快速的去熟悉 Zenbo Junior II 程式的開發方式。本文件將以 DDE 上 Taipei Bus 語料為範例,說明如何在 Zenbo Junior II 搭配 Android SDK,產生一個支援對話的應用程式。
要執行台北公車範例程式,您的 Zenbo Junior II 需要使用 v17.2.2.63 以上的版本,可以在「設定」的「關於平板電腦」檢視「版本號碼」確認。而您的Zenbo Junior II SDK 需為需為v2.1.18.2129 以上的版本。
本文內容將包含下述幾點,在您完成以下 2 個主要步驟後,即可在 Zenbo Junior II 機台上體驗台北公車測試程式:
1. 在 DDE 網站上發佈語料並上傳到 Server。
[1] 在 DDE 匯入 Taipei Bus 語料範例。
[2] DDE 的基礎語料設定。
[3] Taipei Bus 的語料說明。
[4] 發佈自己的語料。
[5] 在 DDE 直接測試語料。
[6] 上傳語料至華碩開發者 Server。
2. 建置應用程式並安裝到 Zenbo Junior II 機台。
[1] 在 Zenbo Junior II 上執行 Android 範例程式。
希望在讀完本文後,能讓您快速上手第一個 Zenbo Junior II 的對話應用開發,協助您來完成所期望的應用程式及語料。
1. 在 DDE 匯入 Taipei Bus 語料範例
步驟 1:登入 DDE 網站
網址為 https://zenbo.asus.com/developer/tools/ds-editor.jsp。
進入網站後,請在 Project Center 點選 Import Template Project。
步驟 2:載入 Taipei Bus 範例語料
選擇 Template Project : 台北公車王 (Taipei Bus Example),點選 Add 鍵,即可匯入專案。
2. DDE 的基礎語料設定
為了後續能連結到您的 App,我們首先需要請您做些基本的設置,包含 Domain ID、Package Name 等相關的設置,未來您也可以透過直接修改這個 Template,來產生您所需要的語料。
首先,請先點選 台北公車王的 Project 下的 Edit 按鈕,開始編輯該專案。
由於每個語料皆需要對應的 Domain ID,因此需要先申請一個 Domain ID。申請 Domain ID 的步驟如下:
步驟 1:進入 Info 選單
點選 Menu 中 Info 按鈕。
步驟 2:註冊 Domain ID
點選 Project Info 中的 Register。
步驟 3:填入 Domain Name
在 Register a new Domain 的視窗中填入您的 Domain Name 和描述,並按下 Create。
步驟 4:儲存 Project Info
回到 Project Info 中,我們會看到在 DDE Domain ID 中,出現一組新的 Domain,其中包括一個系統配發的數字,而後面的括號裡則會有您剛剛所輸入的 Domain Name,請您選取這個 Domain,並點選 Save 以儲存 Project Info。
為方便後續章節的說明,在 Package Name、App Name 及 Launch Activity 的部分,請您先保留 Template 的預設值,因為相關設置都需要對應到您實作的 Android App。
Taipei Bus 範例語料中上述欄位的預設值如下:
- Package Name:com.asus.template.taipeiBus
- App Name:台北公車王
- Launch Activity:activity
您可以檢視當前的設定是否維持預設值,如您調整預設值,在後續章節中的對應值,或在未來如您實作自己的 Android App,也將會需要做相應調整。
完成上述四個步驟後,即完成 DDE 上的基本 Domain 設定。
3. Taipei Bus 的語料說明
本章節中為您說明語料編輯方式。您若想先快速使用範例程式可以先略過本章節的說明,之後再回來繼續了解如何設計語句,完成您的應用程式。
一個基本的語料由 Plans、Intents 和 Concepts 組成,以下將簡要說明每一個部分,並將以 Taipei Bus 為例說明。
3.1 Plans 說明
Plan 用來串接語句結果、參數及系統狀態,以下將會對其中幾項重要設置做說明:
- Is the plan able to launch the app:設值為 true 時,表示此 Plan 為 Cross Intent。亦即不需要前置的 Plan,只要當使用者說出對應語句,即會進入該 Plan。
- Input Context:需要將前項 Is the plan able to launch the app 設值為 false 時才可填入,如果沒有填值,則效力將會等同於前項 Is the plan able to launch the app 設值為 true。 Input Context 表示只有在系統於此 Context 狀態下時,才會允許進入該 Plan。
- Events:為 Plan 的觸發條件,需連結到所設計的對應 Intent。關於 Intent 的詳細說明將會在後續的 3.2 章節中為您介紹。
- Actions:當觸發了此 Plan 之後,可設定系統要轉換到哪項 Output Contexts 的狀態,並可設定對應各別語系所要發出的 TTS 語句。
- Beliefs:設置該 Plan 預期要抽取的參數,以及設計倘若缺少該參數時的回問方式,此處參數名稱需與在 Intent 中的設計一致。
以範例語料 Taipei Bus 為例,語料中一共實作了五個 Plan,相互之間的關係及個別 Plan 的說明如下:
下圖為 Domain 總覽圖,在各 Plan 前方標註觸發所需的 Context,而下方則有語句的範例供參考。以 queryBusWhenArriveStation 為例,其屬於第二階層 Plan,表示當使用者說「我要用台北公車王」後,會先進入到 startApp 並輸出「taipeiBus_begin」的 Output Context,隨後如果使用者說出了「紅 22 何時到關渡捷運站」語句,由於 queryBusWhenArriveStation 要求的 Input Context 條件為「taipeiBus_begin」,因為此時已符合觸發該 Plan 所需達成的上下文脈絡條件,所以才可能打中 queryBusWhenArriveStation 內的意圖。
- taipeiBus.plan.user.startApp
該 Plan 中,「Is the plan able to launch the app?」項目設值為 true,表示這個 Plan為 Cross Intent,也就是表示無需處在特定的上下文脈絡下就能被觸發。在 Events 中設置 taipeiBus.intent.user.startApp 為此 Plan 所連結的 Intent,而 Intent ID 後方括號中的內容則表示所選用 Intent 的支援語言,當值為 All 時表示將會支援所有的語系。
- taipeiBus.plan.user.queryBusWhenArriveStation
該 Plan 中,「Is the plan able to launch the app?」項目設值為 false,並且其中的「Input Context」的欄位為「taipeiBus_begin」,表示此為 Context 下的 Plan,需要進入到「taipeiBus_begin」這個上下文脈絡後,該 Plan 才有機會被觸發。
- taipeiBus.plan.user.querySpecificBus
該 Plan 中,其 Output Context 除了「taipeiBus_begin」之外,還有「querySpecificInfo」。所以如同 Domain 總覽中所揭示的 Plan 間關係所示,需先進入「querySpecificInfo」的上下文脈絡後,才可能觸發後續將會介紹到的兩個 Plan。
- taipeiBus.plan.user.querySpecificBus.startStationAndTime
該 Plan 中,Input Context 需要「querySpecificInfo」,所以從總體 Domain 的角度來觀察,則該 Plan 為第三階層,需要 startApp 輸出「taipeiBus_begin」,並且隨後進入 querySpecificBus 輸出「querySpecificInfo」後,該 Plan 才會被觸發。另外,雖然在 Output Context 中還會輸出「response_startStationAndTime」,但因為後續還沒有其他的 Plan 需要這項 Input Context,所以實際上還不會產生效果。
- taipeiBus.plan.user.querySpecificBus.willPassSpecificPlaceOrNot
該 Plan 中,目前 TTS 的類別設為 Text,並選用繁中做為指定語系,但您也可以在 TTS 頁籤中建立所需的回應句列表及指定語系後,於此選用 Reference 並選擇您所建立的 TTS 回應句列表。
3.2 Intent 說明
Intents 我們稱之為「意圖」。在一個意圖內可以設計多個句型,而一個句型可由多個詞彙來組合。在 DDE 的介面顯示上,會再被細分為以藍色或橘色的方塊來呈現不同的用途。
藍色方塊為直述文字,本文之後將簡稱為藍字;橘色方塊則為引用的 Concept,本文之後簡稱為橘字;而淡橘色方塊也是橘字的一種,是表示該 Concept 可有可無,不是必需條件。
建立 Intent 輸入語句時,如果需要引用 Concept,可輸入@後挑選所需的 Concept,可選擇系統內建的預設 Concepts 或自訂的 Concepts。
您在設計 Intents 時,也能分別依照不同的語系來設計各別的意圖語句,目前提供的語系選項包括英文、繁體中文、簡體中文、廣東話、日本語,將會對應使用者Zenbo Junior II 機台的語系設定,來提供不同語系的意圖支援。如果您設計意圖時,選擇All 則表示在機台語系設定切換至上述各語系時,系統都將支援此 Intent 的意圖語句。
若在意圖中需要抽取參數,需要為其加入 Belief Name,設定方式是在要設定的橘字上,點擊滑鼠左鍵,並在 Set Belief Name 處設定參數名稱。
橘字還可以設定使用的方式,例如是否要依順序(Order)使用、是否為可選(Optional)項目、完全命中(PerfectMatch),都將會影響到語句是否可擊中所設計的意圖。詳細的操作方式,可以參考 DDE 的使用教學文件。
以 Taipei Bus 範例為例,該範例總共設計了五個意圖,分別說明如下:
- taipeiBus.intent.user.startApp
本意圖設計兩個句型,第一個句型由五個部分組成,一個藍字,一個橘字,以及三個淡橘色的橘字。而<VoiceTag>可以代入台北公車王、公車王、台北公車,也就是當使用者講「我要用台北公車王」,即會選中這一個意圖。
- taipeiBus.intent.user.queryBusWhenArriveStation
本意圖中設計了兩個句型,第一個句型是由一個藍字,以及三個淺橘字所組成。在BusColorLine 這個 Concept 內有「紅」、「綠」、「棕」、「藍」等詞彙,而預設的 base.generic.number 可用於帶入任意數字」,在BusStopStation 這個Concept內則是有「關渡捷運站」、「捷運關渡站」等詞彙,表示當使用者說「紅 22 何時到關渡捷運站」或「紅 35 何時到捷運關渡站」等語句時,皆會命中此意圖。
- taipeiBus.intent.user.querySpecificBus
本意圖中僅設計了一個句型,是由一個橘字,以及一個淺橘字所組成。在淺橘字 BusColorLine 這個 Concept 內有「紅」、「綠」、「棕」、「藍」等詞彙,而橘字的 base.generic.number 可用於帶入任意數字,因為淺橘字表示 Optional,表示當使用者說「紅 22」、「757」、「302」等語句時,皆會命中此意圖。
- taipeiBus.intent.user.queryBusWhenArriveStation
本意圖中設計了六個句型,各句型皆由藍字所組成。表示當使用者說出完整語句時會命中此意圖,例如「這班車的起始站是哪邊」或「第一班車是幾點」等。
- taipeiBus.intent.user.queryBusWhenArriveStation
本意圖中設計了兩個句型,兩個句型都是由一個藍字,以及一個淺橘字所組成。在預設的 base.geo.location 中可用於帶入地點的名稱,如「北投區」、「關渡」等詞彙,而藍字雖然預期收到完整語句,但仍有一定程度的容錯範圍,這也就表示當使用者說「這班車會不會經過北投區」或「會經過關渡嗎」等語句時,皆會命中此意圖。
3.3 Concept 說明
Concept 為詞彙的集合,您可以把同類型詞彙都定義在同一個 Concept 內,以方便管理。
另外,請留意 Concept 需要依據語系來設計的,如希望該詞彙在所有語系皆可支援,則可選擇 all,否則請加入在指定語言的列表中。您可點選 + different lang 處新增所要支援的語系詞彙,目前提供英文、繁體中文、簡體中文、廣東話、日本語的語系選項。
以 Taipei Bus 範例為例,該範例總共設計了四個 Concept,分別說明如下:
- BusStopStation
在BusStopStation 有 5 組Instance 分別為BusStopStation001~BusStopStation005。在每個 ID 後方欄位裡,皆可以填入一組同義詞。以 BusStopStation004 為例,即表示「關渡捷運站」、「關渡站」、「捷運關渡站」這三個詞彙,在本應用中代表著相同意義。
- BusColorLine
在 BusStopStation 有 4 組 Instance 分別為 red、green、brown、blue,每個 ID 後方欄位都填入了一組同義詞,例如「紅」、「紅線」。如果您將 Normalize instance synonyms設為 true,則當收到「紅」或「紅線」時,將正規化為「red」,若您希望收到的 Concept內容與使用者實際說出的語句用詞相同,則您需要將此項設為false。
- 動作
在動作中有 2 組 Instance 分別為 take 及 search,每個 ID 後方欄位裡,都填入了一組同義詞。雖然前面的 Concept 都用在名詞上,但其實 Concept 不僅可以用於名詞,若您使用於動詞上,更可以快速地擴增您所設計的意圖,使其支援更多的語句。
- 事件
在事件中有 1 組 Instance 為 bus,而在 ID 後方欄位裡,目前填入了一組各種語系混雜的同義詞,並指定為繁中語系,如果您想要將台北公車王用於支援更多語言,則您可以嘗試將範例中的「大巴士」、「巴士」、「公車」、「bus」分類到不同語系,或調整目前的「繁中」設定,改為「All」以支援所有語系。
4. 發佈自己的語料
語料編輯完後,需要完成發佈的動作之後,才可以在 DDE 介面上做測試,而發佈語料的步驟如下:
步驟 1:發佈語料
點選螢幕右方的 Publish 按鈕,之後會跳出 Data Validation 的畫面。
步驟 2:資料驗證
請點選 Continue To Publish,畫面會跳出 Validation 的結果。若顯示「Success!!」表示資料驗證無誤。
步驟 3:完成語料發佈
請點選 Continue To Publish。
執行完畢後,上方會跳出 Success 資訊,表示此時已發佈成功。
5. 在 DDE 直接測試語料
在 DDE 頁面的右端,有提供一個語料測試的工具介面,您可以透過文字方式,在此模擬語句與對話意圖間的關係,確認是否能讓目標語句擊中您所預期的意圖,及能否取得您所需要的參數值。
下圖為輸入「我要用台北公車王」後的回傳結果。
6. 上傳語料至華碩開發者 Server
在DDE 上實際對建置的語料測試完畢後,您此時可以將語料上傳到華碩開發者Server 上,之後您便可在 Zenbo Junior II 上將語料下載到機台中使用。
步驟 1:上傳語料
在 Dev 頁籤下點擊「Deploy To Download Server」,將語料上傳 Server。
步驟 2:取得 Metadata(重要步驟)
點擊跳出的完成畫面右下方的「Copy the meta-data to Clipboard」按鈕,複製 Manifest 文字訊息。在開發 Android App 時,會需要將 Manifest 文字訊息貼上到 Android Manifest 中,操作步驟我們將在後續的 7.1.3 章節中為您詳細說明。
7. 在 Zenbo Junior II上執行範例程式
在本章節中,將向您說明如何在 Zenbo Junior II 機台上執行您開發的應用程式,以下段落將為您詳細說明Android SDK 執行範例程式的方式,並為您說明範例程式所使用到的 SDK 功能。
7.1 以 Android SDK 方式執行範例程式
7.1.1 範例程式下載位置
前往華碩開發者平台,網址為 https://zenbo.asus.com/developer/tools/zenbo_junior_ii
點選頁面中間 Zenbo Junior II SDK 區塊的 Download 按鍵下載 SDK 及範例程式。
7.1.2 設定 Android 開發環境
開啟 Android Studio,確認您已經下載了 Android 10.0 的 SDK。如尚未下載,請點選 File 下的 Settings。
在 Android SDK 勾選 Android 10.0,並點選 OK 鍵,即完成 Android SDK 10.0 的安裝。
開啟ZenboJuniorSDK_and_SampleCode 專案資料夾,其中 RobotDSBus 即為Taipei Bus的範例程式。我們接下來將會在這支範例程式上,與您一起完成您的第一支Zenbo Junior II 應用程式。
在您初次開啟範例程式專案時,如出現錯誤訊息「ERROR: SDK location not found. Define a location by setting the ANDROID_SDK_ROOT environment variable or by setting the sdk.dir path in your project's local.properties file.」,則您可以點擊在錯誤訊息中的藍色文字「Set sdk.dir in local.properties and sync project」來排除 SDK 路徑問題,完成後 Build 訊息欄位將顯示如「CONFIGURE SUCCESSFUL in 1s」的執行成功訊息,之後當您再次使用範例程式專案時,就不會再遇到此問題。
7.1.3 Android 範例程式設定
步驟 1:修改 Manifest
開啟ZenboDialogSample\src\main 路徑下ZenboDialogSample 中的AndroidManifest.xml檔案,以「Deploy to Download Server」時所複製到剪貼簿中的字串,覆蓋掉下圖反白處的字串。如您未保留 Deploy 階段時的字串內容,請您參考第 6 章操作方式再次 Deploy 語料之後,複製所需的 Manifest 文字訊息。
您所複製的 Manifest 字串內,包含 Domain 語料的 UUID、語料版本、Package Name,應該會是呈現如下的結構:
<meta-data android:name="zenbo_ds_domainuuid" android:value="3B43D11CDADC4E6C834654AFB07BF348"/>
<meta-data android:name="zenbo_ds_version_3B43D11CDADC4E6C834654AFB07BF348" android:value="0.0.1"/>
<meta-data android:name="zenbo_ds_package" android:value="com.asus.template.taipeiBus"/>
步驟 2:設定安裝時自動更新語料
在AndroidManifest 檔案中,加入下述內容,讓語料在安裝 APK 過程中可以自動進行更新。
<meta-data android:name="zenbo_ds_auto_update" android:value="true"/>
步驟 3:更新範例程式中的 UUID
修改專案中的 Bus.java,將 Android Manifest 中的 UUID,覆蓋掉程式中 DOMAIN 的值,路徑 ZenboJuniorSDK_and_SampleCode\RobotDSBus\src\main\java\com\asus\template\taipeiBus。
7.1.4 Android 範例程式說明
我們定義了幾項建議開發者設置的全域變數,可以方便您後續操作 SDK 行為,以下參數分別對應到 Log Tag、Domain UUID、Domain ID、Package Name,範例中將使用到 TAG 以及 DOMAIN,而您可視需求決定是否建立 DOMAIN_ID、PKG_NAME 等參數。
public final static String TAG = "TaipeiBus";
public final static String DOMAIN = "3B43D11CDADC4E6C834654AFB07BF348";
public final static String DOMAIN_ID = "16668"";
public final static String PKG_NAME = "com.asus.template.taipeiBus";
public final static String Version = "20201130_1250";
protected void onResume
調用 Zenbo Junior II 的 SDK,包括 setExpression、jumpToPlan、speakAndListen、speak,在接下來我們將逐一做介紹。
protected void onResume()
{ super.onResume();
// close faical
robotAPI.robot.setExpression(RobotFace.HIDEFACE);
// jump dialog domain
robotAPI.robot.jumpToPlan(DOMAIN, "taipeibus.intent.user.startApp");
// listen user utterance
robotAPI.robot.speakAndListen("歡迎使用台北公車王", new SpeakConfig().timeout(20));
// robotAPI.robot.speak("歡迎使用台北公車王", new SpeakConfig().timeout(20));
// show hint
mTextView.setText(getResources().getString(R.string.dialog_example));
}
setExpression
用於為 Zenbo Junior II 設置各式表情,我們共提供 27 種表情,您可以在需要時為 Zenbo Junior 指定符合語境或行為的表情反應,包括 ACTIVE、AWARE_LEFT、 AWARE_RIGHT 、 CONFIDENT 、 DEFAULT 、 DEFAULT_STILL 、 DOUBTING 、 EXPECTING 、HAPPY 、HELPLESS 、HIDEFACE 、IMPATIENT 、INNOCENT 、 INTERESTED、LAZY、OTHER_USE、PLEASED、PRETENDING、PREVIOUS、PROUD、 QUESTIONING、SERIOUS、SHOCKED、SHY、SINGING、TIRED、WORRIED。
jumpToPlan
用於指定要觸發的 Plan,當您需要跳轉到指定的 Plan 時就可以使用,需要提供您要跳轉的 Domain UUID 及 Plan Name。因為我們在程式開頭處已經設置相關全域變數了,所以請直接填 DOMAIN 即可,而 Play_Basic 則改成您想要跳轉觸發的 Plan。
speakAndListen
表示在 Zenbo Junior II 發完 TTS 語音後,將會自動收音來取得使用者的回應語句。您可以調整 SpeakConfig 以操作 TTS 的行為,如語速、音調、收音時間等。
speak
表示 Zenbo Junior II 在發完 TTS 語音後,即完成行為。您同樣可以調整 SpeakConfig來操作 TTS 的行為。
protected void onPause
在 onPause 階段,以 stopSpeakAndListen 強制中斷尚未完成的發話及收音行為。
protected void onPause()
{ super.onPause();
//stop listen user utterance
robotAPI.robot.stopSpeakAndListen();
}
public static RobotCallback.Listen robotListenCallback
這支程式主要架構在 RobotCallback.Listen,也就是 CSR 收音內容送到 Server 端處理完畢後,回到 Local 端的 Callback 中,在 RobotCallback.Listen 的 onResult 中,會收到 Server 回傳的 JSON 物件,其中就是語意理解完成後得到的資訊,接下來將為您逐一做介紹。
public static RobotCallback.Listen robotListenCallback = new RobotCallback.Listen()
{ @Override
public void onResult(JSONObject jsonObject)
{ String text;
text = "onResult: " + jsonObject.toString();
Log.d(TAG, text);
try{
String domain = RobotUtil.queryListenResultJson(jsonObject, "domain");
String utterance = RobotUtil.queryListenResultJson(jsonObject,"correctedSentence");
String response = RobotUtil.queryListenResultJson(jsonObject, "output_text");
String beliefs = RobotUtil.queryListenResultJson(jsonObject, "beliefs");
if(domain.equalsIgnoreCase(PKG_NAME)) {
if( (response!=null && !response.isEmpty()) && (utterance!=null && !utterance.isEmpty()) ) {
String showText = "CSR: " + utterance + "\n" + "TTS: " + response;
if(beliefs != null && !beliefs.isEmpty() && !beliefs.equals("{}")){
showText += "\n" + "PARAM: ";
String belief = "";
ArrayList<String> keys = getBeliefArray(beliefs);
for(String key : keys){
belief = getBeliefValue(beliefs, key);
showText += belief + " ";
}
}
mTextView.setText(showText);
// robotAPI.robot.speakAndListen(response, new SpeakConfig().timeout(20));
}else{ mTextView.setText(utterance); }
}
}catch(Exception e){ e.printStackTrace(); }
}
}
首先,以 queryListenResultJson 解析收到的JSONObject,此處為您介紹五個常用參數的用途,除了範例程式中有使用到的 IntentionId 外,還包括 domain、correctedSentence、 output_text、beliefs 等。這五項資訊的涵義如下:
1. domain: Package Name;
2. IntentionId: 語句的意圖,可以對應 DDE Domain Project 上的 Plan ID;
3. correctedSentence: 是經過校正後的 CSR 內容,若您需要的是原始的 CSR 內容,則請您取用 originalSentence;
4. output_text: 依據您定義的 Intent,此時要發出的 TTS 內容;
5. Beliefs: 為您所有抽取到的參數內容。在後方 PARAM 相關段落中,則為您示範如何以遍歷的方式取得 beliefs 參數的內容,詳情您可以參考 getBeliefArray、getBeliefValue 中的操作方式。
如果您在測試過程中,Log 中所印出的 Intention 值為空字串,可能是表示您未能成功擊中該意圖,這時就需要您檢視意圖設計語句內容,以確認您設計的語句是否能涵蓋實際辨識出的文字內容。
若您對於完整的 Zenbo Junior II SDK 功能感到興趣,可以前往華碩 Zenbo Junior 開發者網站參考 Zenbo Junior SDK 的 API 文件,其中將為您介紹更多 Zenbo Junior II SDK API 項目,網址為 https://zenbo.asus.com/developer/documents/zenbo_junior_ii/Zenbo-Junior-SDK/DialogSystem
7.1.5 在 Zenbo Junior II 上安裝並執行範例程式
在本章節中,將與您一起把範例程式安裝到 Zenbo Junior II 機台中實際執行,首先我們需要將您的專案輸出為可以安裝的 APK 檔案。
步驟 1:建置專案
依序點擊 Build 頁籤的 Clean Project、Rebuild Project,無需等待 Clean Project 完成,即可點擊 Rebuild Project,Android Studio 將會為您安排依序執行。
步驟 2:建置 APK
在 Android Studio 提示流程完成後,請到 Build 頁籤的 Build Bundle(s) / APK(s)選項,點擊您所需的輸出格式,若要輸出 APK 格式則請點擊 Build APK(s),開始輸出 APK 檔案。
步驟 3:取得 APK 檔案
當 Android Studio 提示已完成 APK 檔案輸出後,請前往專案路徑下取得 APK 檔案,例如 ZenboJuniorSDK_and_SampleCode\RobotDSBus\build\outputs\apk\debug\RobotDSBus- debug.apk,或您可以直接點選提示訊息中的藍色 locate 文字,開啟 APK 檔案所在位置。
步驟 4:安裝 APK 到 Zenbo Junior 機台
在 APK 所在的檔案路徑下,開啟命令提示字元 CMD 後輸入指令進行安裝,若是曾經有安裝過同樣的 APK 到該 Zenbo Junior II 的機台過,則需要加上-r 參數,例如以下指令:
如果此時出現 Success 字樣表示安裝成功。 若您於 AndroidManifest.xml 的 zenbo_ds_auto_update 值是設為 true,此時會依照您填寫的語料版本,自 Server 端去下載對應的語料到 Zenbo Junior II 機台中,在完成語料更新之後,您就可以開始使用您的程式了。
錯誤排除:
如果出現 error: no devices/emulators found、adb: error: failed to get feature set: no devices/emulators found、- waiting for device -的錯誤訊息,則您需要確認 Zenbo Junior II 機台是否已與該電腦以 Micro USB 線連接。
若已連接傳輸線,則需要確認是否已開啟 USB 偵錯。若您尚未開啟 USB 偵錯及取得開發者權限,請您先在設定的關於平板電腦中,連續點擊版本號碼取得開發者權限,然後在系統點擊進階,而後點擊開發人員選項,並確認 USB 偵錯為開啟狀態後,請點選確定以開啟 USB 偵錯。
此時會跳出「允許 USB 偵錯嗎?」視窗,您可以勾選「一律允許透過這台電腦進行」並點擊確定,後續以傳輸線連接同一台電腦時,就不需要再進行確認了。
觸控螢幕並下拉畫面,在選單點擊「已開啟 USB 檔案轉移模式」,點選檔案轉移選項。
重新執行指令,待畫面出現 Success 訊息,即代表程式已完成安裝。
7.1.6 在 Zenbo Junior II 上測試 Android 範例程式
步驟 1:開啟範例程式
您已經完成範例程式的安裝步驟,有兩種方式啟動Taipei Bus 範例程式:
- 在 Zenbo Junior II 的 App 列表內,點擊台北公車王圖示使用範例程式。
- 喚醒 Zenbo Junior II 後,以「我要用台北公車王」語句進入範例程式。
步驟 2:於程式中做語句測試
進入 Taipei Bus 範例程式後,Zenbo Junior II 會發出歡迎語句,並且於畫面上顯示提示訊息,您可以使用「紅 22 何時到關渡捷運站」語句來做測試,並觀察意圖和取得參數的結果,是否與您所設計的語句意圖相符。
對話語句範例:
User: 我要用台北公車王。 Zenbo: 你想查詢哪一班公車?
User: 紅 35。
Zenbo: 請問你要查詢這班車的什麼資訊呢?
User: 第一班車是幾點?
Zenbo: 這班車最早會從 X 出發,起班車時間為 Y。
台北公車王測試語句參考表:
Intent |
Sentence |
TTS |
taipeiBus.intent. user.startApp |
我要用台北公車王 |
你想查詢哪一班公車? |
我要用公車王 |
||
我要用台北公車 |
||
taipeiBus.intent.user. queryBusWhenArriveStation |
紅 22 何時到關渡捷運站 |
我來幫你查查這班車何時到,請稍後 |
還有多久 757 會到大度立德路口 |
||
taipeiBus.intent.user. querySpecificBus |
紅 35 |
請問你要查詢這班車的什麼資訊呢? |
taipeiBus.intent.user. querySpecificBus.startStationAndTime |
這班車的起始站是哪邊 |
|
這班車最早一班是何時 |
||
起始站 |
||
第一班車是幾點 |
||
出發時間 |
||
出發地 |
||
taipeiBus.intent.user. querySpecificBus.willPassSpecificPlaceOrNot |
這班車會不會經過北投區 |
我幫你查查看,請稍後 |
會經過關渡 |
8. 結語
文以 DDE 上 Taipei Bus 範例語料為例,說明如何在 Zenbo Junior II 上通過搭配 Android SDK,產生一個支援對話的應用程式。希望您在閱讀本文之後,能上手開發出您的第一個 Zenbo Junior II 對話應用,來完成您所期望的應用程式功能。
倘若您對於完整的 Zenbo Junior II SDK 功能感到興趣,可以前往華碩 Zenbo Junior 開發者網站參考 Zenbo Junior II SDK 的 API 文件,將介紹更多 Zenbo Junior II SDK API 項目,網址為https://zenbo.asus.com/developer/documents/zenbo_junior_ii/Zenbo-Junior-SDK/DialogSystem
如果本文有任何未盡之處,或您想與我們取得聯繫,也歡迎您隨時通過以下的聯繫方式來聯絡我們,將竭誠為您服務: https://zenbo.asus.com/contact.