Реализация Speech-to-Speech для синхронного перевода
Синхронный перевод — конференции, международные переговоры, прямые эфиры. Требования жёсткие: задержка не более 3–5 секунд, высокая точность терминологии, сохранение темпа речи оратора.
Архитектура синхронного перевода
[Speaker] → WebRTC → VAD → Chunker → STT → MT → TTS → [Listeners]
↓ sliding window (2–4 сек)
Ключевые инженерные решения:
- Sliding window: не ждём конца предложения, переводим скользящим окном в 2–4 секунды
- Anticipation: начинаем TTS до завершения перевода
- Speed normalization: ускоряем TTS, если переводная речь длиннее исходной
Sliding window транскрипция
import asyncio
from collections import deque
class SynchronousTranslator:
def __init__(self, window_sec: float = 3.0, step_sec: float = 1.0):
self.window = window_sec
self.step = step_sec
self.audio_buffer = deque()
self.sample_rate = 16000
async def process_stream(self, audio_generator):
"""Обрабатываем аудио скользящим окном"""
window_samples = int(self.window * self.sample_rate)
step_samples = int(self.step * self.sample_rate)
async for chunk in audio_generator:
self.audio_buffer.extend(chunk)
if len(self.audio_buffer) >= window_samples:
window_audio = list(self.audio_buffer)[:window_samples]
# Сдвигаем буфер на step
for _ in range(step_samples):
if self.audio_buffer:
self.audio_buffer.popleft()
# Транскрибируем и переводим
yield await self.translate_chunk(bytes(window_audio))
Адаптация скорости речи
from pydub import AudioSegment, effects
def adapt_speech_speed(audio: bytes, target_duration_sec: float) -> bytes:
"""Ускоряем/замедляем TTS под темп оригинала"""
segment = AudioSegment.from_wav(io.BytesIO(audio))
current_duration = len(segment) / 1000
if current_duration == 0:
return audio
speed_factor = current_duration / target_duration_sec
speed_factor = max(0.7, min(1.5, speed_factor)) # ограничиваем 0.7–1.5x
# Изменение скорости без изменения питча
adjusted = effects.speedup(segment, playback_speed=speed_factor)
output = io.BytesIO()
adjusted.export(output, format="wav")
return output.getvalue()
Специфика для переговоров
- Предзагружаем терминологический словарь домена переговоров
- Список имён участников для правильного распознавания
- Boosting ключевых терминов в STT
- Промпт для MT с контекстом: отрасль, тип встречи
Сроки: MVP системы синхронного перевода: 4–6 недель. Production с низкой задержкой: 2–3 месяца.







