---
license: other
license_name: stream-1-mini-license
license_link: LICENSE
language:
- en
base_model: Qwen/Qwen3-0.6B-Base
base_model_relation: finetune
pipeline_tag: text-generation
tags:
- qwen3
- dictation
- text-normalization
- text-generation
- gguf
---
# Stream-1 Mini by Whisperstream
Stream-1 Mini turns English dictation transcripts into clean Chat and Email
text on your own device. It is trained to remove fillers and accidental repeats,
add punctuation, and resolve spoken corrections while preserving your meaning
and voice. Email mode also formats dictated greetings, paragraphs and sign-offs.
This revision adds optional custom-vocabulary hints while retaining structural
dictation and numbered-list support. Use these prompts and weights together.
Candidates are spelling hints, not forced substitutions. Known cleanup and entity
errors remain; this revision does not establish zero regressions.
Pass in text from your speech recognizer. Stream-1 Mini returns the cleaned text.
| Specification | Value |
| --- | --- |
| Task | English dictation cleanup |
| Modes | Chat and Email |
| Base model | [Qwen3-0.6B-Base](https://huggingface.co/Qwen/Qwen3-0.6B-Base/tree/da87bfb608c14b7cf20ba1ce41287e8de496c0cd) |
| Parameters | 751,632,384, with separate input embeddings and output weights |
| Formats | Full-precision FP32 Safetensors, F16 GGUF and Q4_K_M GGUF |
| GGUF download | 484,215,648 bytes (about 484 MB) |
| Tested context | 4,096 tokens, with up to 512 output tokens |
| License | [Stream-1 Mini License](LICENSE), permitting commercial use with attribution |
## Structural dictation
The intended behavior is to convert in-place commands while preserving literal
content. These examples describe the policy, not additional measured tests:
| Dictation cue | Intended output |
| --- | --- |
| new line | One line break |
| new paragraph | A blank line |
| exclamation mark / exclamation point | `!` |
| Packing list. Bullet point socks. Bullet point charger. | A lead-in followed by two bullet items |
| First, passport. Second, charger. Third, jacket. | Three numbered items |
Keep phrases such as "a new line of products" and "Please turn the report into
bullet points" as dictated text. Spoken period, full stop, comma and question
mark conversion is outside this release's structural-command scope.
## Quickstart
Use Python 3, the
[Hugging Face CLI](https://huggingface.co/docs/huggingface_hub/guides/cli) (`hf`), and
[llama.cpp b10537](https://github.com/ggml-org/llama.cpp/releases/tag/b10537).
Download the model and its prompts into a local folder:
```shell
hf download whisperstream/stream-1-mini stream-1-mini-vocabulary-q4_k_m.gguf prompts.json chat_template.jinja vocabulary_contract.py --local-dir stream-1-mini
```
Start the CPU server. On Windows, the executable may be named `llama-server.exe`.
```shell
llama-server -m stream-1-mini/stream-1-mini-vocabulary-q4_k_m.gguf --host 127.0.0.1 --port 8080 -c 4096 -b 256 -t 6 -np 1 -ngl 0 --chat-template-file stream-1-mini/chat_template.jinja
```
Save this as `clean.py` beside the `stream-1-mini` folder. It sends one dictation
to the local server:
```python
import json
import sys
from pathlib import Path
from urllib.request import Request, urlopen
prompts = json.loads(Path("stream-1-mini/prompts.json").read_text(encoding="utf-8"))
sys.path.insert(0, str(Path("stream-1-mini").resolve()))
from vocabulary_contract import render_messages
vocabulary = [] # Optional relevant dictionary spellings, not the entire dictionary.
mode = "chat" # Use "email" for Email mode.
transcript = "um let's meet on tuesday no wednesday at three pm"
payload = {
"messages": render_messages(prompts[mode], transcript, vocabulary),
"temperature": 0,
"top_k": 1,
"top_p": 1,
"repeat_penalty": 1,
"max_tokens": 512,
"cache_prompt": True,
"chat_template_kwargs": {"enable_thinking": False},
}
request = Request(
"http://127.0.0.1:8080/v1/chat/completions",
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
)
with urlopen(request, timeout=120) as response:
choice = json.load(response)["choices"][0]
if choice["finish_reason"] != "stop":
raise RuntimeError("Cleanup did not finish. Keep the original transcript.")
print(choice["message"]["content"])
```
In another terminal, run `python clean.py` from that same folder. Change `mode`
to `"email"` and replace `transcript` to try Email mode. Keep each request limited
to its current transcript.
## Files
The full-precision distribution contains four FP32 Safetensors shards, their
index, tokenizer, configuration and chat template. It supports further
modification without starting from quantized weights. Those full-precision
weights are the retained source of the GGUF conversion; the evaluation below
applies specifically to Q4_K_M with the stated serving setup.
`stream-1-mini-f16.gguf` provides the 16-bit GGUF export for llama.cpp-compatible
runtimes. It contains 1,509,343,072 bytes (about 1.51 GB).
`stream-1-mini-vocabulary-q4_k_m.gguf` is the selected inference artifact. It contains
484,215,648 bytes; SHA256:
```text
32bef61bdbc98787ac278d96a2aad120a9fc61f588f1f0a4746441e9d6d89ae7
```
`prompts.json` contains the exact Chat and Email system prompts. Keep these
prompts and the supplied template together with the model. See `LICENSE`,
`LICENSE-APACHE-2.0`, and `NOTICE` for terms and attribution.
## Integration notes
> [!IMPORTANT]
> Use the chosen mode's system prompt and one user message containing only the
> current transcript, enclosed by `` and ``. An optional
> JSON `` block follows it; append the canonical spelling exception
> to the system prompt only when the block is nonempty. The supplied
> `vocabulary_contract.py` renders this exact contract (32 terms, 512 UTF-8 bytes). Render with
> the supplied plain ChatML template, add the assistant generation prefix and
> do not inject a thinking preamble or conversation history.
The full regression collection used llama.cpp b10537 on Vulkan. CPU app smoke
checks are separate runtime evidence. Use the evaluated greedy contract with
4,096-token context, batch size 256, one slot and one request at a time.
Decode greedily: temperature 0, top-k 1, top-p 1, repeat penalty 1, and at most
512 output tokens. Stop at the end-of-turn token. The training/export stop IDs
are 151643 and 151645; the GGUF end-of-turn ID is 151645.
Enable prefix caching and keep Chat and Email sessions separate. Reuse a prompt
prefix without adding earlier dictations to the current request. Reject
incomplete or invalid generations and retain the original transcript when
cleanup fails. Users should be able to inspect and recover the original text.
## Training and evaluation
This revision continues the published v2 model with a balanced cleanup,
structural/list and vocabulary mixture. The selected terminal checkpoint used
training seed 23 and 648 optimizer updates. Training data and internal transcripts
are not distributed. FP32 and F16 files retain the conversion source; evaluation
applies specifically to Q4_K_M with the fixed prompts, decoder and cache contract.
The selected candidate completed 3,409 registered requests, including all 1,600
historical C/D/E cleanup memberships, structure/list tests, vocabulary tests,
preservation controls and actual production chunk requests. These are observed
benchmark cases, with repeated memberships; they are not independent production
events or untouched confirmation.
Provisional delivered cleanup counts across those 1,600 memberships are 1,216
pass, 12 warning, 202 hard failure, 53 critical failure and 117 unresolved.
Unresolved judgments are not passes. Later focused feature review retained
substantial vocabulary gains as well as failures:
| Fresh positive-repair condition / 60 | Previous v2 pass / unresolved | This revision pass / unresolved |
| --- | ---: | ---: |
| Supplied vocabulary | 7 / 1 | 31 / 11 |
| Retrieved vocabulary | 13 / 2 | 30 / 9 |
These purposively difficult cases do not estimate production recovery rates.
Feature success requires the whole output, not just inclusion of a target name.
Supplied-list negative controls can worsen even where vocabulary repair improves.
Known critical regressions include deleting an independent reported account and
substituting a distractor entity for a protected ordinary phrase.
Twenty separate observed-case CPU app calls completed without transport failures,
timeouts or output caps. On the measured host, median request time was 0.97 s,
maximum 2.54 s and peak server working set about 0.96 GiB. These are runtime smoke
measurements, not quality qualification, whole-app RAM or microphone-to-insertion
latency. Three of six paired repeats differed byte-for-byte; one repeat reversed
an explicit host correction. Greedy settings and prefix reuse do not guarantee
identical outputs across cache histories.
Fresh untouched confirmation was waived for this publication. Remaining critical
errors and unresolved judgments are disclosed, not rescored as passes. No claim
of general non-regression, CPU/GPU equivalence or dependable laptop tail latency
is made. Verify consequential names, numbers, conditions and corrections.
## Limitations
> [!WARNING]
> The model can change meaning, retain an incorrect number after a correction,
> or infer the wrong numeric scale. Review names, numbers, restrictions and
> other consequential details before relying on cleaned text.
This release has not established support for code, arbitrary style controls,
multilingual cleanup or general question answering. Instructions within a
transcript should remain dictated content, except the supported in-place
structural dictation cues described above. The model has not been validated
for medical, legal or other high-stakes decisions. Smaller quantizations and
changed prompts may behave differently.
## License
> [!IMPORTANT]
> Personal and commercial use, modification and redistribution are permitted
> under the [Stream-1 Mini License](LICENSE), which combines Apache-2.0 terms
> with an identification requirement for **Stream-1 Mini by Whisperstream**.
> This is a custom license, not unmodified Apache-2.0. See the license for
> permitted attribution locations and treatment of modified versions.