Skip to content

About

Offline-first ASR & TTS workstation powered by Qwen3: diarization, word-level timestamps, voiceprints, voice cloning, async/OpenAI-compatible APIs, and a local Web UI for Linux and Windows.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

131 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sandevistan Audio logo

Sandevistan Audio

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

Linux quality gates Native Windows smoke Latest release Offline after setup CPU and NVIDIA GPU Code license: Apache 2.0

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.

Interface preview

Sandevistan Audio local ASR workspace showing a speaker-separated transcript and export controls

Sandevistan Audio synthesis tasks with waveform playback and downloads Sandevistan Audio persistent ASR and TTS task history

Sandevistan Audio bilingual local Swagger API 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.

What it does

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

Why it is different

  • 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.

Typical uses

  • 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.

Compatibility and hardware

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.

Quick Start

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.

Ubuntu 22.04 / 24.04 x86_64

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/health

Native Windows 11 x64

Use 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/health

Open 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 all

On 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 all

See the Linux installation guide or native Windows guide for prerequisites, proxies, partial installations, foreground/container operation, and upgrades.

How it works

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.

API and integrations

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.

Documentation

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

Security and data ownership

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 all

Browser 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.

Support and contributing

  • 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.

License

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.

About

Offline-first ASR & TTS workstation powered by Qwen3: diarization, word-level timestamps, voiceprints, voice cloning, async/OpenAI-compatible APIs, and a local Web UI for Linux and Windows.

Topics

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages