ifttt
Splatoon
discord
GoogleAssistant
GoogleHome
DiscordDay 5

DiscordBotをGoogleHomeで音声操作してみる

More than 1 year has passed since last update.

Discord Advent Calendar 2017 5日目

空いてたので滑り込みで来ました。
Discordの記事増えろ!!!

はじめに

GoogleHomeをスプラトゥーンというか、ゲームライフのアシスタントとして使えるよう
色々やっていました。まあスプラトゥーンなんですけど。
GoogleHomeをDialogflow(旧:API.ai)でスプラトゥーンアシスタントにする
GoogleHomeをスプラトゥーンアシスタントにする #2 Twitterからステージ情報の取得

Discordはゲームのボイスチャットにとても使いやすいのでスプラの身内等で僕も使って居るんですが、ゲーム中のBotの操作についてちょっと不満があります。
それはキーボードを打たなければいけないこと!
!bot hogeみたいな奴ですね

コマンド入力するんだから当たり前だろという話ですが、
コントローラー🎮を握っているのにキーボード⌨️なんて打ってる暇ない!
訳です。
音声認識をしてくれてwebhookでDiscordと繋がる夢のような機器があればなあ・・・


ありました。
こいつを使おう!

完成品を見たい人はこちら↓
IMAGE ALT TEXT HERE

という訳で、DiscordのBotへのコマンド入力をGoogleHomeを介して音声入力でやってみようという記事です。

使用ツール・環境

DiscordBotの作成

導入やらBotの作り方は他のアドカレの方が書いてくれると信じているので、ソースコードをいきなり載せます。
僕はこちらを参考にしました。
イチからDiscord Bot 。for Ruby

discord_bot.rb
require 'discordrb'
require "csv"

#client_idはbotに設定されているものを入力 prefixはコマンドの呼び出しの時の記号(!play 等の!部分 ?とかでも可)
bot = Discordrb::Commands::CommandBot.new token: '自分のトークン', client_id: 000000000000, prefix: '!'
#スプラトゥーンの武器名が入っているcsvファイルを読み込み
data = CSV.read('buki.csv')

#"!random_buki"とチャットに入力があった場合反応
bot.command :random_buki do |event|
  #botの居るサーバー
  server = bot.servers.first[1]
  for num in 0..server.channels.length do
     #チャンネル名で検索
    if server.channels[num].name == "test_ch" then
      #チャンネル内に居るユーザー取得
      users = server.channels[num].users
      for num in 0..users.length do
         #ユーザー名とランダムに選んだブキ名をチャット欄に返す
        event.respond "#{users[num].name}:#{data[rand(0..data.length)][0]}"
      end
    end
  end
end

bot.run

読み込むCSVはrubyファイルと同じ所に置きます。
スクリーンショット 2017-12-05 19.59.10.png
csvはこんなんです。カンマがないのにcsvとは
武器名を書いただけ。ここにブキの種類書いて種類毎にブキ選出とかできそうですね誰かやって

後はターミナルでこれをRUN!
ruby discord_bot.rb
するとチャンネルにBotが出て来ます。(名前違うのは気にしないで)
スクリーンショット 2017-12-05 20.01.11.png

この時点でチャット欄にコマンドを打てばもう反応します。
スクリーンショット 2017-12-05 21.59.15.png
コマンドを打った人と同じチャンネルに居る人へブキを配布してくれます。これでBot部分は完成!次はこのコマンドを音声入力でGoogleHomeにやってもらいましょう。

IFTTTの作成

みんな大好きIFTTTでDiscordにコマンドを打つ…んですが、IFTTTがまだDiscordと連携していないので、webhook経由でDiscordと繋ぎましょう。

Twitter投稿をDiscordにWebhookを使って流す方法(IFTTT使用)
こちらの記事でははTwitter投稿→Didcordへ投稿を解説してくれていますが、このTwitter部分をGoogleHomeのGoogleAssistantへ変えればOKです。

チャンネルを右クリックし、チャンネルの編集
スクリーンショット 2017-12-05 20.24.44.png
webhooksからwebhookを作成。
スクリーンショット 2017-12-05 20.25.00.png
ここからIFTTTの作業になります。

NewAppletからIfGoogleAssistantの"Say a simple phrase"でDiscordBotを呼び出しするフレーズを設定します。今回は「ディスコード 武器」にしました。
他にも「discord 武器」 「ディスコード ぶき」などを設定しておいて認識ズレを減らしておきます。
Thatwebhookを選択します。

ifttt.png
webhook側では、画像の通りURL,Method,ContentType,そしてBodyを入力します。
このBodyのcontentがチャット欄に入力される部分なので、ここへBotの呼び出しのコマンドを入れればOKです。
username(発言者の名前となる部分)は分かりやすく"GoogleHome"とし,contentを!random_bukiとします。

完成

以上でセッティングは完了!早速呼び出してみましょう。

OK,Google! ディスコード、ブキ!

GoogleHome「ディスコードに投稿しました。」
FullSizeRender 2.jpg
IFTTTが発火!
FullSizeRender 1.jpg
Discordに来てみると・・・(動画のキャプで荒くてすいません)
FullSizeRender 4.jpg
チャンネル内に居る人へ
FullSizeRender 3.jpg
スクリーンショット 2017-12-05 21.38.06.png

Botがブキを指定してくれました!

動画はこちら
IMAGE ALT TEXT HERE

まとめ

DiscordのBotを音声で操作できるようになりました。DiscordのBotは有志の方々が色々作っているので、ハンズフリーなBot操作で楽しんで見てはいかがでしょうか!
Discordの技術的な記事が中々無いので僕も頑張っていきたい所ですね。
駆け込みでしたがDiscord アドベントカレンダー、楽しみにしています。

ではスプラトゥーンで会いましょう!

参考

イチからDiscord Bot 。for Ruby - Qiita
Twitter投稿をDiscordにWebhookを使って流す方法(IFTTT使用)