Реализация мультиязычного синтеза речи
Мультиязычный TTS нужен для международных продуктов: один сервис, несколько языков, единый голосовой бренд. Ключевое требование — сохранение характера голоса при переключении языков.
Стратегии мультиязычного TTS
1. Language-specific модели — лучшее качество, но разные голоса:
TTS_MODELS = {
"ru": "Yandex SpeechKit (alena)",
"en": "OpenAI TTS (alloy)",
"de": "Azure (de-DE-KatjaNeural)",
}
2. XTTS v2 с cross-lingual synthesis — один голос, 17 языков:
from TTS.api import TTS
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to("cuda")
def speak_multilingual(text: str, lang: str, reference_voice: str) -> np.ndarray:
return tts.tts(
text=text,
speaker_wav=reference_voice,
language=lang
)
3. ElevenLabs Multilingual v2 — 29 языков с высоким качеством:
audio = client.text_to_speech.convert(
voice_id="voice_id",
text=text,
model_id="eleven_multilingual_v2",
language_code=lang # auto-detect если не указан
)
Детекция языка и маршрутизация
from langdetect import detect
def synthesize_auto(text: str, voice_config: dict) -> bytes:
lang = detect(text) # ISO 639-1
engine = voice_config.get(lang, voice_config["default"])
return engine.synthesize(text)
Обработка code-switching
Тексты со смешанными языками («наш product manager говорит...»):
def split_by_language(text: str) -> list[tuple[str, str]]:
"""Разбивает текст на сегменты по языку"""
# Простое правило: английские слова в кириллическом тексте
import re
segments = []
parts = re.split(r'(\b[A-Za-z][a-zA-Z\s-]*\b)', text)
for part in parts:
if re.match(r'[A-Za-z]', part):
segments.append(("en", part))
elif part.strip():
segments.append(("ru", part))
return segments
Сроки: мультиязычная система на облачных API — 3–5 дней. Self-hosted XTTS с несколькими голосами — 1–2 недели.







