Texto a voz en OBS: haz que tu directo diga cualquier texto
OBS Studio no lee texto en voz alta por sí mismo: muestra y mezcla lo que le das. Para añadir una voz le das audio, ya sean clips generados de antemano o un archivo que un script genera al momento y pide a OBS que reproduzca. Desde OBS 28 el servidor obs-websocket viene integrado, así que un script en el mismo PC controla una fuente sin ningún plugin.
Esta guía muestra ambas formas con el motor gratuito de SuperClonica, que pone voz al texto sin conexión en tu PC de streaming. Probamos el script contra el protocolo de obs-websocket: para cada línea cambia el archivo de una fuente multimedia y la reinicia.
Frases fijas: fuente multimedia y atajo
Las frases que usas una y otra vez, como «vuelvo enseguida» o un saludo, genéralas una vez: superclonica --text "Vuelvo enseguida, ¡id a por algo de picar!" --voice F1 --lang es --output brb.wav. En OBS añade una fuente multimedia (Media Source), elige el archivo, activa reiniciar la reproducción cuando la fuente se activa y dale a la fuente un atajo de mostrar en la configuración de atajos. Cada vez que lo pulses, suena la frase. Los nombres de los menús pueden variar un poco en la interfaz traducida de OBS.
Cualquier texto en vivo: un script y obs-websocket
En OBS abre Tools, WebSocket Server Settings (Herramientas, configuración del servidor WebSocket), activa el servidor y anota la contraseña. Añade a tu escena una fuente multimedia llamada TTS y deja el archivo vacío. Después instala los dos paquetes:
pip install superclonica-cpu obsws-python
Guarda el script como 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)Ejecútalo con la contraseña en OBS_PASSWORD y escribe líneas, o pásale texto desde tu bot de chat:
python obs_say.py
Cada línea se genera en un WAV, la fuente TTS recibe ese archivo y OBS lo reproduce desde el principio. El script alterna dos archivos para que OBS nunca lea uno mientras se escribe.
Elige la voz
En la página de cualquier voz del catálogo, pega una frase típica, de 30 a 100 caracteres, elige el idioma y pulsa Generar. En unos segundos oyes cómo sonará tu directo, sin cuenta. Pon en TTS_VOICE una de las diez voces de serie, de M1 a M5 y de F1 a F5, o la ruta de un archivo de voz del catálogo, y en TTS_LANGUAGE cualquiera de los 31 idiomas, por ejemplo es; el chino aún no está disponible.
Mantenlo bajo control
Si los espectadores pueden enviar texto, genera voz solo para canjes, bits o donaciones, limita la longitud, filtra enlaces e insultos y ten una tecla para silenciar la fuente TTS. Las voces de personajes las hacen fans y están bien para divertirse en directo dentro de las condiciones de SuperClonica, pero nunca dejes que el chat hable con una voz que imite a una persona real. Nuestra guía de TTS para el chat de Twitch cubre la parte del chat.