Озвучка текста в 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.