Skip to content

fix(rime): migrate Arcana defaults to Coda - #6773

Open
naszzz wants to merge 3 commits into
livekit:mainfrom
naszzz:rime-arcana-migration
Open

fix(rime): migrate Arcana defaults to Coda#6773
naszzz wants to merge 3 commits into
livekit:mainfrom
naszzz:rime-arcana-migration

Conversation

@naszzz

@naszzz naszzz commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Change the no-argument Rime TTS model from Arcana to Coda while keeping the existing Astra speaker.
  • Keep Lyra for callers that explicitly select Coda without a speaker.
  • Keep Astra for callers that explicitly select Arcana without a speaker during the compatibility period.
  • Remove Arcana from public model types, examples, and live test cases.
  • Keep the existing runtime path for callers that pass Arcana as an explicit string during the compatibility period.
  • Add unit tests for the omitted-model, explicit-Coda, and explicit-Arcana paths.

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

@naszzz
naszzz requested a review from a team as a code owner August 10, 2026 19:29
devin-ai-integration[bot]

This comment was marked as resolved.

@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 1 additional finding in Devin Review.

Open in Devin Review

Comment on lines 220 to 228
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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 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.

Suggested change
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"
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants