Saraswati
Saraswati turns voice memos into searchable notes on my own server. It transcribes audio locally, stores the results in SQLite, and can run configurable LLM steps for summaries or structured JSON.
View on GitHubAbout the Project
Saraswati runs the complete note pipeline on a self-hosted server: audio is transcribed locally, the result is stored in SQLite, and optional LLM stages can create summaries or structured JSON. The replica below uses canned samples and contacts no server.
Demo:
A self-contained replica of the Saraswati UI. Everything runs in this page: no audio is uploaded, no server is contacted, and the transcripts and model outputs below are canned samples. The controls behave like the real app so you can see how the pipeline is configured and what it produces.
Pipeline Control
Manually wake the horizontal pipeline. Processes pending, in-progress, and due retry files through ASR and the LLM stages of the active preset.
- Click Trigger Pipeline to run the sample files through ASR and the LLM stages.
- Watch progress update live under Queues and File Status below.
- Open the Entries tab when it finishes to browse the generated results.
- Change the preset under Settings and run again to get different outputs.
Upload Audio
In the real app this accepts audio and video files or whole folders, hashes each one to skip duplicates, and drains the queue automatically. Here the two sample files are already queued, so the picker is decorative.
Drag and drop files or folders here, or:
Queues
One file occupies the pipeline at a time; the rest wait in FIFO order. The real app pushes these updates over server-sent events, which is why there is no polling interval.
File Status
Every file carries a status and the stage it is currently in. Once a row reaches done you can click it to jump straight to its entry.
Processed Entries
One entry per transcribed file. Expand a row for the full transcription, the output of every LLM stage, the stage timeline, and the run history. The kind filter narrows the results to a single stage type.
No entries yet.
Four sections, collapsed by default. The dropdowns are live: switching the ASR backend, the LLM model, or the active preset updates the rest of this demo, including what the pipeline on the Files tab produces. Text fields and destructive actions stay read-only.
Which engine turns audio into text, on which device, and how aggressively silence is trimmed. Changes apply to the next transcription; changing device, model, or compute type reloads the model.
faster-whisper, or NVIDIA Nemotron streaming ASR.
auto picks CUDA when a GPU is available.
Off means files wait for a manual trigger.
Whisper
Bigger is more accurate and slower. .en variants are English-only.
The real app takes any ISO code as free text.
Quantisation. int8 fits on CPU, float16 needs a GPU.
Beam search width.
Skips silence before decoding.
Carries context across segments; can amplify loops.
ffmpeg loudness normalisation before ASR.
Nemotron
Any Hugging Face model id; loaded through transformers.
auto strips the locale tag and lets the model decide.
0 disables streaming chunks.
One OpenAI-compatible server serves every LLM step. The model list is fetched from /v1/models on the configured server; here it is a canned response. Changes apply to future runs only, because each run freezes its own configuration snapshot.
The active preset defines the ordered LLM chain that runs after ASR. Membership edits publish a new immutable revision so runs already in flight keep their frozen definition. Pick a different preset and activate it, then run the pipeline on the Files tab to see the outputs change.
Builtin presets are read-only. Clone to create an editable custom copy.
Membership (ordered steps)
Each row is one occurrence of a reusable prompt step. The input source dropdown binds it to the transcription, to the previous step's output, or to an earlier slot.
The shared library that preset membership points at. Select a step to inspect its prompts and decoding parameters. Editing a custom step publishes a new revision for every preset containing it, and those updates apply to future runs only. Builtin steps are read-only.