From 5db93d55d1f1cae4a418cfc7d04a8aef94555794 Mon Sep 17 00:00:00 2001 From: mARTin-B78 Date: Sat, 27 Jun 2026 23:32:13 +0200 Subject: [PATCH] feat: voices table shows only Factor+WPM; Benchmark gets full detail (v1.12.14) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voices table: removed Length, Duration, Time — only Factor and WPM remain from benchmark data. Setup → Benchmark batch results now shows Duration, Factor (sorted fastest-first, colour-coded), Time, and WPM. Factor replaces Avg RTF with the same data flipped to a more intuitive direction (higher=better). Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 8 ++++++++ static/index.html | 4 ++-- static/js/benchmark.js | 22 ++++++++++++++-------- static/js/voice-library.js | 3 --- static/sections/s-performance.html | 4 ++-- static/sections/s-voices.html | 3 --- static/style.css | 29 +++++++++++++---------------- 7 files changed, 39 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46fd5ad..13ff197 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,14 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi --- +## [1.12.14] — 2026-06-27 + +### Changed +- **Voices table**: simplified to only Factor + WPM from benchmark data (Length, Duration, Time removed — detail lives in Setup → Benchmark). +- **Setup → Benchmark batch results**: now shows Duration, Factor (sorted descending, green ≥ 1.0×), Time, and WPM alongside existing Latency/Best columns. Factor replaces Avg RTF (same data, more intuitive direction). + +--- + ## [1.12.13] — 2026-06-27 ### Changed diff --git a/static/index.html b/static/index.html index 4bf26af..9c371bc 100644 --- a/static/index.html +++ b/static/index.html @@ -26,7 +26,7 @@ - + @@ -336,7 +336,7 @@ - + diff --git a/static/js/benchmark.js b/static/js/benchmark.js index a39bd9c..8706a19 100644 --- a/static/js/benchmark.js +++ b/static/js/benchmark.js @@ -222,25 +222,31 @@ function renderBatchResults() { if (!batchResults.length) { batchResultsCard.style.display = 'none'; return; } batchResultsCard.style.display = ''; - const sorted = batchResults.slice().sort((a, b) => { + const sorted = batchResults.slice().sort((a, b) => { if (a.ok && !b.ok) return -1; if (!a.ok && b.ok) return 1; - return (a.avgRtf || 999) - (b.avgRtf || 999); + // sort by Factor descending (higher = faster); Factor = 1/avgRtf + return (b.avgRtf > 0 ? 1/b.avgRtf : 0) - (a.avgRtf > 0 ? 1/a.avgRtf : 0); }); const okCount = batchResults.filter(r => r.ok).length; if (batchResultsLabel) batchResultsLabel.textContent = `${okCount} / ${batchResults.length} voices — ${batchBackendSel.value}`; batchTbody.innerHTML = sorted.map(r => { - const rtfCls = r.ok && r.avgRtf < 1 ? 'perf-good' : r.ok ? 'perf-slow' : ''; - const trend = r.trend ? `${r.trend.label}` : ''; - const device = typeof backendComputeDevice === 'function' ? backendComputeDevice(r.backend || batchBackendSel.value) : 'Unknown'; + const factor = r.ok && r.avgRtf > 0 ? 1 / r.avgRtf : null; + const timeSec = r.ok && r.avgLatency > 0 ? r.avgLatency / 1000 : null; + const wpm = r.ok && r.avgAudio > 0 && r.wordCount > 0 ? Math.round(r.wordCount / (r.avgAudio / 60)) : null; + const factorCls = factor == null ? '' : factor >= 1 ? 'perf-good' : 'perf-slow'; + const trend = r.trend ? `${r.trend.label}` : ''; + const device = typeof backendComputeDevice === 'function' ? backendComputeDevice(r.backend || batchBackendSel.value) : 'Unknown'; const deviceCls = typeof backendComputeDeviceClass === 'function' ? backendComputeDeviceClass(r.backend || batchBackendSel.value) : ''; return ` ${escHtml(r.voice)} ${escHtml(device)} ${r.ok ? Math.round(r.avgLatency) + ' ms' : '—'} ${r.ok ? r.minLatency + ' ms' : '—'} - ${r.ok && r.avgAudio > 0 ? r.avgAudio.toFixed(2) : '—'} - ${r.ok && r.avgRtf ? r.avgRtf.toFixed(2) : '—'}${trend} + ${r.ok && r.avgAudio > 0 ? r.avgAudio.toFixed(1) + 's' : '—'} + ${factor != null ? factor.toFixed(2) + '×' : '—'}${trend} + ${timeSec != null ? timeSec.toFixed(1) + 's' : '—'} + ${wpm != null ? wpm + ' wpm' : '—'} ${r.ok ? 'OK' : `${escHtml(r.error || 'Failed')}`} `; }).join(''); @@ -281,7 +287,7 @@ batchProgCount.textContent = `${vi + 1} / ${selected.length}`; batchProgBar.style.width = `${Math.round((vi / selected.length) * 100)}%`; - const entry = { voice, backend, ok: false, avgLatency: 0, minLatency: 0, avgRtf: 0, avgAudio: 0, error: '' }; + const entry = { voice, backend, ok: false, avgLatency: 0, minLatency: 0, avgRtf: 0, avgAudio: 0, wordCount: text ? text.trim().split(/\s+/).length : 0, error: '' }; const rowRunResults = []; for (let ri = 0; ri < runs; ri++) { diff --git a/static/js/voice-library.js b/static/js/voice-library.js index 4bbd861..dec742e 100644 --- a/static/js/voice-library.js +++ b/static/js/voice-library.js @@ -2018,10 +2018,7 @@ function makeVoiceRow(v) { ? `` : `${genderMap[gender]||'?'} ${escHtml(genderLabel[gender]||'—')}`} -
${fmtDuration(v.duration)}
-
${escHtml(fmtBenchmarkAudio(v))}
${escHtml(fmtFactor(v))}
-
${escHtml(fmtElapsed(v))}
${escHtml(fmtWpm(v))}
${dbfs} dB
${isClone ? 'Clone' : 'Design'}
diff --git a/static/sections/s-performance.html b/static/sections/s-performance.html index 14e4883..fab8195 100644 --- a/static/sections/s-performance.html +++ b/static/sections/s-performance.html @@ -183,12 +183,12 @@