このプロジェクトは、Discord上で音声読み上げを行うBotです。
Voicevox Engineを使用して、テキストを音声に変換し、Discordのボイスチャットでユーザーの代わりに喋ります。
- Go 1.25
- Docker
- Docker Compose
- GitHub Actions (Dockerイメージの自動ビルド)
- Discord BotのToken
- Discord BotのClient ID
- Voicevox Engine (Dockerコンテナで起動)
- Redis (話者設定の永続化用)
-
.envファイルを作成し、必要な環境変数を設定します。DISCORD_BOT_TOKEN=your_bot_token DISCORD_CLIENT_ID=your_client_id
-
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」を実行します。
- 初回起動時に
go mod downloadが自動実行されます。
- 初回起動時に
-
環境変数を設定します。以下の環境変数を設定してください:
DISCORD_BOT_TOKEN(必須)DISCORD_CLIENT_ID(必須)DISCORD_OWNER_ID(任意)VOICEVOX_HOST(任意。既定はhttp://voicevox:50021)REDIS_HOST(任意。既定はredis)REDIS_PORT(任意。既定は6379)REDIS_DB(任意。既定は0)
-
コンテナ内ターミナルで Bot を起動します。
go run ./cmd/bot
メモ:
- 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の設定は環境変数で行います。.envファイルを作成することで、自動的に読み込まれます。
必須環境変数:
DISCORD_BOT_TOKEN— Discord Bot トークンDISCORD_CLIENT_ID— Discord Bot クライアント ID
基本設定:
DISCORD_OWNER_ID— Bot オーナーの Discord ユーザー ID(デフォルト:123456789012345678)DISCORD_BOT_STATUS— Bot のステータス(デフォルト:[TESTING] 読み上げBot)
VoiceVox設定:
VOICEVOX_HOST— VoiceVox Engine のホスト URL(デフォルト:http://voicevox:50021)VOICEVOX_MAX_CHARS— 1回の読み上げ最大文字数(デフォルト:200)VOICEVOX_MAX_MESSAGE_LENGTH— メッセージの最大長(デフォルト:50)
Redis設定:
REDIS_HOST— Redis ホスト(デフォルト:redis)REDIS_PORT— Redis ポート(デフォルト:6379)REDIS_DB— Redis DB番号(デフォルト:0)
高度な設定:
USE_PION_OPUS—trueにすると DCA の代わりに Pion Opus エンコーダーを使用(デフォルト:false)- 詳細:
docs/OPUS_MIGRATION.md
- 詳細:
HTTP_PORT— ヘルスチェックサーバーのポート(デフォルト:8080)
ロギング設定:
LOG_LEVEL— ログレベル(trace/debug/info/warn/error/fatal、デフォルト:info)LOG_FORMAT— ログ形式(text/json、デフォルト:text)
ユーザーごとに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: 利用可能な話者の一覧を表示します。