Update MARS model names to mars-flash, mars-pro, mars-instruct

Rename model identifiers from mars-8-* to the new naming convention:
- mars-8-flash -> mars-flash (default)
- mars-8 -> removed
- mars-8-instruct -> mars-instruct
- Added mars-pro
This commit is contained in:
Neil Ruaro
2026-01-09 18:20:50 +09:00
parent a3d7e9eafe
commit a541d65255
4 changed files with 24 additions and 24 deletions

View File

@@ -1 +1 @@
- Added Camb.ai TTS integration with MARS-8 models (mars-8, mars-8-flash, mars-8-instruct) for high-quality text-to-speech synthesis.
- Added Camb.ai TTS integration with MARS models (mars-flash, mars-pro, mars-instruct) for high-quality text-to-speech synthesis.

View File

@@ -68,12 +68,12 @@ async def main(voice_id: int):
# Create HTTP session for Camb.ai TTS
async with aiohttp.ClientSession() as session:
# Camb.ai TTS with MARS-8-flash model
# Camb.ai TTS with MARS-flash model
tts = CambTTSService(
api_key=os.getenv("CAMB_API_KEY"),
aiohttp_session=session,
voice_id=voice_id,
model="mars-8-flash",
model="mars-flash",
params=CambTTSService.InputParams(
speed=1.0,
),

View File

@@ -4,13 +4,13 @@
# SPDX-License-Identifier: BSD 2-Clause License
#
"""Camb.ai MARS-8 text-to-speech service implementation.
"""Camb.ai MARS text-to-speech service implementation.
This module provides TTS functionality using Camb.ai's MARS-8 model family,
This module provides TTS functionality using Camb.ai's MARS model family,
offering high-quality text-to-speech synthesis with HTTP streaming support.
Features:
- MARS-8 models: mars-8, mars-8-flash, mars-8-instruct
- MARS models: mars-flash, mars-pro, mars-instruct
- 140+ languages supported
- Real-time HTTP streaming
- 24kHz audio output
@@ -40,7 +40,7 @@ from pipecat.utils.tracing.service_decorators import traced_tts
# Default configuration
DEFAULT_VOICE_ID = 2681 # Attic voice (publicly available)
DEFAULT_LANGUAGE = "en-us"
DEFAULT_MODEL = "mars-8-flash" # Faster inference
DEFAULT_MODEL = "mars-flash" # Faster inference
DEFAULT_BASE_URL = "https://client.camb.ai/apis"
DEFAULT_SAMPLE_RATE = 24000 # 24kHz
DEFAULT_TIMEOUT = 60.0 # Seconds (minimum recommended by Camb.ai)
@@ -126,18 +126,18 @@ def language_to_camb_language(language: Language) -> Optional[str]:
class CambTTSService(TTSService):
"""Camb.ai MARS-8 HTTP-based text-to-speech service.
"""Camb.ai MARS HTTP-based text-to-speech service.
Converts text to speech using Camb.ai's MARS-8 TTS models with support for
Converts text to speech using Camb.ai's MARS TTS models with support for
multiple languages. Provides control over voice characteristics like speed
and custom instructions (for mars-8-instruct model).
and custom instructions (for mars-instruct model).
Example::
tts = CambTTSService(
api_key="your-api-key",
voice_id=2681,
model="mars-8-flash",
model="mars-flash",
aiohttp_session=session,
params=CambTTSService.InputParams(
language=Language.EN,
@@ -145,11 +145,11 @@ class CambTTSService(TTSService):
)
)
# For mars-8-instruct with custom instructions:
# For mars-instruct with custom instructions:
tts_instruct = CambTTSService(
api_key="your-api-key",
voice_id=2681,
model="mars-8-instruct",
model="mars-instruct",
aiohttp_session=session,
params=CambTTSService.InputParams(
language=Language.EN,
@@ -164,7 +164,7 @@ class CambTTSService(TTSService):
Parameters:
language: Language for synthesis (BCP-47 format). Defaults to English.
speed: Speech speed multiplier (0.5 to 2.0). Defaults to 1.0.
user_instructions: Custom instructions for mars-8-instruct model only.
user_instructions: Custom instructions for mars-instruct model only.
Ignored for other models. Max 1000 characters.
"""
@@ -173,7 +173,7 @@ class CambTTSService(TTSService):
user_instructions: Optional[str] = Field(
default=None,
max_length=1000,
description="Custom instructions for mars-8-instruct model only. "
description="Custom instructions for mars-instruct model only. "
"Use to control tone, style, or pronunciation. Max 1000 characters.",
)
@@ -195,8 +195,8 @@ class CambTTSService(TTSService):
api_key: Camb.ai API key for authentication.
aiohttp_session: Shared aiohttp session for making HTTP requests.
voice_id: Voice ID to use (e.g., 2681 for Attic). Defaults to 2681.
model: TTS model to use. Options: "mars-8", "mars-8-flash", "mars-8-instruct".
Defaults to "mars-8-flash" (fastest).
model: TTS model to use. Options: "mars-flash", "mars-pro", "mars-instruct".
Defaults to "mars-flash" (fastest).
base_url: Camb.ai API base URL. Defaults to production URL.
sample_rate: Audio sample rate in Hz. If None, uses Camb.ai default (24000).
params: Additional voice parameters. If None, uses defaults.
@@ -315,8 +315,8 @@ class CambTTSService(TTSService):
"voice_settings": {"speed": self._settings["speed"]},
}
# Add user instructions if using mars-8-instruct model
if self._model_name == "mars-8-instruct" and self._settings.get("user_instructions"):
# Add user instructions if using mars-instruct model
if self._model_name == "mars-instruct" and self._settings.get("user_instructions"):
payload["user_instructions"] = self._settings["user_instructions"]
headers = {

View File

@@ -46,7 +46,7 @@ async def test_run_camb_tts_success(aiohttp_client):
assert "text" in body
assert body["voice_id"] == 2681
assert body["language"] == "en-us"
assert body["speech_model"] == "mars-8-flash"
assert body["speech_model"] == "mars-flash"
assert body["output_configuration"]["format"] == "pcm_s16le"
# Prepare a StreamResponse with chunked PCM data
@@ -78,7 +78,7 @@ async def test_run_camb_tts_success(aiohttp_client):
aiohttp_session=session,
base_url=base_url,
voice_id=2681,
model="mars-8-flash",
model="mars-flash",
)
# Manually set sample rate (normally done by StartFrame)
@@ -367,7 +367,7 @@ async def test_language_mapping():
@pytest.mark.asyncio
async def test_mars8_instruct_model(aiohttp_client):
"""Test that user_instructions are included for mars-8-instruct model."""
"""Test that user_instructions are included for mars-instruct model."""
received_payload = {}
@@ -392,7 +392,7 @@ async def test_mars8_instruct_model(aiohttp_client):
api_key="test-api-key",
aiohttp_session=session,
base_url=base_url,
model="mars-8-instruct",
model="mars-instruct",
params=CambTTSService.InputParams(user_instructions="Speak with excitement"),
)
@@ -413,7 +413,7 @@ async def test_mars8_instruct_model(aiohttp_client):
)
# Verify user_instructions was included in the request
assert received_payload.get("speech_model") == "mars-8-instruct"
assert received_payload.get("speech_model") == "mars-instruct"
assert received_payload.get("user_instructions") == "Speak with excitement"