中文翻译暂不可用,显示俄语原文。

Как работает whisper.cpp для локального ASR с low latency?

Краткий тезис

whisper.cpp — это высокопроизводительная реализация модели Whisper (OpenAI) на C/C++, оптимизированная для локального выполнения с минимальной задержкой. Она использует квантизацию GGML/GGUF, поддерживает потоковую обработку с VAD (Voice Activity Detection) и достигает real-time factor < 1 на большинстве современных устройств, включая Raspberry Pi. Благодаря этому whisper.cpp является ключевым компонентом для голосовых интерфейсов в Agentic RAG и локальных AI-агентах.


1. Термин: ASR (Automatic Speech Recognition) и low latency

ASR — технология преобразования речи в текст. В контексте AI-агентов и RAG-систем ASR используется для голосового ввода запросов пользователя.

Low latency (latency|низкая задержка) — время от окончания речи до получения текста должно быть минимальным (обычно < 300 мс для интерактивного общения). Для локального ASR это критично, так как сетевые вызовы к облачным API добавляют задержку.

Real-time factor (RTF) — отношение времени обработки аудио к длительности самого аудио. RTF < 1 означает, что система работает быстрее реального времени. Например, RTF = 0.1 означает, что 10 секунд аудио обрабатываются за 1 секунду.


2. Проблема оригинального Whisper: latency и зависимости

Оригинальный Whisper от OpenAI — модель encoder-decoder на основе Transformer. Она обучена на 680k часов многоязычных данных и показывает высокое качество распознавания. Однако для локального использования есть недостатки:

  • Зависимости: требует Python, PyTorch, CUDA (для GPU), что увеличивает размер окружения и время загрузки.
  • Latency: полный прогон модели на CPU может быть медленным (RTF > 1 на слабых устройствах).
  • Потоковая обработка: оригинальный Whisper не поддерживает streaming «из коробки» — нужно подавать целый аудиофайл или буферизировать речь целиком.
  • Размер модели: даже small-версия (244 MB) требует значительной памяти.

Эти ограничения делают оригинальный Whisper непригодным для low-latency локального ASR в реальном времени.


3. Архитектура whisper.cpp: C/C++, GGML/GGUF, квантизация

whisper.cpp — это реимплементация Whisper на C/C++ без зависимостей от Python и PyTorch. Основные компоненты:

  • GGML — библиотека для тензорных вычислений на CPU/GPU с поддержкой квантизации. Используется для инференса модели.
  • GGUF — формат файлов моделей, содержащий квантизованные веса и метаданные. Заменил устаревший GGML.
  • Квантизация — снижение точности весов (например, с FP32 до INT8 или INT4) для уменьшения размера модели и ускорения вычислений. whisper.cpp поддерживает уровни: q5_1, q5_0, q4_1, q4_0, q8_0 и другие.

Процесс инференса

  1. Аудио загружается в виде сырых PCM-сэмплов (16 kHz, моно).
  2. Вычисляется Mel-спектрограмма (80 фильтров, 25 мс окно, 10 мс шаг).
  3. Encoder обрабатывает спектрограмму и выдаёт скрытые представления.
  4. Decoder (авторегрессивный) генерирует токены текста, используя cross-attention с encoder-выходами.
  5. Результат декодируется в текст с помощью tokenizer (BPE).

Все вычисления выполняются через GGML, что позволяет эффективно использовать CPU (AVX2, NEON) и GPU (CUDA, Metal, Vulkan).


4. Оптимизации для low latency

4.1 Квантизация и размер модели

Квантизованные модели (например, ggml-small-q5_1.bin) занимают ~100 MB вместо 244 MB и работают в 2–4 раза быстрее на CPU с незначительной потерей качества (WER увеличивается на 1–3%).

4.2 Потоковая обработка (streaming)

Вместо ожидания полного аудиофайла whisper.cpp позволяет обрабатывать аудио кусками (чанками) фиксированной длины (например, 30 секунд или меньше). Для этого используется VAD (Voice Activity Detection) — детектор голосовой активности, который определяет начало и конец фразы.

Алгоритм потокового ASR

  1. Аудио буферизируется в кольцевой буфер.
  2. VAD анализирует энергию сигнала или использует простой ML-детектор (например, Silero VAD).
  3. Когда VAD обнаруживает речь, фрагмент аудио подаётся на whisper.cpp.
  4. После окончания речи (тишина > порога) результат выводится, буфер очищается.
  5. Для непрерывного распознавания можно использовать overlap (перекрытие) между чанками, чтобы не потерять слова на стыках.

Результат задержка от конца речи до вывода текста составляет < 200 мс на современном CPU.

4.3 Real-time factor на разных устройствах

УстройствоМодельRTF
MacBook M2 (CPU)small-q5_10.1 (10x быстрее реального времени)
Raspberry Pi 4 (CPU)tiny-q5_11.0 (работает в реальном времени)
Intel i7-12700 (CPU)base-q5_10.3
NVIDIA RTX 3060 (GPU)small-fp160.05

4.4 Дополнительные оптимизации

  • Beam search (поиск луча) — можно отключить для ускорения (greedy decoding).
  • Multilingual — отключение ненужных языков.
  • Prompt — использование предыдущего контекста для ускорения декодирования (prompt caching).

5. Сравнение whisper.cpp vs оригинальный Whisper

ПараметрОригинальный Whisper (OpenAI)whisper.cpp
Язык реализацииPython + PyTorchC/C++ (GGML)
ЗависимостиPython, PyTorch, CUDA (опционально)Ничего (статическая линковка)
Размер окружения> 2 GB< 10 MB (бинарник)
Поддержка квантизацииНет (только FP16/FP32)Да (INT4, INT8, q5_1 и др.)
Потоковая обработкаНет (только полный файл)Да (через VAD + чанки)
RTF на CPU (small)~2–3~0.3–0.5 (квантизованный)
Поддержка GPUCUDACUDA, Metal, Vulkan
Использование в embeddedСложно (нужен Python)Легко (C API, bindings)

6. Пример кода: использование whisper.cpp через Python bindings

Существуют Python-обёртки, например pywhispercpp или whisper-cpp-python. Пример потокового распознавания:

import whisper_cpp as whisper

# Загрузка квантизованной модели
model = whisper.Whisper("ggml-small-q5_1.bin")

# Настройка параметров
params = whisper.Params()
params.language = "ru"
params.print_progress = False
params.no_timestamps = True

# Потоковая обработка (псевдокод с VAD)
audio_stream = get_audio_stream()  # микрофон
buffer = []

while True:
    chunk = audio_stream.read(1600)  # 100 ms при 16 kHz
    buffer.extend(chunk)
    
    if vad.is_speech(buffer):
        # Накопление речи
        continue
    else:
        if len(buffer) > 16000:  # минимум 1 секунда
            text = model.transcribe(buffer, params)
            print(text)
            buffer = []

Bindings для других языков C API, Go, Rust, Node.js, Swift.


7. Интеграция в Agentic RAG (голосовой ввод для AI-агента)

В архитектуре Agentic RAG голосовой интерфейс часто строится так:

  1. ASR (whisper.cpp) — преобразует речь пользователя в текст.
  2. Query understanding — LLM или rule-based система уточняет запрос.
  3. Retrieval — поиск релевантных документов из векторной БД.
  4. Generation — LLM формирует ответ.
  5. TTS (Text-to-Speech) — озвучивание ответа (например, с помощью piper.cpp).

Преимущества whisper.cpp в таком пайплайне

  • Низкая задержка — пользователь не ждёт.
  • Работает офлайн — приватность данных.
  • Малый размер — можно запустить на Raspberry Pi или ноутбуке.
  • Простая интеграция через C API или bindings.

8. Пет-проект для закрепления

Задача Создать локального голосового ассистента, который принимает голосовой запрос, распознаёт его через whisper.cpp, ищет ответ в локальной базе знаний (RAG) и озвучивает результат.

Инструменты

  • whisper.cpp (сборка из исходников или предкомпилированный бинарник)
  • Python (для склейки), pywhispercpp
  • ChromaDB или FAISS (векторная БД)
  • LLM (например, Llama.cpp с моделью Mistral-7B)
  • TTS: piper.cpp или espeak

Шаги:

  1. Собрать whisper.cpp с поддержкой Metal (macOS) или CUDA.
  2. Написать скрипт, который читает аудио с микрофона (pyaudio), использует VAD (например, webrtcvad) для детекции речи.
  3. Передавать фрагменты речи в whisper.cpp, получать текст.
  4. Отправлять текст в RAG-пайплайн (embedding + поиск + LLM).
  5. Ответ LLM передавать в TTS и воспроизводить.

Ожидаемый результат Работающий прототип, который отвечает на голосовые вопросы с задержкой < 1 секунда на современном ноутбуке.


9. Связь с другими вопросами

ВопросТема
560Как работает Agentic RAG?
561Какие компоненты входят в архитектуру Agentic RAG?
563Как интегрировать TTS в Agentic RAG?
564Как обеспечить low latency в Agentic RAG?
555Как вы уменьшаете latency RAG-системы?
530Какие вы знаете локальные LLM для RAG?

10. Навигация


Навигация