Ви впроваджуєте голосовий асистент або застосунок для реального перекладу розмови? Наскрізна затримка більше 3 секунд вбиває UX — співрозмовник починає перебивати або втрачає нитку. Ми вирішуємо цю проблему паралелізацією трьох етапів: захоплення аудіо → транскрипція → переклад → синтез голосу. При правильній архітектурі користувач не помічає пауз навіть при швидкому діалозі. У послідовній конфігурації затримка сягає 8–15 секунд — це неприйнятно для живого спілкування. Паралельний пайплайн (pipeline parallelism) дозволяє обробляти звук, текст і мову одночасно: поки TTS озвучує одну фразу, STT вже записує наступну. В результаті наскрізна затримка скорочується до 1.5–3 секунд. Наприклад, у проекті для фінансової компанії ми впровадили паралельний пайплайн із Deepgram Nova-2 та Yandex SpeechKit. Затримка на парі російська-англійська склала 2.1 секунди, що дозволило проводити живі переговори без пауз. Клієнт відзначив зниження кількості перепитувань на 60%. Вартість інтеграції одного хмарного сервісу починається від $2000, а економія на переговорах може досягати $10 000 на рік. Отримайте консультацію щодо вашого проекту — ми оцінимо архітектуру та підберемо оптимальний стек. Нижче — ключові технічні рішення для iOS та Android, які ми відпрацювали на 40+ проектах.
Як працює пайплайн перекладу мови?
Мікрофон → VAD → буфер 2-3 сек → STT API → вихідний текст
↓
Translation API → перекладений текст
↓
TTS API → аудіо → динамік
Кожен блок можна паралелити. Поки TTS синтезує перше речення, STT вже обробляє наступний фрагмент. Це називається pipeline parallelism і знижує наскрізну затримку вдвічі.
Як вибрати STT для стрімінгу?
Whisper — ні. Deepgram Nova-2 або Google Speech-to-Text v2 з interim_results — так. Для перекладу мови потрібен потоковий STT, інакше доведеться чекати повної паузи.
Deepgram з interim_results=true та utterance_end_ms=1200 дає текст протягом 300–500 мс після закінчення фрази. Це робоче вікно для запуску перекладу.
Реалізація на iOS
class SpeechTranslationPipeline {
private let deepgramStreamer: DeepgramStreamer
private let translator: TranslationService
private let tts: AVSpeechSynthesizer
func handleFinalTranscript(_ text: String, sourceLang: String, targetLang: String) async {
// Запуск перекладу одразу після отримання фінального utterance
async let translated = translator.translate(text, from: sourceLang, to: targetLang)
// Паралельно показуємо вихідний текст в UI
await MainActor.run { sourceLabel.text = text }
let translatedText = try? await translated
guard let result = translatedText else { return }
await MainActor.run { targetLabel.text = result }
// TTS
let utterance = AVSpeechUtterance(string: result)
utterance.voice = AVSpeechSynthesisVoice(language: targetLang)
utterance.rate = 0.52
tts.speak(utterance)
}
}
AVSpeechSynthesizer — системний TTS на iOS. Для російського голосу якість прийнятна, але помітно гірша за ElevenLabs або OpenAI TTS. Якщо потрібен природний голос — міняємо блок TTS на хмарний з кешуванням синтезованого аудіо.
Управління аудіосесією
При одночасному захопленні мікрофона та відтворенні перекладу — конфлікт AVAudioSession. Потрібна категорія .playAndRecord з опцією .defaultToSpeaker:
try AVAudioSession.sharedInstance().setCategory(
.playAndRecord,
mode: .voiceChat,
options: [.defaultToSpeaker, .allowBluetooth]
)
Режим .voiceChat активує ехоподавлення. Без нього переклад з динаміка потрапить назад у мікрофон і піде на друге коло транскрипції. Apple Developer Documentation
Реалізація на Android
class SpeechTranslationPipeline @Inject constructor(
private val deepgramStreamer: DeepgramStreamer,
private val translationRepo: TranslationRepository,
private val tts: TextToSpeech
) {
fun start(sourceLang: String, targetLang: String) {
deepgramStreamer.onFinalTranscript = { text ->
coroutineScope.launch {
val translated = translationRepo.translate(text, targetLang)
withContext(Dispatchers.Main) {
sourceTextView.text = text
targetTextView.text = translated
}
speakTranslation(translated, targetLang)
}
}
deepgramStreamer.start()
}
private fun speakTranslation(text: String, lang: String) {
tts.language = Locale.forLanguageTag(lang)
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null)
}
}
AudioManager.MODE_IN_COMMUNICATION + AudioRecord з джерелом VOICE_COMMUNICATION — для коректної роботи AEC (Acoustic Echo Canceler) на Android. Інакше на пристроях без хардварного AEC буде ехо.
Які складнощі виникають при паралельній обробці?
Поки TTS вимовляє переклад, користувач може говорити наступну фразу. Якщо VAD це не враховує, мікрофон підхопить і голос з динаміка. Рішення:
- Пауза VAD на час відтворення TTS
- Або додаткова фільтрація: ігнорувати interim-результати під час програвання аудіо
На практиці другий варіант надійніший, оскільки не створює незручних пауз.
Порівняння послідовного та паралельного підходів
| Метод | Затримка | Ризик еха | Ресурсоємність |
|---|---|---|---|
| Послідовний | 8–15 сек | Низький | Низька |
| Паралельний (pipeline) | 1.5–3 сек | Середній (потрібен AEC) | Вище на 20–30% |
Порівняння провайдерів за якістю та затримкою
| Напрямок | STT | Translation | TTS | Особливості |
|---|---|---|---|---|
| ru → en | Deepgram Nova-2 | DeepL | OpenAI TTS | Низька затримка, хороший англійський синтез |
| en → ru | Deepgram Nova-2 | DeepL/Google | Yandex SpeechKit | Yandex дає більш природний російський голос |
| zh → en | Google STT | Google Translate | Google TTS | Надійно для китайської, але затримка трохи вища |
| ar → en | AssemblyAI | GPT-4o | ElevenLabs | Найкраща якість для арабської, але дорожче |
Для російського синтезу голосу Yandex SpeechKit помітно кращий за Google TTS та OpenAI за природністю. Це не думка — це перевірено на тестовому наборі з 50 фраз.
Офлайн-варіант
Для пристроїв без стабільного інтернету: Whisper on-device (whisper.cpp через CoreML на iOS, ONNX на Android) + ML Kit Translate + системний TTS. Затримка 3–6 секунд замість 1,5, але працює без мережі.
Whisper tiny/base на iPhone 13 через CoreML — близько 2 секунд на 5-секундний фрагмент. Прийнятно для туристичного сценарію.
Що входить у роботу
- Інтеграція STT, Translation, TTS з управлінням аудіосесією
- Налаштування VAD та pipeline parallelism
- Обробка обриву мережі та офлайн-режим
- Базовий UI з відображенням вихідного та перекладеного тексту
- Документація з інтеграції та тестові сценарії
- Підтримка протягом 2 тижнів після здачі
- Вартість інтеграції одного хмарного сервісу від $2000, крос-платформена версія від $5000
Терміни та вартість
Потоковий переклад мови з хмарними сервісами на одній платформі — 2–4 тижні. Крос-платформена реалізація на Flutter з нативними аудіо-мостами — 3–5 тижнів. Вартість розраховується індивідуально залежно від набору мовних пар та вимог до якості синтезу.
Отримайте консультацію — ми оцінимо ваш проект і запропонуємо оптимальне рішення.
Наш досвід та гарантії
Наша команда має 5+ років досвіду в мобільній розробці та реалізувала 40+ проектів з голосовими інтерфейсами. Ми гарантуємо наскрізну затримку не більше 3 секунд на підтримуваних пристроях. Сертифіковані нативні аудіо-мости для iOS та Android забезпечують коректну роботу AEC.
Типові помилки при реалізації:
- Пропуск налаштування аудіосесії: ехо та дублювання транскрипції.
- Використання непотокового STT (Whisper API) — затримка 10+ секунд.
- Відсутність кешування TTS — повторний синтез однакових фраз.
- Неврахування стану мережі — обрив призводить до втрати контексту.
Отримайте консультацію — приклад реалізації та оцінка вашого проекту за 1 день.







