什麼是 VoiceXML?
VoiceXML 是由IBM、AT&T、朗訊和摩托羅拉…等公司所組成的VoiceXML (Voice eXtensible Markup Language)論壇,共同合作研發可讓用戶以語音互動方式來上網的技術,W3C已將 VoiceXML 納入其標準。VoiceXML(Voice eXtensible Markup Language) 語音延伸標記語言是為語音對話所設計的標記語言,VoiceXML 包括語音合成、預錄數位語音、語音辨識、按鍵輸入、語音輸入存檔、電話進出線控制等功能項目,設計 VoiceXML 的主要目的是要將網路上開發的優點及豐富的網路內容運用到互動式語音系統的開發上,透過語音瀏覽器 VoiceXML 使用者可以使用手邊的電話,用自己的語音存取網路資源。
為何要用 VoiceXML?
VoiceXML(Voice Extended Markup Language)的網頁技術被熱烈的討論著,因為它可用來發展語音應用系統的技術。由於它的設計相當簡易且高階,因此幾乎是一般會寫HTML網頁的使用者即可利用它來設計符合自己需要的語音應用系統,除了易學易用的特性外,VoiceXML還包括了下列特性:
* 它是一種描述人和電腦之間對話模式的語言,並且以語音合成技術或播放音檔做為輸出,以語音辨識或電話按鍵(DTMF)做為輸入。
* 主要的輸入輸出裝置是電話。
* 符合目前Internet技術的標準:以電話替換PC,以VoiceXML替換HTML,以語音瀏覽器替換Web Browser。
* 一種標準化且具跨平台性的語言。
* 一種高階化(High Level)的語言。
* 針對特定領域(domain-specific)應用所設計的語言。
由於VoiceXML具有這些特性,因此在許多應用場合裡,使用VoiceXML便成了很好的選擇,例如:
* 資訊擷取:如氣象、股價查詢等。
* 電子商務:如銀行交易、客戶帳戶、訂貨進度查詢等。
* 電話服務:如自動總機等。
* 個人化服務:如個人化代理人(Personal Agent)及個人化語音入口網站(Personal Portal)等。
我們可以把VoiceXML和HTML來做一比較,請看下圖,
VoiceXML 組成元件
雖說 VoiceXML 是一種標準,就應用方面,可大致區分幾項主要元件:
VoiceXML Interpreter
VoiceXML Interpreter將所取回的VoiceXML網頁剖析並執行。剖析網頁可用一般的XML Parser,因為VoiceXML本身即是符合XML規格的語言;執行動作則包括執行JavaScript及VoiceXML語法中有關語音及電話功能的元素(element),底下其餘模組即是用來支援這些元素所要執行的功能。
Telephony Interface Service
Telephony Interface Service模組負責執行有關電話介面的工作,例如:等待使用者打電話進來(Wait for Call)、播放一段聲音(Audio Playback)、錄製使用者的聲音(Recording)或是接受按鍵(DTMF)輸入等,並且可執行電話轉接及偵測電話是否掛斷等工作。
Speech Recognition Service
Speech Recognition Service模組是語音辨識核心,負責將使用者的聲音輸入辨識成文字輸出。由於VoiceXML規範的語音對話(Voice Dialog)是一特定領域內容,因此語音辨識的內容僅限於VoiceXML文件中所設定的語音文法(Speech Grammar)的範圍內。
Text-To-Speech Service
Text-To-Speech Service模組負責執行將文字轉換成語音的工作,為了合成更自然的語音,VoiceXML也制定一種Markup Language用來標示想要的聲音特性,例如調整音調高低、音量大小及速度快慢等。
HTTP Service
HTTP Service模組執行和目前HTML browser類似的工作,例如:Submit一個Request到HTTP Server,執行CGI程式以連結資料庫及交換資料。
VoiceXML 應用範例
VoiceXML網頁就如同HTML網頁一樣,可以存放在任何的Web Server上,其語法符合XML語言的規格,但在VoiceXML中定義了許多語音元素來使語音功能能輕易的寫在VoiceXML文件中,這些元素可以在VoiceXML 1.0的規格書中查到,以下是一個簡單的VoiceXML文件範例:
reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)Callstack:
at VoIP/VoIP_知識學習/淺談_VoiceXML(VXML)
MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException: reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown.
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptVar expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptVar.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Evaluate (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state, Boolean evaluateProperties) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptAccess.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptCall expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptCall.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptSequence expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptSequence.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptReturnScope expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
上述範例是一個簡單的語音點餐應用,以下是使用者與電腦間可能的對話:
C:你要點什麼早餐
U:熱狗
上例中,首先設定VoiceXML網頁使用的語言種類(encoding),接著是一個描述使用者和電腦之間對話(Dialog)的表格 (<form>),對話中的一個TURN在VoiceXML中用<field>來設定,其中包含了電腦的提示句 (<prompt>)及限制使用者輸入範圍的文法(<grammar>),當一個<field>的內容被使用者輸入填滿(<filled>)後,接著執行<submit>,將網頁的執行流程轉向另一個CGI程式。其實你可以想像和電腦間的對話就像在填表格一樣,一個表格有許多欄位(field),每個欄位可以用聲音(voice)或按鍵(DTMF)輸入,而且可以有個別的文法來限制使用者的輸入範圍。
除了表格形式的對話外,VoiceXML還提供了較簡單的<menu>形式的對話,以下是一個使用<menu>對話的範例:
reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)Callstack:
at VoIP/VoIP_知識學習/淺談_VoiceXML(VXML)
MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException: reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown.
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptVar expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptVar.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Evaluate (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state, Boolean evaluateProperties) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptAccess.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptCall expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptCall.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptSequence expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptSequence.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptReturnScope expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
上例中當使用者的輸入符合某一選項(<choice>)時,語音瀏覽器即載入該選項對應的VoiceXML網頁並執行之。撰寫 VoiceXML網頁時可根據使用者能輸入範圍的複雜度來決定使用<form>或<menu>建構VoiceXML網頁。
此外,為了讓對話更具彈性,在VoiceXML中允許電腦主導式(Computer Directed)及互動主導式(Mixed-directed)兩種對話。電腦主導式的對話流程依VoiceXML網頁的設計流程固定進行;而互動主導式的對話流程可因使用者的輸入而改變,而且允許同一句話填滿兩個以上的欄位,例如:
<例>
C:請問你要查詢什麼天氣
U:降雨量
C:請問你要查什麼地方的降雨量
U:台北市
<例>
C:請問你要查詢什麼天氣
U:台北市
C:請問你要查台北市的什麼天氣
U:降雨量
你會發現電腦的對話流程會根據使用者的輸入而改變,此即所謂的互動式對話。