2021-09-07

pyttsx3を使ってDiscordの読み上げBotをつくる



Qiitaの記事を参考にして、pyttsx3を使ってDiscord用の音声読み上げBotをつくりました。

前書き

Discord用で読み上げBotはいくつかありますが、無料で使えるBotは安定動作しない傾向にあります。無料で使わせてもらっているだけでもありがたいのですが、せっかくなのでPythonを使ってPrivateで安定して動くBotをつくってみます。動作環境はWindows10以降、Python3.8以降とします。

事前準備


chirppyForWinは今回のプログラムのRepositoryです。cloneかDLして、requirements.txtをつかいライブラリを導入してください。

pip install -r requirements.txt
  • Discord bot作成チュートリアル
    チュートリアルに従ってDiscordのBotを作成してください。リンク先の内容に従ってトークンの発行ができたら、メモ帳にトークンを一時的に記録するか、環境変数CHIRPPY_WIN_TOKENにトークンを登録してください。環境変数に登録した場合には一度PCを再起動してください。

  • windowsにffmpegをインストールする
    Windowsにffmpegをインストールして、ffmpeg.exeを実行できるようにパスを通してください。

実行


サーバー側の準備

ライブラリを導入とトークンの準備ができたのちにchirppy_for_win.pyを実行します。環境変数に正しいトークンを登録した場合にはBotがオンライン状態となります。
環境変数にトークンを設定していない場合は、GUIでトークンを登録し、rootにconfig.yamlとしてトークンを保管します。実行の都度、GUIが表示されるのでトークンの変更・上書きも可能です。正しいトークンが登録されると、環境変数のときと同様にBotがオンライン状態となります。

ユーザー側のBot使用

Botがオンライン状態になると、ユーザーはコマンドを使って読み上げBotを操作できます。

サーバーに呼ぶ(.join)

ボイスチャンネルに入り、読み上げさせたいチャンネルで.joinとPostするとBotを呼び出せます。.joinを投稿したチャンネルでテキストを投稿すると、そのテキストをBotが読み上げます。

単語の登録(.register)

.register A Bのように入力すると、単語AをBとして読み上げるように登録できます。.registerABのそれぞれの間はスペースを挟みます。Aの中にスペースを含む単語やカンマ(,)を含む単語は登録できません。

退出させる(.bye)

.byeと入力するとBotを退出させられます。

コードの解説

readBotをベースに読み上げBotをつくっております。ソースコードは大まかに以下の構成になっています。

Script Description
chirppy_for_win.py Botの処理を実行するメインファイル
voice_generator.py 読み上げ用音声を生成するファイル
util.py その他、汎用的な処理をまとめたもの

chirppy_for_win.py

このファイルはメインのファイルで主にDiscord上の振る舞いをまとめています。
Discord Bot用のTokenを取得して、client.run(token)で認証をします。その後、エラーが生じてもtry-except文と無限ループの組み合わせで自動で再起動します。

Bot用のコマンドを認識させる

from discord.ext import commands

client = commands.Bot(command_prefix='.')

上のコードは、Botを操作する際のトリガーとなる頭文字を定めています。command_prefix引数の値を.としているので、このbotは.join.bye.registerのように.がコマンド認識の文字になっています。

デコレータの設定

このファイルでは@client.event@client.command()の2種類のデコレータが設定されています。
@client.eventはcommand_prefixの記号+関数名(コマンド)の投稿がされたときにその関数を実行させる処理を書けます。例えば以下のような関数を設定します。

@client.command()
async def translation(ctx, arg):
   print(arg)

.translation ABCとDiscordで投稿すると、translation関数が実行されて、引数のABCがコンソール上に出力されます。

@client.eventはDiscord上のイベントを検出して処理を実行します。イベントの種類はイベントリファレンスを確認すると、関数名の設定と特定イベント時の操作の実装ができます。

util.py

ディレクトリの作成処理やYamlの設定、Tokenの取得処理など記載しています。

voice_generator.py

読み上げ用の音声をつくるファイルでメインファイルと並んで大事なファイルです。音声生成のライブラリをpyttsx3に変更して環境構築の手間を簡素化しています。その他、正規表現を使って読み上げ不要な記号などを除去して音声ファイルの生成処理をするような盛業をしております。

まとめ

簡単にですが、見よう見まねのソースコードを編集してDicord読み上げBotをつくりました。ffmpegのみ追加すれば、動作させられるようになったため、頑張るとLinuxやHeroku系の環境でも動作するかもしれませんん。他OSでも動作しましたら是非ご報告などいただけましたら幸いです!