Discordのテキスト読み上げボット、喋太郎を使っていたのですが、声変わりしてユーザー別の声設定ができなくなってしまったので似たようなボットをOpen JTalkを使って書きました。Python製です。せっかくなのでソースコードと導入方法を紹介します。
喋太郎が以前の声を取り戻すまでの繋ぎ用なのでそんなにしっかりしたボットではありません。とりあえず自分が運用しているDiscordサーバーで使えればいいや程度で作ったのであまり期待しないでください。また、面倒なので複数のDiscordサーバー上で動かすことは想定していません。複数のDiscordサーバーで使用すると辞書等の設定が共有されてしまうので注意してください。
読み上げ音声はOpen JTalkのデモサイトで確認できるので導入前に雰囲気を知りたい方は試してみてください。
http://open-jtalk.sp.nitech.ac.jp/
今回のボットを書くにあたって喋太郎のソースコードを参考にさせていただきました。この場を借りてお礼申し上げます。
はじめにお断りしておきますが、
- 私が運用しているボット自体は公開しません
- 「招待」だけでは使えません
- 自前のサーバー/PC等でボットを動かしてください
- Discordボットの作り方は説明しません
- ググれば出てくるので自分で調べてください
- 一応どのOSでも動くと思いますがArch Linuxでしか試してません
- ソースコードを自分で多少書く必要があります
というわけで行きます。
準備
以下のプログラム等が必要です。
- Open JTalk
- Open JTalk用の音声ファイル
- Python (3.6以上)
- discord.pyの音声サポートに必要なライブラリ
- ここの
discord.py[voice]
のインストールに必要なライブラリをインストールしておいてください
- ここの
- FFmpeg (またはavconv)
Open JTalkと音声ファイルのインストール
Arch Linuxの場合はAURにあるので、そこからインストールします。yayを使う場合は以下
yay -S open-jtalk
ついでに音声ファイルもインストールしておきます。
yay -S open-jtalk-voice-mei open-jtalk-voice-nitech-jp-atr503-m001
open_jtalk -h
でヘルプが表示されればインストールできています。
実際に動くかどうか以下のコマンドで確認しておきます。
echo "こんにちは" | open_jtalk -x /usr/share/open-jtalk/dic/ -m /usr/share/open-jtalk/voices/mei_normal.htsvoice -ow test.wav
これでtest.wav
が作られるはずなので、再生して「こんにちは」と発音されていれば大丈夫です。
環境によっては-x
で指定している辞書や-m
で指定している音声の場所が違うので確認・修正してください。この場所はあとで使います。
PythonやFFmpeg等のインストール方法は省略します。普通にインストールするか元から入ってるのを使ってください。
ボット用のPython仮想環境の作成
これはしてもしなくてもいいですが作るのをおすすめします。
わかってる方は次のセクションまで読み飛ばしてください。
ボット用のディレクトリを作ってその中で、
python3 -m venv .
これで環境が作られます。環境をアクティベートするには
./bin/activate
を実行します。
ボット立ち上げ前には必ず環境をアクティベートしてください。
Python仮想環境を作ってアクティベートしてたら
pip install "discord.py[voice]"
これでdiscord.py
と依存するライブラリがインストールされます。
ボットの作成
トークンの取得
Discordボットを作るにはトークンが必要です。トークンの取得方法はここなどを見てください。
ついでに導入したいサーバーにボットを招待しておきます。
ソースコードの取得と編集
ここに読み上げ機能のソースコードを公開しているのでダウンロードかコピペしてvc.py
として保存しておいてください。
ソースコードの50行目あたりから環境別の設定があるので必要に応じて書き換えます。
書き換え方はコメントを参照してください。
ボット本体のコード作成
先程作ったvc.py
と同じディレクトリにmain.py
として以下のようなファイルを作ります。
import discord from vc import talk client = discord.Client() @client.event async def on_message(msg): await talk(msg) if __name__ == '__main__': client.run('ここに先程取得したトークンを記入')
最終行のclient.run
のところには先程取得したトークンを入力してください。
これで python3 main.py
と実行するとボットがオンラインになるはずです。
ボットの使い方
デフォルトのコマンドプレフィックス(コマンドの前につける記号)は!!
です。
ボットがオンラインになったら、Discordのサーバー上で!!help
と入力するとヘルプを表示します。
VCに入っている状態で!!summon
とするとボットがVCに入ってきます。この状態で!!summon
と実行したのと同じチャンネルで何か発言するとボットが読み上げてくれるはずです。喋らない場合はボットを実行した端末上でエラーが出ているはずなので頑張って解決してください。
単語の登録
!!wa 単語 読み
と実行すると、以後「単語」を「読み」と読み上げるようになります。
登録した単語を削除したい場合は!!wd 単語
です。
登録されている単語の一覧を取得したい場合は!!wl
です。
ユーザー別の音声設定
ユーザー別に読み上げ音声の設定を変えることができます。
詳細は!!help
を参照してください。
読み上げボイスの追加
Open JTalkが対応している形式(.htsvoice
)の音声ファイルであれば追加することができます。
例えばここで配布されている音声ファイルはダウンロードしてきてそのまま使えます。(利用規約は遵守してください)
ボイスの追加例
例として、先程のサイトから「桃音モモ」の音声をダウンロードしてボットで使えるようにする方法を紹介します。
まずボットを作成したディレクトリにvoices
というディレクトリを作ります。
次に、音声ファイルをダウンロードしてzipファイルを解凍すると中に利用規約と桃音モモ.htsvoice
というファイルがあるので、htsvoice
ファイルを先程作ったvoices
ディレクトリにコピーします。
vc.py
の84行目あたりに以下のコメント行があるのでアンコメントします。
# 'momo': LOCAL_VOICES / '桃音モモ.htsvoice',
コードを修正したらボットを再起動(python3 main.py
した端末でCtrl+c
して再度python3 main.py
)します。
ボットの再起動後、!!help
と実行すると!!voice
のヘルプにmomo
の選択肢が追加されているはずです。
この状態で!!voice momo
とすると桃音モモの声で読み上げてくれるようになります。
他の音声ファイルを追加する場合は先程のコメント行を参考にいい感じにコードを追加してください。
終わりに
とりあえず喋太郎が以前の声を取り戻す(というかせめてユーザー別に声が変えられるようになるまで)の繋ぎ用読み上げボットの紹介でした。よかったら好きに使ってください。