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
133152foreach ($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