什麼是 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 的範例,我們以〝Hello World!!〞出發:
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
語音對話的外層是 <vxml> 標記,它可以包含兩種語音對話標記: <form> 和 <menu>。使用 <form> 標記時,系統撥提示語,並且接受使用者語音或按鍵輸入,以決定進一部程式流程,使用 <menu> 標記時,提供使用者選項,使用者選擇某項目時,執行相對對話網頁,在〝Hello World!!〞範例中有一個 <form>,<form> 裡面有 <block>,<block> 中指定欲合成的語句為 Hello World,由於 <form> 裡面沒有指定下一對話網頁,這通電話就此結束。
另一個範例要求使用者說出所要的飲料名稱,使用者回應之後執行下一對話網頁:
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
請問您要咖啡、茶、牛奶或者都不要?
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
其中 <field> 是輸入標記,使用者必須對系統撥音作回應,然後系統依據回應執行下一對話網頁。
以下為可能的對話流程:
系統:請問您要咖啡、茶、牛奶或者都不要?
客戶:我要蘋果汁
系統:對不起我聽不清楚(系統預設播音)
系統:請問您要咖啡、茶、牛奶或者都不要?
客戶:來杯牛奶
系統:(執行 drink.asp)