Browser-based recording and review studio for TTS and ASR speech datasets. Built for dialect speakers, emotion-aware voice models, and anyone who needs clean, reviewed training data from spontaneous speech.
Supports German and English UI. Runs fully local — no cloud, no external APIs required.
Recording
- Records audio directly in the browser
- Dialog mode: a local LLM (Voxtral) generates a prompt, Piper speaks it aloud, you respond — only your microphone is recorded
- Splits speech into sentence-like segments via the space bar
- Runs local ASR (Voxtral) on each segment
Free Recording
- Dedicated tab for uninterrupted free speech — no space bar required
- Record as long as you like, then stop; silence detection automatically splits the audio into segments
- Adjustable minimum silence threshold (default 700 ms)
- Transcribe all segments with one click, review and edit inline, save directly to any dataset profile
Emotion Recording
- Kokoro-compatible emotion labels:
neutral,happy,angry,surprised,sad,whispering,question - Emotion-actor mode: when a target emotion is set, Piper actively triggers that emotion — tells a bad joke for
happy, says something provocative forangry, whispers a secret forwhispering, and so on - Designed to capture natural, authentic emotional reactions rather than acted speech
Review
- Manually review, edit, and approve transcripts
- Stores approved items into automatic duration buckets
- Tracks progress toward TTS and ASR collection goals
- Flags duplicate and near-duplicate sentence families
Dataset Management
- Named dataset profiles with per-dataset emotion, dialect, and task labels
- Export-ready manifest format (JSON Lines) with full metadata per segment
Standard TTS training data tools assume clean studio recordings of read sentences. That fails for:
- Dialect speakers — reading written sentences triggers code-switching to standard language
- Emotion datasets — acted emotions sound unnatural; prompt-triggered reactions sound real
- Spontaneous speech — informal sentence structure, natural pauses, authentic prosody
Sprachwerker solves this by prompting the speaker with a topic or situation, letting them speak freely, then transcribing and reviewing the result.
Approved data is stored under:
output/_sprachwerker/<language>/<dataset-bucket>/
Each saved item produces:
- audio file
- text file
- manifest entry in
_review_manifest.jsonl
The manifest format is documented in docs/manifest-schema.md.
Saved segments are automatically routed by audio duration into:
-kurz-mittel-lang-sehr-lang
Prerequisites:
- Docker with Compose support
- ROCm host or CUDA host, depending on backend
Quickstart:
cp .env.example .envFor ROCm, the defaults in .env.example already point to ROCm builder/runtime images.
Start with ROCm:
docker compose -f docker-compose.yml -f docker-compose.rocm.yml up --build -dStart with CUDA:
docker compose -f docker-compose.yml -f docker-compose.cuda.yml up --build -dThen open:
- UI:
http://127.0.0.1:8095/ - Health:
http://127.0.0.1:8095/health
For a step-by-step first start including verification and troubleshooting, see docs/first-start.md.
The stack now bootstraps both llama.cpp and Voxtral automatically before asr-api starts.
Bootstrap services:
llama-buildermodel-fetcher
What they do:
llama-builderclones and buildsllama.cppmodel-fetcherdownloads the required Voxtral GGUF files if they are missing
The results are stored in named Docker volumes:
llama-binllama-srcvoxtral-models
This means the project no longer depends on a prebuilt host llama.cpp folder or a manually populated host model folder.
Main variables:
LLAMA_BACKENDASR_BASE_IMAGELLAMA_BUILDER_BASE_IMAGELLAMA_REPOLLAMA_REFLLAMA_FORCE_REBUILDAMDGPU_TARGETSCUDA_DOCKER_ARCHLLAMA_CMAKE_EXTRA_ARGS
Typical values:
ROCm:
LLAMA_BACKEND=rocmASR_BASE_IMAGE=rocm/dev-ubuntu-22.04:6.3.4-completeLLAMA_BUILDER_BASE_IMAGE=rocm/dev-ubuntu-22.04:6.3.4-complete
CUDA:
LLAMA_BACKEND=cudaASR_BASE_IMAGE=nvidia/cuda:12.4.1-runtime-ubuntu22.04LLAMA_BUILDER_BASE_IMAGE=nvidia/cuda:12.4.1-devel-ubuntu22.04
CPU:
LLAMA_BACKEND=cpuASR_BASE_IMAGE=ubuntu:22.04LLAMA_BUILDER_BASE_IMAGE=ubuntu:22.04
Default model source:
bartowski/mistralai_Voxtral-Small-24B-2507-GGUFmistralai_Voxtral-Small-24B-2507-Q4_K_M.ggufmmproj-mistralai_Voxtral-Small-24B-2507-f16.gguf
Relevant variables:
HF_TOKENoptional for public repos, required for gated reposVOXTRAL_HF_REPOVOXTRAL_MODEL_FILENAMEVOXTRAL_MMPROJ_FILENAME
Dialog mode variables:
PIPER_URLPIPER_DEFAULT_VOICEVOXTRAL_TEXT_CLI_PATHVOXTRAL_PROMPT_MAX_TOKENSVOXTRAL_PROMPT_TIMEOUT_SECONDS
The default docker compose stack now starts a local Piper service automatically.
It installs de_DE-thorsten-high directly inside the Piper image during Docker build, so Sprachwerker no longer depends on an external Piper stack or a host-mounted voices folder.
Important variables:
CONTAINER_NAMEPORTAPP_TITLEDIALECT_NAMEUI_DEFAULT_LANGSOURCE_LANGUAGE_CODEAPP_REGION_GROUPSOURCE_TEXT_LABELTARGET_TEXT_LABELDEFAULT_TASK_MODEDEFAULT_SPEAKER_PROFILEDEFAULT_DIALECT_LABELDEFAULT_EMOTION_LABELTTS_TARGET_HOURSASR_TARGET_HOURSTRANSLATION_ENABLEDOUTPUT_HOST_DIRREVIEW_SUBDIR
ASR backend variables are also listed in .env.example.
APP_REGION_GROUP can be set to germany or other. If UI_DEFAULT_LANG is left empty, the UI language falls back to German for germany and English for other.
Reviewed dataset items are stored as JSON Lines in _review_manifest.jsonl, with one object per approved segment.
- Human-readable field documentation:
docs/manifest-schema.md - Machine-readable schema:
schemas/review_manifest.schema.json
- Bootstrap and backend setup: docs/bootstrap-and-backends.md
- First start and live bootstrap checks: docs/first-start.md
- Dialog mode and prompt flow: docs/dialog-mode.md
- Free recording mode: docs/free-recording.md
Before publishing or sharing:
- do not commit
output/ - do not commit private recordings or reviewed datasets
- do not commit local binary blobs unless their redistribution is clearly allowed
- keep model paths and local infrastructure configurable
The repository includes a .gitignore for the most obvious local artifacts, but you should still review the worktree before any public push.
GNU Affero General Public License v3 — see LICENSE.
If you run a modified version as a network service, you must make the source available to users of that service (AGPL §13).
