このあたりは全くやったことない分野のため、正直よくわからないす。
でもとりあえずやってみることで何かひらめきがあると思います。
ちなみに、今回は配信ソフトやプログラムなどの設定です。
実際にAI Tuberに喋ってもらうのは次回になりそうです。
仮想マイクと配信ソフトのインストール
Youtube配信のための準備として、仮想マイクと配信ソフトをインストールします。
インストールだけなら迷うことはないですね。
仮想マイク
仮想マイクのソフト『VB-AUDIO』をインストールします。
インストールが完了するとデバイスが表示されます。

配信ソフト
配信ソフト『OBS Studio』をインストールします。
インストール後、Youtubeアカウントと接続します。

久しぶりにYoutubeアカウントを使いますので、過去に公開していた謎動画は非公開に・・と。
配信ソフトの設定
初めて配信ソフトを使うのでどういったものか分かりませんがやってみます。
基本操作の確認
画面にテキスト配置

演出家っぽい。
マイク音声を先ほどインストールした仮想マイクに設定

Pythonプログラムと配信ソフトの接続
Pythonプログラムで出力した文字を配信ソフトに表示させるための設定をします。
まずは、配信ソフト側でWebSoketサーバーを起動させます。
↓表示される接続情報はPythonプログラム側で必要になるので控えておきます。

配信ソフト(OBS)を操作するPythonプログラム作成
こんな感じのコードを作りました。
配信ソフトの画面に、質問者からのQuestionと回答のAnswerを表示するプログラムです。
import obsws_python as obs
import os
import dotenv
dotenv.load_dotenv()
password = os.environ.get("OBS_WS_PASSWORD")
host = os.environ.get("OBS_WS_HOST")
port = os.environ.get("OBS_WS_PORT")
class OBSAdapter:
def __init__(self) -> None:
# 設定されていない場合はエラー
if(password == None or host == None or port == None):
raise Exception("OBSの設定がされていません")
self.ws = obs.ReqClient(host=host, port=port, password=password)
def set_question(self, text: str):
self.ws.set_input_settings(name="Question", settings={"text": text}, overlay=True)
def set_answer(self, text: str):
self.ws.set_input_settings(name="Answer",settings={"text": text}, overlay=True)
Youtubeからコメントを取得するプログラム
次に、Youtubeに入力されたコメントを拾ってくるプログラムを作ります。
コメントに対して、OpenAIで応答を作り、それを配信ソフトに表示する、この一連の流れの最初の部分ですね。
こんな感じのコードです↓
import pytchat
import json
class YoutubeCommentAdapter:
def __init__(self, video_id) -> None:
self.chat = pytchat.create(video_id=video_id, interruptable=False)
def get_comment(self):
# コメントを一括で取得
comments = self.__get_comments()
if(comments == None):
return None
comment = comments[-1] # 最新のコメント
# コメントの情報の中からコメントのみを取得
message = comment.get("message")
return message
def __get_comments(self):
if(self.chat.is_available()==False):
print("開始していません")
return None
comments = json.loads(self.chat.get().json())
if(comments == []):
print("コメントが取得できませんでした。")
return None
return comments
if __name__ == "__main__":
import time
video_id = "任意のvideo_id"
chat = YoutubeCommentAdapter(video_id)
time.sleep(1) # コメント取得のため少し待つ
print(chat.get_comment())
今まで作ったプログラムをつなげる&実行するプログラム
今まで個別にプログラムを作ってきました。
①Youtubeコメントを取得するプログラム
②OpenAIから応答をもらうプログラム
③テキストを音声に変換するプログラム
④テキストを配信ソフトに表示させるプログラム
これらをつなぎ合わせるプログラムを作ります。
こんな感じ↓
import random
from obs_adapter import OBSAdapter
from voicevox_adapter import VoicevoxAdapter
from openai_adapter import OpenAIAdapter
from youtube_comment_adapter import YoutubeCommentAdapter
from play_sound import PlaySound
from dotenv import load_dotenv
load_dotenv()
import os
class AITuberSystem:
def __init__(self) -> None:
video_id = os.getenv("YOUTUBE_VIDEO_ID")
self.youtube_comment_adapter = YoutubeCommentAdapter(video_id)
self.openai_adapter = OpenAIAdapter()
self.voicevox_adapter = VoicevoxAdapter()
self.obs_adapter = OBSAdapter()
self.play_soound = PlaySound(output_device_name="CABLE Input")
pass
def talk_with_comment(self) -> bool:
print("コメントを読み込みます…")
comment = self.youtube_comment_adapter.get_comment()
if comment == None:
print("コメントがありませんでした。")
return False
response_text = self.openai_adapter.create_chat(comment)
data,rate = self.voicevox_adapter.get_voice(response_text)
self.obs_adapter.set_question(comment)
self.obs_adapter.set_answer(response_text)
self.play_soound.play_sound(data,rate)
return True
上記のプログラムは、talk_with_commentというメソッドを実行することで、Youtubeコメントを読み込み一連の処理を連携するものです。
talk_with_commentを5秒おきとかに実行するためのプログラムを別途作ります。
こんな感じ↓
import time
from aituber_system import AITuberSystem
import traceback
aituber_system = AITuberSystem()
while True:
try:
aituber_system.talk_with_comment()
time.sleep(5)
except Exception as e:
print("エラーが発生しました")
print(traceback.format_exc())
print(e)
exit(200)
これであとは、ライブ配信の設定をするだけですね。
Youtubeライブ配信について
ライブ配信を初めて行うには時間が必要らしい。

24時間後にもういっちょチェックしますか。
コメント