Мульти-модельное распознавание речи на Rust — локально, быстро, без Python-зависимостей.
RustASR — библиотека и CLI-инструмент для автоматического распознавания речи (ASR, Automatic Speech Recognition), написанные на чистом Rust. Все модели работают через Candle — zero C++/Python зависимостей в runtime.
| Модель | Архитектура | Языки | Параметры |
|---|---|---|---|
| Qwen3-ASR | AuT Encoder + Qwen3 LLM Decoder | Мультиязычная | 0.6B / 1.7B |
| Whisper Large v3 Turbo | Encoder-Decoder (Transformer) | Мультиязычная | ~809M |
| GigaAM v3 E2E CTC | Conformer + CTC | Русский | ~220M |
| Parakeet TDT v3 | FastConformer + TDT | 25 языков | ~627M |
- 4 модели с единым API (trait
AsrModel) - GPU-ускорение: Metal (macOS), CUDA (Linux/Windows)
- Квантизация: GGUF (Q4_0, Q6K, Q8_0) для уменьшения потребления памяти
- Диаризация: определение говорящих по каналам или кластеризацией
- VAD: сегментация речи через WebRTC VAD
- Форматы аудио: WAV (16-bit PCM), автоматический ресемплинг до 16 кГц
- Rust 1.85+ (stable)
- macOS 13+ (для Metal) или Linux 5.0+
# Клонирование
git clone https://github.com/example/rustasr.git
cd rustasr
# Сборка (debug)
cargo build --workspace
# Сборка (release, рекомендуется для инференса)
cargo build --workspace --releaseQwen3 и Whisper загружаются напрямую с HuggingFace, GigaAM и Parakeet требуют конвертации весов.
# Qwen3-ASR 0.6B
python scripts/download_model.py \
--model Qwen/Qwen3-ASR-0.6B \
--output models/qwen3-asr-0.6b
# Qwen3-ASR 1.7B
python scripts/download_model.py \
--model Qwen/Qwen3-ASR-1.7B \
--output models/qwen3-asr-1.7b
# Whisper Large v3 Turbo
python scripts/download_model.py \
--model openai/whisper-large-v3-turbo \
--output models/whisper-large-v3-turbo
# GigaAM v3 E2E CTC (загрузка + конвертация PyTorch → safetensors)
python scripts/convert_gigaam.py --output models/gigaam-v3-e2e-ctc
# Parakeet TDT 0.6b v3 (загрузка + конвертация NeMo → safetensors)
python scripts/convert_parakeet.py \
--model nvidia/parakeet-tdt-0.6b-v3 \
--output models/parakeet-tdt-0.6b-v3Python-зависимости для конвертации:
torch,safetensors,sentencepiece,huggingface_hub. Для Parakeet дополнительно нуженomegaconf.
# Qwen3-ASR (по умолчанию)
cargo run -p asr-cli --release -- transcribe \
--model models/qwen3-asr-0.6b \
--audio recording.wav \
--device metal
# Whisper
cargo run -p asr-cli --release -- transcribe \
--model models/whisper-large-v3-turbo \
--model-type whisper \
--audio recording.wav \
--device metal
# GigaAM (русский)
cargo run -p asr-cli --release -- transcribe \
--model models/gigaam-v3-e2e-ctc \
--model-type gigaam \
--audio recording.wav \
--device cpu
# Parakeet TDT
cargo run -p asr-cli --release -- transcribe \
--model models/parakeet-tdt-0.6b-v3 \
--model-type parakeet \
--audio recording.wav \
--device cpuuse asr_engine::AsrEngine;
use asr_core::{ModelType, TranscribeOptions};
// Загрузка модели
let mut engine = AsrEngine::load(
ModelType::Whisper,
"models/whisper-large-v3-turbo",
&device,
)?;
// Транскрибация
let result = engine.transcribe(&samples, &TranscribeOptions {
language: Some("ru".into()),
..Default::default()
})?;
println!("{}", result.text);
for seg in &result.segments {
println!("[{:.1}s–{:.1}s] {}", seg.start, seg.end, seg.text);
}rustasr transcribe \
--model <путь> \
--model-type <qwen3|whisper|gigaam|parakeet> \
--audio <файл.wav> \
--device <cpu|metal|cuda> \
--language <язык> \
--decoder-weights <auto|safetensors|gguf>Работает с любой моделью (Qwen3, Whisper, GigaAM, Parakeet).
rustasr diarize \
--model <путь> \
--model-type <qwen3|whisper|gigaam|parakeet> \
--audio <файл.wav> \
--device <cpu|metal|cuda> \
--speaker-mode <auto|channel|cluster> \
--num-speakers 2 \
--out-dir output/rustasr quantize \
--input models/qwen3-asr-0.6b/model.safetensors \
--output models/qwen3-asr-0.6b/model-q8_0.gguf \
--qtype q8_0rustasr models list --root models/rustasr test --device metalrustasr/
├── crates/
│ ├── asr-core/ # Базовые типы, ошибки, trait AsrModel
│ ├── audio/ # WAV-загрузка, ресемплинг, mel-спектрограмма
│ ├── aut-encoder/ # AuT аудио-энкодер (Qwen3-ASR)
│ ├── qwen3-decoder/ # Qwen3 LLM декодер (Qwen3-ASR)
│ ├── asr-pipeline/ # End-to-end пайплайн Qwen3-ASR
│ ├── model-qwen3/ # Обёртка Qwen3-ASR → AsrModel
│ ├── model-whisper/ # Whisper Large v3 Turbo → AsrModel
│ ├── model-gigaam/ # GigaAM v3 CTC → AsrModel
│ ├── model-parakeet/ # Parakeet TDT v3 → AsrModel
│ ├── asr-engine/ # Единый фасад AsrEngine (диспетчеризация)
│ └── asr-cli/ # CLI-приложение rustasr
├── models/ # Локальные модели (не в git)
├── scripts/ # Утилиты: загрузка, конвертация, сравнение
└── docs/ # Документация и PRD
asr-core ←── audio ←── aut-encoder
↑ ↑ ↑
│ └── asr-pipeline ←── qwen3-decoder
│ ↑
├── model-whisper │
├── model-gigaam │
├── model-parakeet │
├── model-qwen3 ────────┘
│
└── asr-engine ←── asr-cli
Все модели реализуют AsrModel из asr-core:
pub trait AsrModel: Send + Sync {
fn name(&self) -> &str;
fn model_type(&self) -> ModelType;
fn sample_rate(&self) -> u32 { 16_000 }
fn supported_languages(&self) -> &[&str];
fn model_info(&self) -> ModelInfo;
fn transcribe(
&mut self,
samples: &[f32],
options: &TranscribeOptions,
) -> AsrResult<TranscriptionResult>;
}# Форматирование
cargo fmt --all
# Линт (clippy)
cargo clippy --workspace --all-targets --all-features -- -D warnings# Все тесты
cargo test --workspace
# Конкретный крейт
cargo test -p audio
# Конкретный тест с выводом
cargo test -p asr-pipeline test_pipeline_creation -- --nocaptureЧасть интеграционных тестов пропускается, если модель не загружена (проверяется наличие файлов в
models/).
Модели подключаются через feature gates в asr-engine:
[features]
default = ["whisper", "gigaam", "parakeet", "qwen3"]
whisper = ["dep:model-whisper"]
gigaam = ["dep:model-gigaam"]
parakeet = ["dep:model-parakeet"]
qwen3 = ["dep:model-qwen3"]| Метрика | Значение | Платформа |
|---|---|---|
| RTF (Real-Time Factor) | < 0.3 | M1 Mac (Metal), 0.6B |
| RTF | < 1.0 | CPU (8 cores), 0.6B |
| Cold Start | < 5 секунд | Любая |
| Peak Memory | < 2 GB | 0.6B модели |
| Peak Memory | < 3 GB | 1.7B модели |
Подробный сравнительный тест: docs/tests/SUMMARY.md
| Модель | RTF | Transcribe | Peak RSS | Качество (рус.) |
|---|---|---|---|---|
| GigaAM v3 CTC | 0.017 | 1.02 с | 1 719 МБ | ★★★★☆ |
| Parakeet TDT v3 | 0.038 | 2.30 с | 4 672 МБ | ★☆☆☆☆ |
| Whisper v3 Turbo | 0.110 | 6.60 с | 1 711 МБ | ★★★★★ |
| Qwen3-ASR 0.6B | 0.114 | 6.84 с | 1 932 МБ | ★★★☆☆ |
| Сценарий | Модель |
|---|---|
| Русский, лучшее качество | Whisper v3 Turbo |
| Русский, макс. скорость | GigaAM v3 CTC (Metal) |
| Мультиязычный контент | Whisper v3 Turbo |
| VAD/диаризация | Любая (--model-type) |
Также доступны результаты квантизации GGUF (Qwen3, Whisper).
| Компонент | Библиотека |
|---|---|
| ML-бэкенд | Candle (candle-core, candle-nn, candle-transformers) |
| Формат весов | SafeTensors, GGUF |
| Токенизация | tokenizers |
| Аудио I/O | hound (WAV) |
| Ресемплинг | rubato |
| FFT | rustfft |
| VAD | webrtc-vad |
| CLI | clap |
| Логирование | tracing |
- Product Requirements Document
- Мульти-модельный PRD
- Фаза 1: Инфраструктура
- Фаза 2: Обработка аудио
- Фаза 3: AuT Энкодер
- Фаза 4: Интеграция
- Исследование архитектур ASR
MIT OR Apache-2.0