Реализация Multi-Speaker TTS (несколько голосов в одной системе)

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация Multi-Speaker TTS (несколько голосов в одной системе)
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Реализация Multi-Speaker TTS (несколько голосов в одной системе)

Multi-Speaker TTS — система, в которой несколько голосов сосуществуют в рамках одной архитектуры. Необходима для аудиокниг с несколькими персонажами, диалоговых сценариев, IVR с разными ролями.

Архитектура multi-speaker системы

from dataclasses import dataclass
from enum import Enum

class SpeakerRole(Enum):
    ASSISTANT = "assistant"
    NARRATOR = "narrator"
    CHARACTER_1 = "character_1"
    CHARACTER_2 = "character_2"

@dataclass
class Speaker:
    role: SpeakerRole
    name: str
    voice_config: dict
    reference_audio: str | None = None

class MultiSpeakerTTS:
    def __init__(self, speakers: list[Speaker]):
        self.speakers = {s.role: s for s in speakers}
        self._init_engines()

    def synthesize(self, text: str, role: SpeakerRole) -> bytes:
        speaker = self.speakers[role]
        return self._synthesize_with_config(text, speaker.voice_config)

Реализация на XTTS v2

from TTS.api import TTS

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to("cuda")

# Предзагружаем speaker latents для скорости
SPEAKERS = {
    "narrator": "voices/narrator.wav",
    "alice": "voices/alice.wav",
    "bob": "voices/bob.wav",
}

def synthesize_dialog(dialog: list[dict]) -> list[bytes]:
    """
    dialog: [{"speaker": "alice", "text": "Привет!"},
              {"speaker": "bob", "text": "Здравствуй!"}]
    """
    results = []
    for line in dialog:
        speaker_wav = SPEAKERS[line["speaker"]]
        wav = tts.tts(
            text=line["text"],
            speaker_wav=speaker_wav,
            language="ru"
        )
        results.append(wav)
    return results

Облачный multi-speaker через Azure

Azure Neural TTS поддерживает несколько голосов в одном SSML-документе:

<speak version='1.0' xml:lang='ru-RU'>
  <voice name='ru-RU-DmitryNeural'>
    Добрый день! Это Дмитрий.
  </voice>
  <break time='300ms'/>
  <voice name='ru-RU-SvetlanaNeural'>
    Привет! А это Светлана.
  </voice>
</speak>

Монтаж диалога

from pydub import AudioSegment

def assemble_dialog(audio_clips: list[bytes], pause_ms: int = 300) -> bytes:
    combined = AudioSegment.empty()
    silence = AudioSegment.silent(duration=pause_ms)

    for i, clip in enumerate(audio_clips):
        segment = AudioSegment.from_wav(io.BytesIO(clip))
        combined += segment
        if i < len(audio_clips) - 1:
            combined += silence

    output = io.BytesIO()
    combined.export(output, format="mp3")
    return output.getvalue()

Сроки: multi-speaker система на облаке — 2–3 дня. Self-hosted с управлением голосами — 1 неделя.