diff --git a/CHANGELOG.md b/CHANGELOG.md index 21abadaee..b8c1d504c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to **Pipecat** will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Added support to `RimeHttpTTSService` for the `arcana` model. + ## [0.0.66] - 2025-05-02 ### Added @@ -120,7 +126,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 not a very common case. - Added `RivaSegmentedSTTService`, which allows Riva offline/batch models, such - as to be "canary-1b-asr" used in Pipecat. + as to be "canary-1b-asr" used in Pipecat. ### Deprecated diff --git a/examples/foundational/07q-interruptible-rime-http.py b/examples/foundational/07q-interruptible-rime-http.py index 19d032413..40fc6be5f 100644 --- a/examples/foundational/07q-interruptible-rime-http.py +++ b/examples/foundational/07q-interruptible-rime-http.py @@ -44,7 +44,8 @@ async def run_bot(webrtc_connection: SmallWebRTCConnection, _: argparse.Namespac tts = RimeHttpTTSService( api_key=os.getenv("RIME_API_KEY", ""), - voice_id="rex", + voice_id="luna", + model="arcana", aiohttp_session=session, ) diff --git a/src/pipecat/services/rime/tts.py b/src/pipecat/services/rime/tts.py index 57ade7484..a26a54805 100644 --- a/src/pipecat/services/rime/tts.py +++ b/src/pipecat/services/rime/tts.py @@ -400,6 +400,13 @@ class RimeHttpTTSService(TTSService): payload["modelId"] = self._model_name payload["samplingRate"] = self.sample_rate + # Arcana does not support PCM audio + if payload["modelId"] == "arcana": + headers["Accept"] = "audio/wav" + need_to_strip_wav_header = True + else: + need_to_strip_wav_header = False + try: await self.start_ttfb_metrics() @@ -420,6 +427,10 @@ class RimeHttpTTSService(TTSService): CHUNK_SIZE = 1024 async for chunk in response.content.iter_chunked(CHUNK_SIZE): + if need_to_strip_wav_header and chunk.startswith(b"RIFF"): + chunk = chunk[44:] + need_to_strip_wav_header = False + if len(chunk) > 0: await self.stop_ttfb_metrics() frame = TTSAudioRawFrame(chunk, self.sample_rate, 1)