v2.2.27-beta2 — post-ASR filters + CPU cascade inversion + sliding AGC
Substantial iteration over beta1. Headline changes:
Audio & ASR
* Sliding BS.1770-style AGC replaces one-shot gain — quiet speakers
on multi-speaker conferences no longer get dropped by Whisper VAD
(Пк тест 2026-08-05: 13:30 of 149-min meeting was lost by
default Silero threshold).
* Silero VAD threshold 0.5 → 0.35, min_silence 300/500 → 800/1000 ms.
* CPU cascade inversion: GigaAM primary on CPU + RU/auto (5-30×
faster than Whisper for the same RU quality). Whisper stays lazy
fallback for empty results / EN. Configurable via
cascade_primary=auto|whisper|gigaam.
* Whisper CPU threads cap 16 → 4 (int8 GEMM saturates early).
DiariZen / WeSpeaker capped at 8 (16 fights parallel workers).
Diarization
* DiariZen int8 segmentation model default (282 MB → 98 MB, +10%
CPU speed, posterior cosine 1.0000).
* NME-SC clustering (Park & Han 2019) replaces silhouette default —
fixes both over-split (Мистраль 7→8-9) and under-split
(Пк тест 10→2) failures on WeSpeaker embeddings.
* Overlap-aware word→turn assignment kills 148 empty 'Анна?' turns
on Пк тест 2026-08-06.
* Honest speaker labels — 'Спикер N (Ж)' instead of 'Виктор?'
pseudo-real-name pool (mymeet.ai convention).
* Trust ANY resolved speaker_name — dropped string-based pool
filter that wiped 11 hard-tier voiceprint matches on Мистраль.
Post-ASR quality (all opt-in, disabled by default)
* spellfix: pymorphy3 + SymSpell repairs Whisper transliteration
errors (подскажки → подсказки, лицензыи → лицензии).
* llm_cleanup: local Ollama post-pass (gemma3:12b) restores
punctuation, ё, capitalization. ~17 min on 149-min file.
* summarizer: Sumy TextRank/LexRank/LSA extractive TL;DR, fully
offline. Rendered as fenced ## TL;DR block in MD export.
* wav2vec2 CTC forced alignment: refines Whisper word timings
±200 ms → ±20-40 ms. Critical for overlap-heavy conferences.
Meeting UX
* Loopback level meter (🔊) below mic meter — immediate feedback
when loopback endpoint goes silent (Bluetooth headphones,
routing changes).
* Tray tooltip progress «загрузка/диаризация/распознавание NN%»
for file-mode CPU users instead of static spinner.
* Removed noisy meeting start/stop/rerun toasts.
* Меню 'Скопировать путь к транскрипту' в подменю записей.
* Hotkey rebind fix — old check silently ignored new combos.
* Model-warmup tray guard preserves PROCESSING state when a file
was queued during boot.
Startup
* Stage O CUDA warmup runs one dummy inference at load — kills the
12 s freeze on first finalize (Pavel 2026-08-20).
* torch stub install probes with real import — catches half-
uninstalled torch that segfaults downstream ORT DLL preload.
Distribution
* MossFormer2 lazy download from mirror on first meeting use —
CPU-minimal bundle can ship without the 220 MB blob.
* Config schema v16 with codeswitch model name migration.
Mac port scaffolding
* Cocoa (NSEvent) hotkey adapter as pynput replacement on macOS.
Testing
* 10 new tests: crash scrub, diarization invariants, ed25519 sign/
verify, dual-track finalize, full updater e2e.