Update CrispASR to v0.8.25 and add GigaAM-v3 (STT) + OmniVoice TTS (CrispASR) - #13063
Merged
Conversation
Bumps the pinned CrispASR runtime from v0.8.24 to v0.8.25 across all 11 platform download URLs and adds the new archive + executable SHA-256 hashes (verified against freshly downloaded release assets; macOS binary probe-tested: reports 0.8.25 and transcribes correctly via the sensevoice backend on Metal). The CLI flag surface is byte-identical to v0.8.24, so nothing SE passes needs adjusting. Download-size figures refreshed from the v0.8.25 assets. Notable upstream fixes for SE users: the pyannote powerset decode table had two entries transposed, so every frame with a third speaker talking alone was credited to the wrong two (15 DER points on VoxConverse dev); --diarize-max-speakers was picking the speaker count instead of bounding it (15.74% -> 7.81% DER with TitaNet); pyannote segmentation is now chunked and runs in parallel (~50s -> ~18s on a 2888s file at -t 8); sherpa diarization no longer hangs indefinitely on Windows (#328) and honours its timeout on POSIX too; whisper vocabularies with half-serialized special tokens now fail loudly instead of producing wrong ids (#322); and a VAD matmul was fed a transposed view whose stride precondition was violated. New backends this release: GigaAM-v3 (Russian ASR) and --diarize-method foxnose (no-external-binary diarization); neither is wired into SE yet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
GigaAM-v3 (ai-sage) is a Russian-only ASR model, new as the `gigaam`
backend in CrispASR v0.8.25. Rotary Conformer encoder, published in four
revisions - CTC and RNN-T heads, each character-level or SPM ("e2e") -
listed here as 12 GGUF models from cstr/gigaam-v3-GGUF.
The e2e revisions are listed first because they emit punctuation and
capitalisation natively, which is what subtitles want. Verified against
the pinned v0.8.25 binary on Apple M4 / Metal with Russian test audio:
e2e-rnnt-q8_0 "Привет." / "Это тест распознавания" / "русской речи."
ctc-q4_k "привет это тест распознавания русской речи"
both at 27x realtime, both producing valid timestamped SRT under SE's
default `--max-len 50 --split-on-punct` parameters.
The backend reports Russian as its sole language and crispasr skips
language detection for it, so the language list holds Russian alone -
`-l ru` is accepted, anything else is ignored with a warning.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Runs OmniVoice through the CrispASR runtime's `omnivoice` backend, alongside the existing standalone OmniVoice TTS engine - the same split SE already has between Qwen3TtsCpp and Qwen3TtsCrispAsr. It reuses the CrispASR runtime a user may already have installed for speech-to-text and runs as a persistent server, so the model loads once instead of once per line. Three quants from cstr/omnivoice-GGUF (q4_k / q8_0 / f16) plus the tokenizer companion, staged with size + SHA-256 verification. Unlike VoxCPM2/MOSS-TTS the backend has a usable built-in voice, so the combo offers "Default" first and cloning is opt-in; imported reference WAVs are seeded from the standalone engine's voices folder. ⚠ The tokenizer is pinned to the F16 build. omnivoice-tokenizer-q8_0 loads and synthesises fine, but its encoder tensors cannot be read back as f32 (crispasr logs `read_tensor_f32: unsupported type 8` per quantizer), so encoding a reference voice yields garbage codes and the clone comes out as noise - and crispasr caches that encoding by audio content, so a single q8_0 run poisons later F16 runs too. Verified against the pinned v0.8.25 binary on Apple M4 / Metal by median-F0 comparison of reference vs clone: female ref 191.5 Hz -> clone 190.6 Hz (intelligible, correct text) male ref 110.2 Hz -> clone 111.8 Hz (intelligible, correct text) same run, q8_0 tokenizer -> 481 Hz, transcribes to "I." (noise) The exact server command line SE builds was run end to end - server mode, --voice-dir, provenance flags, cloning reference - and its output round-trips back through sensevoice as the right words in the right voice (187.2 Hz against a 191.5 Hz reference). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three commits: the runtime bump, then the two new engines it makes available.
Update CrispASR to v0.8.25
Bumps the pinned runtime across all 11 platform download URLs and adds the new archive + executable SHA-256 hashes, all computed from freshly downloaded release assets (sizes match the release API exactly).
Verification:
0.8.25, git sha6e5bf7ff, backendscpu,metal,blas, and transcribes correctly via the sensevoice backend on Metal.--helpflag set against the installed v0.8.24 binary: identical, so nothing SE passes was removed or renamed. Upstream confirms it is drop-in.Notable upstream fixes for SE users: the pyannote powerset decode table had two entries transposed, so every frame with a third speaker talking alone was credited to the wrong two (15 DER points on VoxConverse dev);
--diarize-max-speakerswas picking the speaker count instead of bounding it (15.74% → 7.81% DER with TitaNet); pyannote segmentation is now chunked and parallel (~50s → ~18s on a 2888s file at-t 8); sherpa diarization no longer hangs indefinitely on Windows (#328); whisper vocabularies with half-serialized special tokens now fail loudly instead of producing wrong ids (#322).Add GigaAM-v3 speech-to-text
ai-sage/GigaAM-v3, new as thegigaambackend in v0.8.25 — the only backend added this release. Russian-only, Rotary Conformer encoder, 12 GGUFs fromcstr/gigaam-v3-GGUF(CTC and RNN-T heads, each character-level or SPM "e2e", three quants each).The e2e revisions are listed first because they emit punctuation and capitalisation natively. Verified on Russian test audio at 27× realtime:
e2e-rnnt-q8_0"Привет." / "Это тест распознавания" / "русской речи."ctc-q4_k"привет это тест распознавания русской речи"Both produce valid timestamped SRT under SE's default
--max-len 50 --split-on-punct. The language list holds Russian alone —-l ruis accepted, anything else is ignored with a warning.Add OmniVoice TTS (CrispASR)
Runs OmniVoice through the
omnivoicebackend, alongside the existing standaloneomnivoice-ttsengine — the same split SE already has betweenQwen3TtsCppandQwen3TtsCrispAsr. It reuses the CrispASR runtime a user may already have for speech-to-text and runs as a persistent server, so the model loads once instead of once per line.Three quants from
cstr/omnivoice-GGUFplus the tokenizer companion, staged with size + SHA-256 verification (all four hashes match the HF LFS oids). Unlike VoxCPM2/MOSS-TTS this backend has a usable built-in voice, so the combo offers "Default" first and cloning is opt-in; reference WAVs are seeded from the standalone engine's voices folder.⚠ The tokenizer is pinned to the F16 build
omnivoice-tokenizer-q8_0.ggufloads and synthesises fine, but its encoder tensors cannot be read back as f32 (read_tensor_f32: unsupported type 8per quantizer), so encoding a reference voice yields garbage codes and the clone comes out as noise. Worse, crispasr caches the encoded reference by audio content, so a single q8_0 run poisons later F16 runs. Measured by median F0 of reference vs clone:"I."(noise)SE therefore only ever downloads the F16 tokenizer and pins it explicitly via
--codec-modelrather than leaving it to sibling discovery. A test pins that.The exact server command line SE builds — server mode,
--voice-dir, provenance flags, cloning reference — was run end to end, and its output round-trips back through sensevoice as the right words in the right voice (187.2 Hz against a 191.5 Hz reference).Testing
dotnet test tests/UIon the merge of this branch with currentmain: 1127 passed, 2 failed. Both failures (SubtitleGridScrollPerformanceTests.HomeAndEnd_RealizeOnlyAViewportOfRowsandSyntaxTextDocumentTests.InsertWithLineBreaksSplitsTheLine) reproduce identically on plainorigin/mainand are unrelated to these changes. This branch adds 17 tests, all passing.Note:
change-log.txtis deliberately untouched.🤖 Generated with Claude Code