Skip to content

Latest commit

 

History

History
212 lines (178 loc) · 10.6 KB

File metadata and controls

212 lines (178 loc) · 10.6 KB

Фаза 4: Интеграция и Inference

Финальная фаза - сборка всех компонентов в работающую систему распознавания речи.

Задачи

4.1. Audio Projector

  • Реализовать слой проекции для согласования размерностей:
    • Input: [batch, seq_len, encoder_dim] (896 или 1024)
    • Output: [batch, seq_len, llm_dim] (размерность Qwen3)
  • Варианты реализации:
    • Linear projection (простой, быстрый)
    • MLP с 1-2 скрытыми слоями (более гибкий)
  • Добавить LayerNorm после проекции (опционально).
  • Загрузка весов проектора из .safetensors.

4.2. End-to-End Pipeline

  • Создать AsrPipeline struct с компонентами:
    • feature_extractor: FeatureExtractor
    • audio_encoder: AuTEncoder
    • projector: AudioProjector
    • llm: Qwen3Model
    • tokenizer: Tokenizer
  • Реализовать метод transcribe():
    pub fn transcribe(&self, audio_path: &str) -> Result<String>
  • Флоу обработки:
    Audio File (.wav)
      ↓
    FeatureExtractor → Mel Spectrogram [batch, time, 128]
      ↓
    AuT Encoder → Audio Embeddings [batch, time/8, encoder_dim]
      ↓
    Projector → LLM Embeddings [batch, time/8, llm_dim]
      ↓
    Qwen3 LLM → Text Token IDs
      ↓
    Tokenizer Decode → Transcribed Text (String)
    
  • Добавить поддержку batch inference (несколько аудио файлов).
  • Реализовать streaming inference (опционально, для real-time).

4.3. CLI Приложение

  • Создать crates/cli с бинарником rustasr.
  • Реализовать аргументы командной строки:
    rustasr transcribe \
      --model <path_to_model> \
      --audio <path_to_wav> \
      [--device <cpu|metal|cuda>] \
      [--batch-size <size>] \
      [--language <auto|en|zh|...>]
  • Добавить команды:
    • transcribe: Распознать один аудио файл
    • batch: Обработать директорию с аудио
    • benchmark: Измерить производительность
  • Вывод результатов:
    • Распознанный текст в stdout
    • Опционально: JSON формат с метаданными (время обработки, язык, confidence)
  • Прогресс-бар для длинных аудио (с использованием indicatif).
  • Обработка ошибок с понятными сообщениями.

4.4. Оптимизации и Доработки

  • KV-cache для LLM декодера (ускорение генерации).
  • Mixed precision inference (FP16/BF16).
  • Поддержка длинных аудио (chunking + merging).
  • Опциональный postprocessing (пунктуация, нормализация).

✅ Критерии Завершения (Definition of Done)

  • CLI приложение успешно распознает тестовые аудио файлы
  • Точность распознавания соответствует Python-версии (WER в пределах 1%)
  • Производительность достигает целевых метрик (RTF < 0.5)
  • Документация содержит примеры использования CLI
  • Написаны end-to-end тесты для полного пайплайна
  • CLI выдает понятные ошибки при проблемах (файл не найден, неверный формат и т.д.)

📊 Метрики Успеха

Метрика Целевое Значение Измерение
Word Error Rate (WER) < 10% На тестовом наборе (LibriSpeech/Common Voice)
Real-Time Factor (RTF) < 0.5 Аудио 10 секунд на M1/M2
Потребление памяти < 3GB Модель 1.7B, FP32
Время cold start < 5 секунд Загрузка модели + первый инференс
Покрытие тестами > 80% Integration + E2E тесты

⚠️ Риски и Митигация

Риск Вероятность Влияние Митигация
Несовпадение точности с Python Средняя Критическое Пошаговая верификация всего пайплайна, сравнение промежуточных выходов
Низкая производительность LLM Средняя Высокое Использовать KV-cache, mixed precision, оптимизация batch size
Проблемы с длинными аудио Высокая Среднее Реализовать chunking, тестировать на разных длинах
OOM (Out of Memory) на больших файлах Средняя Высокое Streaming inference, оптимизация batch size, мониторинг памяти

🔗 Зависимости

Зависит от:

  • Фаза 1: Инфраструктура и Qwen3 model
  • Фаза 2: Feature Extractor
  • Фаза 3: AuT Encoder

Блокирует:

  • Релиз продукта
  • Публикацию крейта на crates.io

🧪 План Тестирования

1. Unit-тесты

  • Тест Audio Projector (размерности, корректность проекции)
  • Тест загрузки всех компонентов модели
  • Тест токенизации и декодирования

2. Integration-тесты

  • End-to-end тест на коротком аудио (1-2 секунды)
  • Тест batch inference (несколько файлов)
  • Тест обработки ошибок (неверный путь, битый файл)

3. Acceptance-тесты

  • Распознавание эталонных фраз из тестового набора
  • Сравнение WER с официальной Python реализацией
  • Тестирование на разных языках (если модель multilingual)

4. Performance-тесты

  • Benchmark на аудио разной длительности (1s, 5s, 10s, 30s, 60s)
  • Профилирование узких мест (feature extraction, encoder, llm)
  • Измерение peak memory usage
  • Сравнение CPU vs Metal производительности

5. Stress-тесты

  • Обработка 100+ файлов подряд (проверка на утечки памяти)
  • Очень длинное аудио (5+ минут)
  • Параллельная обработка нескольких запросов

🏗️ Архитектура AsrPipeline

┌─────────────────────────────────────────────────────┐
│                   AsrPipeline                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ┌───────────────────┐                             │
│  │ FeatureExtractor  │ WAV → Mel Spectrogram       │
│  └─────────┬─────────┘                             │
│            │                                        │
│            ▼                                        │
│  ┌───────────────────┐                             │
│  │   AuT Encoder     │ Mel → Audio Embeddings      │
│  └─────────┬─────────┘                             │
│            │                                        │
│            ▼                                        │
│  ┌───────────────────┐                             │
│  │  Audio Projector  │ Encoder Dim → LLM Dim       │
│  └─────────┬─────────┘                             │
│            │                                        │
│            ▼                                        │
│  ┌───────────────────┐                             │
│  │    Qwen3 LLM      │ Generate Text Token IDs     │
│  └─────────┬─────────┘                             │
│            │                                        │
│            ▼                                        │
│  ┌───────────────────┐                             │
│  │    Tokenizer      │ Token IDs → Text            │
│  └───────────────────┘                             │
│                                                     │
└─────────────────────────────────────────────────────┘

📝 Примеры Использования

CLI

# Простое распознавание
rustasr transcribe --model ./models/qwen3-asr-1.7b --audio speech.wav

# С выбором устройства
rustasr transcribe --model ./models/qwen3-asr-0.6b --audio input.wav --device metal

# Batch обработка
rustasr batch --model ./models/qwen3-asr-1.7b --input-dir ./audio_files/ --output results.json

# Benchmark
rustasr benchmark --model ./models/qwen3-asr-1.7b --test-set ./librispeech/

Библиотека (Rust API)

use rustasr::{AsrPipeline, Device};

fn main() -> Result<()> {
    let pipeline = AsrPipeline::new(
        "models/qwen3-asr-1.7b",
        Device::Metal
    )?;

    let text = pipeline.transcribe("speech.wav")?;
    println!("Transcribed: {}", text);

    Ok(())
}

📚 Референсы