Skip to content

Discordのテキストチャンネルに投稿されたメッセージをボイスチャンネルで読み上げるBotです(jtalkbotを改造したもの)

License

Notifications You must be signed in to change notification settings

tetsuya-ki/discord-jtalkbot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

discord-jtalkbot

A Discord bot talking Japanese

Discordのテキストチャンネルに投稿されたメッセージをボイスチャンネルで読み上げるBotです。
*このプログラムはMasaaki Shibataさまのjtalkbotを改造したものです(discordが前についていますが、修正前プログラムもDiscordで動作します)
ref. https://bitbucket.org/emptypage/jtalkbot/src/master/

Copyright © 2020 Masaaki Shibata

*上記は、修正前のプログラムのLICENSEから抜粋したもの

このBotは、読み上げBotを見知らぬ人のサーバーで実行することに不安を覚える人が自分のマシンで読み上げさせることが可能です。低機能ですが、そのあたりが嬉しいかもしれません。

Table of Contesnts

  1. A Discord bot talking Japanese

  2. 動作環境

  3. 導入

  4. 準備作業(Homebrew)

  5. 本作業

  6. 使いかた

  7. Botの実行

  8. Botの動作

  9. Dockerでの動かし方

動作環境

以下のプログラム/ライブラリが正常に動作しているシステムが必要です。

それぞれの導入方法はお使いのシステムによって違いますので各自でお調べください(Homebrewでの導入方法は後述します)。 修正元ソースの作者さまはmacOSでMacPorts を使っています。 このソース(discord-jtalkbot)の作者はHomebrewを使っています。

導入

前置き

Dockerでの動かし方を参照ください。Discord Botのトークンを指定するだけで、すぐに動かせます。
以降では、Macに、Homebrewを使って環境構築し、Botを動かす手順を説明します。
また、このBotはWindowsではエラーが発生し、動作しません。 Dockerでなら動かせるかと思いますので、Dockerでの動かし方を参照ください。

準備作業(Homebrew)

何も対策せずに実行すると、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 として入っていますので、これをコピー、リネームして使ってください。

discordjtalkbot-config.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"
}

token

文字列型。Discordによって発行されたBotアカウントのトークンを記述します(トークンは厳重に管理し公開されないようにしてください)

open_jtalk_flags

文字列型。open_jtalk コマンドに渡すコマンドラインオブションを記述します。読み上げに使用されます(dicを変更したり、読み上げるボイスを指定できます)。

voice_hello

文字列型。BotがDiscordの音声チャンネルへ接続したときに、「最初に発声するあいさつ」を記述します。

text_start

文字列型。Botがテキストチャンネルの投稿の読み上げを開始するときに、そのテキストチャンネルに投稿するメッセージを記述します。

text_end

文字列型。Botがテキストチャンネルの投稿の読み上げを停止するときに、そのテキストチャンネルに投稿するメッセージを記述します(2021/01/10現在、なんか動きません)。

voices

文字列型。人に適当にvoiceを割り当てます(カンマ区切りで指定)。voiceが足りなくなった場合、重複します。

except_prefix

文字列型。指定したプレフィックスが先頭にあるメッセージは読み上げしないようになります(カンマ区切りで指定)。ギルドで使用しているBotのプレフィックスを指定すると良いと思います。

read_name

文字列型。名前を読み上げるかどうか。設定がない場合は読み上げない("True"の時のみ読み上げる)

read_system_message

文字列型。メンバーのボイスチャンネルへの入退室を読み上げるかどうか。設定がない場合は読み上げない("True"の時のみ読み上げる)

read_all_guild

文字列型。すべてのギルドのメッセージを読み上げるかどうか。設定がない場合はボイスチャンネルに接続したギルドのみ読み上げる

Botの実行

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の動作

  • オーナー追従機能
    • 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",
    • 声色を使い切った場合、また最初から振り分けます(声色が重複して設定されます)
  • 接続時の動作
    • 接続中は、すべてのチャンネルに投稿されたメッセージをボイスチャンネルにて読み上げます
    • URLは「URL省略」と発言します。「||」で囲われた部分は「ネタバレ」で読み替えます

Dockerでの動かし方

Docker Hubのページは以下です。
https://hub.docker.com/r/tk2812/discord-jtalkbot

Pull from Docker Hub

docker pull tk2812/discord-jtalkbot:latest

Run docker container

TOKENを環境変数で指定し、docker runする。

docker run -e TOKEN=XXXXXXXX tk2812/discord-jtalkbot:latest

Build Dockerfile(memo)

  • 開発用にDockerイメージを作成
    docker build -t discord-jtalkbot:dev .

  • 開発用のDockerイメージからコンテナを作成
    docker run -e TOKEN=XXXXXXXX discord-jtalkbot:dev

About

Discordのテキストチャンネルに投稿されたメッセージをボイスチャンネルで読み上げるBotです(jtalkbotを改造したもの)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published