Get started
Published 07.07.2026

Migrate from PlayHT to Inworld Realtime TTS After Shutdown

By Kylan Gibbs, CEO and Co-founder, Inworld AI
Last updated: July 2026
PlayHT (PlayAI) shut down permanently on December 31, 2025, after Meta acquired its team in July 2025, and deleted all voice clones and saved audio at sunset. This guide migrates PlayHT workloads to Inworld AI's Realtime TTS in three steps: reclone voices, swap the synthesis API, remap stock voices.
Inworld AI is a research lab and inference provider focused on realtime AI models for consumer-facing applications: Realtime TTS (sub-200ms time-to-first-audio, instant voice cloning from 5-15 seconds of audio, 15 GA languages plus 90+ experimental on TTS-2), Realtime STT, a configurable Realtime API pipeline, and an OpenAI-compatible LLM Router across 220+ models at cost. Below: model mapping, voice recloning, code changes, and the operational gotchas that bite teams who try to swap providers in a weekend.

What Happened to PlayHT?

PlayHT is fully shut down and is not onboarding anyone. The timeline, for teams reconstructing what happened to their integration:
  1. July 2025: Meta acquired the PlayAI team (roughly 35 people), absorbing them into Meta Superintelligence Labs. Meta confirmed the acquisition publicly on July 12, 2025.
  2. Late July 2025: the PlayHT API went offline ahead of schedule, around July 26, 2025. Cartesia noted publicly at the time that "their API is already offline, and the full platform sunsets on December 31st," and platforms like Kore.ai discontinued PlayHT TTS support.
  3. December 31, 2025: all products (the play.ht studio, the API, Voice Agents) closed permanently. User accounts, saved audio, and voice clones were deleted at sunset with no export tooling.
  4. As of July 7, 2026: the play.ht domain no longer resolves.
The practical consequences:
  • Existing PlayHT API integrations are dead. The endpoints have been offline since late July 2025.
  • Voice clones are gone. PlayHT deleted user voice data at the December 31, 2025 sunset. There is no recovery path through PlayHT.
  • Your only option is to reclone from your original audio sources into a new provider.
The good news: if you still have your original training audio (the human-recorded samples used to clone the voice), you can reclone into Realtime TTS in minutes. The bad news: do not try to reclone using AI-generated audio output from PlayHT. That introduces compounding artifacts and degrades quality across generations. Use original human audio.

Model Mapping: PlayHT to Realtime TTS

Every PlayHT tier has a direct Realtime TTS equivalent. Map your models with this table, then handle voices in the next two sections.
PlayHT modelRealtime TTS equivalentNotes
PlayHT 2.0 / Play 3.0 (highest quality)inworld-tts-2 (research preview)Sub-200ms median time-to-first-audio, natural-language steering, 15 GA + 90+ experimental languages
PlayHT 2.0 / Play 3.0 (production GA)inworld-tts-1.5-maxSub-200ms median time-to-first-audio, 15 GA languages, GA
PlayHT Turboinworld-tts-1.5-miniLowest time-to-first-audio in the lineup (~120ms median), best for high-volume streaming
PlayHT voice clonesRe-clone via POST /voices/v1/voices:clone2-step process; use original human-recorded audio
PlayHT stock voicesInworld voice library via GET /voices/v1/voicesClosest matches via voice search
Pricing as of July 7, 2026, from inworld.ai/pricing: TTS-2 is $25 per 1M characters on demand, dropping through plan tiers ($20 Creator, $17.50 Builder, $15 Developer, $12.50 Growth) to as low as $5 at enterprise volume. TTS 1.5 Max is $35 per 1M characters and TTS 1.5 Mini is $15. The free tier covers up to 70 minutes of TTS and 100 custom voices, with instant voice cloning included, which is enough to reclone and A/B your PlayHT voices before committing.

Migration Step 1: Reclone Your Voices

Voice cloning in Realtime TTS is a two-step process: clone first to get a voiceId, then use that voiceId in TTS calls. There is no referenceAudio field on the TTS endpoint.
import requests
import base64

with open("original_voice_sample.wav", "rb") as f:
    audio_b64 = base64.b64encode(f.read()).decode()

# Step 1: Clone the voice
clone_response = requests.post(
    "https://api.inworld.ai/voices/v1/voices:clone",
    headers={"Authorization": "Basic <your-api-key>"},
    json={
        "displayName": "Customer Service Agent",
        "langCode": "EN_US",
        "voiceSamples": [
            {"audioData": audio_b64}
        ],
        "audioProcessingConfig": {"removeBackgroundNoise": True}
    }
)
voice_id = clone_response.json()["voice"]["voiceId"]

# Step 2: Use the cloned voice in TTS calls
tts_response = requests.post(
    "https://api.inworld.ai/tts/v1/voice",
    headers={"Authorization": "Basic <your-api-key>"},
    json={
        "text": "Hello, how can I help you today?",
        "voiceId": voice_id,
        "modelId": "inworld-tts-2",
        "audioConfig": {
            "audioEncoding": "MP3",
            "sampleRateHertz": 24000
        }
    }
)

with open("output.mp3", "wb") as f:
    f.write(base64.b64decode(tts_response.json()["audioContent"]))
Cloning requirements:
  • 5-15 seconds of clean, single-speaker original audio (samples >15s auto-trimmed).
  • Formats: WAV, MP3, WEBM. Max 4MB per sample.
  • Cloned-voice storage scales with plan: 100 custom voices on the free tier up to 30,000 on Growth, per inworld.ai/pricing as of July 7, 2026 (higher limits via enterprise sales).
  • Use original human-recorded audio, not AI-generated PlayHT output. Generation-on-generation cloning compounds artifacts.
If your PlayHT voices served multiple languages, note that TTS-2 preserves a cloned voice's identity across languages. See cross-lingual voice cloning on TTS-2 for how that works, and the voice cloning API comparison if you want to evaluate cloning quality across providers before recloning your full library.

Migration Step 2: Swap the Synthesis API

The synthesis swap is three changes: the endpoint, the field names (voiceId and modelId), and a required audioConfig object. Auth is Authorization: Basic <api-key>, not Bearer.
# Before: PlayHT synthesis (legacy reference)
# response = playht.tts(text=text, voice="s3://voice-cloning-zero-shot/...", ...)

# After: Realtime TTS synthesis
import requests
import base64

response = requests.post(
    "https://api.inworld.ai/tts/v1/voice",
    headers={"Authorization": "Basic <your-api-key>"},
    json={
        "text": "Hello world",
        "voiceId": "Sarah",  # or your cloned voiceId
        "modelId": "inworld-tts-2",
        "audioConfig": {
            "audioEncoding": "MP3",
            "sampleRateHertz": 24000
        }
    }
)

audio_bytes = base64.b64decode(response.json()["audioContent"])
with open("output.mp3", "wb") as f:
    f.write(audio_bytes)
For real-time applications, use the streaming endpoint which returns NDJSON (newline-delimited JSON) with base64 audio chunks:
import requests
import base64
import json

with requests.post(
    "https://api.inworld.ai/tts/v1/voice:stream",
    headers={"Authorization": "Basic <your-api-key>"},
    json={
        "text": "Hello world",
        "voiceId": "Sarah",
        "modelId": "inworld-tts-1.5-mini",  # mini for lowest time-to-first-audio
        "audioConfig": {
            "audioEncoding": "PCM",
            "sampleRateHertz": 24000
        }
    },
    stream=True
) as r:
    for line in r.iter_lines():
        if not line:
            continue
        chunk_obj = json.loads(line)
        audio_bytes = base64.b64decode(
            chunk_obj["result"]["audioContent"]
        )
        # play / forward audio_bytes to client

Migration Step 3: Voice Library Mapping

If you used PlayHT stock voices rather than custom clones, browse the Realtime TTS voice library:
import requests

response = requests.get(
    "https://api.inworld.ai/voices/v1/voices?languages=EN_US",
    headers={"Authorization": "Basic <your-api-key>"}
)

for voice in response.json()["voices"]:
    print(voice["voiceId"], voice["displayName"], voice.get("description"))
Realtime TTS ships a voice library across 15 GA languages (plus 90+ experimental languages on TTS-2 with cross-lingual voice identity). Browse voices via GET /voices/v1/voices; the legacy /tts/v1/voices endpoint was deprecated on July 1, 2026, so use the /voices/v1/ path in all new code. The default voice in the official docs examples is Sarah; the full library is listed by the endpoint above or browsable in the TTS Playground, where you can audition candidates against your old PlayHT voice side by side.

Migration Checklist

Work through these in order; each item maps to a step above.
  • [ ] Pull all original human-recorded voice samples used for PlayHT clones.
  • [ ] Get an Inworld API key from platform.inworld.ai.
  • [ ] Reclone each voice via POST /voices/v1/voices:clone. Save the returned voiceId.
  • [ ] Update synthesis calls: change endpoint, use the voiceId and modelId field names, add audioConfig (audioEncoding + sampleRateHertz). If you are new to the API, the Python TTS API tutorial covers the full request/response cycle.
  • [ ] Update streaming parsing: PlayHT used various streaming formats; Realtime TTS streaming is NDJSON with base64 audioContent per line.
  • [ ] Decode base64 before writing audio. Both sync and streaming responses return base64.
  • [ ] Test latency end-to-end. TTS 1.5 Mini delivers ~120ms median time-to-first-audio; TTS-2 and 1.5 Max deliver sub-200ms.
  • [ ] If you used PlayHT for the full speech loop, consider migrating the LLM layer too. The Router is OpenAI SDK-compatible and routes to 220+ models at cost (OpenAI, Anthropic, Google, Groq, Fireworks, Mistral, DeepSeek and more).

Why Realtime TTS After PlayHT

Three reasons to pick Realtime TTS after PlayHT:
  • Voice quality. Inworld's Realtime TTS-2 is the #1 realtime TTS. PlayHT was a strong product; Realtime TTS-2 (research preview) pushes further on expressiveness, conversational naturalness, and natural-language steerability, with Realtime TTS 1.5 Max and Mini GA for production workloads. Judge it with your own ears: reclone one voice on the free tier and A/B it against your archived PlayHT output.
  • 15 GA languages, plus 90+ experimental on TTS-2. TTS-2 preserves a cloned voice's identity across languages, so one reclone covers your whole language footprint instead of one clone per locale.
  • Full pipeline integration. Realtime TTS pairs with Realtime STT, the Router (220+ models, at cost), and the Realtime API for end-to-end voice applications, so PlayHT teams that had stitched TTS to a separate LLM and STT stack can consolidate onto one provider and one API key.
Ready to test a recloned voice? Get an API key at platform.inworld.ai and stream your first audio in minutes; the free tier's 70 TTS minutes and included voice cloning cover a full migration proof-of-concept. The TTS API quickstart has copy-paste curl, Python, and Node examples.

When Another Provider Is the Better Fit

Realtime TTS is built for realtime, high-volume conversational products. Some PlayHT workloads point elsewhere, and it is better to admit that before you reclone 200 voices:
  • You need a massive off-the-shelf voice marketplace or studio-first dubbing workflows. ElevenLabs has a large community voice library and mature dubbing/audiobook tooling. If that was why you chose PlayHT, evaluate ElevenLabs alongside Inworld; and if you later leave it, the ElevenLabs migration guide follows the same reclone-and-swap pattern as this one. Price it honestly: as of July 7, 2026, ElevenLabs lists Flash/Turbo at $0.05 per 1K characters ($50 per 1M) and Multilingual v3 at $0.10 per 1K ($100 per 1M) on elevenlabs.io/pricing/api, versus $25 per 1M on-demand for TTS-2 on inworld.ai/pricing.
  • Your workload is long-form narration rendered offline, where time-to-first-audio is irrelevant and per-character price at batch volume dominates. Compare batch-oriented options in the best TTS APIs comparison before defaulting to a realtime-optimized engine.
  • You are locked into a single-vendor end-to-end voice model stack (for example OpenAI's Realtime API) and do not want a cascaded pipeline. You trade away model choice per component (the thing a modular STT, LLM, TTS pipeline preserves), but it is one less integration to own.

About Inworld AI

Inworld is a research lab and inference provider focused on realtime AI models for consumer-facing applications. We build first-party voice models (Realtime TTS and Realtime STT), serve optimized open-source LLMs on our own Realtime Inference engine, and expose them as modular APIs, alongside an LLM Router that routes to 220+ models and a Realtime API for full speech-to-text-to-LLM-to-speech pipelines. We focus on serving developers of realtime, high-volume conversational products across domains such as health, fitness, education, companions, social, and games, with an emphasis on quality, low latency, and low cost at scale.

FAQ

What happened to PlayHT?

Meta acquired the PlayAI (PlayHT) team in July 2025 and the company announced permanent closure of all products. The API went offline in late July 2025 and the platform fully sunset on December 31, 2025. User accounts, saved audio, and voice clones were deleted at the cutoff, and as of July 2026 the play.ht domain no longer resolves. There is no recovery path through PlayHT.

Can I migrate my PlayHT voice clones to a new provider?

You cannot transfer the clones directly because PlayHT deleted the underlying voice data. You must reclone from your original human-recorded audio samples. Realtime TTS supports instant cloning from 5-15 seconds of audio via the POST /voices/v1/voices:clone endpoint. The clone call returns a voiceId; use that ID in synthesis requests. The free tier includes voice cloning and 100 custom voices, so you can reclone and test before paying.

Should I reclone using AI-generated PlayHT audio?

No. Generation-on-generation cloning compounds artifacts and degrades quality. Always use the original human-recorded audio you used to create the PlayHT clone. If the original recordings are gone, record fresh samples instead: cloning needs only 5-15 seconds of clean, single-speaker audio (WAV, MP3, or WEBM, max 4MB per sample), so re-recording is usually faster than hunting for old files.

How does Realtime TTS compare to PlayHT on quality?

Inworld Realtime TTS-2 (research preview) is built for expressive, conversational speech: natural-language style steering, sub-200ms median time-to-first-audio, and cross-lingual voice cloning. Realtime TTS 1.5 Max and Mini are GA for production workloads. The free tier includes enough TTS minutes to reclone a voice and A/B it against your archived PlayHT output before committing.

What does Inworld Realtime TTS cost compared to PlayHT?

As of July 7, 2026, Inworld Realtime TTS-2 costs $25 per 1M characters on demand, with plan pricing from $20 (Creator) down to $12.50 (Growth) and enterprise rates as low as $5 per 1M characters. TTS 1.5 Mini is $15 per 1M characters. The free tier includes up to 70 minutes of TTS plus 100 custom voices, with voice cloning included, so you can test recloned voices before paying anything.

What is the easiest way to migrate code?

Three changes: switch to the Inworld endpoints /tts/v1/voice (sync) or /tts/v1/voice:stream (streaming) at api.inworld.ai, use voiceId and modelId field names, and add an audioConfig object with audioEncoding and sampleRateHertz. Authentication is Authorization: Basic <api-key> (Basic, not Bearer). Both endpoints return base64 in audioContent; decode before writing audio.
Copyright © 2021-2026 Inworld AI
Migrate from PlayHT to Inworld Realtime TTS After Shutdown