Ejemplo n.º 1
0
        public void AudioPlayerWithMetadataGeneratesCorrectJson()
        {
            var directive = new AudioPlayerPlayDirective
            {
                PlayBehavior = PlayBehavior.Enqueue,
                AudioItem    = new AudioItem
                {
                    Stream = new AudioItemStream
                    {
                        Url   = "https://url-of-the-stream-to-play",
                        Token = "opaque token representing this stream",
                        ExpectedPreviousToken = "opaque token representing the previous stream"
                    },
                    Metadata = new AudioItemMetadata
                    {
                        Title    = "title of the track to display",
                        Subtitle = "subtitle of the track to display",
                        Art      = new AudioItemSources
                        {
                            Sources = new[] { new AudioItemSource("https://url-of-the-album-art-image.png") }.ToList()
                        },
                        BackgroundImage = new AudioItemSources {
                            Sources = new[] { new AudioItemSource("https://url-of-the-background-image.png") }.ToList()
                        }
                    }
                }
            };

            Assert.True(Utility.CompareJson(directive, "AudioPlayerWithMetadata.json"));
        }
Ejemplo n.º 2
0
        private List <AudioPlayerPlayDirective> AddPlayListDirective(DeezerSearchResp deezer)
        {
            List <AudioPlayerPlayDirective> playlist = new List <AudioPlayerPlayDirective>();

            foreach (var item in deezer.data)
            {
                var c = new AudioPlayerPlayDirective()
                {
                    //PlayBehavior = PlayBehavior.Enqueue,
                    AudioItem = new Alexa.NET.Response.Directive.AudioItem()
                    {
                        Stream = new AudioItemStream()
                        {
                            Url   = item.preview,
                            Token = item.title_short
                        },
                        Metadata = new AudioItemMetadata
                        {
                            Title    = item.album.title,
                            Subtitle = item.title_short,
                            Art      = new AudioItemSources
                            {
                                Sources = new List <AudioItemSource>
                                {
                                    new AudioItemSource
                                    {
                                        Url = item.album.cover_xl
                                    }
                                }
                            },
                            BackgroundImage = new AudioItemSources
                            {
                                Sources = new List <AudioItemSource>
                                {
                                    new AudioItemSource
                                    {
                                        Url = item.album.cover_xl
                                    }
                                }
                            },
                        },
                    }
                };
                playlist.Add(c);
            }
            return(playlist);
        }
Ejemplo n.º 3
0
        public void AudioPlayerGeneratesCorrectJson()
        {
            var directive = new AudioPlayerPlayDirective
            {
                PlayBehavior = PlayBehavior.Enqueue,
                AudioItem    = new AudioItem
                {
                    Stream = new AudioItemStream
                    {
                        Url   = "https://url-of-the-stream-to-play",
                        Token = "opaque token representing this stream",
                        ExpectedPreviousToken = "opaque token representing the previous stream"
                    }
                }
            };

            Assert.True(Utility.CompareJson(directive, "AudioPlayerWithoutMetadata.json"));
        }
Ejemplo n.º 4
0
        private AudioPlayerPlayDirective AddAudioDirective(DeezerSearchResp deezer)
        {
            var c = new AudioPlayerPlayDirective()
            {
                //PlayBehavior = PlayBehavior.ReplaceAll,
                AudioItem = new Alexa.NET.Response.Directive.AudioItem()
                {
                    Stream = new AudioItemStream()
                    {
                        Url   = deezer.data[0].preview,
                        Token = deezer.data[0].title_short
                    },
                    Metadata = new AudioItemMetadata
                    {
                        Title    = deezer.data[0].album.title,
                        Subtitle = deezer.data[0].title_short,
                        Art      = new AudioItemSources
                        {
                            Sources = new List <AudioItemSource>
                            {
                                new AudioItemSource
                                {
                                    Url = deezer.data[0].album.cover_xl
                                }
                            }
                        },
                        BackgroundImage = new AudioItemSources
                        {
                            Sources = new List <AudioItemSource>
                            {
                                new AudioItemSource
                                {
                                    Url = deezer.data[0].album.cover_xl
                                }
                            }
                        },
                    },
                }
            };

            return(c);
        }
Ejemplo n.º 5
0
        public async Task <SkillResponse> FunctionHandler(SkillRequest input, ILambdaContext context)
        {
            ILambdaLogger log = context.Logger;

            log.LogLine($"Skill Request Object:" + JsonConvert.SerializeObject(input));
            //APLSupport.Add();

            var accessToken = input.Context.System.User.AccessToken;

            var handler = new JwtSecurityTokenHandler();
            var token   = handler.ReadJwtToken(accessToken);

            var name = token.Payload["firstname"].ToString();

            string  user_name = "";
            Session session   = input.Session;

            try
            {
                if (session.Attributes == null)
                {
                    session.Attributes = new Dictionary <string, object>();
                }

                Type requestType = input.GetRequestType();
                if (input.GetRequestType() == typeof(LaunchRequest))
                {
                    //    var sentences = "Smooth as an android's bottom, eh, Data? About four years." +
                    //"I got tired of hearing how young I looked. " +
                    //"Captain, why are we out here chasing comets? " +
                    //"Fate protects fools, little children and ships named Enterprise."+
                    //"I got tired of hearing how young I looked. " +
                    //"Captain, why are we out here chasing comets? " +
                    //"Fate protects fools, little children and ships named Enterprise."+
                    //"I got tired of hearing how young I looked. " +
                    //"Captain, why are we out here chasing comets? " +
                    //"Fate protects fools, little children and ships named Enterprise."+
                    //"I got tired of hearing how young I looked. " +
                    //"Captain, why are we out here chasing comets? " +
                    //"Fate protects fools, little children and ships named Enterprise.";
                    //var speech = new Speech(new PlainText(sentences));
                    //var mainLayout = new Layout(
                    //    new Container(
                    //        new Image
                    //        {
                    //            Width = "100vw",
                    //            Height = "100vh",
                    //            Position = new APLValue<string>("absolute"),
                    //            Scale = new APLValue<Scale?>(Scale.BestFill),
                    //            Source = new APLValue<string>(bgUrl)
                    //        },


                    //        new ScrollView(
                    //            new Text(sentences)
                    //            {
                    //                PaddingLeft = 40,
                    //                PaddingRight = 40,
                    //                PaddingBottom = 40,
                    //                FontSize = "40dp",
                    //                TextAlign = "Center",
                    //                Id = "talker",
                    //                Content = APLValue.To<string>("${payload.script.properties.text}"),
                    //                Speech = APLValue.To<string>("${payload.script.properties.speech}")
                    //            }
                    //        )
                    //        { Width = "100vw", Height = "100vh" }
                    //    )
                    //);
                    //mainLayout.Parameters = new List<Parameter>();
                    //mainLayout.Parameters.Add(new Parameter("payload"));

                    //var response = ResponseBuilder.Empty();
                    //response.Response.ShouldEndSession = false;

                    //var directive = new RenderDocumentDirective
                    //{
                    //    Token = "randomToken",
                    //    Document = new APLDocument
                    //    {
                    //        MainTemplate = mainLayout
                    //    },
                    //    DataSources = new Dictionary<string, APLDataSource>
                    //    {
                    //        {
                    //            "script",new ObjectDataSource
                    //            {
                    //                Properties = new Dictionary<string, object>
                    //                {
                    //                    { "ssml", speech.ToXml()}
                    //                },
                    //                Transformers = new List<APLTransformer>{
                    //                    APLTransformer.SsmlToText(
                    //                        "ssml",
                    //                        "text"),
                    //                    APLTransformer.SsmlToSpeech(
                    //                        "ssml",
                    //                        "speech")
                    //                }
                    //            }
                    //        }
                    //    }
                    //};


                    //response.Response.Directives.Add(directive);
                    //var speakItem = new SpeakItem
                    //{
                    //    ComponentId = "talker",
                    //    HighlightMode = new APLValue<HighlightMode?>(HighlightMode.Line)
                    //};
                    //response.Response.Directives.Add(new ExecuteCommandsDirective("randomToken", speakItem));
                    //return response;



                    session.Attributes["user_name"] = name;
                    var xml = await new Ssml().Say("Take a \n deep breath")
                              .Say("<audio src =\"soundbank://soundlibrary/transportation/amzn_sfx_car_accelerate_01\" />")
                              .Say("then continue.").ForAlexa()
                              .ToStringAsync();
                    var d = new SsmlOutputSpeech
                    {
                        Ssml = $"<speak>Welcome to Ride Hailer<audio src =\"https://bestilldemo.azurewebsites.net/images/audio10.mp3\" />You can order a ride,or request a fare estimate.Which will it be ?</speak>"
                    };
                    string   next = $"Welcome {name}, \n You can ask me about any country";
                    Reprompt rp   = new Reprompt(next);



                    var rt = input.Context.System.Device.IsInterfaceSupported("Display");
                    if (rt)
                    {
                        //var shape = input.Context.Viewport?.Shape;
                        //var response = ResponseBuilder.AskWithCard(next, "Welcome", next, rp);


                        //session.Attributes.Add("LastIntent", input.Request.Intent.Name);
                        //PlainTextOutputSpeech speech = new PlainTextOutputSpeech(msg);
                        //var response = ResponseBuilder.Ask(next, new Reprompt(""), session);

                        //var response = ResponseBuilder.Empty();
                        //response.Response.ShouldEndSession = false;

                        var response = ResponseBuilder.Ask(next, rp, session);
                        //var dr = new Template().BuildAPLDirective(next, null,"Sylvester Assistant", "Welcome");
                        var dr = new Template().BuildScrollingSequenceWithVoiceDirective(next, null, "Sylvester Assistant", "Welcome");

                        //var dr = new Template().BuildItemListDirective(next, null, "Sylvester Assistant", "Welcome");
                        //var dr = new Template().BuildDataListDirective(next, null,"Sylvester Assistant", "Welcome");
                        //var dr = BuildAPLDirective(next);
                        response.Response.Directives.Add(dr);
                        //var speakItem = new SpeakList
                        //{
                        //    ComponentId = "mySequence",
                        //    Start = new APLValue<int>(0),
                        //    Count = new APLValue<int>(next.Split(",").Length),
                        //    MinimumDwellTime = new APLValue<int?>(1000),
                        //    Align = new APLValue<ItemAlignment?>(ItemAlignment.Center)
                        //};
                        //response.Response.Directives.Add(new ExecuteCommandsDirective("randomToken", speakItem));
                        return(response);
                    }
                    else
                    {
                        return(ResponseBuilder.Ask(next, rp, session));
                    }
                }
                else if (input.GetRequestType() == typeof(SessionEndedRequest))
                {
                    user_name = (string)session.Attributes["user_name"];
                    var speech   = $"Goodbye {user_name} and thanks for playing!";
                    var response = ResponseBuilder.Tell(speech);
                    var dr       = new Template().BuildAPLDirective(speech, null, "Sylvester Assistant", "Welcome");
                    response.Response.Directives.Add(dr);
                    return(response);
                }
                else if (input.GetRequestType() == typeof(IntentRequest))
                {
                    var intentRequest = (IntentRequest)input.Request;
                    switch (intentRequest.Intent.Name)
                    {
                    case "AMAZON.CancelIntent":
                    case "AMAZON.StopIntent":
                        user_name = (string)session.Attributes["user_name"];
                        return(ResponseBuilder.Tell($"Goodbye {user_name} and thanks for playing!"));

                    case "AMAZON.HelpIntent":
                    {
                        Reprompt rp = new Reprompt("What's next?");
                        return(ResponseBuilder.Ask("Here's some help. What's next?", rp, session));
                    }

                    case "AudioPlayer.PlaybackNearlyFinished":
                    {
                        Reprompt rp = new Reprompt("What's next?");
                        return(ResponseBuilder.Ask("Here's some help. What's next?", rp, session));
                    }

                    case "MusicIntent":
                    {
                        var query  = intentRequest.Intent.Slots["searchQuery"].Value;
                        var result = await _client.SearchDeezer(query, context);

                        if (result == null)
                        {
                            string   msg = $"Could not get the music you are looking for. Please ask again.";
                            Reprompt er  = new Reprompt(msg);
                            return(ResponseBuilder.Ask(msg, er, session));
                        }
                        var response = ResponseBuilder.Empty();

                        var playlist = AddPlayListDirective(result);
                        session.Attributes["playlist"] = JsonConvert.SerializeObject(playlist);
                        session.Attributes["playlist_current_index"] = 0;
                        response.Response.Directives.Add(playlist[0]);
                        return(response);
                    }

                    case "AMAZON.YesIntent":
                    {
                        var lastIntent = (string)session.Attributes["last_intent"];
                        switch (lastIntent)
                        {
                        case "CountryIntent":
                        {
                            var country = (string)session.Attributes["country"];
                            var anthem  = await _client.SearchDeezer($"{country} national anthem", context);

                            if (anthem == null)
                            {
                                string   msg = $"Something went wrong. Please ask again.";
                                Reprompt er  = new Reprompt(msg);
                                return(ResponseBuilder.Ask(msg, er, session));
                            }

                            //var progressiveResponse = new ProgressiveResponse(input);
                            //progressiveResponse.SendSpeech("With Pleasure! just hold on a second");


                            //string audioUrl = anthem.data[0].preview;
                            //string audioToken = anthem.data[0].title_short;

                            //var response = ResponseBuilder.AudioPlayerPlay(PlayBehavior.ReplaceAll, audioUrl, audioToken);
                            //var dr = BuildAudioAPLDirective(anthem.data[0].album.cover_xl);
                            var response = ResponseBuilder.Empty();
                            response.Response.Directives.Add(AddAudioDirective(anthem));
                            return(response);
                        }

                        default:
                        {
                            string   msg = $"You are trying to trick me. I know i didn't ask you anything";
                            Reprompt er  = new Reprompt(msg);
                            return(ResponseBuilder.Ask(msg, er, session));
                        }
                        }
                    }

                    case "AMAZON.NoIntent":
                    {
                        var    rnd = new Random();
                        var    i   = rnd.Next(0, 2);
                        string msg = "";
                        if (i == 0)
                        {
                            msg = "Remember you can still play a guessing game with me by saying New Game";
                        }
                        else
                        {
                            msg = "You can ask me about any country by saying Tell me about the contry. example Tell me about Nigeria";
                        }

                        Reprompt er       = new Reprompt(msg);
                        var      response = ResponseBuilder.Ask(msg, er, session);
                        var      dr       = new Template().BuildAPLDirective(msg, null, "Sylvester Assistant", "Welcome");
                        response.Response.Directives.Add(dr);
                        return(response);
                    }

                    case "NewGameIntent":
                    {
                        //session.Attributes["num_guesses"] = 0;
                        //session.Attributes["last_intent"] = "NewGameIntent";
                        //Random rnd = new Random();
                        //Int32 magicNumber = rnd.Next(1, 10);
                        //session.Attributes["magic_number"] = magicNumber;

                        //string next = "Guess a number betwen 1 and 10";
                        //Reprompt rp = new Reprompt(next);
                        //var response = ResponseBuilder.Ask(next, rp, session);
                        //var dr = BuildAPLDirective(next);
                        //response.Response.Directives.Add(dr);
                        //return response;

                        var resp     = ResponseBuilder.Empty();
                        var audioUrl = "https://djejflde2khrv.cloudfront.net/broadcasts/desktop/win20200706.mp3";

                        var audioPlayer = new AudioPlayerPlayDirective()
                        {
                            PlayBehavior = PlayBehavior.Enqueue,
                            AudioItem    = new AudioItem()
                            {
                                Stream = new AudioItemStream()
                                {
                                    Url   = audioUrl,
                                    Token = "Today's Devotional"
                                },
                                Metadata = new AudioItemMetadata
                                {
                                    Title    = "Today's Devotional",
                                    Subtitle = "hello",
                                    Art      = new AudioItemSources
                                    {
                                        Sources = new List <AudioItemSource>
                                        {
                                            new AudioItemSource
                                            {
                                                Url = "https://i.ibb.co/5cWztFH/brown-on-seashore-near-mountain-1007657.jpg"
                                            }
                                        }
                                    },
                                    BackgroundImage = new AudioItemSources
                                    {
                                        Sources = new List <AudioItemSource>
                                        {
                                            new AudioItemSource
                                            {
                                                Url = "https://i.ibb.co/5cWztFH/brown-on-seashore-near-mountain-1007657.jpg"
                                            }
                                        }
                                    },
                                },
                            }
                        };


                        resp.Response.Directives.Add(audioPlayer);
                        return(resp);
                    }

                    case "NewRespIntent":
                    {
                        // check answer
                        session.Attributes["last_intent"] = "NewRespIntent";
                        string userString = intentRequest.Intent.Slots["Value"].Value;
                        Int32  userInt    = 0;
                        Int32.TryParse(userString, out userInt);
                        bool   correct  = (userInt == (Int32)(long)session.Attributes["magic_number"]);
                        Int32  numTries = (Int32)(long)session.Attributes["num_guesses"] + 1;
                        string speech   = "";
                        if (correct)
                        {
                            speech = "Correct! You guessed it in " + numTries.ToString() + " tries. Say new game to play again, or stop to exit. ";
                            session.Attributes["num_guesses"] = 0;
                        }
                        else
                        {
                            speech = "Nope, guess again.";
                            session.Attributes["num_guesses"] = numTries;
                        }
                        Reprompt rp       = new Reprompt("speech");
                        var      response = ResponseBuilder.Ask(speech, rp, session);
                        var      dr       = new Template().BuildAPLDirective(speech, null, "Sylvester Assistant", "Welcome");
                        response.Response.Directives.Add(dr);
                        return(response);
                    }

                    case "CountryIntent":
                    {
                        session.Attributes["last_intent"] = "CountryIntent";
                        string countryString = intentRequest.Intent.Slots["Country"].Value;

                        if (string.IsNullOrEmpty(countryString))
                        {
                            var      msg      = "I'm sorry, but I didn't understand the country you were asking for. Please ask again.";
                            Reprompt er       = new Reprompt(msg);
                            var      response = ResponseBuilder.Ask(msg, er, session);
                            var      dr       = new Template().BuildAPLDirective(msg, null, "Sylvester Assistant", "Welcome");
                            response.Response.Directives.Add(dr);
                            return(response);
                        }

                        var countryInfo = await _client.GetCountryInfo(countryString, context);

                        if (countryInfo == null)
                        {
                            string   msg      = $"I cannot recorganize {countryString} as a country. Please ask again.";
                            Reprompt er       = new Reprompt(msg);
                            var      response = ResponseBuilder.Ask(msg, er, session);
                            var      dr       = new Template().BuildAPLDirective(msg, null, "Sylvester Assistant", "Welcome");
                            response.Response.Directives.Add(dr);
                            return(response);
                        }
                        session.Attributes["country"] = countryInfo.demonym;
                        string   next = $"{countryInfo.name} is in {countryInfo.subregion}. The capital is {countryInfo.capital} and the population is {countryInfo.population}. {countryInfo.demonym} native language is {countryInfo.languages[0].name} and their currency is called {countryInfo.currencies[0].name}. Would you like me to play {countryInfo.demonym} national anthem?";
                        Reprompt rp   = new Reprompt(next);
                        var      resp = ResponseBuilder.Ask(next, rp, session);
                        var      dre  = new Template().BuildAPLDirective(next, null, "Sylvester Assistant", "Welcome");
                        resp.Response.Directives.Add(dre);
                        return(resp);
                    }

                    case "QuietTimeIntent":
                    {
                        string   msg      = "Okay thanks";
                        Reprompt er       = new Reprompt(msg);
                        var      response = ResponseBuilder.Ask(msg, er, session);
                        var      dr       = new Template().BuildAPLDirective(msg, null, "Sylvester Assistant", "Welcome");
                        response.Response.Directives.Add(dr);
                        return(response);
                    }

                    case "AMAZON.FallbackIntent":
                    {
                        string   msg      = "Sylvester Assistant does not support that. You can ask me about any country. example, Tell me about Nigeria";
                        Reprompt er       = new Reprompt(msg);
                        var      response = ResponseBuilder.Ask(msg, er, session);
                        var      dr       = new Template().BuildAPLDirective(msg, null, "Sylvester Assistant", "Welcome");
                        response.Response.Directives.Add(dr);
                        return(response);
                    }

                    default:
                    {
                        log.LogLine($"Unknown intent: " + intentRequest.Intent.Name);
                        string   speech   = "I didn't understand - try again?";
                        Reprompt rp       = new Reprompt(speech);
                        var      response = ResponseBuilder.Ask(speech, rp, session);
                        var      dr       = new Template().BuildAPLDirective(speech, null, "Sylvester Assistant", "Welcome");
                        response.Response.Directives.Add(dr);
                        return(response);
                    }
                    }
                }
                else if (input.GetRequestType() == typeof(AudioPlayerRequest))
                {
                    var audioRequest = (AudioPlayerRequest)input.Request;
                    switch (audioRequest.AudioRequestType)
                    {
                    case AudioRequestType.PlaybackNearlyFinished:
                    {
                        var response = ResponseBuilder.Empty();

                        var jsonStr  = (string)session.Attributes["playlist"];
                        var playlist = JsonConvert.DeserializeObject <List <AudioPlayerPlayDirective> >(jsonStr);
                        var index    = (int)session.Attributes["playlist_current_index"];

                        if (playlist.Count == index)
                        {
                            return(response);
                        }
                        response.Response.Directives.Add(playlist[index + 1]);
                        session.Attributes["playlist_current_index"] = index + 1;
                        return(response);
                    }

                    default:
                    {
                        string   speech   = "Something went wrong! Please try again!";
                        Reprompt rp       = new Reprompt(speech);
                        var      response = ResponseBuilder.Ask(speech, rp, session);
                        var      dr       = BuildAPLDirective(speech);
                        response.Response.Directives.Add(dr);
                        return(response);
                    }
                    }
                }
                user_name = (string)session.Attributes["user_name"];
                return(ResponseBuilder.Tell($"Goodbye {user_name} and thanks for playing!"));
            }
            catch (Exception ex)
            {
                string   msg      = "Something went wrong. Please ask again";
                Reprompt er       = new Reprompt(msg);
                var      response = ResponseBuilder.Ask(msg, er, session);
                var      dr       = new Template().BuildAPLDirective(msg, null, "Sylvester Assistant", "Welcome");
                response.Response.Directives.Add(dr);
                return(response);
            }
        }