Skip to content

Update CrispASR to v0.8.25 and add GigaAM-v3 (STT) + OmniVoice TTS (CrispASR) - #13063

Merged
niksedk merged 3 commits into
mainfrom
feature/crispasr-0.8.25
Aug 1, 2026
Merged

Update CrispASR to v0.8.25 and add GigaAM-v3 (STT) + OmniVoice TTS (CrispASR)#13063
niksedk merged 3 commits into
mainfrom
feature/crispasr-0.8.25

Conversation

@niksedk

@niksedk niksedk commented Aug 1, 2026

Copy link
Copy Markdown
Member

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:

  • macOS binary probe-tested: reports 0.8.25, git sha 6e5bf7ff, backends cpu,metal,blas, and transcribes correctly via the sensevoice backend on Metal.
  • Diffed the full --help flag set against the installed v0.8.24 binary: identical, so nothing SE passes was removed or renamed. Upstream confirms it is drop-in.
  • 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 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 the gigaam backend in v0.8.25 — the only backend added this release. Russian-only, Rotary Conformer encoder, 12 GGUFs from cstr/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:

model output
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 ru is accepted, anything else is ignored with a warning.

Add OmniVoice TTS (CrispASR)

Runs OmniVoice through the 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 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 plus 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.gguf loads and synthesises fine, but its encoder tensors cannot be read back as f32 (read_tensor_f32: unsupported type 8 per 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:

run reference clone
female ref, F16 tokenizer 191.5 Hz 190.6 Hz — intelligible, correct text
male ref, F16 tokenizer 110.2 Hz 111.8 Hz — intelligible, correct text
same, q8_0 tokenizer 110.2 Hz 481 Hz — transcribes to "I." (noise)

SE therefore only ever downloads the F16 tokenizer and pins it explicitly via --codec-model rather 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/UI on the merge of this branch with current main: 1127 passed, 2 failed. Both failures (SubtitleGridScrollPerformanceTests.HomeAndEnd_RealizeOnlyAViewportOfRows and SyntaxTextDocumentTests.InsertWithLineBreaksSplitsTheLine) reproduce identically on plain origin/main and are unrelated to these changes. This branch adds 17 tests, all passing.

Note: change-log.txt is deliberately untouched.

🤖 Generated with Claude Code

niksedk and others added 3 commits August 1, 2026 21:35
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>
@niksedk
niksedk merged commit 0841f2b into main Aug 1, 2026
0 of 2 checks passed
@niksedk
niksedk deleted the feature/crispasr-0.8.25 branch August 1, 2026 20:30
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.

1 participant