Moravian AI is a small research group. We make existing models smaller and lighter on GPU memory, and measure them against the originals.

CzechVoice: Czech speech to text on the device

CzechVoice, Czech speech to text on the device, by Moravian AI

Czech speech to text on the device · weights free for non-commercial use

Whisper large-v3-turbo fine-tuned on Czech. It transcribes Czech more accurately than the open models we tried, and its 452 MiB 4-bit file runs offline on an ordinary phone: 6.9 seconds of speech in 2.7 seconds on a Pixel 9a, on the processor alone. The audio never leaves the device's memory.

Main results

Word error rate, lower is better; same segments and normalisation for every model
modelparliamentFLEURSnoisenumbers right
CzechVoice1.8 %7.3 %6.5 %99.3 %
NVIDIA Canary-1b-v27.5 %8.4 %22.4 %94.8 %
Whisper large-v3-turbo (our starting point)9.5 %11.4 %29.5 %96.5 %
NVIDIA Parakeet-TDT-0.6b-v310.3 %11.9 %25.8 %94.6 %

Parliament: ParCzech4Speech test split, 729 segments; FLEURS: Czech test set, 723 sentences; noise: the parliamentary segments with reverberation and crowd babble at 10 dB. Parliamentary speech is the training domain of CzechVoice, so FLEURS is the least favourable comparison.

Full results and details →

Licence of the weights: free for non-commercial use; commercial use: info@moravian.ai.

ThinCtx: language models with a small context memory

ThinCtx, language models with a small context memory, by moravian

Language models with a small context memory · PolyForm Small Business licence

ThinCtx-small: the quality of Qwen3.5 in a small GPU memory. Qwen3.5 0.8B, 2B and 4B, converted so that the GPU memory for the context stays small and grows about 15 to 20 times more slowly than the original's cache, with the weights stored at 5.4 to 6.4 bits per weight and the context kept compressed in system memory. At 128k tokens the 4B-small needs 4.0 GB of GPU memory instead of 12.0 GB for the original, and at 540k tokens 4.7 GB instead of 24.5 GB, so a 24 GB card runs contexts the original does not fit. The thinctx 1.0 runtime also shares the memory of a common system prompt across conversations. Full-precision versions are available too.

Memory per conversation, Qwen3.5-4B vs ThinCtx-Qwen3.5-4Boriginal: weights (GPU)original: KV cache (GPU)ThinCtx: weights (GPU)ThinCtx: context (GPU)ThinCtx: context (system RAM)0 GB5 GB10 GB15 GB20 GB25 GB30 GB128k tokensQwen3.512.0 GB GPUThinCtx8.9 GB GPU + 4.8 GB RAM--compress_context8.8 GB GPU + 1.9 GB RAMThinCtx-small4.0 GB GPU + 1.9 GB RAM540k tokensQwen3.524.5 GB GPUThinCtx9.6 GB GPU + 19.8 GB RAM--compress_context9.4 GB GPU + 7.8 GB RAMThinCtx-small4.7 GB GPU + 7.8 GB RAM
Memory per conversation on one RTX 3090 (thinctx 1.0.2): solid bars are weights, hatched bars the context's part on the GPU, light bars the context in system RAM. The original keeps its whole KV cache on the GPU; its weights are measured as vLLM loads them and its cache is computed from the model's shape. --compress_context runs the full-precision model with the compressed context store; ThinCtx-small also quantizes the weights.

Quickstart

curl -LsSf https://astral.sh/uv/install.sh | sh && source $HOME/.local/bin/env   # only if uv is missing
uv venv --managed-python --python 3.12 ~/thinctx && source ~/thinctx/bin/activate
uv pip install thinctx

thinctx serve moravianai/ThinCtx-Qwen3.5-2B-small --port 8000 --auth user:pass   # OpenAI-compatible server
thinctx chat  moravianai/ThinCtx-Qwen3.5-2B-small                          # chat in the terminal

In Python: thinctx.load("moravianai/ThinCtx-Qwen3.5-2B-small"). Linux x86_64 or Windows through WSL2, with an NVIDIA GPU; Triton needs gcc on the first start. On Windows: wsl --install -d Ubuntu-24.04 in an admin PowerShell, then the same steps in Ubuntu. Details on each model card.

Main results

Qwen3.5-4B and 2B against their ThinCtx conversions
model
Qwen3.5-4B, original97.086.245.1
ThinCtx-Qwen3.5-4B95.585.145.1
Qwen3.5-2B, original9568.542.6
ThinCtx-Qwen3.5-2B8970.442.5
Qwen3.5-2B against two common ways to cap context memory
439596.4
1566.9
376890.2
498996.6

Same items and settings for every row. Scores in %. BFCL: non-live categories. Distant tool calls: tool definitions far back in the context.

Full benchmarks and details →

Releases

namestatus
moravianai/ThinCtx-Qwen3.5-4B-smallopen download on Hugging Face
moravianai/ThinCtx-Qwen3.5-2B-smallopen download on Hugging Face
moravianai/ThinCtx-Qwen3.5-0.8B-smallopen download on Hugging Face; not recommended for tool calling
moravianai/ThinCtx-Qwen3.5-4Bopen download on Hugging Face
moravianai/ThinCtx-Qwen3.5-2Bopen download on Hugging Face
moravianai/ThinCtx-Qwen3.5-0.8Bopen download on Hugging Face; not recommended for tool calling
pip install thinctxruntime with an OpenAI-compatible server; 1.0 shares memory across conversations

Licence: PolyForm Small Business 1.0.0 (licensor Jan Rosecký): free for companies with fewer than 100 people and under USD 1 million revenue, and for anyone for personal non-commercial use, non-commercial research and education, and evaluation and testing. Production use by larger organisations needs a commercial licence: info@moravian.ai.

ThinEmbed: compressed query encoders

ThinEmbed, compressed query encoders by moravian

Compressed query encoders · open source, Apache-2.0

ThinEmbed compresses the query side of an embedding model into a small file that runs in the browser on WebGPU. The document index stays unchanged, and the query is encoded on the user's device. Code, runtime and released files are open source.

Quickstart

import { loadVqwClient } from 'https://moravian.ai/vqweb/vqweb.js';   // or: npm install @moravian/thinembed-vq

const client = await loadVqwClient(
  'https://huggingface.co/moravianai/ThinEmbed-Qwen3-Embedding-0.6B-vq/resolve/main/qwen3-0.6b-vq3.5d2-webfaq_q-vocfull.vqw');
const q = await client.embed('Kolik stojí parkování v centru Prahy?');   // Float32Array(1024)
// score = dot(q, d) against your Qwen/Qwen3-Embedding-0.6B document vectors

Needs WebGPU with shader-f16 (Chrome, Edge).

Main results

harrier-0.6b on SciFact, test split, 300 queries
query encoderfilenDCG@10p50 per query
harrier-0.6b, full precision (reference)1 143 MiB (fp16)0.7559–
Q3_K, llama.cpp format, wllama on WebGPU235.1 MiB0.7481444 ms
IQ2_M, llama.cpp format, wllama on WebGPU199.3 MiB0.7387508 ms
IQ2_XS, smallest llama.cpp format, native177.5 MiB0.7097–
ThinEmbed, 2.1 bits per weight, WebGPU119.5 MiB0.7375103 ms
ThinEmbed, 1.8 bits per weight, WebGPU105.3 MiB0.7109102 ms

nDCG@10 against the model's own fp32 document index. Browser rows: one idle laptop, Intel integrated GPU, headless Chrome. The ThinEmbed rows are the released files. –: not run in the browser. One device, one model, one corpus.

Full benchmarks and details →  ·  Browser demo

Releases

releasewhere
Code and reportGitHub: rosecky/embedding-quantization-public
thinembedPyPI: thinembed
@moravian/thinembed-vqnpm: @moravian/thinembed-vq
moravianai/ThinEmbed-harrier-0.6bThinEmbed-harrier-0.6b · ThinEmbed-harrier-0.6b-vq
moravianai/ThinEmbed-Qwen3-Embedding-0.6BThinEmbed-Qwen3-Embedding-0.6B · ThinEmbed-Qwen3-Embedding-0.6B-vq
moravianai/ThinEmbed-bge-m3ThinEmbed-bge-m3

Code Apache-2.0. Client files under their base model's licence (MIT or Apache-2.0).

Contact: info@moravian.ai