ガイド

OBSで音声読み上げ:配信にどんな文でもしゃべらせる

OBS Studioは自分では文字を読み上げず、渡されたものを表示してミックスするだけです。声を加えるには音声を渡します。事前に用意したクリップか、スクリプトがその場で音声にしてOBSに再生させるファイルです。OBS 28からはobs-websocketサーバーが組み込まれているので、同じPCのスクリプトがプラグインなしでソースを操作できます。

このガイドでは、配信用PCでオフラインのまま読み上げる無料のSuperClonicaエンジンで両方の方法を紹介します。スクリプトはobs-websocketのプロトコルで動作を確認済みで、1行ごとにメディアソースのファイルを設定して再生し直します。

決まったセリフ:メディアソースとホットキー

「ちょっと離席します」やあいさつなど何度も使うセリフは、一度だけ音声にしておきます:superclonica --text "ちょっと離席します、少々お待ちください!" --voice F1 --lang ja --output brb.wav。OBSでメディアソース(Media Source)を追加してファイルを選び、ソースがアクティブになったときに再生をやり直す設定をオンにし、ホットキー設定でそのソースに表示用のキーを割り当てます。押すたびにセリフが流れます。日本語版OBSではメニュー名が少し異なる場合があります。

どんな文でもライブで:スクリプトとobs-websocket

OBSでTools → WebSocket Server Settings(ツール → WebSocketサーバー設定)を開き、サーバーを有効にしてパスワードを控えます。シーンにTTSという名前のメディアソースを追加し、ファイルは空のままにします。次に2つのパッケージをインストールします:

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が最初から再生します。スクリプトは2つのファイルを交互に使うので、OBSが書き込み中のファイルを読むことはありません。

声を選ぶ

カタログのどの声のページでも、よく使う文(30〜100文字)を貼り付け、言語を選んで読み上げを押してください。登録なしで数秒で配信の聞こえ方がわかります。TTS_VOICEには標準10音声(M1〜M5、F1〜F5)のどれかかカタログの音声ファイルのパスを、TTS_LANGUAGEには31言語のどれか(例:ja)を指定します。中国語にはまだ対応していません。

きちんと管理する

視聴者が文を送れるなら、読み上げるのはチャンネルポイントの交換、ビッツ、投げ銭だけにし、長さを制限し、リンクや暴言をフィルターし、TTSソースのミュートキーを用意しましょう。キャラクターの声はファンが作ったもので、SuperClonicaの規約の範囲で配信を楽しむには問題ありませんが、実在の人物をまねた声でチャットにしゃべらせてはいけません。チャット側についてはTwitchチャット読み上げのガイドをご覧ください。