Skip to main content
Glama

Speak text on a live call

speak_text
Destructive

Read text aloud into a live call with Vobiz TTS, supporting plain text or SSML, selectable languages, and WOMAN or MAN voices.

Instructions

Read text aloud into a LIVE call with Vobiz text-to-speech (POST /Call/{uuid}/Speak/). Use it for dynamic sentences; for a pre-recorded file use play_audio, and to connect your own AI voice agent or transcription use start_audio_stream. Plain text or SSML (type: ssml), up to 3000 characters, spoken in language (default en-US) with a WOMAN (default) or MAN voice; mix and loop work as in play_audio. Speech ends when the text finishes, or earlier with stop_speaking (stop_audio does not stop it). A call that is not live fails with call_not_active.

Input Schema

NameRequiredDescriptionDefault
mixNotrue: speak over the conversation so the parties still hear each other; false: replace the leg's audio while speaking.
legsNoWhich call leg the action applies to: aleg (the call's first leg, default), bleg (the leg bridged to it by <Dial>) or both.
loopNoRepeat the text until stop_speaking is called (default false).
textYesText to speak, or SSML markup when type is ssml; 1-3000 characters.
typeNotext (default): `text` is plain text; ssml: `text` is SSML markup for pauses, emphasis and prosody.
voiceNoVoice: WOMAN (default) or MAN.
languageNoLocale the text is spoken in, e.g. en-US (default), en-IN, hi-IN, de-DE; pick the one matching the text.
call_uuidYesUUID of the LIVE call to act on: the request_uuid returned by make_call, or a UUID from list_live_calls.

Output Schema

NameRequiredDescriptionDefault
okNoTrue on success. On a failure the result is isError with ok: false plus `error` (kind), `message`, `retryable` and sometimes `http_status`.
speakingNoTrue once Vobiz accepted the speech request; audio starts within moments.
call_uuidNoThe call UUID the action was applied to, echoed from the request.
http_statusNoHTTP status Vobiz answered with: 202 when an action was accepted, 204 when one was stopped.
backend_messageNoVobiz's own confirmation text for the request, or null when it sent none.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv1.4.2
    • addedInput schema / properties / call_uuid / description
      Added value: +"UUID of the LIVE call to act on: the request_uuid returned by make_call, or a UUID from list_live_calls."
    • changedInput schema / properties / language / description
      Previous value: -"Default en-US."New value: +"Locale the text is spoken in, e.g. en-US (default), en-IN, hi-IN, de-DE; pick the one matching the text."
    • changedInput schema / properties / legs / description
      Previous value: -"Which call leg: aleg (default), bleg or both."New value: +"Which call leg the action applies to: aleg (the call's first leg, default), bleg (the leg bridged to it by <Dial>) or both."
    • addedInput schema / properties / loop / description
      Added value: +"Repeat the text until stop_speaking is called (default false)."
    • addedInput schema / properties / mix / description
      Added value: +"true: speak over the conversation so the parties still hear each other; false: replace the leg's audio while speaking."
    • changedInput schema / properties / text / description
      Previous value: -"Text (or SSML when type is ssml), max 3000 characters."New value: +"Text to speak, or SSML markup when type is ssml; 1-3000 characters."
    • addedInput schema / properties / type / description
      Added value: +"text (default): `text` is plain text; ssml: `text` is SSML markup for pauses, emphasis and prosody."
    • addedInput schema / properties / voice / description
      Added value: +"Voice: WOMAN (default) or MAN."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "backend_message": {
      +      "description": "Vobiz's own confirmation text for the request, or null when it sent none.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "call_uuid": {
      +      "description": "The call UUID the action was applied to, echoed from the request.",
      +      "type": "string"
      +    },
      +    "http_status": {
      +      "description": "HTTP status Vobiz answered with: 202 when an action was accepted, 204 when one was stopped.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "ok": {
      +      "description": "True on success. On a failure the result is isError with ok: false plus `error` (kind), `message`, `retryable` and sometimes `http_status`.",
      +      "type": "boolean"
      +    },
      +    "speaking": {
      +      "const": true,
      +      "description": "True once Vobiz accepted the speech request; audio starts within moments.",
      +      "type": "boolean"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observedv1.1.1

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=false); the description goes well beyond them by disclosing termination semantics (ends when text finishes, or earlier with stop_speaking), a sibling-confusion warning (stop_audio does not stop it), the live-call precondition with its error code, and loop behavior requiring stop_speaking. That is exactly the extra behavioral context the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then alternatives, then constraints and failure mode — a logical order with no filler sentences. It is delivered as one dense semicolon-chained block rather than scannable clauses, which costs a little readability but wastes nothing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the remaining burden: live-call precondition, character cap, SSML mode, voice/language defaults, stop semantics, sibling tools, and the error path. An agent has everything needed to call it correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description nudges above it by naming the operative defaults (language en-US, voice WOMAN, plain text vs SSML via `type`) and by cross-referencing `mix` and `loop` to their established semantics in play_audio, which the schema cannot convey. It adds no syntax detail for `legs` or `call_uuid`, so it is not fully additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read `text` aloud into a LIVE call with Vobiz text-to-speech') plus the concrete endpoint. It immediately distinguishes itself from play_audio (pre-recorded files) and start_audio_stream (own AI agent/transcription), so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('dynamic sentences'), explicit alternatives with the condition that selects each (pre-recorded file -> play_audio; own voice agent/transcription -> start_audio_stream), and explicit when-not via the failure case ('A call that is not live fails with call_not_active'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools