Skip to main content

Camb.ai Plugin for LiveKit Agents

Text-to-Speech plugin for Camb.ai TTS API, powered by MARS technology.

Features

  • High-quality neural text-to-speech with MARS series models
  • Multiple model variants (mars-flash, mars-pro)
  • Enhanced pronunciation for names and places
  • Support for 140+ languages
  • Real-time HTTP streaming
  • Pre-built voice library

Installation

pip install livekit-plugins-cambai

Prerequisites

You'll need a Camb.ai API key. Set it as an environment variable:

export CAMB_API_KEY=your_api_key_here

Or obtain it from Camb.ai Studio.

Quick Start

import asyncio
from livekit.plugins.cambai import TTS

async def main():
    # Initialize TTS (uses CAMB_API_KEY env var)
    tts = TTS()

    # Synthesize speech
    stream = tts.synthesize("Hello from Camb.ai!")
    audio_frame = await stream.collect()

    # Save to file
    with open("output.wav", "wb") as f:
        f.write(audio_frame.to_wav_bytes())

asyncio.run(main())

List Available Voices

import asyncio
from livekit.plugins.cambai import list_voices

async def main():
    voices = await list_voices()
    for voice in voices:
        print(f"{voice['name']} ({voice['id']}): {voice['gender']}, {voice['language']}")

asyncio.run(main())

Select a Specific Voice

tts = TTS(voice_id=147320)
stream = tts.synthesize("Using a specific voice!")

Model Selection

Camb.ai offers multiple MARS models for different use cases:

# Faster inference, 22050 Hz (default)
tts = TTS(model="mars-flash")

# Higher quality, 48000 Hz
tts = TTS(model="mars-pro")

Advanced Configuration

tts = TTS(
    api_key="your-api-key",  # Or use CAMB_API_KEY env var
    voice_id=147320,  # Voice ID from list-voices
    language="en-us",  # BCP-47 locale
    model="mars-pro",  # MARS model variant
    output_format="pcm_s16le",  # Audio format
    enhance_named_entities=True,  # Better pronunciation for names/places
)

Usage with LiveKit Agents

from livekit import agents
from livekit.plugins.cambai import TTS

async def entrypoint(ctx: agents.JobContext):
    # Connect to room
    await ctx.connect()

    # Initialize TTS
    tts = TTS(language="en-us")

    # Synthesize and publish
    stream = tts.synthesize("Hello from LiveKit with Camb.ai!")
    audio_frame = await stream.collect()

    # Publish to room
    source = agents.AudioSource(tts.sample_rate, tts.num_channels)
    track = agents.LocalAudioTrack.create_audio_track("tts", source)
    await ctx.room.local_participant.publish_track(track)
    await source.capture_frame(audio_frame)

Configuration Options

TTS Constructor Parameters

  • api_key (str | None): Camb.ai API key
  • voice_id (int): Voice ID to use (default: 147320)
  • language (str): BCP-47 locale (default: "en-us")
  • model (SpeechModel): MARS model variant (default: "mars-flash")
  • output_format (OutputFormat): Audio format (default: "pcm_s16le")
  • enhance_named_entities (bool): Enhanced pronunciation (default: False)
  • sample_rate (int | None): Audio sample rate (auto-detected from model if None)
  • base_url (str): API base URL
  • http_session (aiohttp.ClientSession | None): Reusable HTTP session

Available Models

  • mars-flash: Faster inference, 22050 Hz (default)
  • mars-pro: Higher quality synthesis, 48000 Hz

Output Formats

  • pcm_s16le: 16-bit PCM (recommended for streaming)
  • pcm_s32le: 32-bit PCM (highest quality)
  • wav: WAV with headers
  • flac: Lossless compression
  • adts: ADTS streaming format

API Reference

TTS Class

Main text-to-speech interface.

Methods:

  • synthesize(text: str) -> ChunkedStream: Synthesize text to speech
  • update_options(**kwargs): Update voice settings dynamically
  • aclose(): Clean up resources

Properties:

  • model (str): Current MARS model name
  • provider (str): Provider name ("Camb.ai")
  • sample_rate (int): Audio sample rate (22050 or 48000 Hz depending on model)
  • num_channels (int): Number of audio channels (1)

list_voices Function

async def list_voices(
    api_key: str | None = None,
    base_url: str = "https://client.camb.ai/apis",
) -> list[dict]

Returns list of voice dicts with: id, name, gender, age, language.

Multi-Language Support

Camb.ai supports 140+ languages. Specify using BCP-47 locales:

# French
tts = TTS(language="fr-fr", voice_id=...)

# Spanish
tts = TTS(language="es-es", voice_id=...)

# Japanese
tts = TTS(language="ja-jp", voice_id=...)

Dynamic Options

Update TTS settings without recreating the instance:

tts = TTS()

# Change voice
tts.update_options(voice_id=12345)

# Change model
tts.update_options(model="mars-pro")

Error Handling

The plugin handles errors according to LiveKit conventions:

from livekit.agents import APIStatusError, APIConnectionError, APITimeoutError

try:
    stream = tts.synthesize("Hello!")
    audio = await stream.collect()
except APIStatusError as e:
    print(f"API error: {e.status_code} - {e.message}")
except APIConnectionError as e:
    print(f"Connection error: {e}")
except APITimeoutError as e:
    print(f"Request timed out: {e}")

Future Features

Coming soon:

  • GCP Vertex AI integration
  • Voice cloning via custom voice creation
  • Voice generation from text descriptions
  • WebSocket streaming for real-time applications

License

Apache License 2.0

Metadata

Release files for livekit-plugins-cambai 1.8.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for livekit-plugins-cambai 1.8.9
File Size Uploaded Provenance Actions
livekit_plugins_cambai-1.8.9.tar.gz 8.4 kB With provenance Details for livekit_plugins_cambai-1.8.9.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for livekit-plugins-cambai 1.8.9
File Interpreter ABI Platform Actions
livekit_plugins_cambai-1.8.9-py3-none-any.whl Python 3 none any Details for livekit_plugins_cambai-1.8.9-py3-none-any.whl

Total release size: 18.5 kB

Release files / livekit_plugins_cambai-1.8.9.tar.gz

Download URL livekit_plugins_cambai-1.8.9.tar.gz
Size 8.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4f1db77c42e95a7a00a9bc402936dbb51c23c923faf86f8f35a68f92657ba91f
BLAKE2b-256 checksum
How to use checksums
8a95e15ed2ba1ba4f02cb4965a3feae25cc572157f9c814483830950183b4e71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Release files / livekit_plugins_cambai-1.8.9-py3-none-any.whl

Download URL livekit_plugins_cambai-1.8.9-py3-none-any.whl
Size 10.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
abc439cd351510386a50c0226773c02c2644848ce60df82395d91ec146abb2bb
BLAKE2b-256 checksum
How to use checksums
0b609e4c8b666c146ecc0756cae8960450c4f34f6e31a4feafa941a7ec74edba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Security for livekit-plugins-cambai 1.8.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for livekit_plugins_cambai-1.8.9.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.8.9 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page