From 7e0ca113afa73adffce9bc50354d3b6b51db5dda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Tue, 20 Jan 2026 19:04:58 -0800 Subject: [PATCH] CambTTSService: initialize client during StartFrame --- changelog/3511.fixed.md | 1 + src/pipecat/services/camb/tts.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 changelog/3511.fixed.md diff --git a/changelog/3511.fixed.md b/changelog/3511.fixed.md new file mode 100644 index 000000000..1f4f429ac --- /dev/null +++ b/changelog/3511.fixed.md @@ -0,0 +1 @@ +- Fixed a `CambTTSService` issue where client was being initialized in the constructor which wouldn't allow for proper Pipeline error handling. diff --git a/src/pipecat/services/camb/tts.py b/src/pipecat/services/camb/tts.py index 89279604d..00b4eaf9b 100644 --- a/src/pipecat/services/camb/tts.py +++ b/src/pipecat/services/camb/tts.py @@ -199,9 +199,10 @@ class CambTTSService(TTSService): """ super().__init__(sample_rate=sample_rate, **kwargs) - params = params or CambTTSService.InputParams() + self._api_key = api_key + self._timeout = timeout - self._client = AsyncCambAI(api_key=api_key, timeout=timeout) + params = params or CambTTSService.InputParams() # Warn if sample rate doesn't match model's supported rate if sample_rate and sample_rate != MODEL_SAMPLE_RATES.get(model): @@ -222,6 +223,8 @@ class CambTTSService(TTSService): self.set_voice(str(voice_id)) self._voice_id = voice_id + self._client = None + def can_generate_metrics(self) -> bool: """Check if this service can generate processing metrics. @@ -249,6 +252,8 @@ class CambTTSService(TTSService): """ await super().start(frame) + self._client = AsyncCambAI(api_key=self._api_key, timeout=self._timeout) + # Use model-specific sample rate if not explicitly specified if not self._init_sample_rate: self._sample_rate = MODEL_SAMPLE_RATES.get(self.model_name, 22050) @@ -289,6 +294,8 @@ class CambTTSService(TTSService): await self.start_tts_usage_metrics(text) yield TTSStartedFrame() + assert self._client is not None, "Camb.ai TTS service not initialized" + # Buffer for aligning chunks to 2-byte boundaries (16-bit PCM) audio_buffer = b""