ElevenLabs is a trademark of its respective owner, used here for identification and migration comparison only. No endorsement, partnership, or affiliation is implied.
voices.ivc.create), then synthesize speech in it
(textToSpeech.convert) with realistic multilingual output. The SDK is mature and the models are
excellent. But an ElevenLabs account is also a standalone voice vendor that sits apart from
everything else your agent touches:
- Every voice lives behind a single
xi-api-key, disconnected from wherever the agent’s email, cards, phone number, and KYC live. - The key is coarse and self-attested: any code holding it can clone any voice and synthesize anything with it. The only “consent” is a checkbox in the cloning ToS — there is no record of who consented, and nothing enforces that a voice cloned for one purpose isn’t used for another.
- “Which agent cloned that voice, who consented, and what else can this agent do?” is answered in the ElevenLabs dashboard for voices, and in unrelated systems for everything else. The voice has no shared accountability with the rest of the agent’s footprint.
voice primitive gives the agent the same capability — clone
a consented voice, then synthesize speech in it — but the voice is rooted in one governed
identity with consent and permissions enforced at execution time:
- Every voice carries a consent record (who consented, the affirmation, and the
authorized_uses), and synthesis is refused if the requestedusefalls outside that set — a voice cloned foremailwill not narrate avideo. - Cloning and revoking a voice are human-only — they require a signed-in session, not just an agent API key — so a leaked agent key can synthesize with voices it already owns but can never mint or destroy one.
- The tenant user whose Account Kit enables
voiceis the same user that owns the agent’s email inboxes, its cards, its phone number, and its vault — one identity, one audit trail, revocable in one place.
voice primitive, shows the smallest working
swap, and is explicit about the ElevenLabs features that don’t map yet.
Tested against: the ElevenLabs Node SDK
@elevenlabs/elevenlabs-js v2.53.0
(ElevenLabsClient, textToSpeech.convert, textToSpeech.stream, voices.ivc.create,
voices.search, voices.delete; REST base https://api.elevenlabs.io, xi-api-key header) and the
Naive voice primitive over the Naive API (base https://api.usenaive.ai/v1) plus the
Naive CLI, docs snapshot July 2026.Version notes:- ElevenLabs exposes two clone flows: Instant Voice Clone (
voices.ivc.create, a few seconds of audio) and Professional Voice Cloning (voices.pvc.*, longer dataset + a verification / training step). Naive’svoice cloneis a single consented-clone flow withconsent_typeofself,third_party_attested, orthird_party_verified(third-party consenters get a verification link) — see the concept map. - ElevenLabs identifies a voice by its
voice_idand lets you passmodelId(eleven_multilingual_v2, etc.),voiceSettings, andoutputFormatper call. Naive identifies a voice by its id, returns a presigned MP3 URL (valid 24h), and does not expose model / voice-settings / output-format selection today — see what doesn’t map yet. - The Naive
voiceprimitive is REST + CLI (there is novoiceSDK sub-client yet). Examples below use the Naive CLI andfetch; the agent surface uses annv_sk_API key, and the human-only clone/revoke surface requiresnaive auth session-login. - Naive adds a capability ElevenLabs has no equivalent for: the digital-twin clone turns a reference image + a cloned voice + a script into a lip-synced talking video.
Concept map
| ElevenLabs | Naive | Notes |
|---|---|---|
new ElevenLabsClient({ apiKey }) — one xi-api-key for clone and synth | nv_sk_ agent key for synth; human session (naive auth session-login) for clone/revoke | Two trust levels — cloning is not an agent-key action |
voices.ivc.create({ name, files }) → { voiceId } (self-attested ToS checkbox) | naive voice clone --file --name --consent-type --authorized-uses --i-affirm → voice id | Naive records who consented + the affirmation + authorized uses |
voices.pvc.* (professional clone + voices.pvc.verification.request) | --consent-type third_party_verified (consenter gets a verification link; voice stays pending until confirmed) | Third-party consent is a first-class flow |
| (no per-use restriction — the key can synthesize anything) | authorized_uses on the voice, enforced at synthesis (use outside the set is refused) | The execution-time permission win |
textToSpeech.convert(voiceId, { text, modelId, outputFormat }) → audio | POST /v1/voice/synthesize { voice_id, text, use } → { url, credits, char_count } / naive voice say | Presigned MP3 URL, valid 24h; use must be authorized |
textToSpeech.stream(voiceId, { text }) → audio stream | POST /v1/voice/stream | Streamed synthesis |
voices.search() / voices.getAll() | GET /v1/voice/voices / naive voice list | Voices available to the caller |
voices.get(voiceId) | included in list / GET /v1/voice/synthesis/:id for a past synth | — |
voices.delete(voiceId) | naive voice revoke <id> --yes (human-only, irreversible) | Erases audio and marks the consent record revoked; later synth → voice_revoked |
voiceSettings (stability, similarity, style, speed) | (none) | Not exposed — see gaps |
modelId (eleven_multilingual_v2, flash, turbo) | (managed) | Model not selectable today — see gaps |
outputFormat (mp3_44100_128, pcm_*, ulaw_*) | MP3 presigned URL | Format not selectable — see gaps |
| Dubbing, Speech-to-Text, Sound Effects, Music, Conversational AI agents | (none) | Out of scope — see gaps |
| (no talking-video product) | naive clone generate — image + voice + script → lip-synced video | Naive adds the digital twin |
| API key scopes ElevenLabs and nothing else | Account Kit enables voice per user; synthesis metered against the plan | Governance on the identity — see gains |
| ElevenLabs dashboard history | naive.forUser(id).logs.query() — one per-user timeline | Voice events beside email, cards, phone — see gain #3 |
Before / after: the core path
The path that matters for almost every voice-backed agent is clone a consented voice, then synthesize speech in it. Here it is on both platforms.- Cloning is human-only, not an agent-key action. ElevenLabs clones with the same key it
synthesizes with. Naive requires a signed-in human session (
naive auth session-login) to clone or revoke, so a leaked agent key can use voices it already owns but can never mint or destroy one. - Every voice carries a consent record. ElevenLabs’ “consent” is a ToS checkbox. Naive stores
consent_type, the affirmation, and — for third parties — a verified consenter, and marks it revoked onrevoke. - Uses are enforced at synthesis. A Naive voice cloned with
--authorized-uses emailwill refuse avideouse. On ElevenLabs the key can synthesize anything. - The id is your identity, not a separate account. The same tenant user that owns this voice owns the agent’s email, cards, phone, and vault.
Consent + authorized uses: the execution-time gate
This is what “governed identity” means in practice. On Naive, theuse you pass at synthesis is
checked against the voice’s authorized_uses, and clone/revoke are gated behind a human session.
authorized_usesis enforced server-side. Clone once with the uses a voice is allowed for (email,video, …); synthesis outside that set is rejected — you don’t police it in app code.- Revocation is irreversible and enforced.
naive voice revokeerases the voice and its audio and marks consent revoked; every later synthesis returnsvoice_revoked. - Clone/revoke need a human. They record a legal consent affirmation, so they require a signed-in session — the agent key alone cannot perform them.
Minimal viable migration
The smallest swap that keeps a working voice-backed agent alive is clone a consented voice → say it.Install the CLI / set your key
NAIVE_API_KEY (a server-side nv_sk_ key from the
dashboard) for the agent (synthesis) surface. You can drop
ELEVENLABS_API_KEY for this path.Establish a human session for cloning
Cloning and revoking record a consent affirmation, so they are human-only. Run
naive auth session-login once (see
Authentication). This
is a deliberate change from ElevenLabs, where the same key clones and synthesizes.Swap the clone call
Replace
voices.ivc.create({ name, files }) with naive voice clone --file <path> --name <name> --consent-type self --authorized-uses <uses> --i-affirm. Keep the returned voice id in place of
voice.voiceId. For a third party, use --consent-type third_party_verified and pass
--consenter-name / --consenter-email (they receive a verification link).Swap synthesis
Map
textToSpeech.convert(voiceId, { text }) → naive voice say --voice <id> --text "…" (CLI)
or POST /v1/voice/synthesize { voice_id, text, use } (REST). Always pass a use that is within
the voice’s authorized_uses. Read the presigned url (valid 24h) instead of the raw audio
bytes ElevenLabs streams back.Consolidate further once you’re on Naive
This is where the migration pays for itself. On ElevenLabs, thexi-api-key scopes voices in one
ElevenLabs account and nothing else. On Naive, the unit of isolation is a tenant user, and the
voice is one of many primitives that identity owns.
Gain #1 — one identity across primitives
- With ElevenLabs, an agent’s voices are a slice of one account, and per-customer separation is a
naming convention you maintain yourself. With Naive,
naive.forUser(acme.id)is a single handle to the identity whose Account Kit governs voice and email and cards and phone and vault. - The digital-twin video an agent generates auto-ingests into that identity’s Media Manager — the same place its other assets live — not a separate vendor’s file store.
Gain #2 — execution-time governance
- Whether an agent may use
voiceat all is policy on the identity — toggled per user in the Account Kit — and synthesis is metered against the tenant’s plan quota. This is on top of the per-voiceauthorized_usesgate that ElevenLabs has no equivalent for.
- The agent’s synthesis code path stays the same for every tier. What changes at execution time:
- Disabled primitive → the call is refused. If the Account Kit doesn’t grant
voice, synthesis never runs. - Use outside
authorized_uses→ refused. A voice cloned foremailcan’t be used forvideo, regardless of tier. - Quota exceeded → capped. Once usage crosses the plan’s
voicequota for the period, further synthesis is rejected — no surprise bill from a runaway agent. - Clone/revoke need a human session. A leaked agent key can synthesize with owned voices but can never mint or destroy one.
- Disabled primitive → the call is refused. If the Account Kit doesn’t grant
Gain #3 — unified accountability
- Every clone, synthesis, and revoke for a customer lands in one per-user activity log — alongside their email, card, phone, and vault events, not in a separate vendor dashboard:
- That is the question that is hard to answer when voices live in ElevenLabs, cards live in Stripe, the phone number lives in a carrier console, and email lives somewhere else. Under Naive it is a single query.
What does not map yet
A migration guide that hides gaps is worse than none. The core path (clone a consented voice → synthesize speech, list, revoke) maps cleanly, and Naive adds the consent record, theauthorized_uses gate, and the digital-twin talking video. But ElevenLabs is a broad audio
platform, and the following capabilities have no direct equivalent on Naive’s voice primitive
today. Check this list against your app before you commit.
| ElevenLabs feature | Status on Naive | Workaround |
|---|---|---|
voiceSettings (stability, similarity boost, style, speed) | Not exposed | Naive uses managed defaults; not tunable per call today |
modelId selection (eleven_multilingual_v2, flash, turbo) | Managed | Model is chosen for you; not selectable |
outputFormat (pcm_*, ulaw_*, opus, sample rates) | MP3 presigned URL (24h) | Transcode the returned MP3 if you need another format |
Character-level timestamps (convertWithTimestamps) | Not provided | Synthesize per segment if you need alignment |
| Speech-to-Text (Scribe) | Not provided | Use a separate STT provider |
| Dubbing (video/audio translation) | Not provided | No equivalent today |
| Sound Effects / Music generation | Not provided | Use ElevenLabs or another provider for these |
| Conversational AI / Agents platform (WebSocket voice agents) | Not provided | Pair Naive voice synthesis with your own agent loop |
| Voice design / text-to-voice / remix / shared Voice Library | Not provided | Clone from an audio sample you’re authorized to use |
| Pronunciation dictionaries, request stitching | Not provided | Not available today |
Raw voice_id from ElevenLabs’ library | Naive voice id only | Voices are cloned into your identity, not referenced from a shared pool |
Where to go next
voiceprimitive — clone (human-only), synthesize, list, revoke, consent model, digital-twin video- Authentication — the human session that clone/revoke require
- Media Manager — where generated talking-twin videos are auto-ingested
- Customer billing — the plan + quota that meters synthesis at execution time
- Account Kits — the policy model that enables/disables
voiceper user - Tenant users — the identity that owns the voice, email, cards, phone, and vault