MAI-Voice-2.1 on OpenRouter: audio/speech call, mp3 or pcm
OpenRouter serves microsoft/mai-voice-2.1 at POST /api/v1/audio/speech and returns raw audio bytes, mp3 or pcm. Here is the call and how Sume jobs differ.

To call MAI-Voice-2.1 through OpenRouter, POST to https://openrouter.ai/api/v1/audio/speech with model: "microsoft/mai-voice-2.1" and an input string; voice is optional and response_format is mp3 or pcm (pcm is the default). The response is raw audio bytes, not JSON, and an X-Generation-Id header tracks the billed request. Microsoft prices the model at $22 per 1M characters on its own page.
Facts are from OpenRouter's model page and Microsoft AI's model page, both read on 2026-10-13.
| Item | Value |
|---|---|
| Endpoint | POST https://openrouter.ai/api/v1/audio/speech |
| Required | model, input |
| Optional | voice, response_format (mp3 or pcm, default pcm) |
| Response | Raw audio bytes; Content-Type shows the format; X-Generation-Id header |
| Errors | 400, 401, 402, 403, 404, 429, 502 |
| Microsoft list price | $22 per 1M characters (Flash: $15 per 1M) |
curl https://openrouter.ai/api/v1/audio/speech \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"microsoft/mai-voice-2.1","input":"Meet the new desk lamp.","response_format":"mp3"}' \
--output line.mp3How is this different from a Sume TTS job?
A Sume TTS call is a job: you get status_url and result_url, poll GET /v1/jobs/:id/status, and read a durable audio artifact from /result. The OpenRouter call above returns bytes in the response. Neither is better; pick by whether your pipeline wants a hosted file and a job id.
MAI-Voice-2.1 is not in the Sume TTS Router catalog (check GET /v1/tts-router/models), so a Sume pipeline that wants MAI audio imports the file first.
Where else does Microsoft say it is available?
Microsoft's page names the MAI Playground, Copilot Audio Expressions and Microsoft Foundry (Azure Speech). It lists 23 languages, about 550 ms latency for MAI-Voice-2.1 and about 45 ms for Flash.
Sources
Related posts
More in Developers
- Decision-1 returns 429: back off, then fail closed before Sume
Microsoft says retry a Decision-1 429 with exponential backoff. Cap the retries, then route the brief to review so a throttled gate never renders.
- Decision-1, then Haiku 5.5, then a person: a three-tier gate
Add an abstention option to a Decision-1 choice, escalate unsure briefs to Claude Haiku 5.5, and keep people for the rest, before any paid Sume call.
- Decision-1 picks a video model; check it against Sume's catalog
Let a choice question pick among three model ids, then validate the pick against GET /v1/videos/models and fall back to sume/auto when it is missing.
- Microsoft-Decision-1 returns 422 or 404: deployment name and endpoint
Decision-1 wants your deployment name in `model`, not the model name. A 422 means a bad name or question; a 404 means a wrong endpoint or path.
Written by Sume