VIAxVOICE
VIAxARMADA · Speech Service Live on Modal

The fleet's voice.

VIAxVOICE gives every agent and app in the fleet a pair of ears and a voice — Whisper speech-to-text and Piper text-to-speech behind one small contract. Modal-hosted, scales to zero, no vendor lock in the callers.

amplitude envelope · the same track that drives the avatars

What it is

Two capabilities, one seam.

Ears and a voice, served the same way to every caller — with an avatar layer riding on top of the audio.

Ears — STT

Whisper (whisper.cpp) on a T4 GPU turns speech into text with language auto-detect. Powers voice memos and meeting transcription across the fleet.

POST /transcribe · multipart audio

Voice — TTS

Piper renders text to natural speech on CPU. Eight neutral voices, each a stable identity an agent can enroll — voice is identity, like an avatar colour.

POST /synthesize · 8 voices · WAV / OGG

Face — Avatars

Every synth returns an amplitude envelope that drives a speaking avatar. AV1 (live) rides the envelope; talking-head video (AV2) and 3D (AV3) are on the roadmap.

envelope · {v, rate, peaks[]}
Under the hood

One heartbeat, every surface.

Audio is generated once; the amplitude envelope is the shared clock; every face is a function of it — from a chat pip today to talking-head video and 3D next.

TEXTagent turn / memo
PIPER TTStext → waveform · 8 voices · speed
ENVELOPEamplitude @ 20/s · the heartbeat
AV1 · CHATaudio memo + speaking sync
AV2 · MUSETALKtalking-head video
AV3 · 3D · AR3D embodiment

engines swap behind the neutral contract — Piper → Cartesia · MuseTalk → next — with zero consumer change

The voice pool

Eight voices. Pick one, and it's yours.

Neutral labels the fleet holds as a stable contract — the TTS layer resolves each to a concrete model, so the engine can swap without touching a single caller.

The contract

Four endpoints. That's the whole surface.

A short-lived HS256 bearer (aud=viaxvoice, scoped, 5-min TTL) authorizes each call. Same shape the fleet already uses agent-to-agent.

POST/synthesize text → audio + amplitude envelope. Params: voice, format, speed, with_envelope. POST/transcribe multipart audio → { text, language, confidence, duration }. GET/voices the choosable voice catalog with character notes. GET/healthz liveness + which models are loaded { stt, tts }.
synthesize — example
# mint a 5-min bearer, then:
curl -X POST "$VIAXVOICE_URL/synthesize" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Deploy is green, team.",
    "voice": "sage",
    "format": "ogg",
    "with_envelope": true
  }'

# → { audio_b64, envelope: {v:1, rate:20, peaks:[…]} }

Base URL · https://viaxvoice--viaxvoice-web.modal.run


Connect

Three doors — pick yours.

However you're built, there's a first-class way in. The full walk-through lives on the Connect page.

If you're an agent

Speak over MCP

You already talk MCP. Call the voice_synthesize and voice_transcribe tools — request in, audio back. Nothing new to learn.

→ MCP tools
If you're an app

Copy the connector

Drop in the first-adapter connector, set two env vars — VIAXVOICE_URL + VIAXVOICE_SECRET — and voice lights up with no code change. It's how TEAMS connected.

→ HTTP connector
If you're a human

Open the Console

The operator Console — heartbeat, voice pool, synth playground, metering — served behind fleet SSO. Coming online next.

→ Console (soon)
Status & roadmap

What's live, what's next.

Honest state — no vaporware. Speech is in production today; the avatar tiers are staged. See the full build plan & roadmap →

● Verified live on Modal · 2026-07-13 — app deployed, scaled to zero, auth enforced.

Live
STT + TTSvoice memos, transcription, and agent voice are running in production. 8 voices, envelope on every synth.
Live
Avatar AV1amplitude-envelope speaking sync; the avatar rides the audio it's actually saying.
Next
Console + SSOoperator dashboard served from the service, behind fleet login.
Planned
Avatar AV2 / AV3talking-head video (MuseTalk) and 3D lip-sync (VIAx3D). Under benchmark.