A private, offline-first workstation for speech recognition and synthesis.
Turn one Linux or Windows machine into a private speech workstation: transcribe and diarize audio with word-level timestamps, manage voiceprints and hotwords, and synthesize or clone speech through a local Web UI or API.
After model setup, inference runs offline and task data stays on your machine.
简体中文 · Features · Quick Start · API · Documentation · Releases
Important
This is an independent, unofficial open-source project maintained on a non-commercial basis. It has not been authorized, sponsored, approved, or endorsed by CD PROJEKT RED, R. Talsorian Games, or any related rights holder. See the brand and project status notice.
Separate audio/video creation tabs share the ASR queue. Audio keeps its 4 GiB limit; video supports resumable uploads up to 25 GiB, editable presentation images with matching discussion, and illustrated PDF. Audio adds concise PDF while retaining detailed exports. See the video transcription guide.
Voiceprint libraries support groups, scoped ASR recognition and batch move/delete. Transcript downloads support default-on name/note redaction and up to 100 keyword replacements, with persistent browser preferences. ZIP v2 includes groups and imports remain compatible with v1. Upgrade backups cover only necessary data and must be removed after complete acceptance; see the upgrade guide.
Note
The Web UI supports Simplified Chinese and English. Use the language selector in the header or sign-in dialog; the choice is stored locally in the browser. The local Swagger API guide is also bilingual.
ASR provides New audio transcription, New video transcription, and Tasks & results tabs; TTS provides fixed Text, Document, and Tasks & results tabs. Inputs and settings have their own workspace, with direct access to the submitted task. Single audio, ordered sequences, and document sections share waveform playback and downloads.
Transcription results support entering speaker names and optional notes manually or choosing an existing voiceprint-library person to fill in both editable fields. Names are retained in full; notes allow up to 20 characters. Automatic voiceprint recognition and manual saves merge people with the same name and note within a task. Different notes stay separate, while segments, text and timestamps are preserved and exports are refreshed. Later voiceprint-library edits do not rewrite task snapshots. See the speaker editing contract and examples.
| Area | Capabilities |
|---|---|
| Local speech recognition | Qwen3-ASR 0.6B/1.7B, FSMN-VAD, CAM++ speaker diarization, sentence and word timestamps, concise PDF, and detailed JSON/SRT/VTT/TXT export |
| Speaker intelligence | Voiceprints distinguish namesakes by notes and support named, renameable samples; custom and voiceprint-derived hotword lists improve domain vocabulary while completed tasks retain immutable snapshots |
| Local voice studio | Qwen3-TTS 0.6B/1.7B, preset voices, one-off or library-based voice cloning with optional 3–30 second library reference ranges, 1.7B VoiceDesign, and WAV/FLAC/MP3 output |
| Document synthesis | EPUB, TXT, Markdown, text PDF, DOCX, XLSX and PPTX; structural/length previews, reusable imports with bulk removal, checkpoint recovery, and album-tagged ZIP / complete MP3 downloads |
| Durable task engine | Persistent SQLite queues, upload and inference progress, local ETA history, SSE updates, cancellation, retry, task history, and safe purge |
| Web UI and APIs | Bilingual local Web UI and Swagger guide, native asynchronous APIs, and OpenAI-compatible transcription and speech endpoints |
| Deployment-aware operation | Recommended full CPU/GPU profile plus an optional CPU-only profile; the UI and API expose only devices and model controls available in the active deployment |
- Local audio enhancement. One Audio enhancement switch defaults on and automatically applies background denoising and continuous quiet-speech gain where needed; switching it off uses the original audio. Advanced settings independently adjust speech gain (0–200%, default 100%) and GTCRN mix (0–100%, default 50%), with a reset to server defaults. Default processing is unchanged. Processing runs locally on CPU, preserves all speakers and bypasses clean, audible sections. Applied jobs offer original/enhanced playback and download. The API recommends the same combined control and retains independent fields for compatibility. See the enhancement contract.
- Local after setup. Model revisions are pinned and runtime loading is forced offline; inputs, results, voices, the database, and logs stay in project-controlled directories.
- Careful process isolation. ASR and TTS use separate, incompatible Python environments and reusable supervised executors. Cancellation reaches a terminal state only after the complete task process tree exits.
- Model-aware controls. The UI and API expose only controls supported by the selected Qwen checkpoint and voice mode instead of silently ignoring unsupported input.
- Turn multi-speaker meetings into named transcripts and subtitle files.
- Run a private local voice studio with preset voices, cloning, and 1.7B voice design.
- Add a durable speech backend to local tools through asynchronous or OpenAI-compatible APIs.
The recommended full profile is the default. The CPU-only profile is an explicit developer choice for machines where a smaller dependency footprint matters more than inference speed.
| Profile | Runtime and behavior | Disk guidance | Choose it when |
|---|---|---|---|
| Full — recommended | All models and features; CPU FP32 plus NVIDIA GPU BF16 runtimes; submissions default to GPU and can explicitly use CPU | About 43 GiB for pinned models, isolated runtimes, and installation caches; 55 GiB free minimum, 70 GiB recommended | You want the supported default and may use GPU acceleration |
| CPU-only — optional | The same ASR/TTS models and features without CUDA, NVIDIA, or Triton packages; CPU FP32; GPU controls are disabled and explicit GPU API requests return 503 |
Measured Linux core footprint—models plus project runtimes—is about 29 GiB; download/install caches and task data are additional; 40 GiB free minimum, 50 GiB recommended | You deliberately accept substantially slower inference to reduce dependency size |
| Item | Supported baseline |
|---|---|
| Operating systems | Ubuntu 22.04/24.04 x86_64; native Windows 11 x64 |
| NVIDIA GPU | Optional; nvidia-smi must work and the driver must support the pinned PyTorch CUDA runtime |
| GPU admission | 0.6B models: 3840 MiB total VRAM; 1.7B models: 7936 MiB total VRAM |
| Memory | 16 GB minimum for full setup; 32 GB recommended |
GPU admission uses total reported VRAM, not current free VRAM. Other GPU processes can still cause an out-of-memory failure. Explicit API requests for an unavailable GPU return 503 instead of silently switching to CPU; the Web UI explains the reason and selects CPU for that submission.
macOS and ARM are not validated. There is no official container image. Linux foreground mode can be used as an OCI container entrypoint, but the caller remains responsible for building the runtimes and models into the image or mounting them. Native Windows lifecycle behavior is covered by CI; real-model Windows GPU inference has not yet been validated.
The commands below install the recommended full profile. Install Git, curl, tar, Node.js 22.20+ (Node.js 24 LTS recommended), and Corepack. Python 3.12 and pinned project runtimes are installed inside the repository.
git clone https://github.com/wlf186/audio-intel.git
cd audio-intel
./service.sh doctor
./service.sh setup all
./service.sh start all
curl -fsS http://127.0.0.1:20810/api/v1/healthUse a short local NTFS path and Node.js 24 LTS:
git clone https://github.com/wlf186/audio-intel.git C:\ai\audio-intel
Set-Location C:\ai\audio-intel
.\service.cmd doctor
.\service.cmd setup all
.\service.cmd start all
Invoke-RestMethod http://127.0.0.1:20810/api/v1/healthOpen http://127.0.0.1:20810. The bilingual interactive API guide is served at http://127.0.0.1:20810/docs, and the machine-readable contract is at /openapi.json. Swagger assets and validation are hosted locally.
For persistent settings, copy .env.example to .env and edit it once. Both service entrypoints automatically load the project-root .env for lifecycle commands; exported environment variables take precedence. New terminals can run start all directly. Only .env is automatic; .env.local-deploy is an opt-in maintenance snapshot. Set AUDIO_INTEL_LOAD_ENV=0 in the calling environment to skip the file. Port 20810 is the default: use the actual address printed by start/status for custom ports or HTTPS. See the configuration rules.
Developers who choose the CPU-only profile use the same startup command after profile-specific setup:
./service.sh setup all --profile cpu
./service.sh start allOn native Windows, use .\service.cmd setup all --profile cpu followed by .\service.cmd start all.
The selected profile is stored under .runtime and reused by later setup/upgrade commands. To switch profiles, stop the service, drain or cancel nonterminal jobs, then run setup all --profile full|cpu.
Install or start only one pipeline when you do not need the complete model set:
./service.sh setup asr # or: tts / api
./service.sh start asr # or: tts / api
./service.sh status
./service.sh logs all
./service.sh stop allSee the Linux installation guide or native Windows guide for prerequisites, proxies, partial installations, foreground/container operation, and upgrades.
20810 (default) FastAPI + local React Web UI
│
├── SQLite WAL ASR queue ── ASR supervisor
│ └── reusable task executor
│ VAD → optional CPU enhancement + VAD union
│ ├── original audio → speaker diarization
│ └── recognition audio → Qwen3-ASR → forced alignment
│ └── PDF / JSON / SRT / VTT / TXT
│
└── SQLite WAL TTS queue ── TTS supervisor
└── reusable task executor
Qwen3-TTS preset / clone / VoiceDesign
└── WAV / FLAC / MP3
ASR, TTS, and the internal reference aligner use separate Python environments because Qwen ASR and Qwen TTS require incompatible Transformers versions. ASR and TTS GPU jobs share a project-local lock so only one large model occupies the GPU at a time. Used executors stay warm briefly for burst traffic and are recycled only after their same-kind queue remains empty and the old process tree has exited.
The default-on single-task acceleration increases internal batch sizes according to hardware and model size without changing model identity, precision, diarization semantics, ASR chunking, or the sequential TTS decoder. OOM retries step down to batch 1 inside the same task. See Architecture and capabilities for the full execution, cancellation, model, progress, and capability contracts.
Document TTS accepts up to 5 million characters and 2,000 sections by default. Preview and select sections, reuse existing voice controls, and resume from completed section checkpoints. Structural mode uses the character target only as a fallback; the reader offers original line breaks or continuous reading. Retained imports can be reused or removed in batches; see Document TTS for API examples, limits and streaming downloads.
Clone references default to at most the first 15 seconds. Library samples additionally support a waveform editor for a 3–30 second interval anywhere in the sample, with matching complete-word audio and transcript snapshots. See reference ranges.
TTS guards each internal text chunk against runaway generation and invalid waveforms, retrying only a failing chunk up to three additional times. Completed document sections remain reusable. This is bounded generation protection, not comprehensive pronunciation or listening-quality assessment; see behavior and limits.
The eight native asynchronous submission surfaces—ASR, video transcription, single-item TTS, ordered TTS sequences, clone-reference analysis, voiceprint sample upload, document import, and document TTS—require an 8–128 character Idempotency-Key. First acceptance returns 202; a same-request replay returns 200; reusing a key with different input returns 409. Sequence jobs load one model for up to 100 ordered items and return one WAV artifact per item; discover the exact limits at tts.sequence_jobs.
Service-side .env loading does not export settings back to your client shell. Before running examples, set AUDIO_INTEL_BASE_URL to the actual client-reachable URL (for example http://127.0.0.1:20815) and provide AUDIO_INTEL_API_KEY separately when authentication is enabled. The examples default to http://127.0.0.1:20810.
Minimal native ASR submission using the CPU path:
BASE_URL=${AUDIO_INTEL_BASE_URL:-http://127.0.0.1:20810}
ASR_KEY=$(python3 -c 'import uuid; print(uuid.uuid4())')
curl --fail-with-body -sS \
-H "Idempotency-Key: $ASR_KEY" \
-F file=@meeting.wav \
-F language=Auto \
-F diarize=true \
-F align=true \
-F compute_device=cpu \
"$BASE_URL/api/v1/asr/jobs"OpenAI-compatible synchronous transcription:
curl --fail-with-body -sS \
-F file=@meeting.wav \
-F model=qwen3-asr-0.6b \
-F compute_device=cpu \
-F response_format=verbose_json \
"$BASE_URL/v1/audio/transcriptions"Add Authorization: Bearer $AUDIO_INTEL_API_KEY when authentication is configured. Use the native asynchronous APIs for long tasks; they expose queue state, progress, ETA, ETag polling, and SSE. See the API guide for TTS, cloning, hotwords, voiceprints, cancellation, retries, artifacts, Range requests, and event reconciliation.
| Guide | Contents |
|---|---|
| Installation | Linux prerequisites, full and partial setup, proxy, directories, and service modes |
| Native Windows | Windows setup, lifecycle behavior, firewall, and troubleshooting |
| Document TTS | Import, segmentation, synthesis, API examples, and streaming downloads |
| Library transfer | Voiceprints and hotwords, full ZIP transfer, merge/replacement, pinyin sorting and A–Z index |
| Workspace layout | Resizable desktop panes, independent layout preferences, compact library and video reading |
| Speech enhancement | Offline denoising, quiet-speech gain, playback comparison, API controls and paired validation |
| API | Native asynchronous and OpenAI-compatible usage contracts |
| Architecture and capabilities | Pipelines, models, devices, acceleration, queues, progress, and cancellation |
| Local HTTPS | Project CA, certificate trust, SAN renewal, and fingerprint verification |
| Troubleshooting | GPU, models, uploads, queues, progress, and process cleanup |
| Upgrade | Data backup, schema compatibility, and upgrade steps |
| Dependency maintenance | Runtime separation, pins, locks, and security-audit notes |
| Contributing | Development setup, verification, and pull-request expectations |
| Brand and project status | Unofficial status, third-party rights, and the boundary of the Apache-2.0 grant |
Authentication is disabled by default for trusted local networks. Before exposing the service beyond a trusted machine or LAN, configure a strong AUDIO_INTEL_API_KEY and TLS:
AUDIO_INTEL_API_KEY='replace-with-a-long-random-value' ./service.sh start allBrowser login exchanges the key for an opaque HttpOnly same-origin session cookie; the raw key is not stored in browser storage or URLs. /api/v1/health remains a deliberately minimal public probe. Detailed system information, media, models, tasks, and results remain protected.
For microphone recording over a LAN IP, browsers usually require HTTPS. The project includes an offline, project-specific mkcert helper; follow the local HTTPS guide. Do not expose port 20810 directly to the public internet without authentication and trusted TLS.
Models, task inputs, generated outputs, the SQLite database, voices, voiceprints, caches, logs, and runtimes stay in project-local directories by default. Inputs and results persist until explicitly purged.
- Report reproducible bugs or request features through GitHub Issues.
- Read CONTRIBUTING.md before changing runtime boundaries, model loading, device routing, process supervision, or public APIs.
- Review Releases and the upgrade guide before updating an existing installation.
Project-owned code is licensed under the Apache License 2.0. Downloaded model weights are not included in the repository and remain subject to their upstream licenses; see third-party and model notices. The code license does not grant rights to third-party names or intellectual property; see the brand and project status notice.



