The page at /models, as the client draws it: what is
pinned, what the transcribe.cpp catalogue proposes, the feed's rows the search reads, and the
controls that bring a candidate onto the machine and make it the one a role runs. The three
roles are the transcribing and cleanup models and the speaking model the speech-out half is
drawn from. One read of Subject::DictateModels fills all of it; a check
landing, the models finishing their load, and a download or activation landing are the updates
that move it. The benchmark section's own runs - the takes, the read-aloud set, the bundled
public slice, the one press that scores the picks and the speaking loop's own card - are on
the same read.
The page
the ordinary case, with the feed proposing one model - the candidate already installed here, so its control is the activation
dictation files live in ~/Library/Caches/forge-dictate · a download is checked against what its entry declares: the byte length always, and the sha256 a cleanup feed's blobs publish - the speech feed's files publish none, so those are checked by length and by the load
speaking files live in ~/Library/Caches/forge-tts · the model installs from the Hub, and the engine checks every file against the digest its entry declares before it loads it
Updates whether a better model is on the feed
update availablechecked 11:42 · catalogue v0.3.1
a check reads the catalogue the transcribe.cpp runtime publishes - every variant with its sizes, licences, and the speeds and error rates its maintainers measured - and compares it with the two models pinned here. It measures nothing on this machine.
Granite Speech 5.0 470M TurboCTCreplaces the transcribing model473M · Q4_K_M 279 MB · 388.8× vs 72.9× · FLEURS-en 4.61 vs 5.08 · Apache-2.0 · English only, offlineProposed because it beats the model in use on both of the feed's own measurements - fewer errors on its English test set, and a faster realtime factor on an m4-max. Taking it downloads it here if it is not already, and loads it as the transcribing model. Its licence is a fact on the row above rather than a filter: what runs here is this machine's own.
Find a model search the catalogue the runtime publishes
type a name, or pick a family below · the feed's whole catalogue is already here, so this reads nothing off the network
…
fastest on the feed:
·
·
Benchmark score a model on this machine's own recordings
fixtures · the last run scored 42 takes · 1 read-aloud recording
the read-aloud set · every recording is scored against the one passage on 6 known terms · a run over them reads term accuracy and word error, where the takes read agreement
the public corpus · a fixed LibriSpeech test-clean slice embedded in the binary with its transcripts, installed beside the models the first time a bench reads the public tier · the installer restores any clip whose bytes differ from the bundled slice before a bench scores it, and a machine with no recordings still has something to score
0:411 MB · sha 980227df · recorded 06:04:23
select the best models, and score them herethe feed's transcribing pick + the 3 most-downloaded cleanup candidates of 18up to 5 runs over your read-aloud set · about 528 MB to download · the last run over your read-aloud set took 2m 40s · a run already measured on that corpus is kept, not repeated
the transcribing model you run read best of the 2 scoredtranscribingthe feed's own pick, scored on your read-aloud set, 2 clips69.2× realtime · term accuracy 88% · WER 6.1% · 2 clips · 41s of audio
CeluneNorm-0.6B-v2.0-ctx2048 read better than the cleanup model you runcleanupbest of the 3 most-downloaded cleanup candidates, scored on your read-aloud set, 2 clips · 6 more candidates were not tried74.3× realtime · term accuracy 94% · WER 4.2% · 2 clips · 41s of audiowhat you run, s1-mini-f16.gguf: 69.2× realtime · term accuracy 88% · WER 6.1% · 2 clips · 41s of audioswitching downloads 396 MB again - the sweep took the file back when the verdict came in
score the speaking loopthe speaking model says each public transcript · the transcribing pair hears it back and the words are scored again · it scores the bundled public corpuslast run, model_quantized.onnx · measured 01:42: round-trip WER 1.9% · first audio 0.3s · 8.84× realtime · 437 MB peak · 32 clips
every run scored here5›
CeluneNorm-0.6B-v2.0-ctx2048.Q4_K_M.ggufthe read-aloud passagemeasured 06:0874.3× realtime · term accuracy 94% · WER 4.2% · 2 clips · 41s of audioahead of the model in use, which read 88% of the passage's terms at 69.2×
models a bench can run4›
cohere-transcribe-03-2026-Q4_K_M.gguftranscribingin use
CeluneNorm-0.6B-v2.0-ctx2048.Q4_K_M.ggufcleanup
The states it can be in
the two one-line states before a read lands: reading, and a refused subscription in the server's own words
Reading the models...
This forge would not answer for the models: no models on this forge
Both are the route's, not the body's: a page that drew the four sections here would read as an empty catalogue rather than as one that has not arrived, and a refusal is the server's answer rather than an address that is wrong.
the check line, in the states the feed can be in - not checked yet, checking, unreachable, and a state this client cannot read
not checked yetthe feed refreshes at the next boot, or when you check it
checking the catalogue
the catalogue could not be reachedgithub.com/handy-computer/transcribe.cpp answered 502; the last-known feed stands and nothing in use changed
the check state is one this client cannot readthis client is older than the forge serving it
A check in flight offers no second Check now: a second check is refused, and a control that reports nothing when pressed reads as broken. The unknown line is the boundary's own statement - the value was narrowed once where the read entered, never drawn as a fresh check.
dictation off: [dictate] enabled unset, so no dictation model is in use, nothing is proposed, and the catalogue has not been read at all · the speaking row still draws when [tts] is on
no model is in use
[dictate] enabled is not set in forge.toml, so no dictation models are loaded and a take has nothing to run through. Add it and restart forge.
not checked yetthe feed is read only with [dictate] enabled set
the feed is read only with [dictate] enabled set · switch it on and restart forge, and the catalogue loads here
The catalogue is loaded only for an enabled section, so the off forge's read answers no rows: a search box here would answer every query with "no entry matches", which reads as a feed that found nothing rather than one that was never fetched. The speaking role is [tts]'s own row, so it stays in use when that section is on even though dictation is off.
the speaking role's own view: the Hub's ONNX variants, each installed or run, and the voices the model in use carries
the speaking role installs hexgrad/Kokoro-82M from the Hugging Face Hub: one ONNX export and the style files for its named voices · the engine checks every digest before it loads them
kokoro-82m-fp32fp32 · 326 MB
kokoro-82m-fp16fp16 · 163 MB
kokoro-82m-int8int8 · 92 MBactive
54 voices come with the model · the default is af_heart, and the settings page sets the voice every reply renders in
The variants are the Hub's ONNX exports of one model; every install fetches the chosen model file and the voice set beside it. A switch builds the new engine before it swaps, so a load that fails leaves the previous one serving.
the pin mid-load: the chip carries the preflight state, and the download carries its fraction
A page open through a first download hears the models finish loading (dictate_availability) and reads again, so the chips do not stay on waiting until the next check.
the page's own state, under the header: a download in flight with its bar, a download that did not finish, an activation in flight, and a refused action in the core's words
downloading granite-speech-5.0-470m-turboctc-Q4_K_M.gguf38% · 106 MB of 279 MB
the download did not finishgranite-speech-5.0-470m-turboctc-Q4_K_M.gguf · granite-speech-5.0-470m-turboctc-Q4_K_M.gguf is 5 bytes, expected 6
loading granite-speech-5.0-470m-turboctc-Q4_K_M.gguftranscribing · dictation keeps running the current model until this one is up
[dictate] transcribe_model pins this model in forge.toml; remove the key to change it here
One download and one activation run at a time, so every install and activation control is disabled while either is out - a second press is not offered and then refused. The refusal is the core's own sentence, arriving as an error frame the connection answered the dispatch with.
a role forge.toml pins: the row names the key, the installed model draws as a state, and the download stays
A pinned role refuses the activation dispatch by name, so no row draws an activation control for it - a control that is always refused reads as broken. The download stays: a pinned role can still pull candidates down and bench them. The active model draws as a state, never as a control.
the benchmark's other states: off, the read-aloud set empty, a set this client cannot read, a recording in flight, a sweep running, the consensus note with benchmark again, a sweep that ended on a corpus move, a speaking loop running and failed, and a run that did not finish with its close
the bench runs only with [dictate] enabled set · it scores a model on the takes forge has recorded here
the read-aloud set is not recorded yetRead the passage below aloud once and save the recording · a bench over the takes compares two models' words, and this is the one corpus a bench can score on words that are known:I want the forge session to pick up where it left off.
the read-aloud set is one this client cannot read · this client is older than the forge serving it
recording the passage0:06 · 300 framesRead the passage below aloud - the recording becomes the read-aloud set, the one corpus a bench can score on words that are known.I want the forge session to pick up where it left off.
scoring CeluneNorm-0.6B-v2.0-ctx2048.Q4_K_M.ggufyour own takes · 5 runseach run loads one model and scores it on the same corpus · what the sweep downloaded and nobody kept goes back off the disk when the verdict is in
scored on your takes, where a run reads as agreement with the words the model in use recorded beside each one, not as correctness · record the read-aloud passage above and press again to score against known words
a take landed while the sweep ran, so its runs no longer share one corpus - press again to score on what is here now
scoring the speaking loopclip 3 of 12 · spoken, heard back and scoredthe speaking model says each public transcript · the transcribing pair hears it back and the words are scored again · it scores the bundled public corpus
the speaking bench did not finishthe model would not loadthe speaking model says each public transcript · the transcribing pair hears it back and the words are scored again · it scores the bundled public corpus
the bench did not finishCeluneNorm-0.6B-v2.0-ctx2048.Q4_K_M.gguf · the model would not load
The recording card is the passage itself, so the empty, running and recorded states share one edge; the meter is this side's own levels, one bar per frame reading. A set this client cannot read draws no record control over it - the offer would make a second set on a machine that may hold many. The failed run carries its own close: a reader who has read it puts it away, and a NEW failure draws rather than hiding behind that dismissal. The note over the failed card is a sweep that ended by name, not a failure.
a search that matches a family, and one that matches nothing
size, speed and error are the catalogue's own m4-max measurements
no entry matches wav2vec · try a family name
The search is the client's and follows the box: the whole feed arrives with the read, so a query filters what is here and nothing is asked of the server. Each row is a link to the entry's own document, in the tree the server fetches from, with its marker drawn at rest - and its control beside the link, never inside it. Nothing is filtered out for the reader - a non-commercial variant is listed and proposed like any other, with its licence drawn on the row, because what runs here is this machine's own.