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.

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
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,216,768 bytes (about 484 MB)
Tested context 4,096 tokens, with up to 512 output tokens
License Stream-1 Mini License, permitting commercial use with attribution

Examples

These newly authored synthetic examples show raw outputs from the Q4_K_M model using the included prompts. They illustrate usage and are not an accuracy benchmark.

Chat input

um let's meet on tuesday no wednesday at three pm

Chat output

Let's meet on Wednesday at 3 p.m.

Email input

hi alex um thanks for sending the draft i'll review it tomorrow

Email output

Hi Alex,

Thanks for sending the draft. I'll review it tomorrow.

Quickstart

Use Python 3, the Hugging Face CLI (hf), and llama.cpp b10537. Download the model and its prompts into a local folder:

hf download whisperstream/stream-1-mini stream-1-mini-q4_k_m.gguf prompts.json chat_template.jinja --local-dir stream-1-mini

Start the CPU server. On Windows, the executable may be named llama-server.exe.

llama-server -m stream-1-mini/stream-1-mini-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:

import json
from pathlib import Path
from urllib.request import Request, urlopen

prompts = json.loads(Path("stream-1-mini/prompts.json").read_text(encoding="utf-8"))
mode = "chat"  # Use "email" for Email mode.
transcript = "um let's meet on tuesday no wednesday at three pm"

payload = {
    "messages": [
        {"role": "system", "content": prompts[mode]},
        {"role": "user", "content": f"<TRANSCRIPT>{transcript}</TRANSCRIPT>"},
    ],
    "temperature": 0,
    "top_k": 1,
    "top_p": 1,
    "repeat_penalty": 1,
    "max_tokens": 512,
    "cache_prompt": True,
}
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,344,192 bytes (about 1.51 GB).

stream-1-mini-q4_k_m.gguf is the selected inference artifact. It contains 484,216,768 bytes; SHA256:

ec447cdd8dbbcdedca8fe0722db662835a9c6d8b7b9fec6ffd359d057e709910

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

Use the chosen mode's system prompt and one user message containing only the current transcript, enclosed by <TRANSCRIPT> and </TRANSCRIPT>. Render with the supplied plain ChatML template, add the assistant generation prefix and do not inject a thinking preamble or conversation history.

The evaluated configuration used llama.cpp b10537 on CPU, six threads, 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

Stream-1 Mini was fine-tuned from fresh Qwen3-0.6B-Base using LoRA. The training file contained 6,144 weighted entries representing 4,964 distinct example IDs. The corpus combines synthetic examples and owner-provided material, with model-assisted authoring, labeling and subsequent review. Training data is not included in this release.

On an internal 200-case challenge set, the selected Q4 configuration had 169 passes, 28 warnings, one hard cleanup failure and two critical meaning failures after application guards and owner adjudication. These are results for the tested pipeline, not unguarded model accuracy or estimated production error rates. The model was selected after reviewing these results; this is not an independent, untouched test of the final selection.

In that native harness, median request time was 839 ms and p95 was 1,840 ms, with prefix reuse observed on 198 of 200 requests. These measurements exclude model startup, speech recognition, app routing and text insertion. They are specific to the test environment and do not promise performance on other hardware.

Limitations

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. The model has not been validated for medical, legal or other high-stakes decisions. Smaller quantizations and changed prompts may behave differently.

License

Personal and commercial use, modification and redistribution are permitted under the Stream-1 Mini 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.

Downloads last month
32
Safetensors
Model size
0.8B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for whisperstream/stream-1-mini

Finetuned
(735)
this model