せらぴんブログ

サークル「せらぴん」のうのはな透です。やっぱり眼鏡っ娘が好き!!

Discordでイントロ早押しクイズするためのbotを作った件について

この記事はどもがよアドベントカレンダー2022・23日目の記事です。

adventar.org

昨日の記事はあおたくさんの「Firebase Hosting でウェブサイトを公開する」でした。
aoitaku.hatenablog.com
うちの個人サイトはVue.jsで作ってるんですが、ほぼ静的サイトでVueの強み活かせてないし、Firebase Hosting+11tyに置き換えてもいいかも…。
ちなみに私はpug(旧Jade)派です。

さて今回は、「イントロ早押しクイズがやりたすぎて専用のDiscord用BOTを作ってしまった」という話をします。

基礎知識

身内以外が来たとき用の説明。

どもがよ鯖とは?

Among Usマルチプレイを目的として立てられたDiscordサーバ。由来は「狂人どもがよ…」。
あもんがすに留まらず、クイズや、スプラなどいろんなマルチゲーをしている。
なぜかAdvent Calendarもしている…。

クイズの環境

NQA3(長屋クイズアリーナ3、以下長屋)に部屋を立てて、Discordのボイチャでやる。
なにか文章や画像を表示したい場合は、Discordのライブ配信 or 仮想カメラを利用してる。

イントロ早押しクイズをする方法

上記のような状況で「イントロ早押しクイズ」をできるのか?
やるとしたらどうやって?
調べてみました!

まず、やることを整理すると
「曲(イントロ)をDiscordのボイチャで流す」
「長屋でボタンが押された瞬間にボイチャの曲を止める」
の2点です。

どこから曲を流す?

  1. 自分のアカウントから
    • 自室で音楽を流して喋っているマイクで拾う
    • ソフトウェアミキサーと仮想ケーブルを駆使して、マイク音声とオーディオプレイヤーの音声をミックスする
  2. ライブ配信
  3. サブアカウントから
  4. BOTから

まず1番の「自垢から」。一番手軽にできるのですが、以下の通りデメリットも多くオススメできません

  • マイクで拾った場合、音質が大きく劣化する
  • ミックスの場合、自分の声量とイントロの音量のバランスが取りづらい
  • マイク・ミックス問わず、ボイチャではノイズゲートが働くため、小さい音はカットされてしまう
    • ノイズゲートをOFFにすると、今度はマイクからノイズを拾ってしまう

実際、この方法でイントロクイズを試してみてグダった事例を数件見ています。
また、ライブ配信についても、記憶では自垢と似たような感じになってた(音が出なかったり)はずなので、オススメしません。

その点、サブ垢とBOTについては上記の問題はおおよそ無視できます。
一般的にDiscordは1端末で1アカウントしかログイン出来ないため、
複数端末を同時に操作できるならサブ垢、できないならBOTを運用するのがいいでしょう。
私は複垢運用するのも面倒なので、BOTを作りました*1

どうやって曲を停止させる?

  1. 自動で止める
  2. コマンドを打つ(Discord/コンソールを問わず)
  3. ボタンを押す

イントロ早押しクイズで重要なのは、「ボタンが押されたら直ちに曲を止める」こと。
これにもたつくと、いわゆる「問い読みがすべった」状態になり、クイズの進行に差し障ります。

なので「ボタンが押されたら自動で止められる」BOTが作れれば、それがベストなのですが、これは現実的ではないです。
『長屋でボタンが押されたら、それに連動してDiscord BOTを動作させる』というのは、裏を返せば『長屋の通信をハックする』ということです。
私にはそんな技術力*2もないし、できたとしても倫理上やりません。
「ブラウザの画面を画像解析して押された瞬間を検知する」という案を今思いついたけど、面倒そうなのでしません
長屋のクローンを自分で作ればいけるけど、それはもっと面倒そうなのでしません

となると「コマンドを打つ」と「ボタンを押す」の2択ですが、どちらが即応性が良いかというと当然「ボタンを押す」なわけで。

既存のBOTは?

Discordには「Groovy」「Rhythm」といった音楽BOTがすでに存在しています。正確には存在していました
Groovyが2021/8/30に、Rhythmが2021/9/15にサービスを終了してしまいました。

note.com
https://smhn.info/202109-rythm-fin

両者とも「商用利用などの規約違反のためGoogleからサービス終了を求められた」のが終了の原因のようです。
また、Discordでは「Watch Together」というYoutube動画をチャンネル内で視聴するサービスを提供しており、「一緒に音楽を聴く」だけならそちらで十分カバーできます。
gigazine.net

上記以外にも音楽BOTは存在しますが、大抵はYoutubeSoundCloud上の動画/音声を再生するBOTであり、常に配信元の一存で使えなくなるリスクを負っているのが現状です。

どこから曲を取ってくる?

  1. Youtube, SoundCloudなど
  2. 専用のアップロード用サーバを作る
  3. Amazon S3
  4. Googleドライブ

と、ひととおり説明した通り、(今からBOTを新規作成する前提では)1番目の「Youtube, SoundCloudなど」は避けたほうが無難でしょう。
これは既存のBOTで十分代替可能だからです*3
また、専用のアップローダなど作らずとも、既存のストレージサービス(とそのAPI)を利用すれば十分です。ストレージサービスですぐ思いつくのはAmazon S3Googleドライブですが、「BOTの利用者が自身で曲をアップロードする」という運用に馴染みやすいのはGoogleドライブでしょう。

  • 大体の人はGoogleアカウントを持っており、自身のGoogleドライブに曲のファイルをアップロードできる
  • 他人に自分のGoogleドライブ(=アップロードした曲)を見られる心配はほぼない

さて、ここまで述べたイントロ早押しクイズ用BOTの要件は以下の通りです。

  1. 曲をGoogleドライブから取得できるUIを持つ
  2. 曲を即座に停止させられるGUIを持つ

そんな都合のいいBOTあるかな~、ないよな~…。

(多分)ないので作りました
その名も「uMusicBot」。

操作方法

どもがよ民のために操作方法を記載します。
※このBOTはどもがよ鯖での運用を前提としているので、それ以外の方は読み飛ばしてください。

まずuMusicBotGUIページにアクセスします。
①に 「利用者がいません」と表示されていればBOTが利用できるので、②のボタンを押してログインしてください。
ログインにはGoogleアカウントを使います。

③でもう一度Googleアカウント認証をしてください(Googleドライブへのアクセスに必要です)。

最初にページを開いたときには、空のプレイリストが表示されます。
④のボタンを押して、プレイリストにイントロクイズで使いたい曲を追加しましょう。
2回目以降にページを開いたときは、前回のプレイリストがそのまま表示されます。

④のボタンを押したところです。
ログインしたGoogleアカウントのドライブにアップロード済みの音声ファイルの一覧が表示されます。
⑤でファイル名絞り込み、⑥で使いたいファイルを選択したあと、⑦のボタンを押して確定します。

では実際に、ボイチャで曲を流します。
プレイリスト上の曲を選択すると、⑧のように色が変わります。
この状態で、BOTがボイチャに入室済みの場合は、プレイヤーが操作可能になります。

BOTがボイチャに入室していない場合は、下記の操作でBOTを入室させます。
1.自分がBOTを入室させたいボイチャに入室する
2.同じサーバの適当なテキストチャンネルで下記コマンドを入力する

@uMusicBot join

プレイヤーが操作可能になったら、⑨のボタンを押してください。
BOTが選択された曲の再生を開始します。

⑨のボタンを押した後の状態です。
⑩のボタンで一時停止、⑪のボタンで停止ができます。
一時停止と停止の違いは以下のとおりです。

  • 一時停止後はもう一度⑧(再生ボタン)を押すことで曲を再開ができるが、停止後は最初から再生になる
  • 一時停止中は選択している曲を変更できない

早押しクイズではないイントロクイズ向けの機能として、自動停止機能があります。
「再生後N秒後に自動的に曲を停止させる」機能です。
使い方は、⑫のスイッチを切り替えて自動停止機能をオンにし、⑬に流したい秒数を入力したあとで、⑭の再生ボタンを押します。

BOTを使い終わったら、必ずBOTの使用を終了する」ボタンを押して操作を終了してください。
これを押さないと、セッションが最大3時間維持されるので、後で使いたい人が使えなくなるためです。

また、BOTをボイスチャンネルから退室させるには、以下のコマンドを適当なテキストチャンネルに入力してください。

@uMusicBot leave

BOTの操作説明は以上です。

技術的解説

uMusicBot構成図

基本的な動きは「Googleドライブから音声ファイルを取得」して「Discord.jsを通じて音声ストリームをDiscordに送信」するだけなのですが、付随する仕様が多いのでそこが面倒です…。
特にDiscord.jsくんはこのBOT作ってから2回ほどメジャーバージョンアップしてて、キレながら対応したりしてます。

(細かい技術的解説についてはAdvent Calendarの公開時間が迫っているため、あとで気が向いたら追記します)

FAQ

Q1. 複数人同時にBOTを動かすことはできないのか?
A1. GUIがDiscord外にある関係上、GUI操作ユーザとBOTが入室しているサーバ(ボイチャ)とを紐づけるのがしんどい
身内向けのBOTなので、当該機能の実装予定はありません。

Q2. うちのサーバでも使えないか?
A2. 身内向けのBOTとして運用しています。ご了承下さい。
まぁ利用用途が限定されてるから使いたがる人は殆どいないでしょ

まとめ

これでイントロ早押しクイズをするための技術的な障壁はだいぶ取り除かれたと言ってよいでしょう。

まぁ、イントロクイズは作問のほうがよっぽど難しいんだけどね!!!
イントロクイズで誰も知らない曲を連発するのは、やめようね!! みんな知ってると思ったんだけどおかしいなぁ…

作問については、りみっとさんの「蒼音杯第2回振り返り」が参考になるはず。
note.com

ちなみに

冬コミの原稿を昨日(12/22)入稿しました!
新刊が出ます!!
C101の2日目、12/31(土)東4ホール「ル20b『せらぴん』」で待ってます!!

明日はヴぃにきの「来年どもがよサーバーで流行りそうなもの予想」です。
間違えました。明日はtackmanさんの「AIお絵描き」です。
AIイラストは冬コミでイメージの参考にしようとMidjouneyをちょっと動かしただけで、全然知見がないので助かる。
お楽しみに!

*1:BOTを作るほうが面倒と言われれば、まぁその通りではある。

*2:パスワードがわからない状態でセキュアなWebsocketサーバに接続(傍受)する技術力を指します。

*3:ちなみにWatch Togetherはイントロクイズには使えません。動画タイトルでモロバレなので