Skip to content

Repository files navigation

yomiage

VOICEVOX COREでDiscordのテキストチャンネル投稿をボイスチャンネルへ読み上げるPython botです。 tanetakumi/voicebot のRust実装を参考に、 単体で動かしやすい構成へ移植しています。

機能

  • /join: 実行者がいるボイスチャンネルへ参加
  • Botへのメンション: メンションした人がいるボイスチャンネルへ参加
  • /leave: ボイスチャンネルから退出
  • /skip: 再生中の読み上げを停止
  • /s: /skip の短縮版
  • /dict add|remove|list: サーバー辞書の管理
  • /voice list|license: VOICEVOXのキャラクター名、話者ID、クレジット表記を表示
  • /settings show|mention|read_name|default_speaker|user_speaker|clear_user_speaker: 読み上げ設定
  • 参加時のテキストチャンネルに投稿されたメッセージをVOICEVOX COREで読み上げ
  • VC接続時にBot自身をSelf Deafにして、他ユーザーの音声を受信しない
  • 接続中のVCから人が全員退出したら自動退出
  • Rust版と同じ考え方のトークンバケット式レート制限
  • SQLiteによるローカル辞書保存
  • URL、時刻、コード片、括弧などの簡易読み替え
  • Discordメンション、ロール、チャンネル、DiscordチャンネルURLの読み替え
  • 投稿者名の読み上げ
  • ユーザーごとのVOICEVOX話者ID設定

対応OS

Linux専用です。 依存する voicevox_core はmanylinuxホイールのみを配布しており、Windows/macOSでは uv sync の時点でインストールに失敗します。CIも ubuntu-latest 上でのみ実行しています。

必要なもの

  • Linux
  • Python 3.12
  • uv
  • ffmpeg
  • Discord Bot Token
  • VOICEVOX CORE の実行ファイル一式

Discord Developer Portalでは、Botに次の権限とIntentを付けてください。

  • MESSAGE CONTENT INTENT
  • View Channels
  • Send Messages
  • Read Message History
  • Connect
  • Speak
  • Use Voice Activity

VOICEVOX CORE はPyPIだけでは完結しません。このプロジェクトではPython wheelを依存に含めていますが、 実行時には別途VOICEVOX COREのONNX Runtime、OpenJTalk辞書、.vvm モデルが必要です。 VOICEVOX_MODEL_PATH.vvm ファイルを指定した場合、そのファイルと同じディレクトリにある .vvm もまとめてロードします。ディレクトリ自体を指定した場合は、その中の .vvm をロードします。

セットアップ

  1. 依存関係をインストールします。
uv sync
  1. 環境変数ファイルを作ります。
cp .env.example .env
  1. .env を編集します。最低限、次の値を設定してください。
DISCORD_BOT_TOKEN=あなたのDiscord Botトークン
VOICEVOX_ONNXRUNTIME_PATH=./voicevox_core/onnxruntime/lib/libvoicevox_onnxruntime.so.1.17.3
OPEN_JTALK_DIC_DIR=./voicevox_core/dict/open_jtalk_dic_utf_8-1.11
VOICEVOX_MODEL_PATH=./voicevox_core/models/vvms
VOICEVOX_MODEL_EXCLUDE=
VOICEVOX_ACCELERATION_MODE=CPU
  1. Botを起動します。
uv run yomiage

起動後、DiscordでBotをメンションするか /join を実行すると、実行者が参加しているVCへ接続します。

VOICEVOX CORE の配置例

.env.example のデフォルト値は、リポジトリ直下に voicevox_core/ を置く想定です。

voicevox_core/
├── onnxruntime/lib/libvoicevox_onnxruntime.so.1.17.3
├── dict/open_jtalk_dic_utf_8-1.11/
└── models/vvms/0.vvm

配置場所を変える場合は、.envVOICEVOX_ONNXRUNTIME_PATHOPEN_JTALK_DIC_DIRVOICEVOX_MODEL_PATH を変更してください。

Discord コマンド

  • /join: 実行したテキストチャンネルを読み上げ対象にして、実行者のVCへ接続
  • @Bot: 投稿した人のVCへ接続し、そのテキストチャンネルを読み上げ対象に設定
  • /leave: VCから退出
  • /skip: 現在の読み上げを停止
  • /s: /skip の短縮版
  • s, S, !s, !S, !s, !S: テキスト投稿で読み上げを停止
  • /dict add: サーバー辞書へ単語を追加
  • /dict remove: サーバー辞書から単語を削除
  • /dict list: サーバー辞書を表示
  • /voice list: VOICEVOXのキャラクター名、スタイル、話者IDを埋め込みで表示
  • /voice license: VOICEVOXキャラクターのクレジット表記と利用規約URLを埋め込みで表示

/voice の一覧はページ移動ボタン付きで1ページずつ表示します。ボタンは1分後に消えます。

読み上げ設定

  • /settings show: 現在の設定を表示
  • /settings mention mode:名前/チャンネル名: メンションやDiscordチャンネルURLを名前で読む
  • /settings mention mode:リンク省略: メンションやDiscordチャンネルURLを りんくしょうりゃく と読む
  • /settings read_name enabled:true: 読み上げ前に投稿者名を読む
  • /settings read_name enabled:false: 投稿者名を読まない
  • /settings serverchat enabled:true: ServerChat形式の先頭 [...]<...> を読まない
  • /settings serverchat enabled:false: ServerChat形式の先頭 [...]<...> をそのまま読む
  • /settings default_speaker speaker_id:<ID>: サーバーのデフォルト話者IDを変更
  • /settings user_speaker speaker_id:<ID>: 自分の話者IDを設定
  • /settings clear_user_speaker: 自分の話者ID設定を解除

これらのスラッシュコマンドはDiscordの サーバー管理 権限なしで実行できます。

開発用コマンド

uv run ruff check .
uv run basedpyright src
uv run pytest
uv build

uv build の成果物は dist/ に出力されます。dist/.venv/.env、SQLite DB、 VOICEVOX CORE本体はGit管理対象外です。

テスト

tests/ 配下に、Discord接続やVOICEVOX COREの実モデルなしで実行できる単体テストを用意しています。

  • test_rate_limit.py: トークンバケットのレート制限ロジック
  • test_translator.py: 辞書適用・正規表現・英単語/ローマ字変換・文字数省略などのテキスト変換
  • test_config.py: 環境変数の検証ロジック
  • test_database.py: SQLiteへの読み書きとキャッシュの整合性
  • test_session.py: ボイスセッションの生成・再接続時の後始末・終了処理
  • test_bot_voice.py: VC接続時のSelf Deaf設定
uv run pytest

CI

.github/workflows/ci.yml で、push・PR時に uv syncruff checkbasedpyrightpytestuv buildubuntu-latest 上で実行しています。

環境変数

  • DISCORD_BOT_TOKEN: Discord Bot token
  • BOT_ID: 辞書を分けたい場合のbot ID。デフォルトは 0
  • YOMIAGE_DB: SQLite DBのパス。デフォルトは yomiage.sqlite3
  • MAX_TOKENS: サーバーごとの読み上げトークン上限。デフォルトは 400
  • VOICEVOX_SPEAKER_ID: VOICEVOX話者ID。デフォルトは 3
  • VOICEVOX_SPEED: 話速。デフォルトは 1.2
  • VOICEVOX_ONNXRUNTIME_PATH: libvoicevox_onnxruntime.so... のパス
  • OPEN_JTALK_DIC_DIR: OpenJTalk辞書ディレクトリ
  • VOICEVOX_MODEL_PATH: .vvm モデルファイル、または .vvm を含むディレクトリ
  • VOICEVOX_MODEL_EXCLUDE: 読み込まない .vvm。例: 4.vvm、複数なら 4.vvm,9.vvm
  • VOICEVOX_ACCELERATION_MODE: CPU, AUTO, GPU のいずれか。デフォルトは CPU
  • VOICEVOX_CACHE_SIZE: 音声合成キャッシュ数。デフォルトは 100
  • FFMPEG_PATH: ffmpegコマンド。デフォルトは ffmpeg

ライセンス

このプロジェクトはMIT Licenseで公開しています。詳細は LICENSE を参照してください。

このプロジェクトは tanetakumi/voicebot を参考にした Python実装です。VOICEVOX CORE、VOICEVOXの音声モデル、その他依存ライブラリにはそれぞれ別の ライセンスや利用条件があります。利用・配布時はそれらの条件も確認してください。

Rust版との違い

元リポジトリはRustのDiscord bot、gRPC TTS server、Envoy、PostgreSQLで構成されています。 このPython版はまず動かしやすさを優先し、gRPC/Envoy/PostgreSQLを省いて単一プロセスにまとめています。

About

Discord TTS bot.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages