Licences
The voice engine
Section titled “The voice engine”What we download, and the one piece we ship (macOS)
Section titled “What we download, and the one piece we ship (macOS)”On Linux and Windows the speech worker fetches all of these on first use
from the publishers’ own servers; on macOS the CrispASR runtime instead ships
INSIDE the signed, notarized app bundle (Contents/Frameworks, put there by
apps/desktop/scripts/build-macos-app.sh from the same pinned release asset,
re-signed with our identity) and only the models are fetched. The worker checks each download against a pinned sha256 BEFORE it unpacks or
loads it (apps/desktop/crates/etalk-crispasr: platform.rs, models.rs), keeps
only the named files, and re-hashes every library before dlopen. A
mismatch deletes the file and the voice backs off (1 min doubling to 1 h).
| what | version | licence | where from | platforms |
|---|---|---|---|---|
CrispASR runtime: libcrispasr + ggml (libggml*), plus libgomp (GCC Runtime Library Exception) and the reference BLAS on Linux |
v0.8.45 release assets | MIT (its THIRD_PARTY_NOTICES.txt lists the rest; built without espeak-ng, the only GPL component it knows) |
github.com/CrispStrobe/CrispASR releases | Linux x86_64 (CUDA) and Windows x86_64 (Vulkan): downloaded; macOS arm64 (Metal): shipped in the bundle |
NVIDIA CUDA runtime (libcudart.so.12) and cuBLAS (libcublas.so.12, libcublasLt.so.12) |
12.9.79 / 12.9.2.10 | NVIDIA CUDA Toolkit EULA (proprietary, redistributable); its text is kept beside the files | NVIDIA’s own wheels on PyPI (nvidia-cuda-runtime-cu12, nvidia-cublas-cu12) |
Linux x86_64 only |
| Qwen3-TTS 12 Hz 0.6B Base, F16 GGUF | cstr/qwen3-tts-0.6b-base-GGUF @ 94072f5 | Apache-2.0 | Hugging Face | all three |
| Qwen3-TTS 12 Hz tokenizer (codec), F16 GGUF | cstr/qwen3-tts-tokenizer-12hz-GGUF @ 344e279 | Apache-2.0 | Hugging Face | all three |
NEW-78: CrispASR CPU-only runtime (libcrispasr + ggml; on Linux with libgomp (GCC Runtime Library Exception), OpenBLAS (BSD-3-Clause), libgfortran (GCC Runtime Library Exception) and libquadmath (LGPL-2.1)) |
v0.8.45 release assets | MIT (+ the listed) | github.com/CrispStrobe/CrispASR releases | Linux x86_64 and Windows x86_64 without a GPU driver, for push to talk only |
NEW-78: GNU OpenMP runtime libgomp.so.1 (inside both Linux CrispASR archives, the CUDA and the CPU-only one; unmodified, from Ubuntu 22.04’s gcc-12) |
as built into CrispASR v0.8.45 | GPL-3.0-or-later WITH GCC-exception-3.1 (GCC Runtime Library Exception); corresponding source: apt-get source gcc-12, gcc.gnu.org, or the CrispASR maintainers (their THIRD_PARTY_NOTICES.txt) |
github.com/CrispStrobe/CrispASR releases | Linux x86_64 only |
| NEW-78: Parakeet TDT 0.6B v3 (NVIDIA), Q8_0 GGUF | cstr/parakeet-tdt-0.6b-v3-GGUF @ dff69b0 | CC BY 4.0 (attribution + “converted and quantised by cstr” in the notices) | Hugging Face | all three |
| NEW-78: Silero VAD v6.2, ggml | ggml-org/whisper-vad @ 9ffd54a | MIT | Hugging Face | all three |
Sizes of the first-use download: Linux ~2.97 GB (runtime 196 MB, cuBLAS 581 MB, model 1.83 GB, codec 358 MB), macOS ~2.19 GB (the models only; the bundle grows by ~25 MB), Windows ~2.28 GB.
On disk: Linux ~3.29 GB unpacked (runtime + cuBLAS 1.09 GB, models 2.19 GB, built-in clips 1 MB), macOS ~2.19 GB plus the ~25 MB in the bundle, Windows ~2.3 GB.
On disk: {data_dir}/talk/
Section titled “On disk: {data_dir}/talk/”| path | what | written by |
|---|---|---|
crispasr-0.8.45/ |
the runtime libraries, their licences, one .<artifact id>.sha256 manifest per artifact (Linux, Windows; macOS reads Contents/Frameworks of the bundle instead) |
etalk_crispasr::artifact::ensure |
crispasr-0.8.45-cpu/ |
NEW-78: the CPU-only runtime, where no GPU driver exists (Linux, Windows) | same |
models/ |
qwen3-tts-12hz-0.6b-base.gguf, qwen3-tts-tokenizer-12hz.gguf, NEW-78’s parakeet-tdt-0.6b-v3-q8_0.gguf (674 MB) and ggml-silero-v6.2.0.bin (0.9 MB), and their manifests |
same |
voices/ |
builtin-<language>.wav, the built-in clips written out for CrispASR (rewritten when they differ) |
etalk_engine::builtin::materialize |
no-gpu.txt |
the “this GPU and driver were too slow” verdict (fingerprint + time, 30 days) | the speech worker |
<artifact id>.part |
a download in progress (deleted on failure or after unpacking) | etalk_crispasr::artifact::download |
<file>.tmp |
a file being unpacked (renamed into place when complete) | etalk_crispasr::artifact::write_kept |
The NEW-53 kokoro-multi-lang-v1_0/ directory is deleted by the worker on
start. #NEW-63: the IDE deletes the whole {data_dir}/talk/ once an
account’s settings move its voice device away from this machine and no
account signed in here still names it ({data_dir}/voice-device-claims.json),
and sweeps leftover *.part / *.tmp files whenever the speech worker shuts
down; both wait on the worker’s lock (etalk::SpeechClient::remove_voice_data,
etalk::SpeechClient::remove_partial_downloads).
The built-in reference clips (apps/desktop/crates/etalk-engine/assets/, in the
binary, ~0.9 MB) are our own output of Qwen3-TTS 0.6B CustomVoice
(Apache-2.0), preset speaker ryan; no person’s voice is in them (see the
README there). A member’s own reference clip never leaves the voice device.
Determination (2026-10-26)
Section titled “Determination (2026-10-26)”Permitted, with attribution. MIT and Apache-2.0 allow use and
redistribution; on Linux and Windows we redistribute none of it (the user’s
machine fetches it), on macOS we redistribute the MIT CrispASR runtime inside
the bundle, and the desktop notices reproduce CrispASR’s licence and
third-party notices either way (“exponentialTalk’s voice runtime”). The NVIDIA libraries
are fetched by the user’s machine from NVIDIA’s distribution under NVIDIA’s
EULA, not shipped by Exponential. No GPL: CrispASR’s espeak-ng path is off in
these builds and its phonemizer is not used by Qwen3-TTS. On macOS library
validation stays ON (review of #1237, 2026-10-26): no
disable-library-validation entitlement; the bundled dylibs carry our
signature and are loaded by absolute path from the running bundle only.
CrispASR watermarks every synthesized clip (an inaudible AI-content mark, EU
AI Act Art. 50(2)); it stays on. NEW-78 (2026-10-26): Parakeet is CC BY 4.0,
which permits use with attribution and a note of changes: the notices name
NVIDIA, the licence, cstr’s GGUF conversion and Q8_0 quantisation; we change
nothing and redistribute nothing (the voice device fetches it). Silero and its
ggml conversion are MIT. The CPU-only runtime’s GCC runtime libraries are
fetched by the user’s machine with CrispASR’s notices, not shipped by us.
Re-check on every CrispASR or model bump:
the pins, the release’s notices, and that no GPL component entered the
prebuilt library.
Wake word models
Section titled “Wake word models”What we download
Section titled “What we download”A wake phrase with a model of its own (apps/desktop/crates/etalk-wakeword,
models.rs; the first is spezl’s Hey spezl, never Hey Claude) is heard by
openWakeWord’s pipeline instead of Parakeet. The speech worker fetches its
files the first time the phrase is asked for, sha256-pinned like the voice
models, into {data_dir}/talk/models/wakeword/; nothing is in the binary.
They run on tract (MIT OR Apache-2.0, linked, listed by the notice generator
with the other Rust crates): no ONNX Runtime is linked or downloaded.
| what | version | licence | where from |
|---|---|---|---|
openWakeWord melspectrogram.onnx (a fixed torch melspectrogram) |
v0.5.1 release asset (byte-identical to livekit-wakeword 0.1.3’s copy) | Apache-2.0 (openWakeWord’s code licence; livekit-wakeword redistributes the same file under Apache-2.0) | github.com/dscripka/openWakeWord releases |
openWakeWord embedding_model.onnx (Google’s speech_embedding, re-implemented) |
v0.5.1 release asset | Apache-2.0 (Google’s TF Hub module) | same |
hey_spezl.onnx, the phrase’s classifier |
ours, trained by crates/etalk-wakeword/train/train.sh |
Apache-2.0 (ours) | pinned in models.rs |
The tests and the CPU example also fetch livekit-wakeword 0.1.3’s crate
tarball (Apache-2.0) by sha256 for its hey_livekit.onnx and two WAVs; they
never ship.
Training data (what the classifier learnt from)
Section titled “Training data (what the classifier learnt from)”livekit-wakeword (Apache-2.0, pinned revision in train.sh) trains it from
Piper VITS samples only (the en-us-libritts-high checkpoint it publishes;
LibriTTS is CC BY 4.0), augmented with MUSAN noise (CC BY 4.0) and the MIT
environmental impulse responses (CC BY 4.0), and with openWakeWord’s
pre-computed ACAV100M speech features (~2,000 h) as negatives. No person’s
recorded voice is a positive sample.
Determination (2026-10-29)
Section titled “Determination (2026-10-29)”Permitted, with attribution (the desktop notices name openWakeWord, Google’s
speech embedding, livekit-wakeword and tract). We never ship openWakeWord’s
own PRE-TRAINED wake-word models: those are CC BY-NC-SA 4.0. The open point:
openWakeWord gives exactly the ACAV100M negatives as the reason its
pre-trained models are non-commercial (“datasets with unknown or restrictive
licensing”); livekit-wakeword trains on the same features and publishes its
hey_livekit model under Apache-2.0, and we follow it, but whether a
classifier is a derived work of its training data is untested. Re-check
before selling a model (spezl’s marketplace), and retrain without the
ACAV100M features if the answer changes.