В инструкции описано, как с помощью Realtime API Foundation Models преобразовать текст в речь. Realtime API работает по протоколу WebSocket: устанавливает соединение с сервером, отправляет запрос на генерацию и получает аудио частями по мере синтеза.
Сохраните сгенерированный API-ключ в переменную окружения API_KEY:
export API_KEY="<api_key>"
Установите библиотеку websocket-client:
pip install websocket-client
Создайте файл, например speech.py, и выполните в нем следующее:
Импортируйте необходимые библиотеки:
import base64import jsonimport osimport wavefrom websocket import create_connection
Задайте параметры подключения и голос озвучки:
api_key = os.environ["API_KEY"]url = "wss://foundation-models.api.cloud.ru/v1/realtime"voice = "<your_voice>"
Где <your_voice> — выбранный голос озвучки. Укажите один из доступных голосов.
Нельзя изменить голос сессии с помощью события session.update после получения первого аудио.
Установите WebSocket-соединение:
ws = create_connection(url,header=[f"Authorization: Bearer {api_key}"],suppress_origin=True,timeout=60,)audio = bytearray()
Отправьте запрос на генерацию речи:
try:ws.send(json.dumps({"type": "response.create","model": "GigaChat/SaluteSpeech","response": {"output_modalities": ["audio"],"audio": {"output": {"format": {"type": "audio/pcm", "rate": 24000},"voice": voice,"speed": 1.0}},"input": [{"type": "message","role": "user","content": [{"type": "input_text", "text": "<text_to_speech>"}]}]}}))
Где <text_to_speech> — текст, который необходимо озвучить.
При синтезе текста учитывайте следующее:
Длина текста для одной генерации не должна превышать 16 384 символа.
Общий объем накопленного диалога не должен превышать 65 536 символов.
Доступные языки озвучки: русский, английский.
Получите аудио и сохраните результат в WAV-файл:
while True:message = ws.recv()if not message:raise RuntimeError("Соединение закрыто до завершения генерации")event = json.loads(message)if event["type"] == "response.output_audio.delta":audio.extend(base64.b64decode(event["delta"]))elif event["type"] == "error":raise RuntimeError(event)elif event["type"] == "response.done":if event.get("response", {}).get("status") in {"failed", "cancelled", "incomplete"}:raise RuntimeError(event)breakfinally:ws.close()if not audio:raise RuntimeError("Сервер не вернул аудио")with wave.open("speech.wav", "wb") as f:f.setnchannels(1)f.setsampwidth(2)f.setframerate(24000)f.writeframes(audio)print("Аудио сохранено в speech.wav")
Выполните команду:
python3 speech.py
Пример вывода:
Аудио сохранено в speech.wav
Файл speech.wav появится в каталоге, из которого запущен скрипт.
В запросе можно использовать один из следующих голосов:
Голос | Описание |
|---|---|
Mer-Operator | Мужской молодой голос с высоким звонким тембром. Быстрый темп речи, ровная интонация без выраженной эмоциональной окраски. |
Kaz-Lifelike | Женский голос. Быстрый темп речи, ровная интонация без выраженной эмоциональной окраски. |
Tsb-Freespeech | Мужской голос. Размеренный темп речи, ровная, четкая интонация. |
Tsb-Hesitating | Мужской голос. Медленный темп речи, ровная, четкая интонация. |
Gli-Operator | Женский молодой голос с высоким звонким тембром. Быстрый темп речи, ровная интонация без выраженной эмоциональной окраски. |
Gli-Freespeech | Женский молодой голос. Размеренный темп речи, ровная, четкая интонация. |
Bab-Debate | Женский голос со средним тембром. Спокойная манера речи с выразительной интонацией. |
Bab-Energetic | Женский голос со средним тембром. Уверенная манера речи. |
Bab-Freespeech | Женский голос со средним тембром. Манера речи дружелюбная и выразительная: интонация живая, с заметными эмоциональными акцентами. |