Posted at
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使用)