Visual Studio에서 Alexa 기술 개발. C#에서. 여러 의도에 응답합니다.

소개



Visual Studio에서 Alexa 스킬을 코딩하여 AWS Lambda에 배포하고 실제로 실행할 때까지는 여기 문서에 썼습니다.
거기에서는 LaunchRequest 인가 그렇지 않은가 ( IntentRequest 인가)로 Alexa의 응답을 변경하는 것만으로도 지극히 단순한 스킬로 하고 있었습니다.

이번에는 조금 더 만들고, IntentRequest 그렇다면 그것이 무슨 인텐트인지에 따라 반응을 바꾸도록 합시다.

대화 모델에 인텐트 추가



먼저 Alexa 개발자 콘솔로 이동하여 마지막으로 만든 MyFirstCSharpSkill의 대화 모델에 인텐트를 추가합니다.
Alexa에게 "인사해"라고 말했다면 "안녕하세요"라고 인사를 돌려주도록 해 봅시다.
인사말에 발행된 인텐트를 GreetingIntent로 추가합니다.

이름을 지정하여 맞춤 인텐트를 만듭니다.


그리고 아래와 같이 미안 정도의 샘플 발화를 등록합니다.
사용자가 이러한 발화를 받으면 GreetingIntent가 발행됩니다.


대화 모델을 변경했으므로 빌드합니다.
이제 "샘플 호출로 인사합니다."라고 말하면 GreetingIntent가 AWS Lambda로 전송됩니다.

AWS Lambda 측 처리 변경



Visual Studio에서 마지막으로 만든 MyFirstCSharpSkill_Lambda 프로젝트를 엽니다.

코드가 진흙 냄새는 일단 눈을 감아주세요.
보다 좋은 쓰는 방법은 어느 쪽.

그런데, 이하가 변경을 한 FunctionHandler 메소드입니다.
어디가 변경, 이라고 할까 추가되었는가라고 하면 중반당의 「인텐트명으로 경우 나누기」라고 하는 코멘트의 근처로부터입니다.
IntentRequest 객체를 가져오고 거기에서 인텐트 이름을 가져오고 그에 따라 처리를 분리합니다.
:FunctionHandlerメソッド

        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public SkillResponse FunctionHandler(SkillRequest input, ILambdaContext context)
        {
            //ResponseプロパティにAlexaに喋らせる内容などを突っ込んでいく
            var skillResponse = new SkillResponse
            {
                Version = "1.0",//お約束
                Response = new ResponseBody()//お約束
            };


            //リクエストタイプが「LaunchRequest」かそれ以外の「IntentRequest」か判別する
            //今回はスキル起動時に送られる「LaunchRequest」のときとそれ以外のときで異なるレスポンスを返すようにした。
            if (input.Request.Type == nameof(Alexa.NET.Request.Type.LaunchRequest))
            {
                skillResponse.Response.OutputSpeech = new PlainTextOutputSpeech
                {
                    Text = "スキルを起動しましたよ。"
                };
            }
            else
            {
                //LaunchRequest以外はこちら
                //つまりIntentRequestもこちら

                //IntentRequestの場合
                //SampleIntentとGreetingIntentの2種類+ビルトインインテント数種類がある
                //今回は自分で登録したSmapleIntentとGreetingIntentだけを扱う。

                //RequestをIntentRequestにキャスト
                var intentRequest = (IntentRequest) input.Request;
                //インテント名はこのIntentRequestオブジェクトが持っている
                var intentName = intentRequest.Intent.Name;

                //インテント名で場合分け
                if (intentName == "SampleIntent")
                {
                    skillResponse.Response.OutputSpeech = new PlainTextOutputSpeech
                    {
                        Text = "サンプルインテントでした。"
                    };
                }
                else if (intentName == "GreetingIntent")
                {
                    skillResponse.Response.OutputSpeech = new PlainTextOutputSpeech
                    {
                        Text = "こんにちは。グリーティングインテントでした。"
                    };
                }
                else
                {
                    skillResponse.Response.OutputSpeech = new PlainTextOutputSpeech
                    {
                        Text = "どれでもありませんでした。"
                    };
                }
            }


            //セッション終了させる。
            skillResponse.Response.ShouldEndSession = true;

            return skillResponse;
        }

테스트



시도해 봅시다.SampleIntentGreetingIntent 를 각각 호출해 보면, 다음과 같이 대응한 응답이 돌아오는 것을 알 수 있습니다.


결론



이제 더 복잡한 대화를 Alexa와 즐길 수 있습니다.

좋은 웹페이지 즐겨찾기