himanago

Azure・C#などのMS系技術やLINE関連技術など、好きな技術について書くブログ

Googleアシスタントでも ShouldEndSession = true; したい

はじめに

ちょっと間が空いてしまいましたが、技術書典7に向けて執筆していた中で見つけたスマートスピーカースキル開発まわりの小ネタを書きます。
今回もGoogleアシスタントC#です。

ShouldEndSession

タイトルに書いた通りなんですが、Alexa と Clova はレスポンスで ShouldEndSession = true; としてあげると、その返答でスキルのセッションを終了させることができます。

Googleアシスタントでは、会話の終了は Dialogflow のインテントの設定で行うのが一般的なようで、バックエンド側の指示でセッションを終了させるようなプロパティは(C#の)SDKでは見当たりませんでした。

f:id:himanago:20190919233530p:plain

3プラットフォームでなるべく同じような開発方法でできたらな、とあきらめきれず探していたら、以下のように書けば Dialogflow 側で設定しなくてもバックエンドの指示だけでセッションを終了できるということがわかりました。

var webhookResponse = new WebhookResponse
{                
    FulfillmentText = "もうこの話は終わりね。",
    Payload = new Struct
    {
        Fields =
        {
            {
                "google", Value.ForStruct(new Struct
                {
                    Fields =
                    {
                        { "expectUserResponse", Value.ForBool(false) },
                    }
                })
            },
        }
    }
};

Payload の中で、expectUserResponsefalse にすればOK。
これで3プラットフォームで同じような作り方ができます!

目的は共通化

実はこれを調べていた目的は、3プラットフォームの「共通化」でした。

3つのプラットフォームに向けたスキル開発をする際、コードをいかに共通化できるかは、設定できる項目をどれだけ共通化できるかがカギです。
3プラットフォームの最大公約数だけでスキル開発が完結できるのであれば、共通化ライブラリが作れるからです。
(なので ShouldEndSession 的な機能をGoogleアシスタントで見つけることは非常に大きな意義があった)

おわりに

そんなこんなで、技術書典で頒布する本、入稿できました(ほんとぎりぎりでどうなることかと…)。

実はこの本の中で、C#クロスプラットフォーム開発できるライブラリを作る話を紹介しています。
そして、実はそのライブラリを、すでに NuGet で公開していたりします。
…ただ、ちょっとまだ粗削りな部分があるので、もう少し詰めたらここにも記事を書いて、少しずつアピールしていきたいな、と。。

目指すのはスマートスピーカースキルにおける Xamarin.Forms みたいなもの。
最大公約数な機能を共通のコードで実現しつつ、必要に応じてプラットフォーム固有の実装ができるようなものにしたいと思っています。

ということで技術書典も今週末…。。
『AzureでつくるクロスプラットフォームAIアシスタントスキル』、ぜひいらしてください!m(_ _)m

techbookfest.org