Discordで通話していると、マイクを使えない人がチャットで参加している場面がよくあります。深夜で声を出せない人や、聞き専の人です。
そういう人の書き込みは、話している側からは見落としがちです。画面を見ていないと気づけません。
そこで、テキストチャンネルに書いた文章をそのままボイスチャンネルで読み上げるBOTを作りました。名前は「コエル」です。今日リリースしたので、紹介と、作る途中で詰まったところを書いておきます。
コエルでできること
やることは単純です。BOTをVCに呼ぶと、決めたテキストチャンネルへの投稿を読み上げてくれます。
読み上げBOTはすでにいくつもありますが、コエルは最初から複数のサーバーで同時に使われる前提で設計しました。自分のサーバー専用のBOTではなく、どのサーバーでも入れてすぐ使えるサービスとして作っています。
使えるコマンド
| コマンド | できること |
|---|---|
/join |
自分がいるVCにBOTを呼ぶ |
/leave |
BOTをVCから退出させる |
/voice |
読み上げる声を選ぶ。入力するとすぐ候補が出ます |
/dictionary |
読み方を登録する(固有名詞や、読み間違えられる言葉に) |
/settings |
読み上げるチャンネルと、1回に読む最大文字数を決める |
/credit |
今日の残り時間とプランを確認する |
/link-server |
自分の有料プランを、今いるサーバーに適用する |
/unlink-server |
今いるサーバーへの有料プランの適用をやめる |
/help |
コマンドとプランの一覧を出す |
声は種類が多く、サーバーごとに好きなものを選べます。声の選択と読み上げ辞書は、無料プランでも使えます。
もうひとつ、VCに誰もいなくなってから5分たつと自動で退出します。BOTだけがVCに残り続けることはありません。
使い方は3ステップ
- コエルのサイトの「Discordに追加」から、BOTをサーバーに招待する
- VCに入った状態で
/joinを実行する - あとはテキストチャンネルに書き込むだけ
設定をしなくても使い始められます。読み上げるチャンネルを変えたいときだけ /settings を使ってください。
料金プラン
基本は無料です。たくさん使う人向けに、有料プランを用意しています。
| プラン | 料金 | 1日に読み上げられる時間 | 1メッセージの文字数 | 使えるサーバー数 |
|---|---|---|---|---|
| FREE | 無料 | 30分 | 300文字 | ― |
| STANDARD | 月300円 | 100分 | 600文字 | 2サーバー |
| PREMIUM | 月800円 | 300分 | 1000文字 | 5サーバー |
読み上げ時間はサーバーごとに数えます。無料プランなら、BOTを入れたサーバーそれぞれで1日30分ずつ使えます。
有料プランは人に紐づくプランです。1つの契約を、STANDARDなら2つ、PREMIUMなら5つのサーバーに適用できます。適用したサーバーでは、それぞれ表の時間まで使えます。たとえばSTANDARDを2つのサーバーに適用すれば、どちらのサーバーでも1日100分です。
有料プランの始め方
- pixivFANBOXで支援する
- 運営が支援を確認して、プランを有効にする
- 使いたいサーバーで
/link-serverを実行する
今のところ2は手作業なので、反映まで少し時間をいただくことがあります。サーバーを入れ替えたいときは、外したいサーバーで /unlink-server を実行してから、新しいサーバーで /link-server を実行してください。
どうやって作ったか
ここからは作る側の話です。
| 役割 | 使ったもの |
|---|---|
| BOT本体 | Seyfert(TypeScriptのDiscordフレームワーク) |
| 音声の再生 | @discordjs/voice |
| 音声合成 | 外部の音声合成API |
| データの保存 | Drizzle ORM + SQLite |
| サイト | Cloudflare Workers |
SeyfertはVC接続を持っていない
最初に詰まったのがここです。Seyfertは軽くて書きやすいフレームワークですが、ボイスチャンネルへの接続機能を標準では持っていません。
音声の再生には定番の @discordjs/voice を使いたかったのですが、こちらは discord.js と組み合わせる前提で作られています。そこで、Seyfertが受け取るDiscordの生のイベントを @discordjs/voice に渡す橋渡し部分を自分で書きました。ここが動くまでに一番時間がかかりました。
音声は変換せずにそのまま流す
音声合成の結果は、Discordがそのまま扱える形式(Ogg Opus)で受け取っています。途中で変換を挟まないので、ffmpegが要りません。サーバーの負担が減るうえ、受け取りながら再生を始められるので、書き込んでから声が出るまでが速くなりました。
3つのサーバーで同時に動かしたら壊れた
「複数のサーバーで使えるサービス」と言うからには、実際に確かめないといけません。3つのサーバーで同時に接続して試したところ、1つのサーバーでは出なかった不具合が次々に出てきました。
1. 長い文章が途中で切れる
音声の取得を25秒で打ち切る設定にしていました。1つのサーバーなら十分でしたが、3つ同時に取得すると間に合わず、読み上げの途中で切れてしまいました。上限を60秒に延ばして直しています。
2. 回線が一瞬切れると、それきり読み上げなくなる
VCの接続が一瞬途切れたとき、つなぎ直す処理がありませんでした。再生側が一時停止のまま戻らず、書き込んでも何も読まれない状態になっていました。接続が切れたら自動でつなぎ直すようにしました。
3. 手で切断しても戻ってくる
2の対策を入れたら、今度はDiscord上でBOTを切断しても、すぐに戻ってくるようになりました。「切れたらつなぎ直す」が、わざと切った場合にも働いていたためです。
Discordは、BOTが切断されたときに理由を表すコード(4014)を送ってきます。これを見て、わざと切断された場合はつなぎ直さないようにしました。
4. 落ちたあと、再起動してもVCに入れない
BOTのプロセスが異常終了すると、Discord側には前の接続が残ったままになります。その状態で入り直そうとして失敗していました。
起動したときに、いったん明示的に切断してから入り直すようにしました。あわせて、停止の指示を受けたときは接続をきちんと閉じてから終わるようにしています。
5. どのサーバーで起きたのか分からない
地味ですが、これが一番困りました。ログにどのサーバーの出来事かが書かれておらず、3つ同時に動かすと区別がつきませんでした。すべてのログにサーバーのIDを付けるようにしています。
1つのサーバーだけで試していたら、どれにも気づかずに公開していたと思います。同時に動かして確かめたのは正解でした。
これからやること
- 有料プランの自動有効化(今は支援を確認してから手動で有効にしています)
- 支払い方法を増やす(PayPayなど)
最後に、ちょっとだけお願い
いやらしい話で恐縮ですが、正直に書きます。金欠です。
コエルは個人で作って、個人で運営しています。サーバー代もドメイン代も自腹で、開発の時間は夜と休日を削って捻出しています。
もし「これ便利だな」と思ってもらえたら、pixivFANBOXで支援していただけると本当に助かります。支援すると有料プランになるので、読み上げ時間が増えて、複数のサーバーで使えるようになります。ただの寄付ではなく、ちゃんと見返りがあります。
それと、支援してくださる方が10人を超えると、プランの自動有効化に取りかかれます(FANBOXのDiscord連携が使えるようになる条件がそこなので)。支援した瞬間に有料プランが使えるようになる日は、支援者のみなさんの手にかかっています。
もちろん、無料のまま使っていただくだけでも十分うれしいです。「使ってるよ」の一言や、友達のサーバーに入れてもらうのも、立派な応援です。
まとめ
チャットで参加している人の声を、VCに届けるためのBOTを作りました。無料で使えて、声も選べます。
通話中にチャットの書き込みを見落としがちなサーバーで、ぜひ試してみてください。不具合や要望は、サポート用のDiscordサーバーで受け付けています。
- コエルの公式サイト:https://koeru.hachune.online/
- サポート用Discordサーバー:https://discord.gg/JGmB2jg6pY
- 有料プラン・支援:pixivFANBOX

コメント