Реализация AI-перевода речи в реальном времени в мобильном приложении
Перевод речи в реальном времени — это пайплайн из трёх независимых задержек: захват аудио → транскрипция → перевод → синтез голоса. Сквозная задержка от конца фразы до звука перевода в хорошей реализации — 1,5–3 секунды. В плохой — 8–15 секунд, и это уже неюзабельно для живого разговора.
Архитектура пайплайна
Микрофон → 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 активирует эхоподавление. Без него перевод из динамика попадёт обратно в микрофон и пойдёт на второй круг транскрипции.
Реализация на 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-результаты во время проигрывания аудио
На практике второй вариант надёжнее, так как не создаёт неловких пауз.
Провайдеры под разные языковые пары
| Направление | STT | Translation | TTS |
|---|---|---|---|
| ru → en | Deepgram Nova-2 | DeepL | OpenAI TTS (alloy) |
| en → ru | Deepgram Nova-2 | DeepL/Google | Yandex SpeechKit |
| 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-секундный фрагмент. Приемлемо для туристического сценария.
Сроки
Потоковый перевод речи с облачными сервисами на одной платформе — 2–4 недели. Это включает интеграцию STT, translation, TTS, управление аудиосессией, обработку обрыва сети, базовый UI. Кросс-платформенная реализация на Flutter с нативными аудио-мостами — 3–5 недель.







