РУКОВОДСТВО

Озвучка текста в OBS: пусть стрим говорит любой текст

OBS Studio сама не читает текст вслух: она показывает и микширует то, что ей дают. Чтобы добавить голос, нужно дать ей звук — заранее озвученные клипы или файл, который скрипт озвучивает на лету и просит OBS проиграть. С OBS 28 сервер obs-websocket встроен, поэтому скрипт на том же ПК управляет источником без всяких плагинов.

В руководстве — оба способа с бесплатным движком SuperClonica, который озвучивает текст офлайн на вашем стрим-ПК. Мы проверили скрипт на протоколе obs-websocket: для каждой строки он задаёт файл источника мультимедиа и перезапускает его.

Готовые фразы: источник мультимедиа и горячая клавиша

Фразы, которые звучат снова и снова, вроде «отойду на минуту» или приветствия, озвучьте один раз: superclonica --text "Отойду на минуту, не расходитесь!" --voice F1 --lang ru --output brb.wav. В OBS добавьте Media Source («Источник мультимедиа»), выберите файл, включите перезапуск воспроизведения при активации источника и назначьте источнику горячую клавишу показа в настройках горячих клавиш. При каждом нажатии фраза звучит. Названия пунктов в локализованном интерфейсе OBS могут немного отличаться.

Любой текст вживую: скрипт и obs-websocket

В OBS откройте Tools → WebSocket Server Settings («Инструменты» → настройки сервера WebSocket), включите сервер и запомните пароль. Добавьте в сцену источник мультимедиа с именем TTS, файл оставьте пустым. Затем установите два пакета:

pip install superclonica-cpu obsws-python

Сохраните скрипт как obs_say.py:

import os, sys, wave
import numpy as np
import obsws_python as obs
from superclonica import Superclonica

SOURCE = "TTS"  # the name of a Media Source in your scene
VOICE = os.environ.get("TTS_VOICE", "F1")  # M1..M5, F1..F5 or a voice file from the catalog
LANGUAGE = os.environ.get("TTS_LANGUAGE", "en")
FILES = [os.path.abspath("tts-a.wav"), os.path.abspath("tts-b.wav")]

tts = Superclonica()
client = obs.ReqClient(host="localhost", port=4455, password=os.environ.get("OBS_PASSWORD", ""), timeout=5)

def save(path, audio, rate):
    pcm = (np.clip(np.asarray(audio, dtype=np.float32).reshape(-1), -1, 1) * 32767).astype(np.int16)
    with wave.open(path, "wb") as file:
        file.setnchannels(1)
        file.setsampwidth(2)
        file.setframerate(rate)
        file.writeframes(pcm.tobytes())

def say(text, turn):
    path = FILES[turn % 2]  # two files, so OBS never reads the one being written
    audio, rate = tts.synthesize(text, voice=VOICE, lang=LANGUAGE)
    save(path, audio, rate)
    client.set_input_settings(SOURCE, {"local_file": path}, True)
    client.trigger_media_input_action(SOURCE, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART")

for turn, line in enumerate(sys.stdin):
    if line.strip():
        say(line.strip(), turn)

Запустите его с паролем в переменной OBS_PASSWORD и вводите строки или передавайте ему текст из чат-бота:

python obs_say.py

Каждая строка озвучивается в WAV, источник TTS получает этот файл, и OBS проигрывает его с начала. Скрипт чередует два файла, чтобы OBS никогда не читала файл, который в этот момент записывается.

Выберите голос

На странице любого голоса в каталоге вставьте типичную фразу, от 30 до 100 символов, выберите язык и нажмите «Озвучить». Через несколько секунд услышите, как будет звучать стрим, без регистрации. В TTS_VOICE укажите один из десяти встроенных голосов, M1–M5 и F1–F5, или путь к файлу голоса из каталога, а в TTS_LANGUAGE — любой из 31 языка, например ru; китайский пока не поддерживается.

Держите под контролем

Если текст присылают зрители, озвучивайте только награды, биты или донаты, ограничьте длину, фильтруйте ссылки и оскорбления и держите клавишу отключения звука источника TTS. Голоса персонажей сделаны фанатами и подходят для развлечения на стриме в рамках условий SuperClonica, но никогда не давайте чату говорить голосом, имитирующим реального человека. Про сторону чата — наше руководство по озвучке чата Twitch.