/// <summary>
        /// Returns an entity value matching the given name and value, with returnEntity containing the matched entity.
        /// </summary>
        public LexiconEntityValue FindEntityValue(string entityName, string valueName, out LexiconEntity returnEntity)
        {
            foreach (LexiconEntity entity in requiredEntities)
            {
                if (entity == null)
                {
                    continue;
                }

                if (entityName.Equals(entity.EntityName, System.StringComparison.OrdinalIgnoreCase))
                {
                    LexiconEntityValue entityValue = entity.FindValueByName(valueName);
                    if (entityValue != null)
                    {
                        returnEntity = entity;
                        return(entityValue);
                    }
                }
            }

            foreach (LexiconEntity entity in optionalEntities)
            {
                if (entity == null)
                {
                    continue;
                }

                if (entityName.Equals(entity.EntityName, System.StringComparison.OrdinalIgnoreCase))
                {
                    LexiconEntityValue entityValue = entity.FindValueByName(valueName);
                    if (entityValue != null)
                    {
                        returnEntity = entity;
                        return(entityValue);
                    }
                }
            }

            returnEntity = null;
            return(null);
        }
Exemple #2
0
        private void HandleWatsonConversationResponse(MessageResponse response)
        {
            LexiconSpeechResult matchingSpeechResult = null;

            object text;
            string utterance = "";

            if (response.input.TryGetValue("text", out text))
            {
                utterance = (string)text;

                // Find the speech to text result that matches this conversation result.
                foreach (LexiconSpeechResult speechResult in finalSpeechResults)
                {
                    if (string.Equals(speechResult.Transcript, utterance, StringComparison.OrdinalIgnoreCase))
                    {
                        matchingSpeechResult = speechResult;
                    }
                }

                if (matchingSpeechResult != null)
                {
                    // Remove the cached speech to text result.
                    finalSpeechResults.Remove(matchingSpeechResult);
                }
            }

            // Make a list of all entity/value pairs in this response.
            List <EntityPair> entityPairs = new List <EntityPair>();

            foreach (RuntimeEntity entity in response.entities)
            {
                entityPairs.Add(new EntityPair(entity.entity, entity.value));
            }

            List <LexiconRuntimeResult> runtimeResults = new List <LexiconRuntimeResult>();
            bool consumed = false;

            // Process each intent (there will only be one if matchMultipleIntents is false).
            // TODO: We may want to process entities even if there isn't an intent match.
            foreach (RuntimeIntent watsonIntent in response.intents)
            {
                if (watsonIntent.confidence < intentConfidenceThreshold)
                {
                    // Ignore intents that don't meet the confidence threshold.
                    continue;
                }

                List <LexiconIntent> matchingIntents = workspace.FindMatchingIntents(watsonIntent.intent, entityPairs);
                LexiconFocusManager  focusManager    = LexiconFocusManager.Instance;

                foreach (LexiconIntent intent in matchingIntents)
                {
                    LexiconRuntimeResult runtimeResult = new LexiconRuntimeResult();
                    runtimeResult.Intent       = intent;
                    runtimeResult.Confidence   = watsonIntent.confidence;
                    runtimeResult.Utterance    = utterance;
                    runtimeResult.SpeechResult = matchingSpeechResult;

                    foreach (RuntimeEntity watsonEntity in response.entities)
                    {
                        // Find the entity and entityValue that match this intent.
                        LexiconEntity      entity;
                        LexiconEntityValue entityValue = intent.FindEntityValue(watsonEntity.entity, watsonEntity.value, out entity);
                        if (entityValue != null)
                        {
                            LexiconEntityMatch entityMatch = new LexiconEntityMatch();
                            entityMatch.Entity         = entity;
                            entityMatch.EntityValue    = entityValue;
                            entityMatch.FirstCharacter = watsonEntity.location[0];
                            entityMatch.LastCharacter  = watsonEntity.location[1] - 1; // Convert to index of last character.

                            if (matchingSpeechResult != null)
                            {
                                // Find the entity in the speech to text transcript and extract the timestamps.
                                LexiconSpeechResult.WordResult[] wordResults = matchingSpeechResult.GetWordsFromTranscriptPositions(entityMatch.FirstCharacter, entityMatch.LastCharacter);
                                if (wordResults.Length > 0)
                                {
                                    entityMatch.TimeStart     = wordResults[0].TimeStart;
                                    entityMatch.TimeEnd       = wordResults[wordResults.Length - 1].TimeEnd;
                                    entityMatch.RealtimeStart = wordResults[0].RealtimeStart;
                                    entityMatch.RealtimeEnd   = wordResults[wordResults.Length - 1].RealtimeEnd;

                                    if (useDwellPosition)
                                    {
                                        FocusDwellPosition dwellPosition = focusManager.GetFocusData <FocusDwellPosition>(entityMatch.RealtimeStart, 0.2f);
                                        if (dwellPosition != null)
                                        {
                                            FocusPosition focusPosition = new FocusPosition();
                                            focusPosition.Timestamp = dwellPosition.Timestamp;
                                            focusPosition.Position  = dwellPosition.Position;
                                            focusPosition.Normal    = dwellPosition.Normal;

                                            entityMatch.FocusPosition = focusPosition;
                                        }
                                        else
                                        {
                                            entityMatch.FocusPosition = focusManager.GetFocusData <FocusPosition>(entityMatch.RealtimeStart);
                                        }
                                    }
                                    else
                                    {
                                        entityMatch.FocusPosition = focusManager.GetFocusData <FocusPosition>(entityMatch.RealtimeStart);
                                    }

                                    entityMatch.FocusSelection = focusManager.GetFocusData <FocusSelection>(entityMatch.RealtimeStart);
                                }
                            }

                            runtimeResult.EntityMatches.Add(entityMatch);
                        }
                    }

                    runtimeResult.EntityMatches.Sort((x, y) => x.FirstCharacter.CompareTo(y.FirstCharacter));

                    runtimeResults.Add(runtimeResult);

                    if (!consumed)
                    {
                        // If an action has consumed this result no other actions will be fired.
                        // But, we continue to process the intents for the global handler.
                        consumed = intent.Process(runtimeResult);
                    }
                }
            }

            if (OnLexiconResults != null)
            {
                // Share runtime results with our delegates.
                OnLexiconResults(runtimeResults);
            }
        }