Интеграция api
Планируется разработать локальную систему для синтеза речи (TTS) с использованием голосов Яндекса. Мы будем создавать свой собственный локальный сервер, который будет обрабатывать запросы и взаимодействовать с Яндексом через WebSocket.
Архитектура и схема
Локальный сервер:
Мы создаём WebSocket сервер, который будет работать на порту
127.0.0.1:8080
(или другом доступном порту). Этот сервер будет обрабатывать запросы от клиентской части, например, от интерфейса пользователя (GUI).Сервер будет принимать JSON-запросы от клиента, такие как:
{ "guid": "uuid", "text": "Привет", "voice": "Alice" }
Эти запросы будут передаваться в неофициальное API Яндекса для генерации аудиопотока.
Подключение к Яндексу:
Мы будем подключаться к закрытому серверу Яндекса
wss://uniproxy.alice.yandex.net/uni.ws
через WebSocket. Это API используется для получения аудио в формате Opus.Анонимная сессия: Подключение будет происходить с использованием анонимной сессии через метод
create_anonymous
, генерируя необходимые токены и идентификаторы для аутентификации.Перед подключением необходимо получить временные идентификаторы и токен доступа.
Для этого вызывается скрытый метод:https://vc.go.mail.ru/account/create_anonymous
Пример ответа:
{ "result": { "session_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "account_id": "xxxxxx", "session_secret": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" } }
Используется:
session_secret
→ в заголовкахAuthorization
иX-UPRX-AUTH-TOKEN
session_id
иaccount_id
→ для синхронизации состояния (SynchronizeState)
Для установления соединения требуются следующие заголовки:
Origin: https://yandex.ru User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 YaBrowser/25.8.0.0 Safari/537.36 X-UPRX-APP-ID: YaBro X-UPRX-APP-VERSION: 25.0.0.0 X-UPRX-OS-VERSION: 10.0.22631 X-UPRX-PLATFORM: Windows X-UPRX-SPEECHKIT-VERSION: UltraHigh X-UPRX-UUID: <UUID v4> X-UPRX-AUTH-TOKEN: <session_secret> Authorization: Bearer <session_secret>
Ключевые моменты:
Все
X-UPRX-*
заголовки обязательны.X-UPRX-UUID
генерируется какUUID v4
для каждой сессии.Authorization
иX-UPRX-AUTH-TOKEN
содержат одно и то же значение (session_secret
).Без этих заголовков соединение не принимается сервером.
Протокол сообщений:
Процесс взаимодействия с сервером будет следующим:
StreamControl: Инициализация потока.
SynchronizeState: Синхронизация состояния с сервером.
GenerateTTS: Отправка текста на озвучку.
Ответ от сервера: Speak, Opus аудиофайл, SpeechFinished.
Сервер возвращает бинарный аудиофайл в формате Opus, который мы будем декодировать в PCM (24000 Hz, 16 бит) и отправлять на проигрывание.
Схема архитектуры
Вот схема работы системы:
+------------------+
| Клиент (GUI) |
+--------+---------+
|
| JSON-запрос
▼
+--------------------------+
| Локальный WebSocket сервер |
| 127.0.0.1:8080/Chat |
+-----------+--------------+
|
| WebSocket-соединение
▼
+------------------------------+
| Сервер Яндекса (API) |
| wss://uniproxy.alice.yandex.net |
+------------------------------+
|
| Ответ: Opus аудиофайл
▼
+-------------------------------+
| Локальный HTTP-сервер |
| 127.0.0.1:4848/Plugin/Speech |
+-------------------------------+
|
| Проигрывание аудио
▼
+-------------------------+
| Проигрыватель |
+-------------------------+
Что нужно для реализации:
WebSocket клиент:
Разработаем WebSocket клиент для взаимодействия с сервером Яндекса. Он будет использовать анонимную сессию, как в MiniChat, с генерацией UUID и токенов.
Декодер Opus → PCM:
Применим декодирование аудиопотока в формат PCM (24000 Hz, 16 бит), чтобы воспроизвести звук на локальном плеере.
Голоса:
Для синтеза речи будут использоваться голоса, доступные через неофициальное API (Алиса, Маруся, Максим, Татьяна).
Ограничения и риски:
Это неофициальное API, что означает, что в будущем доступ к нему может быть ограничен или закрыт.
Мы можем столкнуться с ограничениями по количеству запросов или времени жизни сессии.
На данный момент доступны только несколько голосов.
Задача
Необходимо реализовать локальный сервер, который будет:
Принимать запросы от клиента (GUI) в формате JSON.
Подключаться к серверу Яндекса для получения аудиопотока.
Обрабатывать полученные данные и передавать их на проигрывание через локальный плеер.