跳轉到內容

XML - 管理資料交換/VoiceXML

來自華夏公益教科書,為開放世界提供開放書籍



上一章 下一章
SVG DocBook



學習目標


  • 瞭解 VoiceXML 的歷史
  • 瞭解 VoiceXML 的硬體/軟體要求
  • 學習基本的 VoiceXML 元素


VoiceXML 示例

[編輯 | 編輯原始碼]

根據 W3C 的說法,“VoiceXML 旨在建立具有合成語音、數字化音訊、語音和 DTMF 鍵輸入識別、語音輸入錄製、電話功能以及混合主動對話功能的音訊對話。其主要目標是將基於 Web 的開發和內容交付的優勢引入互動式語音應答應用。”

以下列出了兩個簡短的 VoiceXML 示例。第一個始終是令人愉快的示例,“Hello World”

Hello world

<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/vxml" version="2.0">
<form>
<block>Hello World!</block>
</form>
</vxml>


頂級元素是 <vxml>,它主要是一個用於對話的容器。兩種主要的對話型別是表單和選單。表單提供資訊並收集輸入。選單提供下一步操作的選擇。此示例包含一個表單,其中包含一個將“Hello World!”合成並呈現給使用者的塊。由於該表單未指定“Hello World”之後的對話,因此對話結束。

我們的第二個示例詢問使用者要喝什麼飲料,然後將其提交給伺服器指令碼


表單示例

<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd" 
version="2.0">
<form>
<field name="drink">
<prompt>Would you like coffee, tea, milk, or nothing?</prompt>
<grammar type="application/x-gsl" mode="voice">
<![CDATA[
[
[coffee] {<drink "Coffee">}
[tea] {<drink "Tea">}
[milk] {<drink "Milk">}
[nothing] {<drink "Nothing">}
]
]]>
</field>
<block>
<submit next="http://www.drink.example.com/drink2.asp"/>
</block>
</form>
</vxml>


欄位是一個輸入欄位。在引用或執行表單中的下一個元素之前,使用者必須為該欄位提供一個值。以下是一個簡單互動的示例

  • C(計算機):您想喝咖啡、茶、牛奶還是什麼都不喝?
  • H(人類):橙汁。
  • C:我不明白你說什麼。(平臺特定的預設訊息。)
  • C:您想喝咖啡、茶、牛奶還是什麼都不喝?
  • H:茶
  • C: (繼續在 drink2.asp 文件中)

選單示例


<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<menu>
<property name="inputmodes" value="dtmf"/>
<prompt>
For sports press 1, For weather press 2, For Stargazer astrophysics press 3.
</prompt>
<choice dtmf="1" next="http://www.sports.example.com/vxml/start.vxml"/>
<choice dtmf="2" next="http://www.weather.example.com/intro.vxml"/>
<choice dtmf="3" next="http://www.stargazer.example.com/astronews.vxml"/>
</form>
</vxml>

計算機或接收器識別該數字併發送訊息以觸發下一個對話,具體取決於選擇的數字。以下是典型對話的樣子

  • C:要選擇體育,請按 1;要選擇天氣,請按 2;要選擇 Stargazer 天體物理學,請按 3。
  • H:4
  • C:我不明白您輸入了什麼值。(平臺特定的預設訊息。)
  • C:要選擇體育,請按 1;要選擇天氣,請按 2;要選擇 Stargazer 天體物理學,請按 3。
  • H:1“體育”。
  • C: (繼續到 http://www.sports.example.com/vxml/start.vxml)


VoiceXML 的起源

[編輯 | 編輯原始碼]

VoiceXML 起源於 1995 年,是一種基於 XML 的對話設計語言。它主要用於簡化 AT&T 專案中稱為電話標記語言 (PML) 的語音識別應用。在建立這種語言之後,一些其他公司也開發了自己的類似 PML 的語言,例如朗訊、摩托羅拉 (VoxML)、IBM (SpeechML)、惠普 (TalkML) 和 PipeBeach (VoiceHTML)。自 1998 年以來,VoiceXML 論壇由 AT&T、IBM、朗訊和摩托羅拉聯合開發,旨在定義一種標準的對話設計語言,開發者可以使用該語言來構建對話式應用。他們選擇 XML 作為這項工作的基礎,因為他們清楚地認識到這是技術的發展方向。到 2000 年,VoiceXML 論壇向公眾釋出了 VoiceXML 1.0,並將其提交給 W3C,以將該語言設為國際標準。此實現允許釋出基於 W3C 成員公司、W3C 工作組以及各種開發者的輸入的 VoiceXML 2.0。

VoiceXML 用於生成音訊對話,允許使用合成語音、數字化音訊、語音和 DTMF(雙音多頻按鍵音或按鍵撥號。)通俗地說,VoiceXML 允許使用計算機語音、錄製音訊、人類語音和電話作為輸入和輸出裝置。按下電話鍵盤上的按鈕會發出一種聲音,該聲音是由兩個音調組成的,一個音調為高頻,另一個音調為低頻)鍵輸入、語音輸入錄製、電話功能以及混合主動對話。

VoiceXML 架構模型

[編輯 | 編輯原始碼]

本文件假設的架構模型具有以下元件

文件伺服器(例如 Web 伺服器)透過 VoiceXML 直譯器上下文處理來自客戶端應用程式 VoiceXML 直譯器的請求。伺服器在回覆中生成 VoiceXML 文件,這些文件由 VoiceXML 直譯器處理。VoiceXML 直譯器上下文可以與 VoiceXML 直譯器並行監控使用者輸入。例如,一個 VoiceXML 直譯器上下文可以始終監聽將使用者帶到高階個人助手的特殊轉義短語,而另一個上下文可以監聽改變使用者偏好的轉義短語,例如音量或文字到語音的特性。

實現平臺由 VoiceXML 直譯器上下文和 VoiceXML 直譯器控制。例如,在互動式語音應答應用中,VoiceXML 直譯器上下文可能負責檢測來電、獲取初始 VoiceXML 文件並接聽電話,而 VoiceXML 直譯器在接聽電話後進行對話。實現平臺生成事件以響應使用者操作(例如,接收到的語音或字元輸入、斷開連線)和系統事件(例如,計時器到期)。其中一些事件由 VoiceXML 直譯器本身處理,如 VoiceXML 文件中所指定的那樣,而另一些事件則由 VoiceXML 直譯器上下文處理。

VoiceXML 的目標

[編輯 | 編輯原始碼]

VoiceXML 的主要目標是將 Web 開發和內容交付的全部功能引入語音應答應用,並使此類應用的作者免受低階程式設計和資源管理的困擾。VoiceXML 建立了一個語音服務和資料服務之間的整合環境,利用了客戶端-伺服器模式。語音服務可以定義為使用者和實現平臺之間的一系列互動式對話。這些對話儲存在文件伺服器中,允許與實現平臺獨立的結構。這些伺服器維護總體服務邏輯,執行資料庫和遺留系統操作,並生成對話。VoiceXML 文件使用 VoiceXML 直譯器與伺服器中的對話進行互動。來自使用者的輸入會生成對文件伺服器的請求,最後,文件伺服器會回覆另一個 VoiceXML 文件,以繼續使用者與其他對話的會話。

VoiceXML 是一種標記語言,它

  • 最大限度地減少了客戶端/伺服器互動,為每個文件生成各種互動。
  • 保護應用作者免受低階和平臺特定的細節的影響。
  • 將使用者互動程式碼(在 VoiceXML 中)與服務邏輯(例如 CGI 指令碼)分開。
  • 允許跨平臺開發,成為內容提供商、工具提供商和平臺提供商的通用語言。
  • 為簡單互動提供易用性,同時提供語言特性來支援複雜的對話。

雖然 VoiceXML 努力滿足大多數語音應答服務的必要條件,但具有嚴格要求的服務最好由使用更精細控制級別的專用應用來提供服務。

設計原則

[編輯 | 編輯原始碼]

VoiceXML 是一種 XML 應用 [XML]。以下列出了 VoiceXML 所具備的一些功能或能力

  • 該語言透過平臺資源抽象來促進服務的可移植性。
  • 該語言適應支援的音訊檔案格式、語音語法格式和 URI 方案方面的平臺多樣性。
  • 該語言使建立常見型別的互動變得容易。
  • 該語言具有明確定義的措辭和語法標準,使作者更輕鬆地表達與使用者互動行為相關的意圖。
  • 該語言識別來自所有型別語法的語義解釋,並將此資訊提供給應用程式。
  • 該語言具有控制流機制。
  • 該語言使服務邏輯與互動行為分離。
  • 它不適用於密集計算、資料庫操作或遺留系統操作。假定這些操作由文件直譯器之外的資源處理,例如文件伺服器。
  • 假定一般服務邏輯、狀態管理、對話生成和對話排序駐留在文件直譯器之外。
  • 該語言提供了一種使用 URI 連結文件並將資料提交到伺服器指令碼的方法。
  • VoiceXML 提供了一種識別要提交到伺服器的精確資料以及提交中使用的 HTTP 方法(GET 或 POST)的方法。
  • 該語言不要求文件作者顯式分配和釋放對話資源。

實現平臺需求

[編輯 | 編輯原始碼]

本節概述支援 VoiceXML 直譯器的硬體/軟體需求。

文件獲取:直譯器上下文應從 VoiceXML 直譯器獲取文件,這需要支援“http”URI 協議。在某些情況下,文件請求由 VoiceXML 文件的解釋生成,但它也可以由語言範圍之外的事件(如傳入電話呼叫)響應生成。透過 http 發出文件請求時,直譯器上下文使用“User-Agent”標頭變數標識自己,其值為“<name>/<version>”,例如“acme-browser/1.2”。

音訊輸出:實現平臺必須支援使用音訊檔案和文字到語音 (TTS) 的音訊輸出。該平臺必須能夠自由地對 TTS 和音訊輸出進行排序。如果音訊輸出資源不可用,則必須丟擲 error.noresource 事件。這些檔案由特定 URI 引用。

音訊輸入:實現平臺需要找到檢測和報告字元和/或語音輸入的方法。它還需要使用計時器控制輸入檢測間隔持續時間,計時器的長度由 VoiceXML 文件指定。

  • 平臺必須支援 W3C 語音識別語法規範 SRGS 中描述的 DTMF 語法的 XML 形式。
  • 它必須能夠動態接收語音識別語法資料。
  • 它可以支援其他格式,例如 JSpeech 語法格式或專有格式。
  • 它必須能夠記錄從使用者接收的音訊。
  • 該平臺應該能夠支援透過通訊網路(如電話)進行第三方連線。

傳輸:該平臺應該能夠支援透過通訊網路(如電話)進行第三方連線。

VoiceXML 文件是一個對話有限狀態機,其中使用者始終處於一個對話狀態或對話中。每個對話都決定要過渡到的下一個對話。過渡可以使用 URI 定義,URI 定義要使用的下一個文件和對話。如果沒有更多對話,或者存在明確退出對話的元素,則執行將終止。VoiceXML 文件主要由稱為對話的頂級元素組成。

對話有兩種型別:表單和選單。文件也可以包含

  • <meta> 元素。
  • <metadata> 元素。
  • 變數元素。
  • <script> 元素。
  • <property> 元素。
  • <catch> 元素。
  • <link> 元素。

表單定義一個互動,該互動從一組欄位項變數中收集值。每個欄位都可以指定一個語法,該語法定義該欄位允許的輸入。

選單向用戶顯示包含選項選擇的資訊,然後根據所選選項過渡到另一個對話。每個對話都涉及一系列語音和/或 DTMF 語法,這些語法僅在使用者處於該對話時處於活動狀態。

子對話類似於函式呼叫,因為它提供了一種建立和呼叫新互動並返回原始對話的方法。變數例項、語法和狀態資訊將被儲存,並在返回呼叫文件時可用。子對話可用於建立可能需要資料庫查詢的確認序列,建立可在單個應用程式中的文件之間共享的一組元件,或者可能建立可在許多應用程式之間共享的可重用對話庫。

會話在使用者開始與 VoiceXML 直譯器上下文互動時開始,在載入和處理文件時繼續,並在使用者、文件或直譯器上下文請求時結束。

應用程式是一組共享相同應用程式根文件的文件。每當使用者與應用程式中的文件互動時,它的應用程式根文件也會載入。應用程式根文件在使用者在同一應用程式中的其他文件之間過渡時保持載入狀態,並在使用者過渡到不在應用程式中的文件時解除安裝。

語法:每個對話都與其關聯一個或多個語音和/或 DTMF 語法。在機器導向的應用程式中,每個對話的語法僅在使用者處於該對話時處於活動狀態。在混合主動應用程式中,使用者和機器交替決定下一步做什麼,其中一些對話被標記為使它們的語法處於活動狀態(即,監聽),即使使用者處於同一文件中的另一個對話中,或處於同一應用程式中的另一個已載入文件中。在這種情況下,如果使用者說出與另一個對話的活動語法匹配的內容,執行將過渡到該另一個對話,使用者的語句將被視為在該對話中說出。混合主動性為語音應用程式增加了靈活性和功能。

事件:VoiceXML 允許使用者以使用者輸入的傳統方式填寫表單,並定義了處理表單機制未涵蓋的事件的機制。當用戶沒有響應、沒有正確響應或請求幫助時,可以丟擲事件。類似地,如果 VoiceXML 直譯器在 VoiceXML 文件中發現語義錯誤,它也可以丟擲事件,使用 catch 元素允許直譯器觸發此類事件。

連結指定每當使用者與它互動時處於活動狀態的語法。如果使用者輸入與連結的語法匹配,則控制權將轉移到連結的目標 URI。連結可用於丟擲事件或轉到目標 URI。

VoiceXML 元素

[編輯 | 編輯原始碼]
For more information about the elements go to W3C page.

http://www.w3.org/TR/2004/REC-voicexml20-20040316/


元素 目的
<assign> 為變數分配值
<audio> 在提示中播放音訊剪輯
<block> (非互動式)可執行程式碼的容器
<catch> 捕獲事件
<choice> 定義選單項
<clear> 清除一個或多個表單項變數
<disconnect> 斷開會話
<else> 用於 <if> 元素
<elseif> 用於 <if> 元素
<enumerate> 列舉選單中選擇的簡寫
<error> 捕獲錯誤事件
<exit> 退出會話
<field> 在表單中宣告輸入欄位
<filled> 欄位填充時執行的操作
<form> 用於顯示資訊和收集資料的對話
<goto> 轉到同一文件或不同文件中的另一個對話
<grammar> 指定語音識別或 DTMF 語法
<help> 捕獲幫助事件
<if> 簡單的條件邏輯
<initial> 宣告進入(混合主動)表單時的初始邏輯
<link> 指定連結範圍內的所有對話共有的過渡
<log> 生成除錯訊息
<menu> 用於在替代目的地之間進行選擇的對話
<meta> 將元資料項定義為名稱/值對
<metadata> 使用元資料模式定義元資料資訊
<noinput> 捕獲 noinput 事件
<nomatch> 捕獲 nomatch 事件
<object> 與自定義擴充套件互動
<option> 在 <field> 中指定選項
<param> <object> 或 <subdialog> 中的引數
<prompt> 將語音合成和音訊輸出排隊到使用者
<property> 控制實現平臺設定。
<record> 錄製音訊樣本
<reprompt> 在事件後重新訪問欄位時播放欄位提示
<return> 從子對話返回。
<script> 指定 ECMAScript 客戶端指令碼邏輯塊
<subdialog> 將另一個對話作為當前對話的子對話呼叫
<submit> 將值提交到文件伺服器

<throw>

丟擲事件。

<transfer>

將呼叫者轉移到另一個目的地
<value> 在提示中插入表示式的值
<variable> 宣告變數
<vxml> 每個 VoiceXML 文件中的頂級元素

一個文件執行

[編輯 | 編輯原始碼]

文件執行預設從第一個對話方塊開始。每個對話方塊執行後,將確定下一個對話方塊。當一個對話方塊不引用另一個對話方塊時,文件執行停止。

以下是“Hello World!”示例的擴充套件,用於說明 VoiceXML 的執行。它現在有一個名為“hi”的文件級變數,用於儲存問候語。它的值在第一個表單中用作提示。第一個表單播放問候語後,它將轉到名為“say_goodbye”的表單,該表單提示使用者“再見!”。因為第二個表單沒有到另一個對話方塊的轉換,所以文件執行停止。

<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.w3.org/2001/vxml 
   http://www.w3.org/TR/voicexml20/vxml.xsd"
   version="2.0">
 <meta name="author" content="John Doe"/>
 <meta name="maintainer" content="hello-support@hi.example.com"/>
 <var name="hi" expr="'Hello World!'"/>
 <form>
  <block>
     <value expr="hi"/>
     <goto next="#say_goodbye"/>
  </block>
 </form>
 <form id="say_goodbye">
  <block>
     Goodbye!
  </block>
 </form>
</vxml>


變數和表示式

[編輯 | 編輯原始碼]

VoiceXML 變數在所有方面都等效於 ECMAScript 變數:它們是同一個變數空間的一部分。VoiceXML 變數可以在 <script> 中使用,就像在 <script> 中定義的變數可以在 VoiceXML 中使用一樣。使用 var 宣告變數等效於在 <script> 元素中使用 var 語句。<script> 也可以出現在 var 可以出現的任何地方。VoiceXML 變數也由表單項宣告。

變數命名約定與 ECMAScript 中一樣,但以下劃線字元(“_”)開頭的名稱和以美元符號(“$”)結尾的名稱保留用於內部使用。VoiceXML 變數(包括表單項變數)不能包含 ECMAScript 保留字。它們還必須遵循 ECMAScript 的引用正確性規則。例如,變數名必須唯一,並且它們的宣告不能包含點 - “var x.y”是 ECMAScript 中的非法宣告。違反命名約定或 ECMAScript 規則的變數名會導致丟擲“error.semantic”事件。

使用 var 元素表示變數

<var name="room_number"/> 
<var name="avg_mult" expr="2.2"/> 
<var name="state" expr="'Georgia'"/>


<vxml> 元素

[編輯 | 編輯原始碼]
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"


version="2.0">…
</vxml>


<vxml> 的屬性包括

version 此文件的 VoiceXML 版本(必需)。當前版本號為 2.0。
base 定義一個基本 URI,用於在文件中解析相對 URI。
xmlns VoiceXML 的指定名稱空間(必需)。VoiceXML 的名稱空間定義為 http://www.w3.org/2001/vxml
xml:base 此文件的基本 URI,如 xml-base 中定義。它是一個 URI,文件中的所有相對引用都以此為基礎。
xml:lang 此文件的語言識別符號。如果省略,則該值為特定於平臺的預設值。
Xmlns:xsi 與 xsi:schemalocation 一起使用,以指示 VoiceXML 名稱空間的模式位置。
xsi:schemalocation 與 xmlns:xsi 一起使用,以指示 VoiceXML 名稱空間的模式位置。
application 此文件的應用程式根文件的 URI(如果有)。

<field> 元素

[編輯 | 編輯原始碼]

欄位指定要從使用者收集的輸入項。此元素的一些屬性是


name 對話方塊範圍內將儲存結果的表單項變數。該名稱在表單中的表單項中必須唯一。
expr 表單項變數的初始值;預設為 ECMAScript 未定義。
cond 一個表示式,在轉換為布林值後必須計算為真,以便訪問表單項。如果未指定屬性,也可以訪問表單項。
Type 欄位的型別,即內建語法型別的名稱

<grammar> 元素

[編輯 | 編輯原始碼]

<grammar> 元素用於提供語音語法,該語法

  • 指定使用者可能用來執行操作或提供資訊的表示式
  • 返回相應的語義解釋,例如簡單值(字串)、屬性-值對(日期、月份和年份)或巢狀物件。

<grammar> 元素的一些屬性是


version version
xml:lang 語法的版本識別符號。
lang 該特定語法的語言識別符號(“fr-CA” 代表加拿大法語)。
mode 定義語法的模式,遵循 W3C 語音識別語法規範 SRGS 的模式。
root 定義語法的根規則。
xml:base tag-format

定義語法中所有標籤的標籤內容格式。

base

宣告解析語法中相對 URI 的基本 URI。此基本宣告優先於 <vxml> 基本 URI 宣告。

<block>
    Welcome to Flamingo, your source for lawn ornaments.
</block>

<block> 元素


name [編輯 | 編輯原始碼]
expr 表單項變數的初始值;預設為 ECMAScript 未定義。
cond 此元素是一個表單項。如果塊的表單項變數未定義且塊的 cond 屬性(如果有)計算為真,則它包含要執行的可執行內容。

表單項變數在進入塊之前會自動設定為真。因此,通常在呼叫表單時執行塊。有時您可能需要對塊進行更多控制。要做到這一點,您可以命名錶單項變數,並設定或清除它以控制 <block> 的執行。此變數在表單的對話方塊範圍內宣告。<block> 的屬性包括

name

用於跟蹤此塊是否符合執行條件的表單項變數的名稱;預設為不可訪問的內部變數。

<prompt>Please say your name.</prompt>

cond

  • 一個表示式,在轉換為布林值後必須計算為真,以便訪問表單項。
  • <prompt> 元素

[編輯 | 編輯原始碼]

Please say your name.

<audio src="sayname.wav"/>

此元素控制合成語音和預錄音頻的輸出。提示排隊等待播放,解釋將在使用者提供輸入後開始。以下是一個提示的示例

<prompt>Please <emphasis>say</emphasis> your city.</prompt>

如果您不需要指定提示屬性(如 bargein),則可以省略 <prompt> ... </prompt>,並且

提示完全由 PCDATA 組成(不包含語音標記),或者僅由 <audio> 或 <value> 元素組成。 例如,以下也是提示
但是,當新增嵌入式語音標記(例如)時,您有時必須使用 <prompt> 標籤 <prompt> 元素具有以下屬性

Cond

xml:lang 表示式,在轉換為布林值後必須計算為真,以便播放提示。預設值為 true。
xml:base Count

練習

數字,允許您在使用者重複執行操作時發出不同的提示。如果省略,則預設為“1”。

Timeout


將用於以下使用者輸入的超時。預設的 noinput 超時特定於平臺。

lang

提示識別符號的語言。
  • base
  • 宣告解析提示中相對 URI 的基本 URI。
  • [編輯 | 編輯原始碼]
  • 1. 建立一個 VoiceXML 文件,在其中您為使用者提供三個不同的鍵盤選項。使用者必須從酒店、博物館或餐廳中選擇一個選項。在本練習中使用表單。提示:本練習需要使用 option 元素標籤示例:<option dtmf="1" value="varName"> 顯示名稱 </option>
  • 2. 建立一個 VoiceXML 文件,在其中您為使用者提供三個不同的鍵盤選項。使用者必須從酒店、博物館或餐廳中選擇一個選項。在本練習中使用選單對話方塊。
  • 參考
  • [編輯 | 編輯原始碼]
華夏公益教科書