Skip to content

Releases: VoxRT/LinnetTTS

LinnetTTS 0.1.1

Choose a tag to compare

@github-actions github-actions released this 04 Nov 10:31

[0.1.1] - 2026-11-04

Fixed

  • C API: every argument error sets the message of linnet_last_error; the header states where a voice's width is validated.
  • Linux examples: wav.h converts float to 16-bit PCM exactly like the runtime's synth example (round half away from zero),
    so the C examples reproduce the reference MD5 of the weights release on x86-64.
  • Android AudioTrackPlayer.drain() returned only at its deadline on devices whose playback head never reports the last frame;
    it now returns as soon as the head stops advancing.
  • PyTorch package: blank text, max_frames < 1, negative temp and a voice of the wrong width raise ValueError (same rules
    as the wheel); the wheel raises ValueError for negative threads.
  • Documentation after an outside-developer pass over every channel: how to depend on the Rust crate, soundfile in the
    Python snippets, seeds not portable between the wheel and the PyTorch package, fp32-only parity tolerances, rpath for
    hand-linked C programs, iOS device-build prerequisites and the Swift package tests' binary target, Android first-run
    notes, and an honest statement on cross-architecture output: bit-identical per platform, below 2e-3 across
    x86-64 / Apple / Android / Raspberry Pi (the reference MD5 holds on x86-64).
  • A stale prebuilt _native.abi3.so is no longer tracked in bindings/python/.

Model weights are published separately (release weights-vN, see README.md).

LinnetTTS 0.1.0

Choose a tag to compare

@make1986 make1986 released this 04 Nov 08:02

0.1.0 - 2026-11-04

First public release of LinnetTTS: lightweight on-device English text-to-speech (flow LM over a 25 Hz continuous-latent
codec with a Vocos-style decoder, ~41M parameters, 24 kHz, streaming).

Added

  • python/ — linnet_tts_torch, the reference model definition and inference in PyTorch (no training code). Bit-exact
    against the training-side reference vectors in tests/goldens/ref (tests/test_ref_goldens.py).
  • runtime/ — Rust runtime. linnet-ops: the kernels this model uses, scalar reference plus aarch64 NEON, x86_64 AVX2+FMA
    and WASM SIMD128 fast paths, selected at run time on x86_64. linnet-tts: loader for the linnet-tts/1 safetensors
    container (fp16 weight matrices, fp32 accumulation), SentencePiece tokenizer, streaming Session (one LM step = 80 ms =
    1920 samples; the chunks concatenate bit-for-bit to the offline result), C API (include/linnet_tts.h), and a persistent
    worker pool whose audio output is bit-identical for every thread count.
  • bindings/linux/ — C distribution linnet-tts-<version>-linux-{x86_64,aarch64}.tar.gz (.so, .a, header, examples).
  • bindings/python/ — wheel linnet-tts (import linnet_tts; abi3, CPython >= 3.9, NumPy in and out, GIL released).
  • bindings/android/ — AAR com.voxrt.linnet:linnet-tts (Kotlin API, JNI in Rust, arm64-v8a + x86_64, minSdk 24,
    AudioTrackPlayer) and a sample app (package registry publishing follows the first tagged release; see
    build/README.md).
  • bindings/ios/ — Swift package LinnetTTS over a static LinnetTTS.xcframework (ios-arm64, simulator arm64 + x86_64,
    macos-arm64 for host tests; iOS 15 / macOS 12), LinnetPlayer, a SwiftUI sample app and XCTests (package
    registry publishing follows the first tagged release; see build/README.md).
  • docs/ — model card, weight container format (linnet-tts/1), streaming contract. Golden vectors in tests/goldens/
    shared by the Python package and the Rust runtime.
  • build/ — set_version.sh (one version for every package), make_weights_release.sh (assembles and checks a weights
    release directory), git hooks; GitHub Actions workflows for CI and tagged releases.

Weights

  • linnet-en-35m v1 (fp16 runtime file, fp32 reference file, tokenizer, built-in voices) is published separately as the
    GitHub release weights-v1 with a Hugging Face mirror, under the Linnet Weights License (WEIGHTS_LICENSE.md).
    No weights are bundled in any package.

Known limitations

  • English only; other languages produce garbage.
  • No text normalisation inside the model: write numbers, dates, currencies and similar as words before synthesis.
  • A slight roughness is audible on headphones in some utterances.
  • Browser (WASM) and Node channels are deferred to a later release; the runtime keeps compiling for wasm32-unknown-unknown.
  • An int8 (W8A8) weight variant for weaker devices is planned as a separate weights file.

Model weights are published separately (release weights-vN, see README.md).

Linnet weights v1 (linnet-en-35m)

Choose a tag to compare

@make1986 make1986 released this 04 Nov 06:36

Linnet weights v1 (linnet-en-35m)

First release of the Linnet model weights: English on-device text-to-speech, 41.4 M parameters (flow LM 31.5 M + codec decoder 9.9 M),
24 kHz, streaming, container linnet-tts/1 (safetensors). Trained in October 2026 (LM step 800 000, EMA weights).

Files

file size purpose
linnet-en-35m-weights-v1.tar.gz 230 MB all files below with the directory layout; unpack into local/ and run sha256sum -c SHA256SUMS
linnet-en-35m.fp16.safetensors 83 MB runtime weights; load this with the Rust runtime and the bindings
linnet-en-35m.safetensors 166 MB fp32 reference weights for linnet_tts_torch and the golden tests
tokenizer.model 102 KB SentencePiece unigram, 6000 pieces
voices/linnet-en-f1.npy (attached as linnet-en-f1.npy) 15 KB built-in voice, female, American
voices/linnet-en-m1.npy (attached as linnet-en-m1.npy) 15 KB built-in voice, male, American
MANIFEST.json contents, metadata, reference synthesis md5
SHA256SUMS sha256sum -c SHA256SUMS
WEIGHTS_LICENSE.md, model-card.md license and model card

License: Linnet Weights License 1.0 (WEIGHTS_LICENSE.md), not an open-source license. Free, including commercially: running the
unmodified weights with the built-in voices inside your own products, on devices and on servers, shipping them as part of your product,
selling the audio you generate. A separate written license from VoxRT (help@voxrt.com) is required for creating or cloning voices
(including your own), fine-tuning or saving modified, quantised or converted copies of the weights, training any model with the weights
or their output, offering general-purpose text-to-speech to others as an API or service, and publishing the weights outside your product.
The license text governs; this summary does not. Products that use the weights show the notices in Section 8 of the license.

Built-in voices are synthetic (designed from text descriptions); they are not clones of real people.

Runtime: LinnetTTS v0.1.0 or later (https://github.com/VoxRT/LinnetTTS). The three files the runtime needs are the fp16 weights,
tokenizer.model and one voice file. Mirror: https://huggingface.co/VoxRT/linnet-en-35m.