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チャット読み上げのガイドをご覧ください。