feat: benchmark sorts by RTF factor, shows 2 decimal places (v1.12.9)

Speed column now displays 1.32× instead of 1.3× for better precision.
Sorting by Speed ranks by the RTF multiplier (faster = higher ×) rather
than raw elapsed time, so the sentence length no longer skews the ranking.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mARTin-B78 2026-06-27 22:36:57 +02:00
parent 0c0bbb5ffd
commit 73d991c2f8
3 changed files with 13 additions and 5 deletions

View File

@ -9,6 +9,14 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
---
## [1.12.9] — 2026-06-27
### Changed
- **Benchmark speed factor shows 2 decimal places** (`1.32×` instead of `1.3×`) in the SPEED column and live status line — more precise RTF comparison across voices.
- **Sorting by Speed now sorts by the RTF factor** (faster voices first) instead of by raw synthesis time — voices with a higher `×` multiplier rank higher regardless of how long the benchmark sentence was.
---
## [1.12.8] — 2026-06-27
### Changed

View File

@ -26,7 +26,7 @@
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
<link rel="stylesheet" href="/static/style.css?v=1.12.8">
<link rel="stylesheet" href="/static/style.css?v=1.12.9">
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
@ -336,7 +336,7 @@
<script src="/static/vendor/wavesurfer-regions.min.js"></script>
<!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
<script src="/static/loader.js?v=1.12.8"></script>
<script src="/static/loader.js?v=1.12.9"></script>
</body>
</html>

View File

@ -97,7 +97,7 @@ function getSortValue(v, field) {
case 'file_type': return voiceFileType(v);
case 'duration': return v.duration || 0;
case 'dbfs': return voiceDbfs(v) ?? -999;
case 'benchmark': return voiceBenchmarkElapsed(v) ?? 999999;
case 'benchmark': { const b = voiceBenchmark(v); return b && b.speed != null ? -Number(b.speed) : 999; }
case 'transcript': return (v.transcript || '').toLowerCase();
case 'note': return (v.note || '').toLowerCase();
case 'source': return (_displaySource(v) || '').toLowerCase();
@ -364,7 +364,7 @@ function fmtBenchmark(v) {
if (!b.ok) return 'ERR';
const elapsed = voiceBenchmarkElapsed(v);
if (elapsed == null) return '-';
const speed = b.speed != null ? ` · ${Number(b.speed).toFixed(1)}x` : '';
const speed = b.speed != null ? ` · ${Number(b.speed).toFixed(2)}x` : '';
return elapsed.toFixed(1) + 's' + speed;
}
@ -819,7 +819,7 @@ async function runVoiceBenchmarkBatch() {
if (b && b.ok) {
stats.ok++;
if (b.realtime_ok === false) stats.slow++;
stats.last = `${voice.id}: ${Number(b.elapsed_sec || 0).toFixed(1)}s${b.speed != null ? ` · ${Number(b.speed).toFixed(1)}x` : ''}${b.realtime_ok === false ? ' · slow' : ''}`;
stats.last = `${voice.id}: ${Number(b.elapsed_sec || 0).toFixed(1)}s${b.speed != null ? ` · ${Number(b.speed).toFixed(2)}x` : ''}${b.realtime_ok === false ? ' · slow' : ''}`;
} else {
stats.errors++;
stats.last = `${voice.id}: failed${b && b.error ? ' · ' + b.error : ''}`;