fix(rime): migrate Arcana defaults to Coda - #6773
Conversation
|
|
| if not is_given(speaker): | ||
| if _is_mist_model(model): | ||
| if not model_is_explicit: | ||
| speaker = "astra" | ||
| elif _is_mist_model(resolved_model): | ||
| speaker = DefaultMistVoice | ||
| elif model == "coda": | ||
| elif resolved_model == "coda": | ||
| speaker = DefaultCodaVoice | ||
| else: | ||
| speaker = "astra" |
There was a problem hiding this comment.
🔴 Rime voice used with no model specified doesn't match the one used when the same model is named explicitly
When no model is chosen, the Rime voice is hard-coded to an old Arcana-era voice (speaker = "astra" at livekit-plugins/livekit-plugins-rime/livekit/plugins/rime/tts.py:222) instead of the documented default voice for the new model, so identical setups can speak in two different voices or fail outright.
Impact: Users who simply create a Rime voice without naming a model get a different (possibly unsupported) speaking voice than users who name the very same model explicitly.
Default-vs-explicit divergence in the constructor's speaker resolution
After the migration, an unspecified model resolves to coda (livekit-plugins/livekit-plugins-rime/livekit/plugins/rime/tts.py:211-216). But the speaker branch keys on whether the model was passed explicitly, not on the resolved model: TTS() → model coda, speaker astra; TTS(model="coda") → model coda, speaker lyra (DefaultCodaVoice in livekit-plugins/livekit-plugins-rime/livekit/plugins/rime/models.py:6). astra was declared as an Arcana voice (removed ArcanaVoices literal), so if Coda does not accept it the request built in _ws_url() / ChunkedStream._run() with speaker=astra and modelId=coda will be rejected by Rime for every default-constructed instance. The new test tests/test_plugin_rime_tts.py:17-18 locks in this divergence.
| if not is_given(speaker): | |
| if _is_mist_model(model): | |
| if not model_is_explicit: | |
| speaker = "astra" | |
| elif _is_mist_model(resolved_model): | |
| speaker = DefaultMistVoice | |
| elif model == "coda": | |
| elif resolved_model == "coda": | |
| speaker = DefaultCodaVoice | |
| else: | |
| speaker = "astra" | |
| if not is_given(speaker): | |
| if _is_mist_model(resolved_model): | |
| speaker = DefaultMistVoice | |
| elif resolved_model == "coda": | |
| speaker = DefaultCodaVoice | |
| else: | |
| speaker = "astra" |
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
Thanks. This difference is intentional for backward compatibility. Before this PR, TTS() used Arcana/Astra, while TTS(model="coda") used Coda/Lyra. Rime confirms Astra supports Coda, and its migration guide says to keep the same speaker name when it exists on Coda. Using one speaker for both paths would unnecessarily change the established speaker for one group of users. The tests document both compatibility paths. Coda can still sound different from Arcana, but this avoids an additional speaker-identity change.
Summary
Rime's migration guide says to keep the same speaker name when Coda supports it. Astra is available on both Arcana and Coda: https://docs.rime.ai/docs/migrate-arcana-to-coda