Spaces:
Running
Running
File size: 18,313 Bytes
ffbdd11 e836848 ffbdd11 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | <!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Hebrish Models</title>
<meta name="description" content="Every Hebrish speech model in one place: English-Hebrew code-switching fine-tunes, their variants and formats.">
<link rel="icon" href="mark.svg" type="image/svg+xml">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600;9..144,700&family=Inter:wght@400;500;600&display=swap">
<style>
/* Tokens copied from Hebrish-Mgmt/brand/tokens.css (2026-10-21). */
:root {
--bg: #fbf8f2; --surface: #ffffff; --band: #f1ece1;
--ink: #1d2422; --muted: #5b6662; --line: #e2dccf;
--accent: #0f6b5c; --accent-ink: #ffffff; --accent-soft: #d8efe7;
--warn-soft: #fbe3d9; --warn-ink: #9a3412; --gold: #c8901c;
--font-display: Fraunces, Georgia, serif;
--font-body: Inter, system-ui, -apple-system, "Segoe UI", sans-serif;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg: #111615; --surface: #18201e; --band: #151c1a;
--ink: #e8ece9; --muted: #9aa7a2; --line: #2a3532;
--accent: #3fbf9f; --accent-ink: #0c1412; --accent-soft: #163a31;
--warn-soft: #3a2018; --warn-ink: #f4a582; --gold: #e0b14a;
}
}
:root[data-theme="dark"] {
--bg: #111615; --surface: #18201e; --band: #151c1a;
--ink: #e8ece9; --muted: #9aa7a2; --line: #2a3532;
--accent: #3fbf9f; --accent-ink: #0c1412; --accent-soft: #163a31;
--warn-soft: #3a2018; --warn-ink: #f4a582; --gold: #e0b14a;
}
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body { margin: 0; background: var(--bg); color: var(--ink); font: 16px/1.55 var(--font-body); }
a { color: var(--accent); text-underline-offset: 2px; }
.wrap { max-width: 1080px; margin: 0 auto; padding: 0 16px; }
header { padding: 48px 0 24px; }
.brand { display: flex; align-items: center; gap: 10px; font-weight: 600; color: var(--muted); font-size: 14px; }
.brand img { width: 28px; height: 28px; }
h1, h2, h3 { font-family: var(--font-display); line-height: 1.15; margin: 0; }
h1 { font-size: clamp(32px, 6vw, 52px); margin-top: 18px; }
h1 em { font-style: normal; color: var(--accent); }
.lede { color: var(--muted); font-size: 18px; max-width: 720px; margin: 14px 0 0; }
.cta { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
.btn { display: inline-block; padding: 9px 16px; border-radius: 999px; border: 1px solid var(--line); background: var(--surface); color: var(--ink); text-decoration: none; font-weight: 500; font-size: 14px; }
.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
section { padding: 28px 0; }
.band { background: var(--band); border-block: 1px solid var(--line); }
h2 { font-size: 28px; }
.sub { color: var(--muted); margin: 6px 0 18px; max-width: 760px; }
/* Speed-accuracy scale */
.scale { position: relative; height: 150px; margin: 8px 0 4px; }
.scale .axis { position: absolute; left: 0; right: 0; top: 74px; height: 4px; border-radius: 2px; background: linear-gradient(90deg, var(--gold), var(--accent)); }
.scale .dot { position: absolute; top: 68px; width: 16px; height: 16px; margin-left: -8px; border-radius: 50%; background: var(--surface); border: 3px solid var(--accent); }
.scale .lbl { position: absolute; font-size: 12px; line-height: 1.25; width: 100px; margin-left: -50px; text-align: center; color: var(--ink); text-decoration: none; }
.scale .lbl.up { bottom: 90px; } .scale .lbl.down { top: 92px; }
.scale-ends { display: flex; justify-content: space-between; font-size: 13px; color: var(--muted); }
.note { font-size: 13px; color: var(--muted); margin-top: 10px; }
/* Lines */
.line { margin-top: 26px; }
.line-head { display: flex; align-items: flex-start; gap: 14px; margin-bottom: 14px; }
.line-head img { width: 52px; height: 52px; flex: none; }
.line-head .mono { width: 52px; height: 52px; flex: none; border-radius: 14px; display: grid; place-items: center; background: var(--accent-soft); color: var(--accent); font-family: var(--font-display); font-size: 24px; font-weight: 700; }
.line-head p { margin: 2px 0 0; color: var(--muted); font-size: 15px; }
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 14px; }
.card { background: var(--surface); border: 1px solid var(--line); border-radius: 16px; padding: 18px; display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.card.rec { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
.card h3 { font-size: 20px; overflow-wrap: anywhere; }
.tags { display: flex; flex-wrap: wrap; gap: 6px; }
.tag { font-size: 12px; padding: 2px 9px; border-radius: 999px; background: var(--band); color: var(--muted); border: 1px solid var(--line); }
.tag.acc { background: var(--accent-soft); color: var(--accent); border-color: transparent; font-weight: 600; }
.tag.warn { background: var(--warn-soft); color: var(--warn-ink); border-color: transparent; }
.card .for { margin: 0; }
dl { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; font-size: 14px; }
dt { color: var(--muted); } dd { margin: 0; overflow-wrap: anywhere; }
.meters { display: flex; gap: 18px; font-size: 13px; color: var(--muted); }
.pips { letter-spacing: 2px; color: var(--accent); }
.pips .off { color: var(--line); }
.links { display: flex; flex-wrap: wrap; gap: 6px; margin-top: auto; padding-top: 4px; }
.links a { font-size: 13px; padding: 4px 10px; border-radius: 8px; background: var(--band); text-decoration: none; border: 1px solid var(--line); }
.links a.main { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
footer { padding: 32px 0 48px; color: var(--muted); font-size: 14px; }
@media (max-width: 820px) {
.scale { display: none; }
.scale-ends { display: none; }
#scale-list { display: block !important; }
}
#scale-list { display: none; margin: 0; padding-left: 20px; }
</style>
</head>
<body>
<header class="wrap">
<div class="brand"><img src="mark.svg" alt=""> Hebrish · עבריש</div>
<h1>Every <em>Hebrish</em> model in one place</h1>
<p class="lede">Speech recognition for English with Hebrew words mixed in. Each model writes the Hebrew words in one consistent romanized spelling (<i>arnona</i>, <i>kupat holim</i>, <i>teudat zehut</i>) and runs on your own device. Free and open, from a not-for-profit project.</p>
<div class="cta">
<a class="btn primary" href="https://hebrish.app/models/choose">Which model should I use?</a>
<a class="btn" href="https://hebrish.app/download">Get the apps</a>
<a class="btn" href="https://huggingface.co/spaces/Hebrish/Jachnun-Demo">Try it in the browser</a>
<a class="btn" href="https://hebrish.app/benchmarks">Benchmarks</a>
</div>
</header>
<section class="band">
<div class="wrap">
<h2>From small and fast to most accurate</h2>
<p class="sub">Where each speech model sits, from wearables on the left to desktop GPUs on the right.</p>
<div class="scale" id="scale" aria-hidden="true"><div class="axis"></div></div>
<div class="scale-ends"><span>Smaller, faster, runs anywhere</span><span>Larger, more accurate, needs a GPU</span></div>
<ol id="scale-list"></ol>
<p class="note">Positions are estimates from model size and each model's own evaluations. The models have not all been scored on the same test set, so read them as a rough order, not a ranking.</p>
</div>
</section>
<main class="wrap" id="lines"></main>
<section class="band">
<div class="wrap">
<h2>Access and terms</h2>
<p class="sub">The model repositories are gated: request access with the form on each repository page, and Daniel reviews every request. If you have not heard back after a few days, write to <a href="mailto:access@hebrish.app">access@hebrish.app</a>. Use is free for personal, research, education and not-for-profit work. Commercial use, including telephony, needs a commercial licence. Read the <a href="https://hebrish.app/terms">terms of use</a>. The Hebrish apps and the browser demo download models from Hebrish's own CDN, so they work without an access request.</p>
</div>
</section>
<footer class="wrap">
<a href="https://hebrish.app">hebrish.app</a> · <a href="https://huggingface.co/Hebrish">Hugging Face: Hebrish</a> · <a href="https://github.com/Hebrish-ASR">GitHub: Hebrish-ASR</a> · <a href="https://hebrish.app/whitepaper">White paper</a><br>
Developed by <a href="https://danielrosehill.com">Daniel Rosehill</a>. Figures as published on hebrish.app, checked 2026-10-21.
</footer>
<script>
// Model data. Mirrors hebrish.app data/variants.json and /models (2026-10-21). Update both together.
const HF = "https://huggingface.co/";
const SITE = "https://hebrish.app";
const LINES = [
{ id: "sabich", name: "Sabich", logo: "sabich.svg",
blurb: "The main line: code-switched speech plus tech vocabulary, brand names and numbers. The same training data on several base models, from wearables to desktop GPUs.",
variants: [
{ name: "Sabich", rec: true, base: "NVIDIA Parakeet TDT 0.6B v2", params: "0.6B", version: "v1.0 (2026-10-20)",
for: "Phones and computers without a GPU. The default in the Hebrish apps.",
result: "73.8% term recall, 3.3% WER on the public benchmark", size: "about 661 MB (sherpa-onnx int8)",
tags: ["Recommended", "In the apps"], speed: 3, accuracy: 4, gradient: 67, page: "/models/sabich",
repo: "Hebrish/Sabich", formats: [["sherpa-onnx int8", "Hebrish/Sabich-sherpa-onnx-int8"], ["ONNX", "Hebrish/Sabich-ONNX"], ["GGUF", "Hebrish/Sabich-GGUF"], ["MLX", "Hebrish/Sabich-MLX"]] },
{ name: "Sabich-Qwen3-ASR-1.7B", base: "Qwen3-ASR 1.7B", params: "2.0B", version: "v1.0 (2026-10-21)",
for: "Desktop GPUs. The most accurate model on code-switched speech.",
result: "5.4% code-switching WER (stock Qwen3-ASR 10.0%), held-out split", size: "4.1 GB bf16; GGUF Q8_0 about 2 GB",
tags: ["Desktop GPU", "Not in the apps yet"], speed: 2, accuracy: 5, gradient: 95, page: "/models/sabich-qwen3",
repo: "Hebrish/Sabich-Qwen3-ASR-1.7B", formats: [["GGUF", "Hebrish/Sabich-Qwen3-ASR-1.7B-GGUF"]] },
{ name: "Sabich-Canary-Qwen-2.5B", base: "NVIDIA Canary-Qwen 2.5B", params: "2.56B", version: "v1.0 (2026-10-21)",
for: "Desktop GPUs. The best plain English of the Sabich variants; second to Sabich-Qwen3-ASR-1.7B on code-switching.",
result: "6.9% code-switching WER, 2.4% on the speaker's own English, held-out split", size: "about 5 GB bf16, about 6 GB of VRAM; NeMo only",
tags: ["Desktop GPU", "Audio up to 40 s", "Not in the apps yet"], speed: 2, accuracy: 4, gradient: 88, page: "/models/sabich-canary-qwen",
repo: "Hebrish/Sabich-Canary-Qwen-2.5B", formats: [] },
{ name: "Sabich-Parakeet-110M", base: "NVIDIA Parakeet TDT-CTC 110M", params: "114M", version: "v1.0 (2026-10-21)",
for: "Low-end phones, watches and wearables. A fifth of Sabich's size: faster, with more mistakes.",
result: "Not benchmarked yet", size: "about 137 MB (sherpa-onnx int8)",
tags: ["Small devices", "In the apps"], speed: 4, accuracy: 3, gradient: 30, page: "/models/sabich-110m",
repo: "Hebrish/Sabich-Parakeet-110M", formats: [["sherpa-onnx int8", "Hebrish/Sabich-Parakeet-110M-sherpa-onnx-int8"], ["GGUF", "Hebrish/Sabich-Parakeet-110M-GGUF"]] },
{ name: "Sabich-asr4all-M", base: "FUTO asr4all M", params: "56M", version: "v1.0 (2026-10-21)",
for: "Wearables and low-power boards. A little more accurate than S. Streams on the CPU.",
result: "9.1% code-switching WER (stock asr4all-m 19.5%), held-out split", size: "223 MB fp32; ONNX about 214 MB",
tags: ["Streaming", "Numbers as words", "Not in the apps yet"], speed: 5, accuracy: 2, gradient: 14, page: "/models/sabich-asr4all",
repo: "Hebrish/Sabich-asr4all-M", formats: [] },
{ name: "Sabich-asr4all-S", base: "FUTO asr4all S", params: "28M", version: "v1.0 (2026-10-21)",
for: "Wearables and very low-power boards. The smallest Hebrish model. Streams on the CPU.",
result: "10.1% code-switching WER, held-out split", size: "113 MB fp32; ONNX about 108 MB",
tags: ["Streaming", "Numbers as words", "Not in the apps yet"], speed: 5, accuracy: 2, gradient: 4, page: "/models/sabich-asr4all",
repo: "Hebrish/Sabich-asr4all-S", formats: [] },
] },
{ id: "jachnun", name: "Jachnun", logo: "jachnun.svg",
blurb: "Code-switching only: English with the Hebrew words spelled right, without the tech vocabulary. In the apps next to Sabich.",
variants: [
{ name: "Jachnun", base: "NVIDIA Parakeet TDT 0.6B v2", params: "0.6B", version: "v1.0 (2026-10-19)",
for: "Code-switching only, for anyone who prefers it to Sabich.",
result: "73.3% term recall, 3.3% WER on the public benchmark", size: "about 660 MB (sherpa-onnx int8)",
tags: ["In the apps"], speed: 3, accuracy: 4, gradient: 61, page: "/models/jachnun",
repo: "Hebrish/Jachnun", formats: [["sherpa-onnx int8", "Hebrish/Jachnun-sherpa-onnx-int8"], ["ONNX", "Hebrish/Jachnun-ONNX"], ["GGUF", "Hebrish/Jachnun-GGUF"], ["MLX", "Hebrish/Jachnun-MLX"]] },
] },
{ id: "shakshuka", name: "Shakshuka", logo: "shakshuka.svg",
blurb: "The streaming line: the words appear while you are still talking. Trained on Sabich's data.",
variants: [
{ name: "Shakshuka", base: "NVIDIA Nemotron Speech Streaming EN 0.6B", params: "0.6B", version: "v1.0 (2026-10-21)",
for: "Live text while you speak: captions and live dictation.",
result: "v1.0 not benchmarked yet; PoC-2: 62.2% term recall, 4.7% WER (offline)", size: "about 662 MB (sherpa-onnx int8)",
tags: ["Streaming", "Not in the apps yet"], speed: 4, accuracy: 4, gradient: 54, page: "/models/shakshuka",
repo: "Hebrish/Shakshuka", formats: [["sherpa-onnx int8 (streaming)", "Hebrish/Shakshuka-sherpa-onnx-int8"], ["GGUF", "Hebrish/Shakshuka-GGUF"]] },
] },
{ id: "whisper", name: "Whisper Hebrish", mono: "W",
blurb: "Fine-tunes of OpenAI Whisper. This is where Hebrish started, in November 2025.",
variants: [
{ name: "Whisper Hebrish Small ACFT", base: "OpenAI Whisper small.en", params: "242M", version: "small-en-en30-acft (2026-10-17)",
for: "People who already use FUTO Keyboard on Android.",
result: "5.8% code-switching WER on its own test set (FUTO runtime)", size: "Transformers fp32, whisper.cpp GGML Q8_0",
tags: ["FUTO Keyboard"], page: "/models/whisper-small",
repo: "Hebrish/Whisper-Hebrish-Small-ACFT", formats: [] },
{ name: "Whisper Hebrish (large-v3-turbo)", base: "OpenAI Whisper large-v3-turbo", params: "809M", version: "Version 2 (2026-10-17)",
for: "A full fine-tune; the larger sibling of the Small ACFT model.",
result: "Version 1: 54.1% term recall, 6.5% WER on the public benchmark", size: "Transformers, whisper.cpp GGML",
tags: [], page: "/models/whisper-turbo",
repo: "danielrosehill/Whisper-Hebrish", formats: [] },
] },
{ id: "text", name: "Small text model", mono: "Aa",
blurb: "Not a speech model, but code-switching needs it. It finds Hebrew written in Latin letters inside English text.",
variants: [
{ name: "Hebrew-Latin Token Classifier", base: "XLM-RoBERTa base", params: "277M", version: "v1 (2026-10-15)",
for: "Marks each romanized Hebrew word in an English sentence, so text-to-speech can send it to a Hebrew voice.",
result: "Span F1 0.941 on terms it never saw in training", size: "Transformers (safetensors)",
tags: ["Text"], page: "/models/token-classifier",
repo: "Hebrish/Hebrew-Latin-Token-Classifier", formats: [] },
] },
];
const esc = s => String(s).replace(/[&<>"]/g, c => ({ "&": "&", "<": "<", ">": ">", '"': """ }[c]));
const pips = n => "●".repeat(n) + `<span class="off">${"●".repeat(5 - n)}</span>`;
const tagClass = t => t === "Recommended" || t === "In the apps" ? "tag acc" : t.startsWith("Not in") ? "tag warn" : "tag";
function card(v) {
const meters = v.speed ? `<div class="meters"><span>Speed <span class="pips">${pips(v.speed)}</span></span><span>Accuracy <span class="pips">${pips(v.accuracy)}</span></span></div>` : "";
const fmts = v.formats.map(([label, repo]) => `<a href="${HF + repo}">${esc(label)}</a>`).join("");
return `<article class="card${v.rec ? " rec" : ""}" id="${esc(v.repo.split("/")[1])}">
<h3>${esc(v.name)}</h3>
${v.tags.length ? `<div class="tags">${v.tags.map(t => `<span class="${tagClass(t)}">${esc(t)}</span>`).join("")}</div>` : ""}
<p class="for">${esc(v.for)}</p>
<dl><dt>Base</dt><dd>${esc(v.base)}</dd><dt>Size</dt><dd>${esc(v.params)} params · ${esc(v.size)}</dd><dt>Version</dt><dd>${esc(v.version)}</dd><dt>Result</dt><dd>${esc(v.result)}</dd></dl>
${meters}
<div class="links"><a class="main" href="${HF + v.repo}">Weights on Hugging Face</a>${fmts}<a href="${SITE + v.page}">Model page</a></div>
</article>`;
}
document.getElementById("lines").innerHTML = LINES.map(l => `<section class="line" id="${l.id}">
<div class="line-head">${l.logo ? `<img src="${l.logo}" alt="">` : `<span class="mono">${esc(l.mono)}</span>`}<div><h2>${esc(l.name)}</h2><p>${esc(l.blurb)}</p></div></div>
<div class="grid">${l.variants.map(card).join("")}</div>
</section>`).join("");
// Speed-accuracy scale: labels alternate above and below the axis so neighbours don't collide.
const onScale = LINES.flatMap(l => l.variants).filter(v => v.gradient != null).sort((a, b) => a.gradient - b.gradient);
const scale = document.getElementById("scale");
onScale.forEach((v, i) => {
const x = 4 + v.gradient * 0.92; // keep end labels inside the box
const id = v.repo.split("/")[1];
scale.insertAdjacentHTML("beforeend", `<span class="dot" style="left:${x}%"></span><a class="lbl ${i % 2 ? "down" : "up"}" style="left:${x}%" href="#${esc(id)}">${esc(v.name)}</a>`);
});
document.getElementById("scale-list").innerHTML = onScale.map(v => `<li><a href="#${esc(v.repo.split("/")[1])}">${esc(v.name)}</a>: ${esc(v.for)}</li>`).join("");
</script>
</body>
</html>
|