prompt要素は音声合成と録音音声の出力を制御する。
概念上、プロンプトは再生用の待ち行列に即時に追加されるので、ユーザの入力が必要になるまで処理が進められる。その後プロンプトが再生され、システムはユーザの入力を待つ。音声認識サブシステム(またはDTMF認識装置)から入力を受け取ると、処理は続行する。
promptは以下の属性を持つ:
bargein | ユーザがプロンプトを中断できるかどうかを制御する。デフォルトは真(true)。 |
cond | プロンプトが有効かどうかを指示する式。デフォルトは真(true)。 |
count | もしユーザが繰り返し何かをするとき、毎回異なるプロンプトを再生することを許すための値。省かれた場合は、デフォルトで1になる。 |
timeout | ユーザ入力のために使用されるタイムアウト値。デフォルトのnoinputタイムアウトはプラットフォーム依存である。 |
プロンプトの例は以前に示した:
<prompt> 住んでる都市を言ってください。 </prompt>
もし以下のとき、<prompt> ... </prompt>は省略できる:
例えば、これらもプロンプトである:
住んでいる都市を言ってください。 <audio src="say_your_city.wav"/>
しかし音声マークアップを埋め込む場合には、<prompt> ~ </prompt>をプロンプトから省くことはできない:
<prompt> 住んでいる都市を<emp>言って</emp>ください。 </prompt>
prompt要素はemphasis、break、prosodyを示すためのマークアップを含むことができる(訳注:VoiceXMLの次期版ではW3C Speech Synthesys Markup Languageが定義される予定である。)。
<prompt> これ<emp>も</emp>コンピュータによって生成された文章です。 <break size="medium"/> 気に入りましたか? </prompt>
VoiceXMLは以下の音声マークアップ要素をサポートしている。
音声出力の休止(pause)の指定。
<break>の属性:
msecs(訳注:VoiceXML 2.0ではtime)とsizeの高々1つが指定されなければならない。もし指定されないなら、size="medium"が割り当てられる。
内包するテキストの種類を示す
(訳注:VoiceXML 2.0では<paragraph>および<sentence>という表記も導入された。)。
<div>の属性:
内包されたテキストを強調して話すべきであることを指定する。
<emp>の属性:
内包されたテキストの韻律(prosody)情報の指定。属性の値のフォーマットについての詳細は、Java API Speech Markup Language specification (v0.5-1997年8月27日)を参照のこと。
(訳注:VoiceXML 2.0ではprosodyである。)
<pros>の属性:
単語やフレーズがどのように読み上げられるべきかを指定する。
(訳注:VoiceXML 2.0ではsay-asである。)
<sayas>の属性:
phon | テキスト内容の代替としてUnicode International Phonetic Alphabet(IPA)文字による表現 |
sub | テキスト内容の代替として読み上げるテキストの定義 |
class | とりうる値は、phone、data、digits、literal、currency、number、time |
しばしばテキストは特定のスタイルを用いて表現される必要がある。例えば、北米電話番号プランに準拠した電話番号では、最初の3桁、次の3桁の後に休止が必要である。これを行うためにclass属性を用いる。:
<prompt> あなたは<value expr="home_num" class="phone"/>に電話しました。 </prompt> <prompt> あなたは<sayas class="phone">312-555-1212</sayas>に電話しました。 </prompt>
処理系は音声マークアップのフルセットを扱う必要がある。しかし、実装プラットフォームが同じレベルの音声マークアップ機能を持たない音声合成エンジンを使用している場合は、プラットフォームは可能な限りVoiceXMLのマークアップを対応付けする必要があるだろう。全てのプラットフォームで全ての音声マークアップ要素の使用が認められるべきであり、もし特定のマークアップ要素がサポートされていなくても、テキスト内容の読み上げは行われなくてはならない。
プロンプトでは合成音声によるオーディオクリップを用いることが可能である。
<prompt> Bird Seed Emporiumへようこそ。 <audio src="http://www.birdsounds.example/thrush.wav"/> 今月はアザミの種250kgが <sayas class="currency">299.95ドル</sayas> に郵送料と手数料がかかります。 <audio src="http://www.birdsounds.example/mourningdove.wav"/> </prompt>
音声はどのプロンプトにおいても再生可能である。通常はURI経由で指定されるが、録音済みのaudio変数を使用することもできる。
<prompt> 録音したメッセージは次のとおりです。 <value expr="greeting"/> 保存するには1を押してください。 続けるには2を押してください。 メインメニューに戻るにはシャープを押してください。 終わるには米印を押してください。 </prompt>
audioタグ要素はオーディオサンプルが利用できない場合、代替テキスト(マークアップを含む)を用いることができる。:
<prompt> <audio src="welcome.wav"> <emp>ようこそ</emp> 音声ポータルへ。 </audio> </prompt>
オーディオファイルが再生できない場合(例:フォーマットの未サポートや無効なURIなど)は、audio要素の内容が代わりに読み上げられる。この内容はテキスト、音声マークアップ、または他のaudio要素を含む。もしオーディオファイルが再生できず、audio要素の内容が空(empty)であれば、対応するerrorイベントが投げられる。
<audio>の属性:
プロンプトには<value>要素を使い変数参照を埋め込むことができる。:
<prompt> あなたは<value expr="home_num"/>に電話しました。 </prompt>
<value>の属性:
expr | 引き渡すための表現。 |
class | 変数の<sayas> class、例:phone、date、currency。妥当なフォーマットは<sayas>音声マークアップ内でサポートされているそれと同じである。 |
mode | レンダリング(rendering)形式。tts(デフォルト)またはrecorded |
recsrc | modeがrecordedのときのオーディオファイルのURI。 |
もし実装プラットフォームがバージイン(barge-in)をサポートするなら、サービス制作者はユーザがプロンプトに割り込みさせること(プロンプトに"バージイン"させること)を許すかどうか指定できる。これは対話をスピードアップさせるが、常に望まれているわけではない。もしユーザが警告、法律の注意、または広告の全てを聞かなければならないなら、barge-in実行不可能であるべきである。これはbargein属性により行われる:
<prompt bargein="false"><audio src="legaless.wav"/></prompt>
ユーザは、bargein属性が真(true)であるプロンプトに割り込み可能であるが、bargein属性が偽(false)であるプロンプトではユーザは終了を待たなければならない。いくつかのプロンプトが並んでいる場合、それぞれのプロンプトのbargein属性はそのプロンプトの再生中それぞれ使用される。シーケンス内の一つのプロンプトにバージインされた場合はすべての後続プロンプトが再生されなくなる。bargein属性が指定されていない場合は、bargeinプロパティの値が使用される。
先細りプロンプト(tapered prompt)は試行回数に応じて変更されるプロンプトである。情報要求(Information-requesting)プロンプトは、ユーザがタスクにより精通しているようになるという仮定の下でより簡潔になるべきである。ヘルプメッセージは、おそらくユーザがさらにヘルプを必要とするという仮定の下でより詳しくなるべきである。または、プロンプトは相互作用をより興味深くするためだけに変更できる。
それぞれのフォーム項目とmenuは、そのformまたはmenuに入ったそれぞれのときにリセットされる内部プロンプトカウンタを持っている。システムがプロンプトを使用しているときはいつも、その関連したプロンプトカウンタはインクリメントされる。これが先細りプロンプトをサポートするためのメカニズムである。
例えばformレベルのプロンプトと、fieldレベルのプロンプトをもつformの例を挙げる。
<form id="tapered"> <block> <prompt bargein="false">アイスクリームsurveyへようこそ。</prompt> </block> <field name="flavor"> <grammar>バニラ|チョコレート|ストロベリー</grammar> <prompt count="1">何にしますか?</prompt> <prompt count="3"> バニラ、チョコレート、ストロベリーから選んでください。 </prompt> <help>申し訳ありませんが、ヘルプは用意されていません。</help> </field> </form>
以下にこのformを使用した会話を示す。:
C:アイスクリームsurveyへようこそ C:何にしますか? ("flavor"fieldのプロンプトカウンタ = 1) H:ピカンプラーリーン C:理解できませんでした。 C:何にしますか? (プロンプトカウンタ = 2) H:ピカンプラーリーン C:理解できませんでした。 C:バニラ、チョコレート、ストロベリーから選んでください。(プロンプトカウンタ = 3) H:それらが嫌ならどうなりますか? C:理解できませんでした。 C:バニラ、チョコレート、ストロベリーから選んでください。(プロンプトカウンタ = 4) H:....
プロンプトを選択するときにはプロンプトカウンタとの比較が行われる。count属性の値がプロンプトカウンタより少ないか一致するもので、count属性の値が最大であるような子promptが使用される。もしpromptがcount属性を持たないなら、"1"が初期設定される。
条件付きプロンプト)conditional prompt)は、条件が満たされているとき使用される。以下の例では、フォームを訪れるたびにプロンプトが変更される:
<form id="another_joke"> <var name="r" expr="Math.random()"/> <field name="another" type="boolean"> <prompt cond="R < .50"> 他の象の冗談を聞きたいですか? </prompt> <prompt cond="r >= .50"> 他の冗談を聞きたければ「はい」と、聞きたくなければ「いいえ」と言ってください。 </prompt> <filled> <if cond="another"> <goto next="#pick_joke"/> </if> </filled> </field> </form>
プロンプトの選択において、待ち行列に追加されるプロンプトの集合は以下のアルゴリズムにより選択される:
こうしてリストに残ったすべての要素が、再生のために待ち行列に追加される。
timeout属性は、最後のプロンプトが終わったあと、ユーザ入力を待つことが許される沈黙のインターバルを指定する。もしこのインターバルを上回ると、プラットフォームはnoinputイベントを投げ掛ける。この属性のデフォルト数値はtimeoutプロパティで指定される。(17章参照)
プロンプトの属性としてtimeoutを許す理由は、tapered timeoutをサポートするためである。例えば、ユーザが最初の入力を試みるために5秒、次にすすむのに10秒を与えてもよい。
プロンプトにおけるtimeout属性は、以降の入力でのnoinput timeoutの値を決定する。
<prompt count="1"> 新しいT型の色を選んでください。 </prompt> <prompt count="2" timeout="120s"> 新しい1920年式T型フォードの色を選んでください。 可能な色は黒か黒か黒です。時間をとってください。 </prompt>
もし、いつくかのプロンプトがfield入力の前に待ち行列されているなら、最後のプロンプトのtimeoutが使用される。