Skip to content

Commit 4fda44f

Browse files
STT: WER-бенч работает, метрика не врёт на коротких клипах
Бенч был записан как невозможный: «эталонных транскриптов в репозитории нет». Корпус лежит рядом, вне репозитория: C:\Projects\MyFLOW\data\eval_wispr (phrases.jsonl + 624 wav), и tools/stt-accuracy.ps1 гоняет его на устройстве через SttBenchReceiver -> logcat. Прогон на 7 клипах (1,3-10,8 с), одинаковые id у обоих движков: whisper small mean 10,47 %, corpus 13,85 % (9 правок / 65 слов); parakeet corpus 9,52 % (6 / 63), но два односложных клипа не дали результата вовсе. Средний WER по клипам - плохая метрика на таком наборе: «Продолжай.» -> «Продолжи.» даёт 100 % за одну букву и тянет среднее сильнее длинной фразы с той же ошибкой. Wer разделён на WerCounts (правки и слова эталона) и Wer (проценты), отчёт печатает corpus WER и число клипов <=2 слов. Сравнивать движки по этим числам пока нельзя: у parakeet два клипа пропали, наборы разные. Это отдельный вопрос, а не вывод «parakeet точнее».
1 parent f8eb2e0 commit 4fda44f

3 files changed

Lines changed: 56 additions & 10 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,22 @@ ChatOverlay разобран на четыре файла (25.10.2026)
630630
- `provenance.test.mjs` — новый тест на фразу правила (дата, коммит, «проверь код
631631
заново»); 29 тестов зелёные, `-Task jstest` зелёный.
632632

633+
STT: WER-бенч работает, и метрика больше не врёт (26.10.2026)
634+
- Бенч был записан как невозможный: «эталонных транскриптов в репозитории нет». Корпус
635+
лежит рядом, вне репозитория — `C:\Projects\MyFLOW\data\eval_wispr` (`phrases.jsonl`
636+
+ 624 wav), и `tools/stt-accuracy.ps1` гоняет его на устройстве через
637+
`SttBenchReceiver` → `logcat`.
638+
- Прогон на 7 клипах (1,3–10,8 с), одинаковые id у обоих движков: whisper `small` —
639+
средний WER 10,47 %, corpus 13,85 % (9 правок / 65 слов); parakeet — corpus 9,52 %
640+
(6 / 63), но два односложных клипа не дали результата вовсе.
641+
- **Средний WER по клипам — плохая метрика на таком наборе.** «Продолжай.» →
642+
«Продолжи.» — одна буква, но WER 100 %, и этот клип тянет среднее сильнее, чем
643+
длинная фраза с той же ошибкой. Поэтому `Wer` разделён на `WerCounts` (правки и
644+
слова эталона) и `Wer` (проценты), а отчёт печатает **corpus WER** — правки на слово
645+
по всему набору — и число клипов ≤2 слов.
646+
- Сравнивать движки по этим числам пока нельзя: у parakeet два клипа пропали, наборы
647+
разные. Это отдельный вопрос, а не вывод «parakeet точнее».
648+
633649
---
634650

635651
## Стек и зависимости

‎docs/ROADMAP.md‎

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,30 @@ IPv4-first через `InetAddress`/Netd) + `HTTPS_PROXY`/`HTTP_PROXY`/`NO_PROXY
8686
хвост >30 с не теряется, галлюцинаций на тишине меньше.
8787
- ✅ **Бенч turbo int8 на реальном OPPO прогнан** (24.09.2026): int8 6.8–8.2 s
8888
vs fp32 14.5–15.2 s (~2.1×); CSV: `docs/stt-bench-2026-09-24.csv`.
89-
- Осталось: WER-бенч (точность при чанкинге), тюнинг `setThreads` на других
90-
устройствах.
89+
- ✅ **WER-бенч работает (26.10.2026).** `tools/stt-accuracy.ps1` гоняет клипы на
90+
устройстве (`SttBenchReceiver` → `logcat`), эталон — `C:\Projects\MyFLOW\data\eval_wispr`
91+
(`phrases.jsonl` + 624 wav). Первый прогон на 7 клипах (1,3–10,8 с):
92+
whisper `small` — средний WER 10,47 %, **corpus WER 13,85 %** (9 правок / 65 слов);
93+
parakeet `parakeet-tdt-0.6b-v3` — corpus 9,52 % (6 / 63), но два односложных клипа
94+
не дали результата вовсе, поэтому сравнение пока нечестное.
95+
- **Метрика исправлена:** средний WER по клипам — шум на наборе с односложными фразами
96+
(одна буква в слове из одного слова даёт 100 %). Скрипт теперь печатает и corpus WER
97+
(правки на слово по всему набору), и число клипов ≤2 слов.
98+
- Осталось: прогон по всему корпусу (624 клипа) и разбор, почему parakeet молчит на
99+
односложных клипах; тюнинг `setThreads` на других устройствах.
91100
- ✅ **VAD-пороги измерены, а не угаданы** (26.09.2026): офлайн-свип
92101
`SpeechSegmenterBenchTest` на реальных bench-wav, 6 порогов × 5 SNR = 30 замеров.
93102
Recall речи 90.7% на всём диапазоне 0.010–0.030; 0.015 и 0.025 дают **идентичный**
94103
результат во всех 30 замерах, то есть предложенный сдвиг порога — no-op.
95104
`MIN_RMS` остаётся 0.015. Отчёт: `app/build/reports/vad-bench.txt`.
96-
- ⛔ **WER-бенч по-прежнему невозможен**: нужны эталонные транскрипты, которых в репозитории
97-
нет, плюс устройство с моделями для ncnn-прохода. Считать WER по выводу модели нельзя —
98-
на `jfk.wav` int8 отдаёт текст, не являющийся цитатой.
105+
- ✅ **Прошлый вывод «WER посчитать нельзя» снят (26.10.2026).** Он опирался на то, что
106+
эталона нет в репозитории: корпус лежит рядом, в `C:\Projects\MyFLOW\data\eval_wispr`,
107+
и его достаточно. Считать WER по выводу модели по-прежнему нельзя (на `jfk.wav` int8
108+
отдаёт текст, не являющийся цитатой) — но с внешним эталоном это и не нужно.
99109

100110
**Готово когда:** потоковый пайплайн с первым результатом 1–2 s + WER-прогон —
101-
✅ пайплайн внедрён (1–2 s первые слова); пороги VAD измерены; остаётся формальный
102-
WER-бенч, заблокированный отсутствием эталона.
111+
✅ пайплайн внедрён (1–2 s первые слова); пороги VAD измерены; WER-бенч работает и
112+
дал первые числа на 7 клипах. Полный прогон по корпусу — отдельная задача, не блокер.
103113

104114
---
105115

‎tools/stt-accuracy.ps1‎

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function Normalize([string]$s) {
8282
return ($t -split '\s+' | Where-Object { $_ }) -join ' '
8383
}
8484

85-
function Wer([string]$hyp, [string]$ref) {
85+
function WerCounts([string]$hyp, [string]$ref) {
8686
$h = @((Normalize $hyp) -split ' ' | Where-Object { $_ })
8787
$r = @((Normalize $ref) -split ' ' | Where-Object { $_ })
8888
if ($r.Count -eq 0) { return $null }
@@ -102,8 +102,13 @@ function Wer([string]$hyp, [string]$ref) {
102102
$d[$i, $j] = $m
103103
}
104104
}
105-
$last = $d[$r.Count, $h.Count]
106-
return [Math]::Round(100.0 * $last / $r.Count, 1)
105+
return [pscustomobject]@{ edits = $d[$r.Count, $h.Count]; words = $r.Count }
106+
}
107+
108+
function Wer([string]$hyp, [string]$ref) {
109+
$c = WerCounts $hyp $ref
110+
if (-not $c) { return $null }
111+
return [Math]::Round(100.0 * $c.edits / $c.words, 1)
107112
}
108113

109114
function GrabLog() {
@@ -142,8 +147,13 @@ foreach ($p in $picks) {
142147
}
143148
$ref = $rows[$p.id].text
144149
$w = if ($hyp) { Wer $hyp $ref } else { $null }
150+
$cnt = if ($hyp) { WerCounts $hyp $ref } else { $null }
151+
$edits = $null
152+
$words = $null
153+
if ($cnt) { $edits = $cnt.edits; $words = $cnt.words }
145154
$results += [pscustomobject]@{
146155
id = $p.id; sec = [math]::Round($p.sec, 1); wer = $w
156+
edits = $edits; words = $words
147157
hyp = $hyp; ref = $ref; timing = (GrabLog).timing
148158
}
149159
$mark = if ($w -eq $null) { 'NO-LOG' } elseif ($w -eq 0) { 'exact' } else { "$w% WER" }
@@ -165,7 +175,16 @@ foreach ($r in $results) {
165175
if ($ok.Count -gt 0) {
166176
$mean = [math]::Round((($ok | Measure-Object -Property wer -Average).Average), 2)
167177
$exact = ($ok | Where-Object { $_.wer -eq 0 }).Count
178+
# Средний WER по клипам врёт, когда в наборе есть односложные фразы: одна
179+
# буква в слове из одного слова даёт 100%, и такой клип тянет среднее
180+
# сильнее, чем длинная фраза с той же ошибкой. Поэтому рядом печатаем
181+
# corpus WER - правки на слово по всему набору - и число коротких клипов.
182+
$words = ($ok | Measure-Object -Property words -Sum).Sum
183+
$edits = ($ok | Measure-Object -Property edits -Sum).Sum
184+
$corpus = if ($words -gt 0) { [math]::Round(100.0 * $edits / $words, 2) } else { 'n/a' }
185+
$short = ($ok | Where-Object { $_.words -le 2 }).Count
168186
[void]$sb.AppendLine("WER mean = $mean % exact = $exact / $($ok.Count) missing = $($results.Count - $ok.Count)")
187+
[void]$sb.AppendLine("WER corpus = $corpus % edits = $edits / words = $words clips<=2 words = $short")
169188
} else {
170189
[void]$sb.AppendLine('NO RESULTS')
171190
}
@@ -176,4 +195,5 @@ if ($ok.Count -gt 0) {
176195
$mean = [math]::Round((($ok | Measure-Object -Property wer -Average).Average), 2)
177196
$exact = ($ok | Where-Object { $_.wer -eq 0 }).Count
178197
Write-Host "WER mean = $mean % exact = $exact / $($ok.Count)"
198+
Write-Host "WER corpus = $corpus % edits = $edits / words = $words clips<=2 words = $short"
179199
}

0 commit comments

Comments
 (0)