2016/07/08


欸.. 萊恩大兵有做一台 Node-RED 三輪車, 會結合 Bluemix 平台來玩物聯網應用. 

在打通 RPi 收送資料到 Watson Internet of Things Platform (IOTP) 這個關卡後, 萊恩大兵總算有時間回頭來動手寫交談式對話程式.


先前情提要一下 Node-RED 三輪車的相關文章:

Node-RED 三輪車, 藉由 IBM Watson IOT Platform 來做物聯網應用
IBM Bluemix, 交談式對話程式初體驗
IBM Bluemix, 在 Node-RED 增加交談式對話程式節點


這隻交談對話程式是應用情境是和使用者對話, 決定車子的行進參數 (前進/後退? 左轉/右轉/直走? 輪胎轉幾圈? 等)

第一次寫交談對話程式, 萊恩大兵讀完交談對話程式的 XML 語法, 就傻傻的從 <folder label="Main"> 開始填歡迎詞, 一下子修調問句的語氣, 另一下子又去搬挪程式段落. 花了好些工夫才寫完 (體驗版本). (程式碼貼在本篇文章最末段)

回頭來看, 覺得寫這交談對話程式, 其實可以更有效率一點. 一點點的經驗與心得和大家分享:

(1) 交談對話程式的本質是人機介面. 它的目的是和使用者溝通, 取得使用者想要問的事 (input, variable), 並給予使用者適當的回饋. 

以自動車的交談對話來舉例, 就是要問出使用者要車子的行進參數: <1> 前進或後退? <2> 左轉, 右轉或直走? <3> 輪胎轉幾圈或轉幾秒? <4> 出力多寡? 或速度為低速, 中速或快速? 等等

決定要問出哪些答案後, 再去設計問題與對話會比較快. 

在交談對話程式中, 這些參數是被定義在 <variables> </variables>.



(2) 在設計要問的問題與對話時, 畫張結構圖把各問題之間的關聯與路線定義清楚, 再動手來寫會比較快. 類似下圖這張流程圖.




以上. 謝謝大家.


交談對話程式的 XML 語法, 有興趣的人可點進去看看.

Simple Sample of the Watson Dialog Service in Bluemix
Dialog Services- Primary Features

我的交談對話程式碼

<dialog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="WatsonDialogDocument_1.0.xsd">
    <flow>
        <folder label="Main">
            <output>
                <prompt selectionType="RANDOM">
                    <item>歡迎使用萊恩自動車服務, 你要下指令? 還是要來個驚喜?<</item>
                    <item>我尊貴的大爺, 你要下指令給萊恩自動車? 還是要來個驚喜?</item>
                    <item>萊恩自動車歡迎你. 請選擇下指令, 或是要來個驚喜?</item>
                </prompt>
                <goto ref="cmd_or_surprise"/>
            </output>
            <getUserInput id="cmd_or_surprise">
                <search ref="get_intents"/>
                <default>
                    <output>
                        <prompt selectionType="RANDOM">
                            <item>不好意思, 我沒聽清楚你的意思.</item>
                            <item>剛剛有點吵, 我沒聽清楚.</item>
                            <item>哈哈, 我剛剛有點失神, 沒聽清楚.</item>
                        </prompt>
                    </output>
                </default>
            </getUserInput>
        </folder>
        <folder label="Library">
            <folder label="Intents" id="get_intents">
                <input>
                    <grammar>
                        <item>$指令</item>
                        <item>$命令</item>
                        <item>$command</item>
                    </grammar>
                    <output>
                        <prompt selectionType="RANDOM">
                            <item>好的, 你選擇為下指令操控.</item>
                            <item>OK, 就選擇為下指令操控.</item>
                        </prompt>
                        <goto ref="get_cmd_dir1"/>
                    </output>
                </input>
                <input>
                    <grammar>
                        <item>$驚喜</item>
                        <item>$自動</item>
                        <item>$surprise</item>
                    </grammar>
                    <output>
                        <prompt selectionType="RANDOM">
                            <item>好的, 你選擇來個驚喜. (請繫好安全帶 XDD)</item>
                            <item>OK, 就選擇為自動模式.</item>
                        </prompt>
                        <goto ref="go_surprise_mode"/>
                    </output>
                </input>
            </folder>
            <folder label="CMD_DIR1" id="get_cmd_dir1">
                <output>
                    <prompt selectionType="RANDOM">
                        <item>你要車子的方向是前進? 還是後退呢?</item>
                        <item>請選擇車子的行進方向 (前進或後退)</item>
                        <item>是要前進或是後退? 請選擇..</item>
                        <item>人生就像河流上的一葉扁舟, 不是前進就是後退. 請問大爺你要選哪一種?</item>
                    </prompt>
                    <getUserInput>
                        <input>
                            <grammar>
                                <item>$前進</item>
                                <item>$向前行</item>
                                <item>$forward</item>
                            </grammar>
                            <action varName="Dir1" operator="SET_TO">前進</action>
                            <output>
                                <prompt selectionType="RANDOM">
                                    <item>好的, 你要車子向前走.</item>
                                    <item>OK, 行進方向為向前.</item>
                                </prompt>
                                <goto ref="get_cmd_dir2"/>
                            </output>
                        </input>
                        <input>
                            <grammar>
                                <item>$後退</item>
                                <item>$倒退嚕</item>
                                <item>$backward</item>
                            </grammar>
                            <action varName="Dir1" operator="SET_TO">後退</action>
                            <output>
                                <prompt selectionType="RANDOM">
                                    <item>好的, 你要車子向後退.</item>
                                    <item>OK, 行進方向為後退.</item>
                                </prompt>
                                <goto ref="get_cmd_dir2"/>
                            </output>
                        </input>
                    </getUserInput>
                </output>
            </folder>
<!-- -->
            <folder label="CMD_DIR2" id="get_cmd_dir2">
                <output>
                    <prompt selectionType="RANDOM">
                        <item>你要車子轉向嗎? 左彎? 右彎? 或是不轉彎?</item>
                        <item>要轉彎嗎? 左轉或右轉? 還是不需要?</item>
                        <item>請選擇左轉? 右轉? 或是不轉彎?</item>
                    </prompt>
                    <getUserInput>
                        <input>
                            <grammar>
                                <item>$左</item>
                                <item>$left</item>
                            </grammar>
                            <action varName="Dir2" operator="SET_TO">左轉</action>
                            <output>
                                <prompt selectionType="RANDOM">
                                    <item>好的, 你要車子向左彎.</item>
                                    <item>OK, 車子向左轉.</item>
                                </prompt>
                            <!--    <goto ref="get_cmd_wheel_rots"/> -->
                            </output>
                        </input>
                        <input>
                            <grammar>
                                <item>$右</item>
                                <item>$right</item>
                            </grammar>
                            <action varName="Dir2" operator="SET_TO">右轉</action>
                            <output>
                                <prompt selectionType="RANDOM">
                                    <item>好的, 你要車子向右彎.</item>
                                    <item>OK, 車子向右轉.</item>
                                </prompt>
                            <!--    <goto ref="get_cmd_wheel_rots"/> -->
                            </output>
                        </input>
                        <input>
                            <grammar>
                                <item>$不</item>
                                <item>$straight</item>
                            </grammar>
                            <action varName="Dir2" operator="SET_TO">不轉彎</action>
                            <output>
                                <prompt selectionType="RANDOM">
                                    <item>好的, 你要車子直直走.</item>
                                    <item>OK, 車子直直走不轉彎.</item>
                                </prompt>
                            <!--    <goto ref="get_cmd_wheel_rots"/> -->
                            </output>
                        </input>
                        
                    </getUserInput>
                </output>
            </folder>

<!-- -->
            <folder label="Storage"/>
        </folder>
        <folder label="Global"/>
        <folder label="Concepts"/>
    </flow>
    <constants>
        <var_folder name="Home"/>
    </constants>
    <variables>
        <var_folder name="Home">
            <var name="Dir1" type="TEXT"/>
            <var name="Dir2" type="TEXT"/>
            <var name="Wheel Rots" type="TEXT" initValue="1"/>
        </var_folder>
    </variables>
    <settings>
    </settings>
</dialog>



[萊恩大兵的其它文章]

自製大四軸

自製大四軸, (1) 零組件篇, 遙控器 (Drone, Quadcopter, Futaba, Maker, Arduino, Animatronic Eye)
自製大四軸, (2) 零組件篇, 飛控板 (Drone, Quadcopter, MultiWii, Arduino, Futaba, Maker)
自製大四軸, (3) 零組件篇, 自行雷切木質機架 (Drone, Quadcopter, Maker, Laser Cut)
自製大四軸, (4) 零組件篇, 馬達與電變調整 (Drone, Quadcopter, Maker, Electric Speed Control, Motor)
自製大四軸, (5) 組裝篇, 四軸飛行器成形 (Drone, Quadcopter, MultiWii, Arduino, Maker, Electric Speed Control, Motor)
自製大四軸, (6) 調整篇, 飛行前兩三事 (Drone, Quadcopter, Maker, Futaba, Arduino, MultiWii)

CC2540 Bluetooth Low Energy
筆記, CC2540 Bluetooth Low Energy, (1) 開發環境 架設 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (2) 跑第一個範例程式 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (3) SimpleBLEPeripheral 簡單介紹 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (4) 在智慧手機上執行範例程式 (Bluetooth, CC2540)
筆記, CC2540 Bluetooth Low Energy, (5) 偵測與發送 iBeacon 訊號 (Bluetooth, CC2540, iBeacon)
實作, iBeacon 發訊器 x 防丟器 (Bluetooth, CC2540, iBeacon)
實作, iBeacon 尋寶遊戲 (Bluetooth, CC2540, iBeacon, iOS app)
實作, BLE + iOS app, 遙控燈泡君 (Bluetooth, CC2540, iOS app)
做實驗, 用 iBeacon 做自動控制的可行性 (Bluetooth, iBeacon, CC2540, Automation, URL Scheme, iOS app)

OpenCV 學習路徑

記錄, OpenCV 學習路徑, (1) 環境安裝與第一個範例 (OpenCV, Python)
記錄, OpenCV 學習路徑, (2) 辨識多邊形 (OpenCV, Python)
記錄, OpenCV 學習路徑, (3) 人臉辨識 (OpenCV, Python, Face Recognition)

小惡魔 無線溫度感測器


0 意見:

張貼留言