VXML 是 w3 組織提出的用以搭建語音應用的描述性語音。使用 VXML 可以很方便得搭建集成語音識別和語音合成技術的語音應用。本文給出了一個簡單的例子介紹 VXML 的兩個基本的使用方法——語音識別和語音合成,並且簡單介紹了 VXML 與 Java 層信息交互的方法。相信通過本文的介紹,大家就可以搭建出很酷的語音控制系統。
語音技術
微軟公司董事長比爾蓋茨曾不止一次的提出,語音技術將越來越多得改變我們的生活。新一代的搜索引擎也將使用語音最為最終的輸入手段;電腦鍵盤的作用將逐步減少,今後人們使用電腦時將不再是通過鍵盤輸入文字,而是用語音來輸入文字。
不可否認的是,如今的語音技術還未達到如他所述的成熟程度。但是一些簡單的應用,例如語音撥號的功能已經被大家所接受。基於語音技術的自動應答系統在歐美已然流行開來,幫助像銀行,移動運營商這樣的大型服務性機構搭建無人電話語音服務,以此減少接線員的工作量,給大家的生活帶來便利。
VXML 簡介
Voice eXtensible Markup Language(簡稱 VXML)是被用來創建語音對話系統,可以調用語音合成以及語音識別服務,可以用來記錄語音錄入和連接電話系統。創建 VXML 語音的主要目的就是用 Web 開發的理念來開發交互式的語音應用。VXML 提供了基於 Menu 和基於 Form 的兩套框架,整合了語音識別和語音合成兩個關鍵服務,使得語音應用的開發變得更為方便和快捷。
VXML 的運行環境
VXML 和普通的標記語言一樣,需要有浏覽器進行解析;還需要提供語音識別和語音合成服務的應用服務器;有時也需要有 http 服務器提供文檔服務;當然,如果需要與電話系統相連,就必須加上 VOIP (網絡電話)的支持。如下圖所示的就是 VXML 的運行環境:
圖 1. VXML 運行環境
一個企業級應用的系統框架
IVR (interactive voice-response services) 也就是自動應答服務,是使用 VXML 的典型企業級應用。IVR 和使用者通過電話,按鍵 (DTMF) 互動,如語音訂票,語音查詢,語音投票等。普通的 IVR 都是支持 VXML 的解析和提供了 sip 協議的支持,通過和 ASR ( 語音識別 ) 應用服務器以及 TTS( 語音合成 ) 應用服務器的集成,可以實現幾乎所有的 VXML 封裝的操作。
企業級的 VXML 應用需要如下的體系結構,以使用 IBM Voice Server (WVS) 為例:
圖 2. 一個 VXML 具體應用的例子
上圖中的 IVR 事實上就是 VXML 解析器,通過解析 VXML,分發相應的工作給 WVS ,實現 VXML 封裝的語音識別和語音合成的功能。
兩個開源的實驗環境
嘗試 VXML,可以使用開源的項目 OpenVXI (見參考資源) 。OpenVXI 提供的是完整的 VXML 解析服務,同時也提供了有限語言的 TTS 支持。雖然暫時來看, OpenVXI 沒有提供 ASR 的實現,但是 OpenVXI 提供了方便的回調函數的接口,因此可以很方便的嵌入外部 ASR 和 TTS 的服務。
嘗試 VXML ,另一個選擇是使用一個名為 Tadpole (見參考資源) 的 Firefox 浏覽器上的開源插件。通過 Tadpole 的幫助, Firefox 平台因此具有 VXML 解析浏覽器的功能。此架構的缺點是只支持 XHtml-Voice 標記語言,這個語言只能說是 VXML 語言的一個子集。
搭建自己的 VXML 中文應用
從一個簡單的例子開始
清單 1. 一個典型的 VXML 的例子
<?XML version="1.0" encoding="UTF-8" ?>
<vxml version="2.0" xml:lang="zh-CN" xmlns="http://www.w3.org/2001/vXML">
<meta name="GENERATOR" content="Voice demo"/>
<form id="head">
<block>
請問您需要何種服務?
<audio src="BEEP.WAV"/>
<goto next="#main"/>
</block>
</form>
<menu id="main">
<choice next="menu_1.JSP">
開空調
</choice>
<choice dtmf="1" next="menu_1.vXML"/>
<choice next="menu_2.JSP ">
開洗澡水
</choice>
<choice dtmf="2" next="menu_2.vXML"/>
<choice next="menu_3.JSP">
打開音響
</choice>
<choice dtmf="3" next="menu_3.vXML"/>
<catch event="noinput" count="1">
<prompt> 請問您需要何種服務? <audio src="BEEP.WAV"/> </prompt>
</catch>
<catch event="noinput" count="2">
<submit next="menu_whole.vXML"/>
</catch>
<catch event="nomatch">
<prompt> 對不起,我沒有聽清,請再重復一遍。 <audio src="BEEP.WAV"/> </prompt>
</catch>
</menu>
</vXML>
上述 VXML 是一個很簡單的例子。我們可以看到,事實上 VXML 文件和普通的 Html 文件並沒有實質的不同,我們可以完全使用相同的思維方式去理解,唯一不同的是針對特殊的語音 VXML 應用了相應特別的標簽,具體可以參考 w3 上有關 VXML 的規范(詳見參考資源)。
上面的例子,<block/> 標簽是用來描述語音播放的屬性,也就是需要使用語音合成的語句(直接輸入詞句可以得到語音輸出),該標簽也可包含需要播放的錄音,可以使用 <audio/> 標簽。<menu/> 標簽就像 Html 中的 <select/> 標簽,只是將輸入變成了語音,也就是,<choice/> 標簽中指定的語句是可以被識別的,根據識別的結果,可以跳轉到 <goto/> 標簽中指定的 VXML 並繼續執行。 <catch/> 標簽也是很好理解的,它能接受並處理無輸入超時和無法識別語音這兩個事件。
綜合起來看上面的例子,我們可以看出這是一個 VXML 最典型的應用,即根據語音輸入,確定使用者需要的服務。把該 VXML 應用到電話系統中,就是現今應用最多的用語音技術替代接線員工作的模式。我們也可以理解為,用說話命令的方式,代替了普通電話服務熱線那種按鍵的方式。
一個更深入的例子,與 Java 層的交互
清單 2. 傳遞參數到 JSp 的例子(menu_3.vXML+playAudio.JSP)
menu_3.vXML:
<?XML version="1.0" encoding="UTF-8" ?>
<vxml version="2.0" xml:lang="zh-CN" xmlns="http://www.w3.org/2001/vXML">
<form id="head">
<block>
請問你要播放那首歌曲?
<audio src="BEEP.WAV"/>
<goto next="#playsong"/>
</block>
</form>
<form id="playsong">
<fIEld name="song">
<grammar type="application/srgs" src="songs.gram"/>
<option dtmf="9" value="back"> 後退 </option>
<filled>
<if cond="songs == 'back'">
<submit next="menu_whole.vXML"/>
<submit next="playAudio.JSP" namelist="song"/>
</filled>
</fIEld>
</form>
</vXML>
playAudio.JSP:
<?XML version="1.0" encoding="UTF-8" ?>
<vxml version="2.0" xml:lang="zh-CN" xmlns="http://www.w3.org/2001/vXML">
<%@page contentType="application/voicexml+XML; charset=UTF-8" %>
<%@page import="com.ibm.com.AudioPlayer"%>
<vxml version="2.0" 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">
<%
// Get the utterance from the Html form
request.setCharacterEncoding("UTF-8");
String song = (String)request.getParameter("song");
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play(song);
%>
</vXML>
menu_3.vXML 是一個簡化的略去錯誤處理的例子,我們也使用另一種常用的框架 <form/> 。該框架需要給定語音識別的期望結果,也就是 grammar 文件,然後進行語音匹配,得到識別結果。而 grammar 文件如 songs.gram ,可以簡單得這樣實現:
清單 3. 一個 grammar 的例子(songs.gram)
#ABNF 1.0 UTF-8;
language zh-CN;
mode voice;
root $songs;
public $songs= 北京歡迎你 | 我和你 | 為生命喝彩 ;
grammar 可以有 abnf 和 xml 兩種格式,具體可以參考 w3 上關於 grammar 的規范(見參考資源)。事實上,menu_whole.vxml 中 <choice/> 標簽就可以看成是一個可以自動生成的 grammar。使用 VXML 外部的 grammar 可以很方便加入新的可以被識別的結果。並且由於 grammar 支持類似正則表達式的構造方式,所以 grammar 可以很方便得構造一些規則驅動的識別結果集合,這個很大程度上減輕了應用開發人員在枚舉識別結果時的工作量。
在 menu_3.vXML 和 playAudio.JSP 中,我們可以看到,通過 submit 的 namelist 屬性,系統可以很方便的把識別結果傳輸給 java 層,利用 java 層強大的功能,可以實現很多操作。上面的例子只是一個很簡單的播放歌曲的例子,假設如果在 Java 層實現了所有的電器控制接口,那完全用語音控制電器這只在科幻電影中出現的應用,將成為現實。
搭建中文 VXML 系統的注意點
對於中文系統而言,首先,必須要保證語音識別引擎是完全支持中文的。其次,對於所有的 VXML,JSp 以及 grammar 文件,必須要按照統一的 UTF-8 的編碼方式,並且在 JSP 層,需要對 request 對象設置編碼方式。在這點上,中文的語音應用和普通的 web 應用是一致的。
結束語
使用 VXML 可以很方便得搭建中文的語音應用。雖然說現如今,語音識別技術還存在識別率的問題,並且也沒有很完善的開源的語音識別引擎。但是,一些部分支持 VXML 的開源的解決方案已經出現,相信在不久的將來,技術將更加成熟,也將越來越普遍化。我相信,在科幻電影中才能看到的語音控制家電將會因此成為趨勢。
作者簡介
強晟是 IBM 中國軟件開發中心工程師,在 WVS and EVV 組工作,從事Websphere VoiceServer 的技術支持工作。
劉盈是 IBM 中國軟件開發中心工程師,在 WVS and EVV 組工作,從事Websphere VoiceServer 的技術支持工作。