Skip to content

Commit 9f65a12

Browse files
committed
Refine landing page: selectable backends, remove Python version, clean tagline, fix diamond char
1 parent 7157d29 commit 9f65a12

1 file changed

Lines changed: 45 additions & 11 deletions

File tree

docs/index.html

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@
168168
font-size: .58rem; letter-spacing: .12em; text-transform: uppercase;
169169
color: var(--muted); border: 1px solid var(--faint);
170170
padding: .2rem .6rem; border-radius: 2px;
171+
cursor: pointer; background: none;
172+
font-family: var(--mono);
171173
transition: color .2s, border-color .2s;
172174
}
173175
.backend-pill:hover { color: var(--accent2); border-color: var(--accent); }
@@ -332,7 +334,7 @@
332334
<div class="page">
333335

334336
<div class="header">
335-
<span class="req-pill">Python 3.9+ &nbsp;&middot;&nbsp; ffmpeg</span>
337+
<span class="req-pill">Python &nbsp;&middot;&nbsp; ffmpeg</span>
336338

337339
<div class="wave" aria-hidden="true">
338340
<div class="wave-bar"></div><div class="wave-bar"></div><div class="wave-bar"></div>
@@ -345,12 +347,12 @@
345347
</div>
346348

347349
<h1 class="glitch" data-text="whispr">whispr</h1>
348-
<p class="tagline">CLI + Web UI<span class="sep">&middot;</span>Multi-Backend<span class="sep">&middot;</span>Whisper Transcription</p>
350+
<p class="tagline">CLI + Web UI<span class="sep">&middot;</span>Multi-Backend</p>
349351

350352
<div class="backends">
351-
<span class="backend-pill hi">faster-whisper</span>
352-
<span class="backend-pill">whisper.cpp</span>
353-
<span class="backend-pill">openai api</span>
353+
<button class="backend-pill hi" onclick="setBackend(0)">faster-whisper</button>
354+
<button class="backend-pill" onclick="setBackend(1)">whisper.cpp</button>
355+
<button class="backend-pill" onclick="setBackend(2)">openai api</button>
354356
</div>
355357
</div>
356358

@@ -376,7 +378,7 @@ <h1 class="glitch" data-text="whispr">whispr</h1>
376378
<span class="dot dot-r"></span>
377379
<span class="dot dot-y"></span>
378380
<span class="dot dot-g"></span>
379-
<span class="term-label">bash &mdash; whispr</span>
381+
<span class="term-label">bash -- whispr</span>
380382
</div>
381383
<div class="term-body">
382384
<span class="ps">$&gt;</span>
@@ -409,7 +411,7 @@ <h1 class="glitch" data-text="whispr">whispr</h1>
409411
{
410412
raw: `git clone git@github.com:franckferman/whispr.git && cd whispr && bash install.sh`,
411413
html: `<span class="cmd">git</span> <span class="kw">clone</span> <span class="str">git@github.com:franckferman/whispr.git</span> <span class="op">&amp;&amp;</span> <span class="cmd">cd</span> <span class="str">whispr</span> <span class="op">&amp;&amp;</span> <span class="cmd">bash</span> <span class="str">install.sh</span>`,
412-
desc: `Interactive installer &mdash; detects <span class="hl">Python 3.9+</span> and <span class="hl">ffmpeg</span>, sets up a venv, and lets you choose backends (<span class="hl">faster-whisper</span>, <span class="hl">whisper.cpp</span>, <span class="hl">OpenAI</span>) and interfaces (CLI / Web UI).`,
414+
desc: `Interactive installer. Detects <span class="hl">Python</span> and <span class="hl">ffmpeg</span>, sets up a venv, and lets you choose backends (<span class="hl">faster-whisper</span>, <span class="hl">whisper.cpp</span>, <span class="hl">OpenAI</span>) and interfaces (CLI / Web UI).`,
413415
},
414416
{
415417
raw: `python main.py -f lecture.mp4 --backend faster_whisper -F txt,srt,vtt`,
@@ -429,25 +431,57 @@ <h1 class="glitch" data-text="whispr">whispr</h1>
429431
{
430432
raw: `python main.py -f interview.mp3 --backend openai --openai-key $OPENAI_API_KEY -F srt,txt`,
431433
html: `<span class="cmd">python</span> <span class="str">main.py</span> <span class="flag">-f</span> <span class="str">interview.mp3</span> <span class="flag">--backend</span> <span class="kw">openai</span> <span class="flag">--openai-key</span> <span class="env">$OPENAI_API_KEY</span> <span class="flag">-F</span> <span class="str">srt,txt</span>`,
432-
desc: `Cloud transcription via <span class="hl">OpenAI Whisper API</span>. No local model &mdash; files &gt; 25 MB are chunked automatically. Rate-limit handling with <span class="hl">Retry-After</span> backoff. Falls back to a local backend on failure if <span class="hl">--fallback-backend</span> is set.`,
434+
desc: `Cloud transcription via <span class="hl">OpenAI Whisper API</span>. No local model. Files &gt; 25 MB are chunked automatically. Rate-limit handling with <span class="hl">Retry-After</span> backoff. Falls back to a local backend on failure if <span class="hl">--fallback-backend</span> is set.`,
433435
},
434436
];
435437

438+
const BACKENDS = ['faster_whisper', 'whisper_cpp', 'openai'];
439+
const BACKEND_LABELS = ['faster-whisper', 'whisper.cpp', 'openai api'];
436440
let cur = 0;
441+
let curBackend = 0;
442+
443+
function setBackend(i) {
444+
curBackend = i;
445+
document.querySelectorAll('.backend-pill').forEach((p, idx) => p.classList.toggle('hi', idx === i));
446+
setTab(cur);
447+
}
448+
449+
function buildCmd(i) {
450+
if (i === 0) return S[0];
451+
if (i === 3) return S[3];
452+
if (i === 4) return S[4];
453+
const b = BACKENDS[curBackend];
454+
const bl = BACKEND_LABELS[curBackend];
455+
if (i === 1) {
456+
return {
457+
raw: `python main.py -f lecture.mp4 --backend ${b} -F txt,srt,vtt`,
458+
html: `<span class="cmd">python</span> <span class="str">main.py</span> <span class="flag">-f</span> <span class="str">lecture.mp4</span> <span class="flag">--backend</span> <span class="kw">${b}</span> <span class="flag">-F</span> <span class="str">txt,srt,vtt</span>`,
459+
desc: `Transcribe a local file with <span class="hl">${bl}</span>${b==='faster_whisper'?' (CTranslate2, GPU/CPU)':b==='whisper_cpp'?' (GGML, CPU-optimized)':' (OpenAI API, no local model)'}. Outputs <span class="hl">plain text</span>, <span class="hl">SRT</span>, and <span class="hl">WebVTT</span> subtitles. Supports MP3, MP4, WAV, MKV, FLAC, and any ffmpeg-compatible format.`,
460+
};
461+
}
462+
if (i === 2) {
463+
return {
464+
raw: `python main.py -u "https://youtu.be/dQw4w9WgXcQ" --backend ${b} -l en -F srt`,
465+
html: `<span class="cmd">python</span> <span class="str">main.py</span> <span class="flag">-u</span> <span class="str">"https://youtu.be/dQw4w9WgXcQ"</span> <span class="flag">--backend</span> <span class="kw">${b}</span> <span class="flag">-l</span> <span class="str">en</span> <span class="flag">-F</span> <span class="str">srt</span>`,
466+
desc: `Transcribe a <span class="hl">YouTube URL</span> (or any HTTP URL) via yt-dlp. Audio is extracted, chunked with ffmpeg, transcribed in parallel, and output as <span class="hl">SRT subtitles</span>. Language auto-detected if <span class="hl">-l</span> is omitted.`,
467+
};
468+
}
469+
}
437470

438471
function setTab(i) {
439472
cur = i;
440473
document.querySelectorAll('.tab').forEach((t, idx) => t.classList.toggle('active', idx === i));
474+
const entry = buildCmd(i);
441475
const d = document.getElementById('cmd-display');
442476
d.innerHTML = '';
443477
void d.offsetWidth;
444-
d.innerHTML = S[i].html;
445-
document.getElementById('tab-desc').innerHTML = S[i].desc;
478+
d.innerHTML = entry.html;
479+
document.getElementById('tab-desc').innerHTML = entry.desc;
446480
}
447481

448482
function copyCmd() {
449483
const btn = document.getElementById('copy-btn');
450-
navigator.clipboard.writeText(S[cur].raw).then(() => {
484+
navigator.clipboard.writeText(buildCmd(cur).raw).then(() => {
451485
btn.textContent = 'Copied!';
452486
btn.classList.add('ok');
453487
setTimeout(() => { btn.textContent = 'Copy'; btn.classList.remove('ok'); }, 1800);

0 commit comments

Comments
 (0)