Reference article · Speech interface standards

How a markup language taught computers to hold a conversation

VoiceXML turned the telephone into a browsable medium. Two decades later, its dialogue model still sits underneath call centres, banking hotlines and the grammar engines behind modern assistants.

Format: long-form technical overview Reading time ≈ 12 min Topic: W3C Voice Browser stack

Most descriptions of the voice web begin with the microphone. That is the wrong end of the problem. The hard part was never capturing sound — it was describing, in a portable way, what a machine should do with what it heard: when to listen, what vocabulary to expect, how long to wait, what to say when nothing arrived, and where to go next.

VoiceXML was the answer that stuck. Rather than inventing a programming language for telephony, its designers borrowed the shape of the web. A dialogue became a document. A document contained forms. Forms contained fields. A field waited for input, matched it against a grammar, and filled a variable. Control moved between documents by URI, exactly as a browser follows a link.

The central idea: separate the dialogue logic from the speech technology. An author writes what the conversation should do; the platform decides which recogniser, which synthesiser and which telephony board to use. That separation is why a 2001 dialogue script is still legible today.

01Where it came from

Through the 1990s, interactive voice response was a proprietary craft. Every vendor shipped its own scripting environment, its own state-machine editor, its own bindings to recognition hardware. An application written for one platform could not be moved to another without a rewrite, and the people who could write them were specialists tied to a single toolchain.

Four companies — working on telephony, speech recognition and web infrastructure respectively — converged on the same conclusion: the dialogue layer should be declarative and transport-agnostic. The resulting specification passed into the W3C's Voice Browser activity, where it was refined alongside companion standards for grammars, synthesis markup and call control.

  • 1995 – 1998

    Research dialects appear inside telephony labs. Markup is used to describe prompt-and-collect loops, but each dialect is bound to one recogniser.

  • 1999

    A joint forum forms to unify the dialects. The first public draft frames a voice dialogue as a document retrieved over HTTP.

  • 2000

    Version 1.0 is submitted to the W3C. The <form> / <field> model and the Form Interpretation Algorithm are fixed in place.

  • 2004

    Version 2.0 becomes a Recommendation, with SRGS for grammars, SISR for semantic interpretation and SSML for synthesis as separate, reusable specifications.

  • 2007 onward

    Version 2.1 adds pragmatic extensions. The stack becomes the default substrate for hosted IVR platforms and cloud telephony APIs.

02The anatomy of a dialogue

A VoiceXML document is small and boringly readable — which was the point. The example below books a table. It prompts, listens, handles the two failure modes every voice interface must handle, and submits the collected values to a server.

reservation.vxml
<vxml version="2.1" xmlns="http://www.w3.org/2001/vxml">

  <form id="booking">

    <field name="party" type="number">
      <prompt>For how many guests?</prompt>
      <nomatch>Sorry — a number between one and twelve.</nomatch>
      <noinput>Still there? How many guests?</noinput>
    </field>

    <field name="sitting">
      <grammar src="sittings.grxml" type="application/srgs+xml"/>
      <prompt>Early or late sitting?</prompt>
    </field>

    <!-- runs only when every field is filled -->
    <filled>
      <prompt>
        A table for <value expr="party"/>,
        <value expr="sitting"/> sitting. Confirming now.
      </prompt>
      <submit next="/confirm" namelist="party sitting"/>
    </filled>

  </form>
</vxml>

Nothing in that document names a vendor, a codec, an audio device or a recognition engine. It describes intent. The interpreter supplies everything else — and that is the whole trick.

The Form Interpretation Algorithm

Behind the readability sits one precisely specified loop, universally shortened to FIA. On each pass it selects the first field whose variable is still undefined, plays that field's prompt, arms the active grammars, waits, and then either fills the variable or throws an event. When no undefined field remains, the <filled> block executes.

That loop is what makes mixed initiative possible. If a caller volunteers "four people, late sitting" in one breath, a document-level grammar can fill both variables at once; the algorithm simply finds nothing left to ask and moves on. The author never writes branching code for the shortcut — the ordering falls out of which variables happen to be defined.

Prompt

What the platform speaks or plays. Synthesised text, recorded audio, or a mixture, with barge-in configurable per prompt.

Field

A slot awaiting a value. Owns its grammars, its retry prompts and its own event handlers.

Event

noinput, nomatch, help, error.* — thrown by the interpreter, caught by the nearest enclosing handler.

Scope

Handlers and grammars cascade: field, then form, then document, then application root. Behaviour is inherited, not repeated.

03Grammars: constraining the infinite

Open-ended recognition was unreliable on the narrow-band audio of a phone line, and remains costly today. VoiceXML's response was to make the expected vocabulary explicit at every point in the conversation. A grammar is not decoration — it is the contract that tells the recogniser which finite set of utterances is currently legal, and how to convert each into structured data.

sittings.grxml — SRGS with semantic tags
<grammar root="sitting" mode="voice"
         xmlns="http://www.w3.org/2001/06/grammar">

  <rule id="sitting">
    <one-of>
      <item>early    <tag>out = "early";</tag></item>
      <item>first    <tag>out = "early";</tag></item>
      <item>six      <tag>out = "early";</tag></item>
      <item>late     <tag>out = "late";</tag></item>
      <item>second   <tag>out = "late";</tag></item>
      <item>half past eight <tag>out = "late";</tag></item>
    </one-of>
  </rule>

</grammar>

Six surface forms collapse to two values. The dialogue never learns that a caller said "half past eight"; it receives "late". This normalisation step — the semantic interpretation layer — is the direct ancestor of the intent-and-slot model used by every contemporary assistant framework. The names changed; the shape did not.

Why the constraint aged well

A bounded grammar delivers three things that remain valuable: predictable accuracy, because the search space is small; predictable latency, because matching is cheap; and predictable behaviour under audit, because the set of accepted phrasings is enumerable. Systems handling money, medication or dispatch still prefer that trade to open transcription, whatever the accuracy headline of the underlying model.

04What the interpreter actually does

The runtime is best pictured as a browser with an unusual set of peripherals. Instead of a screen and a pointer it has a telephony interface, a recogniser and a synthesiser — but the fetch-parse-execute cycle is the familiar one.

Component Responsibility Web equivalent
Document server Generates dialogue documents, usually per call and per state, from application logic Any HTTP application server
Interpreter context Answers calls, watches for out-of-band events, loads the initial document Browser chrome and session handling
Interpreter Runs the Form Interpretation Algorithm, manages scopes, variables and events Layout, scripting and event loop
ASR resource Matches captured audio against the currently active grammars Keyboard and pointer input
TTS / audio Renders prompts as speech or plays pre-recorded files Rendering and paint
Telephony layer Call setup, transfer, DTMF detection, teardown Network transport

Because documents arrive over HTTP, the entire web infrastructure applies unchanged: caching headers control prompt re-fetching, session state can live in cookies or in URLs, load balancers distribute calls, and the same application server that renders a booking page can render the dialogue that books by phone. Deployments frequently shared a database and a template layer between the two front ends.

Events as the honest part of the design

Visual interfaces can afford to treat failure as exceptional. Voice cannot. Silence, mishearing, background noise and interruption are the normal texture of a phone call, so the specification gives them first-class syntax. <noinput> fires on silence, <nomatch> on an unrecognised utterance, and both accept a count attribute so that the second and third attempts can escalate — shorter prompt, then an offer of DTMF, then transfer to a human.

Designing those escalation ladders, rather than the happy path, is the bulk of the craft in voice interface work. The specification's willingness to name failure states explicitly is one reason its documents remain readable as design artefacts, not just as code.

05What survived

Nobody markets a product as a VoiceXML platform any more. That obscures how much of the model persists — usually under different vocabulary, occasionally in the same XML.

Intents and slots

The field-plus-grammar pairing, renamed. An intent is a form; a slot is a field; slot-filling prompts are retry handlers.

Barge-in semantics

Interrupting a prompt mid-sentence, and the rules for what happens to the remaining audio, were settled here first.

SSML

Split out as its own specification, it is now the standard way to control pronunciation, pacing and emphasis across most synthesis APIs.

Server-driven dialogue

Fetching the next turn from an application server, rather than embedding the state machine in the client, is the dominant pattern once more.

The deeper inheritance is architectural. VoiceXML established that a conversation can be authored declaratively, versioned in a repository, reviewed by someone who is not a speech engineer, and executed on infrastructure the author never sees. Every subsequent voice framework has accepted that premise, and the ones that abandoned it — burying dialogue flow in imperative handler code — have generally rediscovered why the separation was worth having.

A note on reading old dialogues: a decade-old .vxml file is often the clearest surviving documentation of how an organisation's phone service actually behaved — including the escalation paths and edge cases that were never written down anywhere else.

Further reading

  • The Voice Extensible Markup Language specification, versions 2.0 and 2.1 — the normative description of the Form Interpretation Algorithm.
  • Speech Recognition Grammar Specification (SRGS), in both XML and ABNF forms.
  • Semantic Interpretation for Speech Recognition (SISR) — how utterances become structured values.
  • Speech Synthesis Markup Language (SSML) — prosody, phonemes and rendering control.
  • Call Control XML (CCXML) — the layer beneath the dialogue, handling call legs, conferences and transfers.