Дата публикации
ai_products

Как собрать живой синхронный перевод с AI‑аватаром на Azure Speech: разбор готового проекта

Что нового

Microsoft показала рабочий пример приложения, которое делает синхронный перевод речи и сразу озвучивает его через AI‑аватара в браузере.

Ключевые вещи, которые здесь появляются в связке:

  1. Реальный синхронный перевод речи → речь

    • Вход: голос спикера на одном языке.
    • Выход: перевод в текст и озвучка на другом языке.
    • Всё происходит в реальном времени, без предварительной записи.
  2. Аватар, который говорит на нужном языке

    • Лицо и губы аватара синхронизированы с синтезированной речью.
    • Слушатель видит не субтитры, а «живого» ведущего на своём языке.
  3. Разделение интерфейсов спикера и слушателя

    • У спикера — панель управления с настройкой сессии, языков, аватара и статистикой.
    • У слушателя — только аватар, звук и субтитры, без лишних контролов.
  4. Многопользовательские сессии

    • Один спикер создаёт сессию, к ней подключаются десятки и сотни слушателей по URL вида /listener/123456.
    • Для каждой сессии можно задать свой набор языков и аватар.
  5. Готовый открытый код

    • Бэкенд на Flask + Flask‑SocketIO.
    • Клиент на Web Audio API + WebRTC.
    • Публичный репозиторий GitHub: github.com/l-sudarsan/avatar-translation.

Цифр по задержке, стоимости запроса или лимитам контекста Microsoft в примере не даёт, но по стеку понятно: задержка определяется Azure Speech Translation и WebRTC‑потоком аватара.


Как это работает

Проект собирает несколько сервисов Azure Speech в одну цепочку: распознавание, перевод, синтез речи и аватар через WebRTC.

Архитектура сессий

Приложение делит пользователей на две роли:

  • Speaker (спикер) — создаёт и настраивает сессию.
  • Listener (слушатель) — подключается по коду сессии и смотрит/слушает аватара.

Сервер на Flask хранит состояние сессий в памяти. Пример структуры:

# Session structure
sessions = {
    "123456": {
        "name": "Q1 Townhall",
        "source_language": "en-US",
        "target_language": "ja-JP",
        "avatar": "lisa",
        "listeners": set(),
        "is_translating": False
    }
}
``

Каждая сессия имеет:
- имя (например, «Q1 Townhall»),
- язык оригинала (например, `en-US`),
- язык перевода (например, `ja-JP`),
- выбранного аватара (например, `lisa`),
- список слушателей,
- флаг, идёт ли сейчас перевод.

### 1. Бэкенд: Flask + Socket.IO

Сервер выполняет три роли:

1. **HTTP‑API**
   - Создание и конфигурация сессий.
   - Выдача URL для слушателей.
   - Обмен SDP/ICE‑данными для WebRTC с Azure Avatar Service.

2. **WebSocket‑шина (Flask‑SocketIO)**
   - Принимает аудиоданные от спикера.
   - Рассылает результаты перевода всем слушателям в комнате сессии.

3. **Хранилище сессий**
   - В памяти процесса Flask (подходит для демо и пилотов).

Используется Eventlet как async‑воркер, чтобы поддерживать WebSocket‑подключения.

### 2. Захват аудио в браузере

Микрофон подключается не на сервере, а в браузере спикера через Web Audio API. Это снимает вопросы с правами доступа к оборудованию на стороне сервера.

```javascript
// Speaker captures microphone at 16kHz
const audioContext = new AudioContext({ sampleRate: 16000 });
const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });

// Process audio and send via Socket.IO
processor.onaudioprocess = (event) => {
    const pcmData = convertToPCM16(event.inputBuffer);
    socket.emit('audioData', { sessionId, audioData: pcmData });
};

Ключевые моменты:

  • частота дискретизации 16 kHz — стандарт для Azure Speech;
  • данные конвертируются в PCM16 и отправляются в реальном времени по Socket.IO.

3. Azure Speech Translation на сервере

Сервер принимает аудиочанки от спикера и подаёт их в TranslationRecognizer через PushAudioInputStream.

# Configure translation
translation_config = speechsdk.translation.SpeechTranslationConfig(
    subscription=SPEECH_KEY,
    region=SPEECH_REGION
)
translation_config.speech_recognition_language = "en-US"
translation_config.add_target_language("ja")

# Push audio stream
push_stream = speechsdk.audio.PushAudioInputStream()
audio_config = speechsdk.audio.AudioConfig(stream=push_stream)

# Handle recognition results
def on_recognized(evt):
    translation = evt.result.translations["ja"]
    socketio.emit('translationResult', {
        'original': evt.result.text,
        'translated': translation
    }, room=session_id)

Что происходит:

  • SpeechTranslationConfig настраивает язык оригинала и целевой язык.
  • PushAudioInputStream получает аудио из браузера.
  • Обработчик on_recognized забирает оригинальный текст и перевод, и отправляет их по Socket.IO всем слушателям сессии.

4. Подключение к Azure Avatar через WebRTC

Каждый слушатель создаёт свой WebRTC‑peer‑коннект к службе аватаров Azure.

Шаги:

  1. Браузер слушателя создаёт SDP‑offer.
  2. Отправляет его на бэкенд (/api/connectListenerAvatar).
  3. Бэкенд общается с Azure Avatar Service, получает SDP‑answer.
  4. Браузер устанавливает удалённое описание и начинает получать видео.
// Listener connects to avatar
const peerConnection = new RTCPeerConnection(iceConfig);
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);

// Send to Azure Avatar Service
const response = await fetch('/api/connectListenerAvatar', {
    method: 'POST',
    headers: { 'session-id': sessionId },
    body: JSON.stringify({ sdp: offer.sdp })
});

const { sdp: remoteSdp } = await response.json();
await peerConnection.setRemoteDescription({ type: 'answer', sdp: remoteSdp });

Видео аватара идёт напрямую от Azure к слушателю по WebRTC с низкой задержкой.

5. Рассылка перевода и синхронизация

  • Аудио спикера → Azure Speech Translation → текст оригинала + текст перевода.
  • Текст перевода используется для синтеза речи и управления аватаром на стороне Azure.
  • Слушатель получает:
    • видеопоток аватара по WebRTC;
    • текст перевода и оригинала по Socket.IO (субтитры и история).

Отдельные WebRTC‑подключения для каждого слушателя позволяют масштабировать количество зрителей, не превращая один поток в бутылочное горлышко.


Что это значит для вас

Для каких задач это полезно

  1. Глобальные корпоративные встречи

    • Townhall, квартальные апдейты, обращения руководства.
    • Сценарий: руководитель говорит, например, по‑английски, а сотрудники смотрят аватара на немецком, португальском, хинди и т.д.
    • Важно: спикер не отвлекается на переключение языков, всё делает инфраструктура.
  2. Продажи и клиентский сервис

    • Презентации продукта для клиентов из других стран.
    • Переговоры, когда одна сторона не готова говорить на английском.
    • Аватар создаёт ощущение «своего» ведущего, а не сухих субтитров.
  3. Обучение и онбординг

    • Внутренние тренинги для распределённых команд.
    • Обучающие курсы, которые нужно быстро локализовать на несколько языков.
    • Один сценарий — много языков, без переозвучки и пересъёмки.
  4. Здравоохранение

    • Консультации с пациентами, которые не говорят на языке врача.
    • Телемедицина с переводом в реальном времени.
    • Аватар доносит инструкции и объяснения на языке пациента.
  5. Образование и музеи

    • Онлайн‑лекции с одновременным переводом.
    • Интерактивные уроки с «цифровым преподавателем».
    • Музейные туры: посетитель выбирает язык — и получает гида‑аватара.
  6. Медиа и мероприятия

    • Новости с локализованным ведущим для разных регионов.
    • Конференции, продуктовые анонсы, лайв‑стримы с одновременным переводом.

Где это не подойдёт

  1. Критично чувствительные сценарии без права на ошибку

    • Юридические консультации, сложные медицинские решения, переговоры, где важна каждая формулировка.
    • Переводчик‑человек по‑прежнему надёжнее, особенно с юридическими нюансами.
  2. Среды с жёсткими требованиями к приватности

    • Всё завязано на Azure Speech, то есть голос уходит в облако Microsoft.
    • Для закрытых контуров с офлайн‑обработкой этот стек не подойдёт.
  3. Проекты без бюджета на Azure

    • Нужна подписка Azure Speech Service.
    • Перевод, TTS и аватар тарифицируются по своим прайс‑листам.

Доступность в России

Azure официально не ориентирован на российских заказчиков, оплата и регистрация аккаунта могут потребовать зарубежный платёжный метод и юрлицо.

Если вы находитесь в России, скорее всего придётся использовать VPN для доступа к Azure‑порталу и части API. Для продакшн‑использования это надо учитывать с точки зрения юридических и технических рисков.


Место на рынке

Проект работает поверх Azure Speech Services и Azure Avatar, поэтому корректнее сравнивать именно эти сервисы, а не демо‑приложение.

По типу решения

  • Azure Speech + Avatar — полный стек: распознавание, перевод, синтез речи и аватар.
  • Google Cloud Speech / Translate — есть распознавание и перевод, есть TTS, но нет прямого эквивалента Azure Avatar с готовыми лицами и WebRTC‑стримингом.
  • Amazon Transcribe / Translate / Polly — похожий набор для речи и перевода, но без готового сервиса аватаров.

У Microsoft важное отличие — официальный сервис аватаров, который можно подключить как управляемый WebRTC‑поток, а не собирать пайплайн из сторонних движков анимации.

По техническим параметрам

В примере указываются конкретные настройки, но без числовых сравнений с конкурентами:

  • частота дискретизации аудио: 16 kHz;
  • поддержка нескольких целевых языков через add_target_language;
  • WebRTC‑стриминг с ICE/TURN‑конфигурацией.

Так как нет данных по задержке «микрофон → аватар», точности перевода и ценам относительно, например, Google Cloud или Amazon, сравнивать скорость или стоимость некорректно. На практике метрики будут зависеть от выбранных языков, региона Azure и нагрузки.


Установка

Проект выложен на GitHub и разворачивается локально за несколько шагов.

Предварительные требования

  • Python 3.8+
  • Подписка на Azure Speech Service (нужны SPEECH_REGION и SPEECH_KEY)
  • Современный браузер: Chrome, Edge или Firefox

Как запустить

# Clone the repository
git clone https://github.com/l-sudarsan/avatar-translation.git
cd avatar-translation

# 1. Create and activate virtual environment
python -m venv venv
.\venv\Scripts\Activate

# 2. Install dependencies
pip install -r requirements.txt

# 3. Configure Azure credentials
cp .env.example .env
# Edit .env with your SPEECH_REGION and SPEECH_KEY

# 4. Run the application
python -m flask run --host=0.0.0.0 --port=5000

Сценарий демо

  1. Откройте http://localhost:5000/speaker.
  2. Создайте сессию: задайте имя, язык оригинала, язык перевода и аватара.
  3. Нажмите Create Session и скопируйте URL слушателя.
  4. Откройте URL слушателя в другом браузере или на другом устройстве.
  5. Подождите, пока аватар подключится (должно появиться видео).
  6. Начните говорить — слушатель увидит аватара и текст переводов.

Совет: для лучшего эффекта откройте интерфейс слушателя на отдельном устройстве. Иначе звук от аватара может попасть обратно в микрофон спикера и создать эхо.


Кастомные аватары и этика

Azure позволяет не только использовать готовых аватаров, но и обучить собственного под бренд.

Как создать кастомный аватар

  1. Запросить доступ

    • Отправить форму в Microsoft на одобрение использования кастомных аватаров.
  2. Записать тренировочные данные

    • Снять минимум 10 минут видео с человеком, который станет «лицом» аватара.
  3. Получить согласие

    • Записать отдельное видео, где человек явно подтверждает согласие на использование его внешности.
  4. Обучить модель

    • Загрузить данные в Microsoft Foundry Portal и запустить обучение аватара.
  5. Задеплоить

    • Привязать обученный аватар к вашему ресурсу Azure Speech и использовать его в приложениях.

Ответственное использование

Создание цифрового двойника человека — чувствительная тема, Microsoft отдельно подчёркивает требования:

  • всегда получать явное письменное согласие;
  • объяснять, как именно будет использоваться аватар и где он появится;
  • не использовать технологию для обмана, дезинформации и незаконного маскарада;
  • соблюдать официальные гайдлайны Responsible AI для голоса и аватаров.

Если вы планируете коммерческий проект с кастомными лицами, лучше сразу заложить юридическую проверку договоров и сценариев использования.


Что в итоге

Этот пример от Microsoft — не просто демо, а рабочий шаблон, как собрать живой синхронный перевод с аватаром на стеке Azure:

  • браузер спикера отдаёт аудио через Web Audio API;
  • Flask‑бэкенд прокидывает звук в Azure Speech Translation;
  • переводы и оригинальный текст раздаются слушателям по Socket.IO;
  • аватар транслируется каждому слушателю по WebRTC;
  • всё это обёрнуто в понятную модель «спикер / слушатель» с сессиями.

Если вам нужно быстро проверить идею «цифрового переводчика‑ведущего» — этот репозиторий даёт готовый старт: можно развернуть локально, подключить свои ключи Azure и адаптировать интерфейс под свои сценарии.


Читайте также

Как собрать живой синхронный перевод с AI‑аватаром на Azure Speech: разбор готового проекта — VogueTech | VogueTech