Як уникнути таймаутів при AI-транскрибації?
Користувач завантажує 40-хвилинний запис наради — і чекає текст. Якщо на сервер іде сирий MP4 вагою 300 МБ, а назад приходить JSON через 90 секунд, UX зламаний ще до першого слова. Ми вибудовуємо пайплайн, у якому мобільний клієнт не просто відправляє файл, а бере участь у підготовці даних: нарізка, конвертація, чанкування — і отримує результат поступово, поки модель ще працює. Спеціалізуємося на інтеграції AI-транскрибації під ключ, враховуючи особливості платформи та обмеження API. Понад 5 років досвіду в мобільній розробці та 15+ реалізованих пайплайнів транскрибації для iOS і Android із сумарним обсягом понад 10 000 годин аудіо.
Найчастіша помилка — відправляти файл цілком через URLSession.dataTask або OkHttp з дефолтними таймаутами. На файлах понад 50 МБ це призводить до NSURLErrorTimedOut (iOS) або SocketTimeoutException (Android) у 70% випадків. Сервер часто відповідає 413 Entity Too Large, якщо ліміт не узгоджено. На пристроях з 2 ГБ RAM буферизація всього файлу в пам'ять викликає OOM — особливо при роботі з відео.
Чому VAD критично важливий для точності?
Чанкування по 60 секунд без урахування пауз ріже слова навпіл — транскрипція розбиває «транскрибація» на «транс» і «крибація». Voice Activity Detection (VAD) нарізає по реальних паузах: на iOS використовуємо AVAudioEngine з порогом -45 dBFS, на Flutter — пакет voice_activity_detector (WebRTC VAD). Це підвищує точність розпізнавання на 15–20% для неформальної мови порівняно з рівномірним чанкуванням.
Типові налаштування VAD:
| Параметр | Рекомендоване значення | Зауваження |
|---|---|---|
min_speech_duration |
0.8 s | Не менше 0.5 с для коротких фраз |
min_silence_duration |
1.2 s | Збільшити до 2 с для інтерв'ю |
threshold |
-45 dBFS | Для тихих записів — -35 dBFS |
frame_size |
30 ms | 10–30 ms за WebRTC |
Як налаштувати VAD під свої дані
- Запишіть 10-хвилинний зразок мови на цільовому пристрої.
- Проженіть через VAD з дефолтними параметрами та візуалізуйте межі чанків.
- Відкоригуйте
min_speech_durationтаthresholdтак, щоб чанки не обрізали початок/кінець фраз. - Перевірте на кількох файлах різної гучності та фонового шуму.
Як конвертувати кодеки без втрат?
Whisper API приймає audio/wav, mp3, mp4, ogg, але не всі кодеки всередині. .mov з pcm_s16le — ок, з ac3 — 400 Bad Request. На iOS AVAssetExportSession з пресетом AVAssetExportPresetAppleM4A покриває 95% форматів. На Android — MediaExtractor + MediaCodec (PCM) → MediaMuxer (AAC). Для екзотичних кодеків додаємо FFmpeg (mobile-ffmpeg-full-gpl на Android, ffmpegkit на iOS).
Детальніше про конвертацію кодеків
Якщо стандартні засоби не справляються, використовується FFmpeg з налаштуваннями: `-acodec pcm_s16le -ar 16000 -ac 1` для Mono WAV, який гарантовано приймають всі API.Як будується пайплайн на практиці
Підготовка файлу на пристрої
// iOS: Вилучити аудіодоріжку з відео
let asset = AVURLAsset(url: videoURL)
let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A)!
exportSession.outputFileType = .m4a
exportSession.outputURL = tempAudioURL
await exportSession.export()
Після експорту — розбивка на чанки по 25 МБ (ліміт Whisper API) з урахуванням VAD-меж. Кожен чанк завантажується через URLSession.uploadTask(with:fromFile:) з фоновою конфігурацією (URLSessionConfiguration.background), щоб завантаження продовжувалося при згортанні додатка.
На Android аналогічно: WorkManager з CoroutineWorker для фонової обробки, OkHttp з RequestBody.create через File, а не через ByteArray — це критично для економії пам'яті на пристроях з 2 ГБ RAM.
Стрімінг результату
Замість polling кожні N секунд — WebSocket або SSE. Якщо використовуєте власний бекенд поверх Whisper, сервер може стрімити partial_transcript у міру обробки чанків. На клієнті це URLSessionWebSocketTask (iOS) або OkHttp WebSocket (Android), який додає рядки в StateFlow / @Published — UI оновлюється в реальному часі.
Для прямої інтеграції з OpenAI Whisper API стрімінгу немає — API синхронний. Тому при великому файлі розбивайте на незалежні запити та мержте результати на клієнті за індексом чанка, а не за порядком відповідей (мережа не гарантує порядок).
Зберігання та постобробка
Сирий транскрипт з Whisper повертає segments з часовими мітками — це цінніше, ніж просто текст. Зберігайте JSON з start, end, text для кожного сегмента: це дозволяє реалізувати «тап на слово → перемотка аудіо».
Для постобробки — пунктуація та діаризація (хто говорив). Whisper не розділяє спікерів. Для цього потрібен окремий крок: pyannote.audio через API або AssemblyAI з параметром speaker_labels: true. На клієнті просто мержте два JSON за часовими мітками.
Порівняння провайдерів
| Провайдер | Точність (RU) | Стрімінг | Діаризація | Ліміт файлу |
|---|---|---|---|---|
| OpenAI Whisper | Висока | Ні | Ні | 25 МБ |
| AssemblyAI | Середня | Так | Так | 5 ГБ |
| Deepgram Nova-2 | Висока | Так | Так | Немає ліміту |
| Google Speech-to-Text v2 | Середня | Так | Так | 1 ГБ |
| On-device (iOS CoreML) | Середня | Ні | Ні | Обмежений RAM |
Для російської мови Whisper large-v3 дає на 30% вищу точність, ніж Google Speech-to-Text, особливо на неформальній мові та технічному жаргоні. Deepgram Nova-2 з параметром language: ru — хороший варіант, якщо потрібен реалтайм. Зниження витрат на транскрибацію може досягати 40% при виборі правильного провайдера.
OpenAI Whisper documentation
Що входить у роботу
- Аудит форматів — визначаємо середній розмір файлу, кодеки, мову, вимоги до діаризації.
- Вибір провайдера та архітектури — рекомендація щодо моделі (Whisper, Deepgram, AssemblyAI) та стратегії завантаження.
- Розробка пайплайну — підготовка файлу, чанкування, фонове завантаження, стрімінг результату.
- Інтеграція постобробки — пунктуація, діаризація, синхронізація з UI.
- Тестування на реальних пристроях — у тому числі з CoreML та MediaCodec.
- Документація — опис API, схеми потоків даних, інструкції з доопрацювання.
- Підтримка після здачі — налаштування моніторингу, виправлення помилок, консультації.
Процес роботи
Починаємо з аудиту: формат файлів, середній розмір, мови, чи потрібна діаризація, чи є вимоги до офлайн-роботи. Під це обираємо провайдера та архітектуру пайплайну.
Розробка йде поетапно: спочатку базовий upload + транскрипція без оптимізацій, потім додаємо чанкування, фонове завантаження, стрімінг UI, постобробку. Кожен етап — окрема гілка з функціональним тестом на реальних пристроях (не симулятор — CoreML та MediaCodec поводяться по-різному на реальному залізі).
Термін від інтеграції простого Whisper API до повноцінного пайплайну з діаризацією та фоновим завантаженням — від 2 до 6 тижнів залежно від платформи та вимог. Вартість інтеграції розраховується індивідуально після аудиту.
Зв'яжіться з нами для безкоштовного аудиту ваших файлів — це займе не більше години. Замовте інтеграцію та отримайте працюючий пайплайн у найкоротші терміни.







