- Дата публикации
Как собрать живой синхронный перевод с AI‑аватаром на Azure Speech: разбор готового проекта
Что нового
Microsoft показала рабочий пример приложения, которое делает синхронный перевод речи и сразу озвучивает его через AI‑аватара в браузере.
Ключевые вещи, которые здесь появляются в связке:
-
Реальный синхронный перевод речи → речь
- Вход: голос спикера на одном языке.
- Выход: перевод в текст и озвучка на другом языке.
- Всё происходит в реальном времени, без предварительной записи.
-
Аватар, который говорит на нужном языке
- Лицо и губы аватара синхронизированы с синтезированной речью.
- Слушатель видит не субтитры, а «живого» ведущего на своём языке.
-
Разделение интерфейсов спикера и слушателя
- У спикера — панель управления с настройкой сессии, языков, аватара и статистикой.
- У слушателя — только аватар, звук и субтитры, без лишних контролов.
-
Многопользовательские сессии
- Один спикер создаёт сессию, к ней подключаются десятки и сотни слушателей по URL вида
/listener/123456. - Для каждой сессии можно задать свой набор языков и аватар.
- Один спикер создаёт сессию, к ней подключаются десятки и сотни слушателей по URL вида
-
Готовый открытый код
- Бэкенд на 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.
Шаги:
- Браузер слушателя создаёт SDP‑offer.
- Отправляет его на бэкенд (
/api/connectListenerAvatar). - Бэкенд общается с Azure Avatar Service, получает SDP‑answer.
- Браузер устанавливает удалённое описание и начинает получать видео.
// 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‑подключения для каждого слушателя позволяют масштабировать количество зрителей, не превращая один поток в бутылочное горлышко.
Что это значит для вас
Для каких задач это полезно
-
Глобальные корпоративные встречи
- Townhall, квартальные апдейты, обращения руководства.
- Сценарий: руководитель говорит, например, по‑английски, а сотрудники смотрят аватара на немецком, португальском, хинди и т.д.
- Важно: спикер не отвлекается на переключение языков, всё делает инфраструктура.
-
Продажи и клиентский сервис
- Презентации продукта для клиентов из других стран.
- Переговоры, когда одна сторона не готова говорить на английском.
- Аватар создаёт ощущение «своего» ведущего, а не сухих субтитров.
-
Обучение и онбординг
- Внутренние тренинги для распределённых команд.
- Обучающие курсы, которые нужно быстро локализовать на несколько языков.
- Один сценарий — много языков, без переозвучки и пересъёмки.
-
Здравоохранение
- Консультации с пациентами, которые не говорят на языке врача.
- Телемедицина с переводом в реальном времени.
- Аватар доносит инструкции и объяснения на языке пациента.
-
Образование и музеи
- Онлайн‑лекции с одновременным переводом.
- Интерактивные уроки с «цифровым преподавателем».
- Музейные туры: посетитель выбирает язык — и получает гида‑аватара.
-
Медиа и мероприятия
- Новости с локализованным ведущим для разных регионов.
- Конференции, продуктовые анонсы, лайв‑стримы с одновременным переводом.
Где это не подойдёт
-
Критично чувствительные сценарии без права на ошибку
- Юридические консультации, сложные медицинские решения, переговоры, где важна каждая формулировка.
- Переводчик‑человек по‑прежнему надёжнее, особенно с юридическими нюансами.
-
Среды с жёсткими требованиями к приватности
- Всё завязано на Azure Speech, то есть голос уходит в облако Microsoft.
- Для закрытых контуров с офлайн‑обработкой этот стек не подойдёт.
-
Проекты без бюджета на 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
Сценарий демо
- Откройте
http://localhost:5000/speaker. - Создайте сессию: задайте имя, язык оригинала, язык перевода и аватара.
- Нажмите Create Session и скопируйте URL слушателя.
- Откройте URL слушателя в другом браузере или на другом устройстве.
- Подождите, пока аватар подключится (должно появиться видео).
- Начните говорить — слушатель увидит аватара и текст переводов.
Совет: для лучшего эффекта откройте интерфейс слушателя на отдельном устройстве. Иначе звук от аватара может попасть обратно в микрофон спикера и создать эхо.
Кастомные аватары и этика
Azure позволяет не только использовать готовых аватаров, но и обучить собственного под бренд.
Как создать кастомный аватар
-
Запросить доступ
- Отправить форму в Microsoft на одобрение использования кастомных аватаров.
-
Записать тренировочные данные
- Снять минимум 10 минут видео с человеком, который станет «лицом» аватара.
-
Получить согласие
- Записать отдельное видео, где человек явно подтверждает согласие на использование его внешности.
-
Обучить модель
- Загрузить данные в Microsoft Foundry Portal и запустить обучение аватара.
-
Задеплоить
- Привязать обученный аватар к вашему ресурсу Azure Speech и использовать его в приложениях.
Ответственное использование
Создание цифрового двойника человека — чувствительная тема, Microsoft отдельно подчёркивает требования:
- всегда получать явное письменное согласие;
- объяснять, как именно будет использоваться аватар и где он появится;
- не использовать технологию для обмана, дезинформации и незаконного маскарада;
- соблюдать официальные гайдлайны Responsible AI для голоса и аватаров.
Если вы планируете коммерческий проект с кастомными лицами, лучше сразу заложить юридическую проверку договоров и сценариев использования.
Что в итоге
Этот пример от Microsoft — не просто демо, а рабочий шаблон, как собрать живой синхронный перевод с аватаром на стеке Azure:
- браузер спикера отдаёт аудио через Web Audio API;
- Flask‑бэкенд прокидывает звук в Azure Speech Translation;
- переводы и оригинальный текст раздаются слушателям по Socket.IO;
- аватар транслируется каждому слушателю по WebRTC;
- всё это обёрнуто в понятную модель «спикер / слушатель» с сессиями.
Если вам нужно быстро проверить идею «цифрового переводчика‑ведущего» — этот репозиторий даёт готовый старт: можно развернуть локально, подключить свои ключи Azure и адаптировать интерфейс под свои сценарии.