Microsoft AI: MAI-Voice-2
Microsoft AI’s MAI-Voice-2 produces expressive multilingual speech for narration, dialogue and spoken applications. Long-form consistency, multiple speakers and turn-level emotion control support audiobooks, lessons and character voices.
About the model
This description covers the model’s capabilities. Available in Ailoot inputs, outputs and options are listed for the selected method below.
MAI-Voice-2 is Microsoft AI’s prompted text-to-speech model for natural, expressive spoken content. Its manufacturer emphasises acoustic fidelity, speaker consistency and emotional range. The documented tasks include assistants, audiobooks, podcasts, lectures, educational characters and accessibility narration. Transcript text becomes audio in a chosen voice; the Voice-2-Flash variant has its own profile for interactions where immediate response is the priority.
Language and speaker
Microsoft’s Voice-2 release describes fifteen languages, including English, French, German, Italian, Spanish, Portuguese, Hindi, Korean, Simplified Chinese, Turkish, Russian, Thai, Dutch, Romanian and Hungarian. Some languages have separate regional variants. The release also describes Hindi–English and Spanish–English code switching, so selected mixed-language passages can retain the way a speaker naturally alternates languages.
Prepare the actual words to be spoken and preserve their intended language. A bilingual educational passage can introduce a term in one language and explain it in another, while keeping names and quotations intact. The spoken result should be checked with the accent and audience required by the piece rather than treating every locale as interchangeable.
The model card provides a curated voice library and a separate reference-voice prompting path. Reference speech supplies the desired speaker identity without fine-tuning. Microsoft recommends natural conversational delivery with moderate energy because the recording affects pacing and delivery. Use a representative, consented recording when the task calls for a custom voice.
Longer narration and dialogue
The model card documents long-form generation through chunking with context carryover. This supports connected narration such as a chapter, a lesson or a sequence of podcast passages. Divide the script at meaningful section boundaries and keep its terminology and speaker choice consistent. A long explanation benefits from spoken transitions that tell the listener when the topic changes.
Multiple-speaker support allows distinct roles in a prepared dialogue. Assign the question and response to their intended speakers and retain those assignments when a role returns. The input should contain the final lines and relevant performance instructions, not an open request asking the speech synthesizer to invent the conversation.
Tone and emotional delivery
Microsoft documents fine-grained, turn-level control of tone, delivery and emotion. Its release examples demonstrate expressive spoken roles and emotional passages. For a narrative, determine which sentence is factual, reflective or excited, then apply a delivery that follows that meaning. A practical line is: “The quietest part of the experiment turned out to be the most revealing. That was where the pattern first became clear.” The wording gives the performance an intentional change of emphasis.
For an instructional voice-over, keep the action clear and the explanation in a separate sentence. For dialogue, distinguish a character’s spoken wording from scene notes. Listen to repeated names and transitions between passages so the final sequence remains coherent.
Use the audio
The output is newly generated speech for the supplied transcript. Its useful form is a narration, dialogue or spoken application response whose voice and delivery follow the script. Keep the text, speaker and section order associated with the recording so a correction changes the intended passage without losing the rest of the performance.
MAI-Voice-2’s emphasis is naturalness and expression in an extended listening experience. Its long-form capability does not define an unlimited input or a guaranteed maximum recording duration. The exact Voice-2 description remains separate from the expanded language catalogue and voice settings of the later Voice-2.1 editions.
Ailoot Ultra · Text to speech POST /v1/audio/speech microsoft/mai-voice-2
microsoft/mai-voice-2Overview
Microsoft AI’s MAI-Voice-2 produces expressive multilingual speech for narration, dialogue and spoken applications. Long-form consistency, multiple speakers and turn-level emotion control support audiobooks, lessons and character voices.
- Accepted inputs
- Text
- Results
- Audio
Available in Ailoot · inputs & methods
Ailoot Ultra · Text to speech POST /v1/audio/speech
- Input types
text- Output types
audio- Output format
- mp3
| Field | Type | Requirement | Values & limits | Default |
|---|---|---|---|---|
Fieldmodel | Typestring | RequirementRequired | Values & limits microsoft/mai-voice-2 | Default— |
Fieldinput | Typestring | RequirementRequired | Values & limits Minimum length: 1 Unit: Unicode characters | Default— |
Fieldvoice | Typestring | RequirementRequired | Values & limits en-US-Harper:MAI-Voice-2, es-MX-Valeria:MAI-Voice-2, fr-FR-Soleil:MAI-Voice-2, de-DE-Klaus:MAI-Voice-2 | Default— |
Fieldresponse_format | Typestring | RequirementRequired | Values & limits mp3 | Default— |
Input material combinations
text_to_speech · Required: input
Method parameters and lifecycle
| Parameter | Contract |
|---|---|
Parametercontent_type | Contractapplication/json |
Parameterrequired | Contractmodel, input, voice, response_format |
Parametervoice_ids | Contracten-US-Harper:MAI-Voice-2, es-MX-Valeria:MAI-Voice-2, fr-FR-Soleil:MAI-Voice-2, de-DE-Klaus:MAI-Voice-2 |
Parameterresponse_format | Contractmp3 |
Parametermax_input_characters | Contractnull |
Parameterother_options | Contractfalse |
Parameterinput | Contractexact UTF-8 text; Unicode character count without normalization |
Parametermaterial_types | Contracttext |
Lifecycle: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · actual returned task_id or media library record
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Select exact voice from this model profile.
Input characters and audio seconds are different meters.
Pricing
Tariff references do not add request options. Supported parameters are listed for the selected method.
- Fast mode
- Not specified When fast mode is selected
- Flex mode
- Not specified When flex mode is selected
- Maximum reasoning effort
- Not specified When maximum reasoning effort uses the default adjustment
Ailoot rates
Prices by configuration
Match each charge to the conditions shown. Use one rate for each set of alternative configurations.
| Configuration | Rate schedule | Billable quantity | Billing unit | Charge |
|---|---|---|---|---|
| ConfigurationBase token rates | Rate scheduleBase rate | Billable quantity— | Billing unit— | Charge Input · Input tokens — / 1K tokens Output · Output tokens — / 1K tokens Input · Cache read — / 1K tokens Input · Cache write — / 1K tokens Input · Cache write, 1 hour — / 1K tokens |
| ConfigurationUltra | Rate schedule— | Billable quantityEach Unicode code point counts as one character, including Han characters. | Billing unitper 1000 input character | Charge Input · input character $0.044 per 1000 input character |
Reference tariff details
Model-level reference schedules do not change method selection, quotes or charges. Active charges use the selected Ailoot method rates.
Microsoft AI: MAI-Voice-2
Prices by configuration
| Configuration | Billing conditions | Charge |
|---|---|---|
| ConfigurationMicrosoft AI: MAI-Voice-2 · Default configuration | Billing conditionsDefault configuration | Charge Input · Input characters $0.000044 per input character |
Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →
Example requests
Ailoot Ultra · Text to speech
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_VOICE_ID:?Choose an accepted voice ID from this exact model profile}"
export AILOOT_VOICE_ID
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "microsoft/mai-voice-2", "input": "Good afternoon! This is a short voice take."}')
voice=os.environ["AILOOT_VOICE_ID"]
allowed=json.loads('["en-US-Harper:MAI-Voice-2", "es-MX-Valeria:MAI-Voice-2", "fr-FR-Soleil:MAI-Voice-2", "de-DE-Klaus:MAI-Voice-2"]')
if voice not in allowed: raise SystemExit("Choose an accepted voice ID from this exact model profile")
p["voice"]=voice
p["response_format"]="mp3"
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/audio/speech \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o speech.mp3
Receive and save results
Ailoot Ultra · Text to speech
mp3
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Other content reads
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/media/assets \
-H "Authorization: Bearer $AILOOT_API_KEY" -o media-assets.json
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_MEDIA_TASK_ID:?Set the actual ID returned by the response or media-library metadata}"
export AILOOT_MEDIA_TASK_ID
resource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_MEDIA_TASK_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/media/tasks/$resource_id" \
-H "Authorization: Bearer $AILOOT_API_KEY" -o media-task.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("media-task.json").read_text())))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_ASSET_ID:?Set the actual ID returned by the response or media-library metadata}"
export AILOOT_ASSET_ID
resource_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_ASSET_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/media/assets/$resource_id" \
-H "Authorization: Bearer $AILOOT_API_KEY" -o media-asset.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("media-asset.json").read_text())))
PY_RESULT
Keep all completed results
Keep every complete returned response, file and content part.
Keep the complete binary result and headers. If JSON/multiple outputs are returned, retain every data item and fetch each actual signed asset URL.
If the original response needs checking
Retain original operation_id/X-Client-Request-ID for reconciliation without resubmission; no dedicated audio poll route.
Response fields
| Field | Type |
|---|---|
Fieldbinary audio | Typebytes |
Fieldresponse headers | Typeheaders |
Errors and next steps
| Response | Condition | Next step |
|---|---|---|
Response400 · invalid_request_error | ConditionInvalid required fields, material representation or parameter value | Next stepCorrect the indicated fields before a new creation request. |
Responseserver_error | ConditionThe returned response says the operation or result requires a check | Next stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request. |
Aliases
Model aliases
Ailoot Ultra microsoft/mai-voice-2
Method path aliases
Use the method paths shown above.
Related caller IDs
FAQ · Microsoft AI: MAI-Voice-2
- What inputs and results are available?
POST /v1/audio/speech·microsoft/mai-voice-2:text→audio- Which fields does the request use?
POST /v1/audio/speech·microsoft/mai-voice-2:model,input,voice,response_format