diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d0365c7..dc732c569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- `RimeHttpTTSService` needs an `aiohttp.ClientSession` to be passed to the + constructor as all the other HTTP-based services. + +- `RimeHttpTTSService` doesn't use a default voice anymore. + - `DeepgramSTTService` now uses the new `nova-3` model by default. If you want to use the previous model you can pass `LiveOptions(model="nova-2-general")`. (see https://deepgram.com/learn/introducing-nova-3-speech-to-text-api) diff --git a/src/pipecat/services/rime.py b/src/pipecat/services/rime.py index f920959d8..cc59b132d 100644 --- a/src/pipecat/services/rime.py +++ b/src/pipecat/services/rime.py @@ -345,7 +345,8 @@ class RimeHttpTTSService(TTSService): self, *, api_key: str, - voice_id: str = "eva", + voice_id: str, + aiohttp_session: aiohttp.ClientSession, model: str = "mistv2", sample_rate: Optional[int] = None, params: InputParams = InputParams(), @@ -354,6 +355,7 @@ class RimeHttpTTSService(TTSService): super().__init__(sample_rate=sample_rate, **kwargs) self._api_key = api_key + self._session = aiohttp_session self._base_url = "https://users.rime.ai/v1/rime-tts" self._settings = { "speedAlpha": params.speed_alpha, @@ -388,30 +390,27 @@ class RimeHttpTTSService(TTSService): try: await self.start_ttfb_metrics() - async with aiohttp.ClientSession() as session: - async with session.post(self._base_url, json=payload, headers=headers) as response: - if response.status != 200: - error_message = f"Rime TTS error: HTTP {response.status}" - logger.error(error_message) - yield ErrorFrame(error=error_message) - return + async with self._session.post( + self._base_url, json=payload, headers=headers + ) as response: + if response.status != 200: + error_message = f"Rime TTS error: HTTP {response.status}" + logger.error(error_message) + yield ErrorFrame(error=error_message) + return - await self.start_tts_usage_metrics(text) + await self.start_tts_usage_metrics(text) - yield TTSStartedFrame() + yield TTSStartedFrame() - # Process the streaming response - chunk_size = 8192 - first_chunk = True + # Process the streaming response + chunk_size = 8192 - async for chunk in response.content.iter_chunked(chunk_size): - if first_chunk: - await self.stop_ttfb_metrics() - first_chunk = False - - if chunk: - frame = TTSAudioRawFrame(chunk, self.sample_rate, 1) - yield frame + async for chunk in response.content.iter_chunked(chunk_size): + if chunk: + await self.stop_ttfb_metrics() + frame = TTSAudioRawFrame(chunk, self.sample_rate, 1) + yield frame except Exception as e: logger.exception(f"Error generating TTS: {e}") yield ErrorFrame(error=f"Rime TTS error: {str(e)}")