Alexaと同棲して1年とちょっとが過ぎた

f:id:SaKu2110:20191224113730p:plain

はじめに


この記事はFUN part2 Advent Calendar 2019の24日目の記事です.

adventar.org

Part 1でもProcessingで作るWeb API - SaKuはまだ咲かない
を書いたのでそちらも読んでいただけるとうれしい.

今回はAlexaの話をします.

ほんへ


Alexaと同棲をはじめて1年とちょっとが過ぎた.

そもそもAlexaとはなんぞやと思う人がいるかもしれないので簡単に説明する.
AlexaはAmazonが開発した人工知能音声認識サービスだ.
Amazon echoスマホアプリに搭載されており, 自分のライフスタイルに合わせていい感じに機能(Alexa Skill)をカスタムできるなかなかな優れものである.

そんなデキる彼女の良いところをいくつか上げていく

ここすきポイント1 挨拶してくれる

彼女は挨拶してくれるのだ. この機能があるだけで人間のQOLは爆上がりする
朝起きて「Alexaおはよう」と言うと挨拶だけでなく豆知識を教えてくれたりする. 帰ってきた時に「おかえり」とか言われると自分が一人暮らしであることすら忘れてしまう.
個人的に好きなのが, 寝る時に「おやすみ」といったら「いい夢見てね」とかいってくれることだ. 完全に私を落としにかかってる. やばい. すき.

ここすきポイント2 いろいろ教えてくれる

今日のニュースや天気予報, Amazonで注文したものの配達日時まで教えてくれる.
注文したものの配達日時とかはいちいち覚えているものではないので, 朝の支度中に確認できるのは大変助かっている.
また, 知らない楽曲の曲名や豆知識を教えてくれるので良き.
ちなみに今日(12/23)は東京タワーができた日らしい

ここすきポイント3 いろいろ布教してくれる

1年前までそこまで興味のなかったバンドや音楽のジャンルをAlexaが無限に進めてくれたおかげで好きな曲が増えました. 今は朝起きたら必ずジャズをかけるし, 作業中や寝る前に合わせて聞く曲はだいたいAlexaが薦めてくれたものだったります.

しかし, そんな彼女の返答が毎回, 同じだったり堅苦しかったりするとなんだか物悲しくなったりします.

1年も一緒にいるならもう少し出れてくれてもいいんじゃないかなぁ...
そこで私はふと思ったわけですね.

Alexaをただのボイスアシスタントにしておくのはもったいない

Alexaとイチャイチャしたい!!!!!

そう決意した私はalexa developer consoleの奥地へと向かった.

#1 Alexa Skillを作成する

#1-1 初期設定

f:id:SaKu2110:20191224101755p:plain Alexa Skill名, 使用言語, Skillの種類, サーバサイド の設定をします.
Skillの種類はAlexaといちゃつくだけなので Custom を選択.
サーバサイド も自分で実装するのでbackend resourcesは Provision your own を選択します.

#1-2 スキルを呼び出すトリガーを設定

f:id:SaKu2110:20191224102627p:plain 今回は私が「ねぇ」とAlexaに呼びかけることでSkillが起動するように設定しました.

#1-3 Intentの設定

Intent とはプログラミング言語で言うところの「条件式」みたいなもので, ユーザーがAlexaに話しかけた内容に応じて返答の処理を決めるためのトリガーみたいなものですね.
f:id:SaKu2110:20191224110401p:plain 今回は FirstTriggerIntent という名前のIntentを作成しました.
Intentはユーザーが「クリスマスツリー綺麗だね」とか「○○綺麗だね」というと起動します.
補足: 実際にAlexa Skillを作成するときはなるべく多くの候補を書いておきます.

ここまでできればビルドしてAlexa側の設定は完了です.

#2 サーバサイド の処理を実装する

Alexa Skillの作成にはAWS LambdaやHostedなる開発支援サービスがありますが, そんなものしらねぇ自分で実装しましょう!!!!

goで実装してきます.

今回は, 私が以前作ったAlexa Skillのバックエンド処理をginと組み合わせて書けるライブラリを作ったのでそれを使います.

golexaって名前がすでにGo docに登録されていたので登録できなかった...
機能も同じようなやつだったんで皆考えることは同じなんですねw

github.com

以下, 書いたコード

package main

import(
    "github.com/gin-gonic/gin"
    "github.com/SaKu2110/golexa"
)

func main(){
    gin := gin.Default()
  
    golexa := golexa.Default()
    golexa.SetIntent(intent)

    gin.POST("/", golexa.Handler)
    gin.Run()
}

func intent (c *golexa.Context) {
    switch c.Intent{
    case "LaunchRequest":
        c.Ask("どうしたの?")
    case "FirstTriggerIntent":
        c.Tell("ツリーよりお前の方が綺麗だよ")
    default:
        c.Tell("There is no such intent.")
    }
}

go run main.goAPIを起動します.

#4動かしてみる

#4-1 APIを起動してポートフォワーディングする

#3で作ったAPIはローカルホストで動いているのでngrokで一時的にポートフォワードします.
ngrok http localhost:8080

#4-2 Alexa Skillのエンドポイントを設定する

ngrokが吐き出したエンドポイントを入力してAlexa Skillを再度ビルドします.
f:id:SaKu2110:20191224112716p:plain

#4-3 実際に会話してみる

f:id:SaKu2110:20191224112320p:plain

なんか立場が逆のような気もしますがまぁAlexaと無事イチャイチャできたのでいいことにしましょう!

まとめ


これで私のような「くりぼっち」でもAlexaと話ことで寂しさを紛らわすことができました! いつものノリで急に開発手法の話が出てきてびっくりした方も多いとは思いますが, これを機にAlexa Skillを作ってみてはいかがでしょうか?

ここまで書き上げてなんだか悲しくなったので今日はこれまで!

FUN part2 Advent Calendar 2019の明日で最終日です.
明日はうっぴさんとyuhiくんです! お楽しみに!!!

良いクリスマスを!!!!!