Files
VoiceStudio/omnivoice
debpalashandClaude Opus 5.5 4b72c3af55 fix(clone): long references clone on OmniVoice; engines report the reference length they use (#2286)
* fix(clone): let long references clone and say what each engine uses

OmniVoice rejects a transcript paired with a clip over 20 s, and every
automatic path produced exactly that pair: Voice Clone and /generate
transcribed the whole clip, and saved profiles kept that transcript. A
25 s saved voice was permanently unusable on the default engine even
though the model can pick its best 15 s passage from clips up to 75 s.

- Drop whole-clip transcripts on over-long OmniVoice references at the
  engine boundary (prompt cache, inline fallback, sidecar) and skip the
  wasted whole-clip ASR; a transcript typed on /generate still gets the
  actionable [clone_ref_too_long] error.
- VoxCPM2 ignores a whole-clip transcript once its 30 s cap cuts the clip.
- Engines advertise max_ref_seconds/ref_strategy via list_backends().
- Electron Voice Clone shows an engine-aware note instead of the 15 s
  trim toast and leaves the transcript to engines that pick a passage.

Refs #2281

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(clone): patch the sidecar backend's own base class

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(clone): review fixes for long references (#2281)

- A transcript sent with a saved voice over the limit gets the same
  [clone_ref_too_long] 400 as an upload instead of being dropped.
- omnivoice_ref_text treats blank text as no transcript.
- The VoxCPM2 sidecar advertises its 30 s head limit; a parity test pins
  every sidecar's reference metadata to its in-process engine.
- The Voice Clone transcript hook withdraws its own whole-clip transcript
  when the engine starts picking the passage itself, keeping user edits.
- Changelog credits use the standard form.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(generate): probe reference length off the event loop

Non-WAV clips decode through ffmpeg to measure length; doing it inline on the
async route stalled every other request.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 11:49:49 +05:30
..
…
…
…