tatujan/MimiCodec

Rust implementation of Mimi audio codec from Kyutai/moshi

Rust

1

6 commits

updated Jul 19, 2026

See the code

README

Mimi Codec

Standalone Rust implementation of the Mimi streaming neural audio codec, extracted from the Moshi monorepo. Includes a native Candle backend, ONNX Runtime backend, JNI bridge for Android, and Python bindings.

24 kHz mono audio, 12.5 Hz frame rate, configurable 1–32 codebooks.

Crates

CrateDescription
mimi-coreCandle-based codec: SEANet encoder/decoder, transformer, RVQ
mimi-onnxONNX Runtime backend with streaming state management
mimi-cliCLI tool for encode/decode/roundtrip
mimi-jniJNI bridge for Android (used by MimiDemo)
mimi-pyo3Python bindings via PyO3

ONNX Streaming Models

Pre-exported streaming ONNX models are available on Hugging Face: BMekiker/mimi-onnx-streaming

VariantEncoderDecoderTotalBitratePrecision
8 codebooks194 MB170 MB364 MB~1.1 kbpsFP32
16 codebooks242 MB186 MB428 MB~2.2 kbpsFP32
8 codebooks (fp16)119 MB93 MB212 MB~1.1 kbpsFP16 weights
16 codebooks (fp16)167 MB109 MB276 MB~2.2 kbpsFP16 weights

The FP16 variants store weights as float16 (~40% smaller) while keeping float32 graph I/O. Computation runs in float32 at runtime — no quality loss, drop-in replacement.

Exporting ONNX models

pip install torch transformers onnx onnxruntime

# Export FP32 models
python scripts/export_streaming_onnx.py --num-codebooks 8 --output-dir onnx-models/streaming-8cb
python scripts/export_streaming_onnx.py --num-codebooks 16 --output-dir onnx-models/streaming-16cb

# Convert to weight-only FP16
python scripts/weight_fp16.py --input-dir onnx-models/streaming-8cb --output-dir onnx-models/streaming-8cb-fp16
python scripts/weight_fp16.py --input-dir onnx-models/streaming-16cb --output-dir onnx-models/streaming-16cb-fp16

The exported models accept any chunk size that is a multiple of 80ms (1920 samples) at runtime — the chunk size is not baked into the graph.

CLI Usage

# Build
cargo build --release -p mimi-cli

# Roundtrip (encode + decode)
mimi-cli roundtrip --input test.wav --output out.wav --num-codebooks 8

# ONNX backend
mimi-cli roundtrip --input test.wav --output out.wav \
  --backend onnx \
  --encoder-model onnx-models/streaming-8cb/encoder_model.onnx \
  --decoder-model onnx-models/streaming-8cb/decoder_model.onnx \
  --num-codebooks 8 --streaming

Building for Android

mimi-jni uses a vendored, lightly-patched copy of candle-core (see candle-core-patched/) via a [patch.crates-io] entry in mimi-jni/Cargo.toml. The patch is candle-core 0.9.2 plus runtime ARM dotprod (SDOT) detection, which makes quantized (GGUF) int8 inference ~3× faster on ARMv8.2+ devices while still falling back to the plain NEON path on older ARMv8.0 hardware. No extra setup is required — the crate is checked into this repo.

cargo install cargo-ndk

cd mimi-jni
cargo ndk -t arm64-v8a -P 24 build --release --features onnx

# Copy .so to the Android project
cp target/aarch64-linux-android/release/libmimi_jni.so \
   ../MimiDemo/app/src/main/jniLibs/arm64-v8a/

Scripts

ScriptDescription
export_streaming_onnx.pyExport PyTorch Mimi to streaming ONNX with causal attention masking
weight_fp16.pyConvert FP32 ONNX models to weight-only FP16 (~40% smaller, no quality loss)
export_onnx.pyExport batch (non-streaming) ONNX models
compare_backends.pyNumerical comparison between PyTorch, ONNX batch, and ONNX streaming
convert_to_gguf.pyConvert safetensors to GGUF (Q4_0, Q8_0)

License

This project contains code derived from Moshi by Kyutai.

  • Code: MIT License — see LICENSE
  • Model weights (Mimi codec): CC-BY 4.0 by Kyutai

Contributors

tatujan

6 commits

tatujan/MimiCodec

Rust implementation of Mimi audio codec from Kyutai/moshi

Rust

1

6 commits

updated Jul 19, 2026

See the code

README

Mimi Codec

Standalone Rust implementation of the Mimi streaming neural audio codec, extracted from the Moshi monorepo. Includes a native Candle backend, ONNX Runtime backend, JNI bridge for Android, and Python bindings.

24 kHz mono audio, 12.5 Hz frame rate, configurable 1–32 codebooks.

Crates

CrateDescription
mimi-coreCandle-based codec: SEANet encoder/decoder, transformer, RVQ
mimi-onnxONNX Runtime backend with streaming state management
mimi-cliCLI tool for encode/decode/roundtrip
mimi-jniJNI bridge for Android (used by MimiDemo)
mimi-pyo3Python bindings via PyO3

ONNX Streaming Models

Pre-exported streaming ONNX models are available on Hugging Face: BMekiker/mimi-onnx-streaming

VariantEncoderDecoderTotalBitratePrecision
8 codebooks194 MB170 MB364 MB~1.1 kbpsFP32
16 codebooks242 MB186 MB428 MB~2.2 kbpsFP32
8 codebooks (fp16)119 MB93 MB212 MB~1.1 kbpsFP16 weights
16 codebooks (fp16)167 MB109 MB276 MB~2.2 kbpsFP16 weights

The FP16 variants store weights as float16 (~40% smaller) while keeping float32 graph I/O. Computation runs in float32 at runtime — no quality loss, drop-in replacement.

Exporting ONNX models

pip install torch transformers onnx onnxruntime

# Export FP32 models
python scripts/export_streaming_onnx.py --num-codebooks 8 --output-dir onnx-models/streaming-8cb
python scripts/export_streaming_onnx.py --num-codebooks 16 --output-dir onnx-models/streaming-16cb

# Convert to weight-only FP16
python scripts/weight_fp16.py --input-dir onnx-models/streaming-8cb --output-dir onnx-models/streaming-8cb-fp16
python scripts/weight_fp16.py --input-dir onnx-models/streaming-16cb --output-dir onnx-models/streaming-16cb-fp16

The exported models accept any chunk size that is a multiple of 80ms (1920 samples) at runtime — the chunk size is not baked into the graph.

CLI Usage

# Build
cargo build --release -p mimi-cli

# Roundtrip (encode + decode)
mimi-cli roundtrip --input test.wav --output out.wav --num-codebooks 8

# ONNX backend
mimi-cli roundtrip --input test.wav --output out.wav \
  --backend onnx \
  --encoder-model onnx-models/streaming-8cb/encoder_model.onnx \
  --decoder-model onnx-models/streaming-8cb/decoder_model.onnx \
  --num-codebooks 8 --streaming

Building for Android

mimi-jni uses a vendored, lightly-patched copy of candle-core (see candle-core-patched/) via a [patch.crates-io] entry in mimi-jni/Cargo.toml. The patch is candle-core 0.9.2 plus runtime ARM dotprod (SDOT) detection, which makes quantized (GGUF) int8 inference ~3× faster on ARMv8.2+ devices while still falling back to the plain NEON path on older ARMv8.0 hardware. No extra setup is required — the crate is checked into this repo.

cargo install cargo-ndk

cd mimi-jni
cargo ndk -t arm64-v8a -P 24 build --release --features onnx

# Copy .so to the Android project
cp target/aarch64-linux-android/release/libmimi_jni.so \
   ../MimiDemo/app/src/main/jniLibs/arm64-v8a/

Scripts

ScriptDescription
export_streaming_onnx.pyExport PyTorch Mimi to streaming ONNX with causal attention masking
weight_fp16.pyConvert FP32 ONNX models to weight-only FP16 (~40% smaller, no quality loss)
export_onnx.pyExport batch (non-streaming) ONNX models
compare_backends.pyNumerical comparison between PyTorch, ONNX batch, and ONNX streaming
convert_to_gguf.pyConvert safetensors to GGUF (Q4_0, Q8_0)

License

This project contains code derived from Moshi by Kyutai.

  • Code: MIT License — see LICENSE
  • Model weights (Mimi codec): CC-BY 4.0 by Kyutai

Contributors

tatujan

6 commits

Languages

Rust

96.7%

Python

3.3%