このプロジェクトは、Discord上で音声読み上げを行うBotです。
Voicevox Engineを使用して、テキストを音声に変換し、Discordのボイスチャットでユーザーの代わりに喋ります。
- Ruby 3.4.2
- Docker
- Docker Compose
- GitHub Actions (Dockerイメージの自動ビルド)
- Discord BotのToken
- Discord BotのClient ID
- Voicevox Engine (Dockerコンテナで起動)
- Redis (話者設定の永続化用)
-
config.ymlを作成し、必要な情報を設定します。config.sample.ymlを参考にしてください。 -
Docker Composeを使用して、BotとVoicevox Engineを起動します。
docker-compose up --build
-
DiscordでBotを招待し、
/pingコマンドを試してみてください。Pong!と返信されれば、Botは正常に動作しています。
このプロジェクトでは、GitHub Actionsを使用してDockerイメージの自動ビルドを行っています。
mainまたはmasterブランチへのプッシュ- タグ付きリリース(
v*形式) - プルリクエスト
- mainブランチ:
ghcr.io/jo3qma/yoursaysan:main - 開発用イメージ:
ghcr.io/jo3qma/yoursaysan:dev - セマンティックバージョン:
ghcr.io/jo3qma/yoursaysan:v1.0.0(タグ付きリリース時) - メジャー・マイナーバージョン:
ghcr.io/jo3qma/yoursaysan:1.0(タグ付きリリース時) - SHAハッシュ:
ghcr.io/jo3qma/yoursaysan:sha-{hash}(コミット時)
-
GitHub Container Registryからイメージを取得:
# 最新のmainブランチのイメージ docker pull ghcr.io/jo3qma/yoursaysan:main # 開発用イメージ docker pull ghcr.io/jo3qma/yoursaysan:dev # 特定のバージョン(例: v1.0.0) docker pull ghcr.io/jo3qma/yoursaysan:v1.0.0
-
ローカルで実行:
# mainブランチのイメージで実行 docker run -d ghcr.io/jo3qma/yoursaysan:main # 開発用イメージで実行 docker run -d ghcr.io/jo3qma/yoursaysan:dev
- GitHub Container Registryへのプッシュには、リポジトリの設定で「Packages」の権限を有効にする必要があります
- プルリクエスト時はイメージのビルドのみ実行され、プッシュは行われません
- Docker / Docker Compose
- VS Code もしくは Cursor の Dev Containers 機能(拡張)
-
エディタでこのリポジトリを開き、「Reopen in Container」を実行します。
- 初回起動時に
bundle installが自動実行され、config.ymlが無ければconfig.sample.ymlから生成されます。
- 初回起動時に
-
環境変数を設定します。以下の環境変数を設定してください:
DISCORD_BOT_TOKEN(必須)DISCORD_CLIENT_ID(必須)DISCORD_OWNER_ID(任意)VOICEVOX_HOST(任意。既定はhttp://voicevox:50021)REDIS_HOST(任意。既定はredis)REDIS_PORT(任意。既定は6379)REDIS_DB(任意。既定は0)
-
コンテナ内ターミナルで Bot を起動します。
ruby run.rb
メモ:
- DevContainer は
.devcontainer/compose.devcontainer.ymlのみで起動します。voicevoxサービスも自動で立ち上がります。 - 各サービスは内部ネットワークで通信するため、ホストへのポート公開は不要です。
Botのログ出力は環境変数で制御できます。
LOG_LEVEL: ログレベルを指定(trace,debug,info,warn,error,fatal)- デフォルト:
info - 本番環境:
info推奨 - 開発環境:
debug推奨 - 詳細なデバッグ:
trace推奨(パフォーマンスに影響する可能性があります)
- デフォルト:
LOG_FORMAT: ログ形式を指定(textまたはjson)- デフォルト:
text - 本番環境:
json推奨(ログ集約システムとの連携に便利)
- デフォルト:
- Trace: 詳細な内部処理(引数、戻り値、内部状態)※本番では使用しない
- Debug: デバッグに有用な情報(コマンド名、ユーザーID、処理開始/終了、メッセージ受信)
- Info: 重要なライフサイクルイベント(起動、停止、接続/切断、VC参加/退出)
- Warn: 異常だが継続可能な状況(デフォルト値の使用、リトライ)
- Error: 処理失敗(ユーザーへの影響あり)
- Fatal: 起動不可能なエラー
- コマンド実行: コマンド名、ギルドID、ユーザーID、チャンネルID(Debugレベル)
- メッセージ受信: ギルドID、チャンネルID、ユーザーID、メッセージID、文字数(Debugレベル)
- 注意: メッセージの内容はプライバシー保護のため記録されません
- 音声生成: 話者ID、音声データサイズ、生成時間(Debug/Traceレベル)
- VC接続: ギルドID、チャンネルID、接続状態(Info/Debugレベル)
.envファイルまたは環境変数で設定:
# 開発環境
LOG_LEVEL=debug
LOG_FORMAT=text
# 本番環境
LOG_LEVEL=info
LOG_FORMAT=jsonbot:
token: <%= ENV['DISCORD_BOT_TOKEN'] %> # Discord BotのToken
client_id: <%= ENV['DISCORD_CLIENT_ID'] %> # Discord BotのClient ID
prefix: '!' # コマンドのプレフィックス
status: '[TESTING] 読み上げBot' # Botのステータス
owner: <%= ENV['DISCORD_OWNER_ID'] || 123456789012345678 %> # BotのオーナーID
voicevox:
max: 50 # 最大文字数
host: <%= ENV['VOICEVOX_HOST'] || 'http://voicevox:50021' %> # Voicevox Engineのホスト
redis:
host: <%= ENV['REDIS_HOST'] || 'redis' %> # Redisのホスト
port: <%= ENV['REDIS_PORT'] || 6379 %> # Redisのポート
db: <%= ENV['REDIS_DB'] || 0 %> # Redisのデータベース番号ユーザーごとにVoiceVoxの話者を設定できます。
- 個人設定: 各ユーザーが自分の好みの話者を設定可能
- 永続化: Redisを使用して話者設定を永続化
- 話者一覧:
/speaker_listコマンドで利用可能な話者を確認 - 設定変更:
/speakerコマンドで話者IDを指定して設定変更
/ping: Botの死活確認を行います。/help: 利用可能なコマンドの一覧を表示します。/invite: Botを他のサーバーに招待するためのURLを表示します。/summon: 読み上げBotをVCに参加させます。/bye: 読み上げBotをVCから退出させます。/reconnect: Discordが調子悪いときなどに、手動で再接続します。/stop: 読み上げを中断します。/speaker: 話者を設定します(例:/speaker 2)。/speaker_list: 利用可能な話者の一覧を表示します。