Skip to content
Immersive AI

GPT-4o mini TTS — room for your next idea

Audio GPT 4O Mini TTS by Henri Huotari · Oct 28, 2026

A short English brand introduction with OpenAI speech generation and the Coral voice. Demonstrates an explicitly selected speech model, voice and speed, with the exact source script and returned MP3.

This file couldn't be loaded. The link may have expired.
Output result.mp3

Run it yourself

Set IMMERSIVE_API_KEY to an API key from your account. Create a free account to get one.

curl -X POST 'https://ai.im.inc/api/v1/audio/tts' \
  -H "Authorization: Bearer $IMMERSIVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "async": true,
  "input": "An idea can start anywhere. With a shape. A colour. A few words. Bring it to life with image, video, audio, text and 3D models, all through Immersive AI. One API. Room for your next idea.",
  "model": "gpt-4o-mini-tts",
  "speed": 1,
  "voice": "coral",
  "provider": "openai"
}'

# Set JOB_ID to the response's "id", then poll every few seconds until the job has finished:
curl "https://ai.im.inc/api/v1/audio/$JOB_ID" \
  -H "Authorization: Bearer $IMMERSIVE_API_KEY"

# The finished response has the result at url.
const headers = { Authorization: `Bearer ${process.env.IMMERSIVE_API_KEY}` };

const response = await fetch("https://ai.im.inc/api/v1/audio/tts", {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({
    "async": true,
    "input": "An idea can start anywhere. With a shape. A colour. A few words. Bring it to life with image, video, audio, text and 3D models, all through Immersive AI. One API. Room for your next idea.",
    "model": "gpt-4o-mini-tts",
    "speed": 1,
    "voice": "coral",
    "provider": "openai"
  }),
});
const job = await response.json();

// Poll every few seconds while the job is still running.
const running = ["pending", "queued", "submitted", "starting", "processing", "running", "streaming", "in_queue", "in_progress"];
let result;
do {
  await new Promise((resolve) => setTimeout(resolve, 5000));
  result = await (await fetch(`https://ai.im.inc/api/v1/audio/${job.id}`, { headers })).json();
} while (running.includes(String(result.status).toLowerCase()));

console.log(result.url);
import os
import time

import requests

headers = {"Authorization": f"Bearer {os.environ['IMMERSIVE_API_KEY']}"}

job = requests.post(
    "https://ai.im.inc/api/v1/audio/tts",
    headers=headers,
    json={
        "async": True,
        "input": "An idea can start anywhere. With a shape. A colour. A few words. Bring it to life with image, video, audio, text and 3D models, all through Immersive AI. One API. Room for your next idea.",
        "model": "gpt-4o-mini-tts",
        "speed": 1,
        "voice": "coral",
        "provider": "openai",
    },
    timeout=300,
).json()

# Poll every few seconds while the job is still running.
running = {"pending", "queued", "submitted", "starting", "processing", "running", "streaming", "in_queue", "in_progress"}
while True:
    time.sleep(5)
    result = requests.get(f"https://ai.im.inc/api/v1/audio/{job['id']}", headers=headers, timeout=60).json()
    if str(result.get("status", "")).lower() not in running:
        break

print(result["url"])
{
    "id": "3dd976d0-acfe-4278-8818-a6782a5f65ba",
    "url": "https://s3.eu-central-1.amazonaws.com/ai.im.inc/examples/outputs/6a98f239-6fc9-479b-be09-4a55bec03697/result.mp3",
    "status": "succeeded",
    "speech_id": "3dd976d0-acfe-4278-8818-a6782a5f65ba"
}

Your browser blocked the clipboard. Select the text and copy it by hand.

How the job runs

  1. POST returns the job's id and status right away.
  2. Poll GET /api/v1/audio/{id} every few seconds while the job is running.
  3. When status is succeeded, download url. Failed jobs are refunded automatically.
Endpoint
POST /api/v1/audio/tts
Model
gpt-4o-mini-tts
Output
Audio · MP3