private void Connector_ActivityReceived(object sender, ActivityReceivedEventArgs e)
        {
            var json     = e.Activity;
            var activity = JsonConvert.DeserializeObject <Activity>(json);

            if (e.HasAudio && activity.Speak != null)
            {
                var audio  = e.Audio;
                var stream = new ProducerConsumerStream();

                Task.Run(() =>
                {
                    var buffer     = new byte[800];
                    uint bytesRead = 0;
                    while ((bytesRead = audio.Read(buffer)) > 0)
                    {
                        stream.Write(buffer, 0, (int)bytesRead);
                    }
                }).Wait();

                var channelData = activity.GetChannelData <SpeechChannelData>();
                var id          = channelData?.ConversationalAiData?.RequestInfo?.InteractionId;
                if (!string.IsNullOrEmpty(id))
                {
                    System.Diagnostics.Debug.WriteLine($"Expecting TTS stream {id}");
                }

                var wavStream = new RawSourceWaveStream(stream, new WaveFormat(16000, 16, 1));
                this.playbackStreams.Enqueue(new WavQueueEntry(id, false, stream, wavStream));

                if (this.player.PlaybackState != PlaybackState.Playing)
                {
                    Task.Run(() => this.PlayFromAudioQueue());
                }
            }

            List <AdaptiveCard> cardsToBeRendered = new List <AdaptiveCard>();

            if (activity.Attachments?.Any() is true)
            {
                cardsToBeRendered = activity.Attachments
                                    .Where(x => x.ContentType == AdaptiveCard.ContentType)
                                    .Select(x =>
                {
                    try
                    {
                        var parseResult = AdaptiveCard.FromJson(x.Content.ToString());
                        return(parseResult.Card);
                    }
#pragma warning disable CA1031 // Do not catch general exception types
                    catch (Exception ex)
                    {
                        this.ShowException(ex);
                        return(null);
                    }
#pragma warning restore CA1031 // Do not catch general exception types
                })
                                    .Where(x => x != null)
                                    .ToList();
            }

            this.RunOnUiThread(() =>
            {
                this.Activities.Add(new ActivityDisplay(json, activity, Sender.Bot));
                if (activity.Type == ActivityTypes.Message || cardsToBeRendered?.Any() == true)
                {
                    var renderedCards = cardsToBeRendered.Select(x =>
                    {
                        var rendered             = this.renderer.RenderCard(x);
                        rendered.OnAction       += this.RenderedCard_OnAction;
                        rendered.OnMediaClicked += this.RenderedCard_OnMediaClicked;
                        return(rendered?.FrameworkElement);
                    });
                    this.Messages.Add(new MessageDisplay(activity.Text, Sender.Bot, renderedCards));
                    this.ConversationView.ConversationHistory.ScrollIntoView(this.ConversationView.ConversationHistory.Items[this.ConversationView.ConversationHistory.Items.Count - 1]);
                }
            });
        }
Exemple #2
0
 public WavQueueEntry(string id, bool playInitiated, ProducerConsumerStream stream, RawSourceWaveStream reader) =>
 (this.Id, this.PlayInitiated, this.Stream, this.Reader) = (id, playInitiated, stream, reader);