Discordのテキストチャンネルに投稿されたメッセージをボイスチャンネルで読み上げるBotです。
*このプログラムはMasaaki Shibataさまのjtalkbotを改造したものです(discordが前についていますが、修正前プログラムもDiscordで動作します)
ref. https://bitbucket.org/emptypage/jtalkbot/src/master/
Copyright © 2020 Masaaki Shibata
*上記は、修正前のプログラムのLICENSEから抜粋したもの
このBotは、読み上げBotを見知らぬ人のサーバーで実行することに不安を覚える人が自分のマシンで読み上げさせることが可能です。低機能ですが、そのあたりが嬉しいかもしれません。
以下のプログラム/ライブラリが正常に動作しているシステムが必要です。
- Python 3.8
- Open JTalk(
open_jtalk
コマンド) - Opus ライブラリ(discord.py の音声機能に必要)
それぞれの導入方法はお使いのシステムによって違いますので各自でお調べください(Homebrewでの導入方法は後述します)。 修正元ソースの作者さまはmacOSでMacPorts を使っています。 このソース(discord-jtalkbot)の作者はHomebrewを使っています。
Dockerでの動かし方を参照ください。Discord Botのトークンを指定するだけで、すぐに動かせます。
以降では、Macに、Homebrewを使って環境構築し、Botを動かす手順を説明します。
また、このBotはWindowsではエラーが発生し、動作しません。 Dockerでなら動かせるかと思いますので、Dockerでの動かし方を参照ください。
何も対策せずに実行すると、PyAudioをインストール中にportaudio.hが見つからない
旨のエラーが発生したため、Qiitaの記事を参考に、portaudioをインストールし、「インストールされたライブラリおよびインクルードファイルの位置を指定」した上でpip installします。
brew install open-jtalk
brew install opus
brew install portaudio
sudo env LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" pip3 install pyaudio
git clone
します。その後、requirements.txtのモジュールをインストールし、Botを実行します。
~/ $ git clone https://github.com/tetsuya-ki/discord-jtalkbot.git
~/ $ cd discord-jtalkbot
~/discord-jtalkbot $ python3 -m venv .venv
~/discord-jtalkbot $ source .venv/bin/activate
(.venv) ~/discord-jtalkbot $ pip3 install -r requirements.txt
...
(.venv) ~/discord-jtalkbot $ python3 discordjtalkbot/discordJtalkbot.py
はじめに discordjtalkbot-config.json
ファイルを編集します。
ライブラリ内にサンプルファイルが discordjtalkbot-config.sample.json
として入っていますので、これをコピー、リネームして使ってください。
{
"token": "__ENTER_YOUR_TOKEN_HERE__",
"open_jtalk_flags": "-x /usr/local/opt/open-jtalk/dic -m /usr/local/opt/open-jtalk/voice/mei/mei_normal.htsvoice",
"voice_hello": "みなさんこんにちは。",
"text_start": "読み上げを始めます。",
"text_end": "読み上げを終わります。",
"voices": "/usr/local/opt/open-jtalk/voice/m100/nitech_jp_atr503_m001.htsvoice,/usr/local/opt/open-jtalk/voice/mei/mei_angry.htsvoice,/usr/local/opt/open-jtalk/voice/mei/mei_bashful.htsvoice,/usr/local/opt/open-jtalk/voice/mei/mei_happy.htsvoice,/usr/local/opt/open-jtalk/voice/mei/mei_normal.htsvoice,/usr/local/opt/open-jtalk/voice/mei/mei_sad.htsvoice",
"except_prefix": "!,$,/",
"read_name": "True",
"read_system_message": "True",
"read_all_guild": "False"
}
文字列型。Discordによって発行されたBotアカウントのトークンを記述します(トークンは厳重に管理し公開されないようにしてください)
文字列型。open_jtalk
コマンドに渡すコマンドラインオブションを記述します。読み上げに使用されます(dicを変更したり、読み上げるボイスを指定できます)。
文字列型。BotがDiscordの音声チャンネルへ接続したときに、「最初に発声するあいさつ」を記述します。
文字列型。Botがテキストチャンネルの投稿の読み上げを開始するときに、そのテキストチャンネルに投稿するメッセージを記述します。
文字列型。Botがテキストチャンネルの投稿の読み上げを停止するときに、そのテキストチャンネルに投稿するメッセージを記述します(2021/01/10現在、なんか動きません)。
文字列型。人に適当にvoiceを割り当てます(カンマ区切りで指定)。voiceが足りなくなった場合、重複します。
文字列型。指定したプレフィックスが先頭にあるメッセージは読み上げしないようになります(カンマ区切りで指定)。ギルドで使用しているBotのプレフィックスを指定すると良いと思います。
文字列型。名前を読み上げるかどうか。設定がない場合は読み上げない("True"の時のみ読み上げる)
文字列型。メンバーのボイスチャンネルへの入退室を読み上げるかどうか。設定がない場合は読み上げない("True"の時のみ読み上げる)
文字列型。すべてのギルドのメッセージを読み上げるかどうか。設定がない場合はボイスチャンネルに接続したギルドのみ読み上げる
python3 discordjtalkbot/discordJtalkbot.py
コマンドを実行します。
下記設定ファイルを参照し、処理を開始します。
{Clone先ディレクトリ}/discordjtalkbot/cogs/modules/files/discordjtalkbot-config.json
起動するとログを表示しながら待機し続けます。
~/discord-jtalkbot $ python3 discordjtalkbot/discordJtalkbot.py
INFO:discordJtalkbot.py$__main__:Opus library is loaded.
INFO:discordJtalkbot.py$__main__:discordjtalkbot/discordJtalkbot.py is running.
INFO:cogs.autoreadercog:We have logged in as MyBot#nnnn.
Botを停止するときは Ctrl+C
を押します。
- オーナー追従機能
- Botアカウントが招待されているDiscordサーバー(ギルドともいいます)において、そのサーバーのオーナーであるユーザー(ギルドマスター)がボイスチャンネルに接続したとき、同じボイスチャンネルへ同時に接続します。
- サーバーのオーナーがボイスチャンネルから切断すると読み上げ動作を停止し、同時にボイスチャンネルからも切断します。
- コマンドによる接続/切断/再生停止機能
$connect
やP$c
(エイリアス)で、Botがコマンドしたメンバーの接続しているボイスチャンネルに接続します。$disconnect
や$d
(エイリアス)で、Botがボイスチャンネルから切断します。$stop
や$s
(エイリアス)で、Botの読み上げを停止させることができます。
- Help機能
$help
で、このBotで使用できるコマンドが表示されます$help connect
や$help stop
で、それぞれの「機能の説明」や「使用できるエイリアス」が表示されます
- さびしんぼ機能
- メンバーの切断により、ボイスチャンネルに接続しているメンバーがBotのみになった場合、Botもボイスチャンネルから切断します。
- 声色設定機能:
- discordjtalkbot-config.jsonに、
voices
を追加し、以下のような設定(htsのフルパスを,
でセパレート)すると、メンバーごとに適当な声色を振り分けます "voices": "/usr/local/opt/open-jtalk/voice/m100/nitech_jp_atr503_m001.htsvoice,/usr/local/opt/open-jtalk/voice/mei/mei_angry.htsvoice"
,- 声色を使い切った場合、また最初から振り分けます(声色が重複して設定されます)
- discordjtalkbot-config.jsonに、
- 接続時の動作
- 接続中は、すべてのチャンネルに投稿されたメッセージをボイスチャンネルにて読み上げます
- URLは「URL省略」と発言します。「||」で囲われた部分は「ネタバレ」で読み替えます
Docker Hubのページは以下です。
https://hub.docker.com/r/tk2812/discord-jtalkbot
docker pull tk2812/discord-jtalkbot:latest
TOKENを環境変数で指定し、docker runする。
docker run -e TOKEN=XXXXXXXX tk2812/discord-jtalkbot:latest
-
開発用にDockerイメージを作成
docker build -t discord-jtalkbot:dev .
-
開発用のDockerイメージからコンテナを作成
docker run -e TOKEN=XXXXXXXX discord-jtalkbot:dev