【個人開発】ローカルで動くDiscord読み上げBot「yomi-KAI」を作った話【discord.py】

※当サイトはアフィリエイト広告(Amazonアソシエイト含む)を利用しています。

プログラミング

Discordのテキストチャンネルに投稿された文章を、ボイスチャンネルで自動的に読み上げてくれるBotを個人開発した。名前は「yomi-KAI」だ。

最大のメリットは「自分のPC(または自前サーバー)上で実行できること」。 巷で公開されている有名な読み上げBotは、夜のゴールデンタイムになると世界中から負荷が集中し、読み上げが遅延したり、最悪サービスがダウンしたりすることが少なくない。 しかし、このyomi-KAIは完全に独立して動作するため、どんな時間帯でも負荷集中による遅延がなく、圧倒的に安定して動作する。

現在も絶賛アップデート中で、ソースコードの閲覧やダウンロードはこちらのGitHubからどうぞ。

GitHub - Garden-Tree/yomi-KAI: yomi-KAIはDiscordのテキストチャンネルに送られた文章をボイスチャンネルで読み上げるbotです。
yomi-KAIはDiscordのテキストチャンネルに送られた文章をボイスチャンネルで読み上げるbotです。 - Garden-Tree/yomi-KAI

また、このbotを作る過程でとても役に立ったVSCodeの拡張機能を紹介している記事もある。

開発しようと思ったきっかけ

巷には優秀なDiscord読み上げBotがいくつも存在する。しかし、先述の通りピークタイムには遅延が発生したり、サーバーダウンで急に使えなくなったりすることが頻発していた。 「自分が困っているなら、他の人も同じ不満を抱えているはずだ」と思い、ローカル環境で安定して動く読み上げBotを自作しようと決意した。

……というのは建前で、当時は高校の受験生であり「目に見える成果物があれば推薦入試で有利になるのではないか?」という下心があったのも事実だ(笑)。

開発言語と使用したフレームワーク

言語はPython、ライブラリには定番の「discord.py」を使用した。 discord.pyは一時期、作者の負担等により開発中止の危機にあったが、コミュニティの力で開発が再開されて本当に良かった。

詳細なソースコードや実装はGitHubを参照してほしい。

GitHub - Garden-Tree/yomi-KAI: yomi-KAIはDiscordのテキストチャンネルに送られた文章をボイスチャンネルで読み上げるbotです。
yomi-KAIはDiscordのテキストチャンネルに送られた文章をボイスチャンネルで読み上げるbotです。 - Garden-Tree/yomi-KAI

音声合成エンジンの変遷と裏話

Botの「声」となる音声合成エンジンには、バージョンアップごとに変遷がある。

v2以降:Google Cloud Text-to-Speechを採用

現在(v2以降)のメイン音声合成には、Google Cloud Text-to-Speechを採用している。天下のGoogle様が提供しているだけあって、音声の品質は高く、何よりAPIの応答時間が爆速だ。

しかしながら、たまに日本語の読み間違いをしてしまうお茶目な一面もあるため、今後はより精度の高い音声合成サービス(VOICEVOXなど)の導入も探っていきたい。

幻のv1:VoiceText Web APIのポンコツ具合

ちなみに、v1ではReadSpeaker VoiceText Web APIを使用していた。 しかしこれはAPIのタイムラグが比較的大きく、漢字や簡単な英単語の読み間違いが致命的だったため、v2では初期設定での採用を見送った。

一番面白かったのは「sword」が読めないことだ。当然「ソード」と読んでほしい場面なのだが、なんと「すべた」と読み上げるのである。どういう学習をしたらそうなるのか問い詰めたい。

ただ、一部の身内ユーザーから「あのポンコツな声が癖になるから残してほしい」という謎の強い要望があったため、v2から実装した「プルダウンメニューによる音声合成サービスの切り替え機能(下記参照)」で引き続き使用可能にしていた。

(2023/06/27追記:現在はVoiceText Web APIの新規登録が終了したため、今後のv3では完全に削除予定)

こだわりの機能①:プルダウンメニューでの設定変更

discord.pyのv2系から、Discord上でプルダウンメニューやボタンなどのリッチなUI(UIコンポーネント)が使用できるようになった。

このBotでもこの機能を活用し、チャット上のメニューから直感的に「音声合成サービスの切り替え」を行えるようにしている。

こだわりの機能②:読み上げる文章の前処理(正規表現)

読み上げBotを開発する上で一番苦労し、かつ最も重要なのが「読み上げる文章の前処理」だ。

Discordのメッセージを受け取ってから、実際に音声合成APIに渡すまでに、不自然な読み上げを防ぐための様々な置換処理(フィルター)を挟んでいる。

  • 辞書置換
    • ユーザーが登録した単語を置換する。
    • 約束された勝利の剣 → エクスカリバー
  • URL置換
    • URLを「エイチティーティーピー(以下略)」と長々と読まれると通話の邪魔なので置換する。
    • https://www.example.com → URL
  • ネタバレ置換
    • Discordのスポイラー機能で隠された文字を、そのままだとBotが空気を読まずにそのまま読み上げてしまうため置換する。
    • ||犯人はヤス|| → ネタバレ
  • メンション置換
    • ユーザーへのメンションは内部IDで飛んでくるため、表示名に置換する。
    • <@123456789> → アット hoge
  • サーバー独自絵文字の置換
    • サーバーオリジナルのカスタム絵文字も内部IDになるため置換する。
    • <:hoge:123456789> → hoge
  • 装飾文字(斜体)の置換
    • 文字の強調(斜体)を表すが、「アスタリスク」などと読まないように記号を削除する。
    • *hoge* → hoge
    • _hoge_ → hoge

自然な聞き専ライフを実現するために、裏ではこれだけの処理を走らせている。

こだわりの機能③:自動切断機能

「通話から誰もいなくなったのに、Botだけがポツンとボイスチャンネルに居座り続ける」のは不格好なので、自動切断機能を実装した。

自分が接続しているボイスチャンネルに「yomi-KAIのみ」が参加している状態になった瞬間に、自動で切断処理が行われる。

(ただし、MEE6など『他のBot』が同時にボイスチャンネルに滞在している場合は、お互いを人間と認識してデッドロックしてしまい帰らなくなるため、その場合は手動で切断する必要がある)

Botを24時間安定して動かす「サーバー」について

当然ながら、Botを24時間365日動かし続けるためには、PCを開きっぱなしにするか、専用の「サーバー」を用意する必要がある。

私が動かしているのは「自宅サーバー」

私は自宅のPCにLinux(Proxmox)を導入し、そこにBotを常駐させている。自宅サーバーにはロマンと構築の楽しさがあるが、電気代やセキュリティの観点から万人に勧めることはできない。私が自宅鯖を運営して分かったメリット・デメリットは以下の記事で本音を語っている。

初心者は「VPS(レンタルサーバー)」が圧倒的におすすめ

無料で動かせるホスティングサービスとして有名だった「Heroku」は無料プランが終了してしまった。Google Cloud Platform (GCP)の無料枠を使う手もあるが、設定の難易度は高い。

そのため、プログラミング初心者や「手軽に24時間Botを動かしたい」という人には、月額数百円から借りられる「VPS(仮想専用サーバー)」の契約を強くおすすめする。

Linuxの勉強にもなる上、Botだけでなくマイクラやパルワールドのマルチサーバーとしても使い回すことができるため、情報系学生なら1つ契約しておいて絶対に損はない。

個人的に、これからVPSを借りるならコスパと安定性に優れた「Xserver VPS」か「ConoHa VPS」のどちらかを選んでおけば間違いない。

どちらもワンクリックでUbuntuなどのLinux環境が構築でき、すぐにBotを動かし始めることができる。

\月額数百円でBotを24時間安定稼働!/

まとめ

最後まで読んでくれた方は、ぜひあなたのDiscordサーバーにもyomi-KAIを導入してみてほしい。

最初の導入に少しだけ手間はかかるが、一度設定してしまえばピークタイムの遅延ストレスとは無縁の、間違いなく安定した動作を約束する。

快適な聞き専ライフをあなたに。

GitHub - Garden-Tree/yomi-KAI: yomi-KAIはDiscordのテキストチャンネルに送られた文章をボイスチャンネルで読み上げるbotです。
yomi-KAIはDiscordのテキストチャンネルに送られた文章をボイスチャンネルで読み上げるbotです。 - Garden-Tree/yomi-KAI

コメント

タイトルとURLをコピーしました