みやこの元団長日記

グラブルの騎空団ぐるぐるストッキング(ぐるスト(ストはカタカナ))の元団長がたまになんか書くかもしれません

喋太郎が声変わりして声を変えられなくなってしまったので繋ぎ用にDiscordのテキスト読み上げボットを書いた

Discordのテキスト読み上げボット、喋太郎を使っていたのですが、声変わりしてユーザー別の声設定ができなくなってしまったので似たようなボットをOpen JTalkを使って書きました。Python製です。せっかくなのでソースコードと導入方法を紹介します。

喋太郎が以前の声を取り戻すまでの繋ぎ用なのでそんなにしっかりしたボットではありません。とりあえず自分が運用しているDiscordサーバーで使えればいいや程度で作ったのであまり期待しないでください。また、面倒なので複数のDiscordサーバー上で動かすことは想定していません。複数のDiscordサーバーで使用すると辞書等の設定が共有されてしまうので注意してください。

読み上げ音声はOpen JTalkのデモサイトで確認できるので導入前に雰囲気を知りたい方は試してみてください。

http://open-jtalk.sp.nitech.ac.jp/

今回のボットを書くにあたって喋太郎のソースコードを参考にさせていただきました。この場を借りてお礼申し上げます。

はじめにお断りしておきますが、

  • 私が運用しているボット自体は公開しません
    • 「招待」だけでは使えません
    • 自前のサーバー/PC等でボットを動かしてください
  • Discordボットの作り方は説明しません
    • ググれば出てくるので自分で調べてください
  • 一応どのOSでも動くと思いますがArch Linuxでしか試してません
    • Windowsでも動かせますがたぶん大変なのでVMUbuntu動かすとかした方が楽だと思います
  • ソースコードを自分で多少書く必要があります

というわけで行きます。

準備

以下のプログラム等が必要です。

  • 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でヘルプが表示されればインストールできています。

Ubuntuの場合はこちらにインストール方法があります。

実際に動くかどうか以下のコマンドで確認しておきます。

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で指定している音声の場所が違うので確認・修正してください。この場所はあとで使います

PythonFFmpeg等のインストール方法は省略します。普通にインストールするか元から入ってるのを使ってください。

ボット用の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とすると桃音モモの声で読み上げてくれるようになります。

他の音声ファイルを追加する場合は先程のコメント行を参考にいい感じにコードを追加してください。

終わりに

とりあえず喋太郎が以前の声を取り戻す(というかせめてユーザー別に声が変えられるようになるまで)の繋ぎ用読み上げボットの紹介でした。よかったら好きに使ってください。