中文翻译暂不可用,显示俄语原文。
Как работает 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 и другие.
Процесс инференса
- Аудио загружается в виде сырых PCM-сэмплов (16 kHz, моно).
- Вычисляется Mel-спектрограмма (80 фильтров, 25 мс окно, 10 мс шаг).
- Encoder обрабатывает спектрограмму и выдаёт скрытые представления.
- Decoder (авторегрессивный) генерирует токены текста, используя cross-attention с encoder-выходами.
- Результат декодируется в текст с помощью 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
- Аудио буферизируется в кольцевой буфер.
- VAD анализирует энергию сигнала или использует простой ML-детектор (например, Silero VAD).
- Когда VAD обнаруживает речь, фрагмент аудио подаётся на whisper.cpp.
- После окончания речи (тишина > порога) результат выводится, буфер очищается.
- Для непрерывного распознавания можно использовать overlap (перекрытие) между чанками, чтобы не потерять слова на стыках.
Результат задержка от конца речи до вывода текста составляет < 200 мс на современном CPU.
4.3 Real-time factor на разных устройствах
| Устройство | Модель | RTF |
|---|---|---|
| MacBook M2 (CPU) | small-q5_1 | 0.1 (10x быстрее реального времени) |
| Raspberry Pi 4 (CPU) | tiny-q5_1 | 1.0 (работает в реальном времени) |
| Intel i7-12700 (CPU) | base-q5_1 | 0.3 |
| NVIDIA RTX 3060 (GPU) | small-fp16 | 0.05 |
4.4 Дополнительные оптимизации
- Beam search (поиск луча) — можно отключить для ускорения (greedy decoding).
- Multilingual — отключение ненужных языков.
- Prompt — использование предыдущего контекста для ускорения декодирования (prompt caching).
5. Сравнение whisper.cpp vs оригинальный Whisper
| Параметр | Оригинальный Whisper (OpenAI) | whisper.cpp |
|---|---|---|
| Язык реализации | Python + PyTorch | C/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 (квантизованный) |
| Поддержка GPU | CUDA | CUDA, 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 голосовой интерфейс часто строится так:
- ASR (whisper.cpp) — преобразует речь пользователя в текст.
- Query understanding — LLM или rule-based система уточняет запрос.
- Retrieval — поиск релевантных документов из векторной БД.
- Generation — LLM формирует ответ.
- 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
Шаги:
- Собрать whisper.cpp с поддержкой Metal (macOS) или CUDA.
- Написать скрипт, который читает аудио с микрофона (pyaudio), использует VAD (например,
webrtcvad) для детекции речи. - Передавать фрагменты речи в whisper.cpp, получать текст.
- Отправлять текст в RAG-пайплайн (embedding + поиск + LLM).
- Ответ 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. Навигация
- Предыдущий: 561
- Следующий: 563
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 561
- Следующий: 563
- Индекс: 00. Индекс разборов