Ви запускаєте голосовий асистент у закритому контурі: жодного доступу до хмари, дані під NDA, залізо — Raspberry Pi 4. Vosk — єдиний production-ready toolkit на базі Vosk Kaldi, який працює повністю офлайн, займає від 50 МБ на диску і дає latency ~200 мс на streaming. Завдяки цьому забезпечується STT без інтернету та приватне розпізнавання мовлення. Vosk підтримує 20+ мов, але на кожному другому проекті ми стикалися з проблемою WER вищого за очікуваний — базова модель не розуміє медичні або юридичні терміни. Ми впроваджували Vosk у медичні диктофони, голосові помічники для «чистих кімнат», системи керування конвеєром. Щоразу впиралися в два обмеження: точність на специфічній лексиці та продуктивність на слабкому CPU. Нижче — як ми це обходимо. При цьому витрати на хмарні API можуть сягати сотень тисяч рублів на місяць — перехід на Vosk знижує витрати на 60–80%. Наприклад, базова інтеграція коштує $500, а повна з кастомізацією – від $2000 до $5000.
Які проблеми вирішуємо
-
Високий WER на предметній лексиці. Стандартна модель vosk-model-uk-0.3 дає WER ~12% на новинах, але на медичних термінах — до 30%. Рішення — кастомний словник з вагами та fine-tuning на 1–2 години цільових записів. На одному проекті ми за день знизили WER з 25% до 14%.
-
Латенсі на потоці. Vosk віддає partial results кожні 200 мс, але якщо навантаження на CPU 100%, фреймворк починає зависати. Ми оптимізували pipeline: винесли декодинг в окремий потік, додали буфер на 2 секунди, використали VAD (Voice Activity Detection) для вирізання тиші, налаштували beam search та масштабування мовної моделі. В результаті p99 latency не перевищує 350 мс.
-
Необхідність унікальної моделі. Для китайської мови Vosk пропонує не всі акценти. На одному проекті з французьким діалектом ми навчили адаптовану модель через Kaldi nnet3 — витратили тиждень, але отримали WER 8% проти базових 22%.
Як адаптувати Vosk під специфічну лексику?
Процес включає чотири етапи: збір аудіозаписів (1–2 години), транскрибування, створення кастомного словника з вагами, донавчання моделі через Kaldi nnet3. На одному з проектів для французького діалекту ми знизили WER з 22% до 8% за тиждень.
Чому Vosk кращий для edge-пристроїв?
Vosk в 40 разів економніший за пам'яттю та в 10 разів швидший за Whisper на Raspberry Pi. Vosk споживає в 40 разів менше пам'яті, ніж Whisper-large, і в 10 разів швидший на Raspberry Pi. Нижче — порівняння доступних моделей для української мови (дані — Vosk model zoo Vosk Documentation):
| Модель |
Розмір |
WER (чисте мовлення) |
RAM (всього) |
Ідеальний сценарій |
| vosk-model-small-uk-0.2 |
45 MB |
~20% |
~80 MB |
Raspberry Pi Zero, мікроконтролери |
| vosk-model-uk-0.3 |
1.5 GB |
~12% |
~1.6 GB |
Сервер, одноплатник з 2+ ГБ ОЗУ |
| Кастомна (fine-tune) |
від 100 MB |
8–15% |
~500 MB |
Нішева лексика (медицина, юриспруденція) |
Висновок: для low-power edge — small, для точності — full або кастом.
Додаткове порівняння за ресурсами (для RPi4):
| Ресурс |
Vosk (small) |
Whisper (tiny) |
Whisper (base) |
| RAM |
80 MB |
1 GB |
2.5 GB |
| CPU load |
15% |
60% |
90% |
| Latency |
200 ms |
500 ms |
1.2 s |
Як ми інтегруємо Vosk: кейс медичного диктофона
З нашої практики: наш клієнт, медичний центр, якому потрібно було записувати прийоми лікарів. Залізо — Intel NUC (i5, 8 GB RAM). Ми використали vosk-model-uk-0.3 з кастомним медичним словником. Фрагмент інтеграції:
from vosk import Model, KaldiRecognizer
import pyaudio
model = Model("vosk-model-medical")
rec = KaldiRecognizer(model, 16000)
rec.SetGrammar(grammar) # медичні терміни
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000,
input=True, frames_per_buffer=4000)
while True:
data = stream.read(4000, exception_on_overflow=False)
if rec.AcceptWaveform(data):
result = json.loads(rec.Result())
print(result["text"])
else:
partial = json.loads(rec.PartialResult())
# відображаємо проміжний текст
Перший прототип — за 4 дні. Ще 3 дні пішло на калібрування словника та стрес-тестування. На виході — WER 9% на реальних записах. Вартість такої інтеграції стартує від $500, а економія на хмарних API сягає $3000 на місяць.
Детальніше про кастомний словник
Ми використовуємо техніку додавання термінів з вагами: кожному слову призначається коефіцієнт від 0 до 1, що впливає на ймовірність його розпізнавання. Наприклад, для слова «діагноз» weight=1.5, для «гіпертонія» weight=1.2. Це дозволяє підвищити точність без збільшення розміру моделі. Також застосовуємо фонетичну декомпозицію та біграмні моделі для зниження WER.
Що входить у роботу
- Аудит завдання та підбір моделі.
- Інтеграція Vosk у ваш код (Python, Java, C#, Go, Node.js).
- Кастомізація словника та/або fine-tuning моделі.
- Оптимізація latency та споживання пам'яті.
- Тестування на ваших даних (100+ записів).
- Документація та навчання команди.
- Техпідтримка 3 місяці.
Вартість розраховується індивідуально, але в середньому заміна хмарного API на Vosk економить 60–80% бюджету на розпізнавання. Для типових проектів бюджет становить $500–$3000.
Терміни інтеграції Vosk
Базова інтеграція — від 3 до 5 днів. Якщо потрібна кастомна модель або fine-tuning — 2–3 тижні. Ми допомагаємо оцінити проект: просто опишіть задачу, і за день надішлемо план.
Чому обирають нашу інтеграцію?
Досвід — більше 10 проектів з голосових технологій. Ми даємо гарантію на якість розпізнавання (обумовлений WER) і підтримуємо код після здачі. Ви залишаєтеся власником усіх моделей і скриптів — жодного vendor lock.
Зв'яжіться з нами — надішлемо тестову модель під вашу задачу.
Замовте пілот — отримайте прототип за 5 днів.
Edge AI та оптимізація: деплой моделей без хмари
Уявіть: ваша модель розпізнавання облич видає 4 секунди latency на Jetson Orin, батарея сідає за годину, модель вилітає по OOM. Ми — команда інженерів з Edge AI — оптимізували понад 150 моделей для граничних пристроїв. Без профілювання та правильного вибору квантизації або дистиляції проект приречений. Розрив між дослідницьким кодом та edge-деплоєм — окрема інженерна дисципліна, і ми допомагаємо її освоїти за 2–16 тижнів під ключ. Справа не в експорті, а в системній роботі із залізом: GPU utilization, latency p99, memory bandwidth.
Чому просто «експортувати модель» не працює?
PyTorch-модель з float32 та batch_size=32 не готова до edge. Типові проблеми:
- ResNet-50 в fp32 займає 98 MB, inference на Cortex-A78 — 380 мс. Після INT8-квантизації
torch.ao.quantization — 24 MB, 95 мс. Експорт в ONNX + TensorRT на Jetson — 28 мс.
- YOLOv8m на Raspberry Pi 5 в fp32 — 2.8 fps. TFLite INT8 — 9.4 fps. З XNNPACK делегатом — 14 fps.
- Transformer-енкодер на мобільному CPU: MobileBERT в fp16 через CoreML на iPhone 15 — 18 мс/інференс.
distilbert-base-uncased в ONNX — 42 мс.
Проблема не у виборі «квантизувати чи ні» — правильний шлях визначається пристроєм, завданням та допустимою деградацією метрики. Пропонуємо оцінку вашого проекту: за 24 години скажемо, наскільки реально прискорити модель.
Який метод квантизації вибрати для вашого завдання?
PTQ (Post-Training Quantization) — швидкий шлях. Берете навчену модель, проганяєте calibration dataset (200–1000 прикладів), отримуєте INT8 або INT4 ваги. Інструменти: torch.ao.quantization, ONNX Runtime quantization tool, bitsandbytes. Деградація точності: 0.5–2% на класифікації. Червона зона — детекція дрібних об'єктів та сегментація, де PTQ дає -4–8% mAP.
QAT (Quantization-Aware Training) — навчання з симульованими квантизаційними шумами. Дорожче (перенавчання), але деградація 0.1–0.5%. Виправдано, коли PTQ неприйнятний. В PyTorch — torch.ao.quantization.prepare_qat().
GPTQ / AWQ — для LLM. AWQ краще зберігає якість при 4-bit квантизації. llm-compressor від Neural Magic або autoawq — основні бібліотеки.
Зв'яжіться з нами для безкоштовного профілювання вашої моделі — ми оцінимо latency та запропонуємо план оптимізації.
| Метод |
Час реалізації |
Деградація точності |
Інструменти |
| PTQ |
1–2 дні |
0.5–2% (до 8% на детекції) |
torch.ao, ONNX RT, bitsandbytes |
| QAT |
1–3 тижні |
0.1–0.5% |
torch.ao.prepare_qat, TF Quantization |
| GPTQ/AWQ |
3–7 днів |
1–3% (LLM) |
autoawq, llm-compressor |
Прунінг та дистиляція: коли квантизації недостатньо
Структурний прунінг видаляє канали або шари. Наприклад, видалення 40% каналів ResNet-50 з наступним fine-tuning дає -35% розміру, -28% latency при втраті top-1 accuracy лише на 1.2%. Інструменти: torch.nn.utils.prune, для transformer — прунінг attention heads (movement pruning, LTP). Глибша техніка — N:M sparsity, коли з кожних M ваг залишаються N ненульових (NVIDIA Ampere підтримує 2:4).
Knowledge distillation — навчаємо маленьку student імітувати велику teacher через KLDivLoss на soft labels. Feature distillation на проміжних шарах (hint-based) дає краще збереження якості. Hugging Face DistilBERT: 66M vs 110M параметрів, -40% latency, -3% на GLUE. Температура дистиляції — ключовий гіперпараметр (типово 4–8).
Комбінований підхід: дистиляція → прунінг → QAT. Дає максимальний ефект на обмеженому залізі. У кількох клієнтів ми фіксували економію на облачних обчисленнях до 70%.
Цільові платформи та інструменти
| Платформа |
Переважний формат |
Інструмент |
Специфіка |
| NVIDIA Jetson |
TensorRT engine |
trtexec, torch2trt |
INT8 calibration, DLA offload |
| Apple Silicon / iOS |
CoreML (.mlmodel) |
coremltools |
ANE (Neural Engine) автоматично |
| Android |
TFLite (.tflite) |
tf.lite.TFLiteConverter |
GPU delegate, NNAPI |
| x86 CPU |
ONNX + ORT |
onnxruntime |
AVX-512, VNNI |
| Arm Cortex |
TFLite / ONNX |
ort-arm, tflite |
XNNPACK, NEON |
| Qualcomm NPU |
QNN (.dlc) |
Qualcomm AI Hub |
Hexagon DSP |
TensorRT — головний інструмент для NVIDIA edge. TRT будує граф з fusion операторів, вибирає оптимальні ядра. На Jetson AGX Orin YOLOv8m в TRT INT8 дає 78 fps проти 22 fps в fp16 PyTorch — прискорення в 3.5 рази.
Практичний кейс з нашої практики: детекція дефектів на виробничій лінії
Наш клієнт — виробниче підприємство. Завдання: виявлення подряпин на металі в реальному часі, 30 fps, камера до Jetson Xavier NX (16GB). Вихідна модель YOLOv8l mAP50 0.91, inference на сервері 28 мс, на Jetson в fp16 — 110 мс (9 fps). Не підходить.
Кроки оптимізації:
- Перехід на YOLOv8m — mAP50 0.887 (-2.3%), 68 мс
- Експорт в TensorRT FP16 через
yolo export format=engine half=True — 31 мс (32 fps)
- INT8 calibration на 500 кадрах — 22 мс (45 fps), mAP50 0.879
Підсумок: деградація 3.5% при 5× прискоренні. Клієнт отримав engine та документацію. Гарантуємо, що метрика не впаде нижче обумовленого порогу — прописано в договорі.
Приклад профілювання latency по шарах YOLOv8m на Jetson Xavier NX (fp16):
- Convolution (layer 1–5): 12 ms
- Bottleneck (layer 6–10): 8 ms
- Head (detection): 11 ms
Вузьке місце — останні шари head'а. Після квантування head'а окремо latency head знизилась до 4 ms.
Що входить в роботу
- Звіт по профілюванню моделі на цільовому пристрої (latency по шарах, вузькі місця)
- Вибір та обґрунтування методів оптимізації (quantization / pruning / distillation)
- Оптимізована модель (TensorRT engine / TFLite / CoreML / ONNX)
- Конфіги для відтворення (скрипти, Docker-образ, інструкція)
- Тестування на реальному пристрої (не менше 10 000 інференсів)
- Навчання вашої команди (2 години онлайн)
- Підтримка 1 місяць після передачі
Як замовити оптимізацію моделі?
- Залиште заявку на сайті або зв'яжіться з нами будь-яким зручним способом.
- Ми проводимо безкоштовне профілювання вашої моделі на цільовому пристрої протягом 24 годин.
- Готуємо план оптимізації з оцінкою trade-off (швидкість vs якість).
- Ви затверджуєте план — ми приступаємо до роботи.
- Після завершення передаємо оптимізовану модель, конфіги та документацію.
- Проводимо навчання вашої команди та надаємо місячну підтримку.
Терміни: оптимізація готової моделі — 2–4 тижні. Розробка з нуля під edge — 6–16 тижнів. Вартість розраховується індивідуально залежно від складності моделі та цільової платформи.
Отримайте консультацію — ми безкоштовно оцінимо вашу модель та запропонуємо план за 24 години. Замовте безкоштовне профілювання прямо зараз.