I dictate most of my emails now. The speech recognition gets the words right. What it hands back is one long block of text, which is why I trained a small model to put the paragraph breaks back in (Gemma 3 270M ASR Paragraph Breaks).
Hugging Face Model danielrosehill/Gemma-3-270M-ASR-Paragraph-Breaks Adds paragraph breaks to flat speech-to-text output and changes nothing else. Speech recognition (here, a Parakeet fine-tune) returns punctuated, cased text as one block; this model returns the same text with… Text generationGEMMAUpdated Oct 2026 View model on Hugging FaceParagraphs fix the structure. They don't fix the length. A dictated email to a contractor can run to 300 words when the actual point is one question and one date. If the recipient only reads two lines, I'd like them to be the right two.
So this is the next step: Gemma 3 270M Email Key-Line Bolding. It's a full fine-tune of Google's gemma-3-270m-it that puts the key parts of an email in Markdown bold (the requests, the purpose, the main points and the key facts) and changes nothing else. The test I annotated against is simple: someone who reads only the bold should know what the email is about and what is being asked of them.
It's a preliminary model. I'll get to the numbers, and they're modest.
What it does
The input is an email that has already been paragraphed. The output is the same email with ** around some runs of words. Usually that's a whole sentence. Sometimes it's a clause, when only part of the sentence is the point.
"Changes nothing else" is enforced, not hoped for. A 270M-parameter model will occasionally decide to tidy a sentence or drop a word, and a silent edit to someone's email is worse than no bold at all. So the output is checked: strip the ** and it has to match the input exactly. If it doesn't, the input comes back unbolded.
Here's an excerpt from one of the held-out test emails (synthetic, like all of the training data). Before:
We're going with the Halvorsen ProBook 14, the 32 gigabyte memory version with the 1 terabyte solid state drive. We need twelve units in total, for the design team, and I'd like them in the silver finish if that's still available. If silver is out, graphite is fine.
On the warranty, I'd like the three year on-site option rather than the standard one year. Our last batch had two failures in the first eight months, and the downtime was painful, so I'd rather pay the difference now.
For delivery, the target date is Thursday the 14th of March.
Could you send me a revised quote with those details, along with the invoice terms? I'm happy to approve it once I've seen the figures.
And what the model returned:
We're going with the Halvorsen ProBook 14, the 32 gigabyte memory version with the 1 terabyte solid state drive. We need twelve units in total, for the design team, and I'd like them in the silver finish if that's still available. If silver is out, graphite is fine.
On the warranty, I'd like the three year on-site option rather than the standard one year. Our last batch had two failures in the first eight months, and the downtime was painful, so I'd rather pay the difference now.
For delivery, the target date is Thursday the 14th of March.
Could you send me a revised quote with those details, along with the invoice terms? I'm happy to approve it once I've seen the figures.
The order, the delivery date and the ask are bold. The reasoning about past failures isn't (and neither is the warranty choice, which is arguably a key fact).
Where it could sit
I built it for my own dictation pipeline: speech to text, then paragraph breaks, then bolding. Both text models are 270M parameters, small enough to run on-device.
Two other uses occurred to me while building it.
Outbound mail written by AI agents. Agents that draft and send email tend to write a lot of it. Running the paragraph model and then this one over an agent's draft gives one post-processing step that makes the details easy to find.
Inbound mail. The same model can annotate the emails you receive. A mail client doesn't have to render the spans as bold; it could show them as highlights instead. That's a front-end decision. The model just marks the spans.
How I made it
The emails are synthetic: 342 dictated emails generated with Claude Haiku 5.5, written to 12 kinds of recipient (landlords, schools, clinics, contractors, clients, clubs and so on). They came out of the paragraph-breaks project, already paragraphed.
I hand-annotated 19 of them in an annotation Space I put together on Hugging Face. You drag across words to bold them, and the selection snaps to whole words. (The first version made you tick whole sentences from a list. I replaced it because I sometimes want only part of a sentence in bold.)
Nineteen emails isn't a training set, so I wrote the pattern up as rules. Bold the ask. Bold the purpose line, when there is one. Bold each point of a list, the decisive date, amount or problem, and any instruction or warning. Never bold the greeting: in none of the 19 did I bold anything in the opening paragraph.
Claude Sonnet 5.5, given those rules and my annotations as examples, then labelled the other 323. In 4-fold cross-validation against my 19, it scored a word F1 of 0.69. Haiku 5.5 scored 0.63 and Opus 5.5 also 0.69. I went with Sonnet because it bolds a little less than Opus, and over-bolding defeats the point.
The training set is 13 of my annotations plus the 323 silver labels. The other 6 of mine are held out for testing and were never shown to the labeller.
How well does it work?
On the 6 held-out emails, scored per word:
Precision 0.73, recall 0.54, F1 0.62.
0 of 6 fallbacks (outputs that changed the text and were rejected).
The untrained base model fell back on all 6.
Earlier runs scored F1 0.39 at 3 epochs, 0.54 at 6 epochs and 0.56 at 6 epochs with a higher learning rate (1e-4). The 10-epoch run that I published took 504 seconds on a Modal L4.
So it's precise but it under-bolds. It reliably catches the ask and the purpose line, and misses some of the listed points. Six test emails is a tiny test set, so treat every figure here as rough. And with one annotator (me) there's no telling how close 0.69 is to the ceiling for a task this subjective.
What's next
More hand annotations, mostly. The target is around 200, shortest emails first. F1 was still rising at 10 epochs, so longer training is the other obvious thing to try. Once there's more gold I'll re-run the labeller comparison too, since 19 emails is thin ground for that as well.
Try it
The demo Space:
Dataset (emails, my annotations, the silver labels and the exact train/test split): danielrosehill/Email-Key-Line-Bolding
The sibling model: Gemma 3 270M ASR Paragraph Breaks
Model page on my site: danielrosehill.com/ai/models/gemma-3-270m-email-key-line-bolding