Skip to content

Commit 2d7c0f5

Browse files
stt-accuracy: окно лога по времени устройства и ожидание по факту готовности, а не по sleep
1 parent f45b0db commit 2d7c0f5

1 file changed

Lines changed: 39 additions & 9 deletions

File tree

‎tools/stt-accuracy.ps1‎

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ param(
33
[string]$Engine = 'whisper',
44
[int]$Count = 12,
55
[string]$Tag = 'acc1',
6-
[int]$WaitSeconds = 30,
6+
[int]$WaitSeconds = 150,
77
[string]$UseIds = '',
8+
[switch]$All,
89
[string]$Dataset = 'C:\Projects\MyFLOW\data\eval_wispr',
910
[string]$ReportDir = "$env:TEMP\opencode"
1011
)
@@ -47,7 +48,17 @@ $buckets = @(
4748
@{ lo = 9.0; hi = 40.0; n = [int]($Count * 0.15) }
4849
)
4950
$picks = @()
50-
if ($UseIds) {
51+
if ($All) {
52+
# Весь корпус: каждый клип из эталона, у которого есть wav. Без случайного выбора —
53+
# иначе «полный прогон» на деле оказывается выборкой по бакетам.
54+
foreach ($f in (Get-ChildItem "$src\audio\*.wav" | Sort-Object Name)) {
55+
$id = $f.BaseName
56+
if ($rows.ContainsKey($id)) {
57+
$picks += [pscustomobject]@{ path = $f.FullName; id = $id; sec = $rows[$id].sec }
58+
}
59+
}
60+
Write-Host "using every clip: $($picks.Count)"
61+
} elseif ($UseIds) {
5162
foreach ($id in ($UseIds -split ',')) {
5263
$id = $id.Trim()
5364
if (-not $id) { continue }
@@ -111,8 +122,16 @@ function Wer([string]$hyp, [string]$ref) {
111122
return [Math]::Round(100.0 * $c.edits / $c.words, 1)
112123
}
113124

114-
function GrabLog() {
115-
$raw = & $adb logcat -d -t 4000 2>$null
125+
function DeviceClock() {
126+
# Окно по строкам здесь не работает: этот телефон пишет >2000 строк лога за 25 с,
127+
# поэтому `-t 4000` покрывает меньше минуты, BENCH-строка выпадает из окна и клип
128+
# помечается «NO-LOG», хотя распознался. Берём время устройства и читаем по нему.
129+
$line = & $adb shell 'date +"%m-%d %H:%M:%S.000"' 2>$null
130+
return ("$line").Trim()
131+
}
132+
133+
function GrabLog([string]$Since) {
134+
$raw = if ($Since) { & $adb logcat -d -T $Since 2>$null } else { & $adb logcat -d -t 4000 2>$null }
116135
$res = @{}
117136
foreach ($l in $raw) {
118137
if ($l -match "BENCH\s+.*/([0-9a-f-]+)\.wav\s+=>\s*'(.*)'\s*$") { $res[$matches[1]] = $matches[2] }
@@ -133,17 +152,28 @@ $n = 0
133152
foreach ($p in $picks) {
134153
$n++
135154
Write-Host ("[{0}/{1}] {2} ({3}s)" -f $n, $picks.Count, $p.id.Substring(0, 8), $p.sec)
155+
$since = DeviceClock
136156
& $adb shell "am broadcast -n $rcv -a org.opencode.mobile.STT_BENCH -e file $remoteDir/$($p.id).wav -e model $Model -e engine $Engine" | Out-Null
137-
Start-Sleep -Seconds $WaitSeconds
138-
$hyp = (GrabLog).text[$p.id]
157+
# Ждём не фиксированные секунды, а появление строки: холодная загрузка модели — ~20 с,
158+
# сам проход 2–25 с. Опрос раз в 3 с заканчивается сразу, как только клип готов.
159+
$hyp = $null
160+
$deadline = (Get-Date).AddSeconds($WaitSeconds)
161+
while (-not $hyp -and (Get-Date) -lt $deadline) {
162+
Start-Sleep -Seconds 3
163+
$hyp = (GrabLog $since).text[$p.id]
164+
}
139165
# Замечено: broadcast после logcat -c уходит, но ответ приходит не всегда
140166
# (первый клип стабильно терялся). Повторяем один раз, прежде чем считать пропажей.
141167
if (-not $hyp) {
142168
Write-Host ' retry (no log)'
143169
Start-Sleep -Seconds 2
170+
$since = DeviceClock
144171
& $adb shell "am broadcast -n $rcv -a org.opencode.mobile.STT_BENCH -e file $remoteDir/$($p.id).wav -e model $Model -e engine $Engine" | Out-Null
145-
Start-Sleep -Seconds $WaitSeconds
146-
$hyp = (GrabLog).text[$p.id]
172+
$deadline = (Get-Date).AddSeconds($WaitSeconds)
173+
while (-not $hyp -and (Get-Date) -lt $deadline) {
174+
Start-Sleep -Seconds 3
175+
$hyp = (GrabLog $since).text[$p.id]
176+
}
147177
}
148178
$ref = $rows[$p.id].text
149179
$w = if ($hyp) { Wer $hyp $ref } else { $null }
@@ -154,7 +184,7 @@ foreach ($p in $picks) {
154184
$results += [pscustomobject]@{
155185
id = $p.id; sec = [math]::Round($p.sec, 1); wer = $w
156186
edits = $edits; words = $words
157-
hyp = $hyp; ref = $ref; timing = (GrabLog).timing
187+
hyp = $hyp; ref = $ref; timing = (GrabLog $since).timing
158188
}
159189
$mark = if ($w -eq $null) { 'NO-LOG' } elseif ($w -eq 0) { 'exact' } else { "$w% WER" }
160190
Write-Host " -> $mark"

0 commit comments

Comments
 (0)