private static string GetKeywordConfigurationStatusDescription(ActivationSignalDetectionConfiguration config, string configName) { string status = string.Empty; if (!config.AvailabilityInfo.HasSystemResourceAccess) { status = $"Voice activation is unavailable for {configName}. Please verify against keyword conflicts."; } else if (!config.AvailabilityInfo.IsEnabled) { status = $"{configName} is programmatically disabled by the app."; } else if (!config.AvailabilityInfo.HasPermission) { // Lack of permission is not config specific and is already accounted for, so do not add that here. } else if (!config.IsActive) { status = $"{configName} is unavailable for an unknown reason."; } return(status); }
/// <summary> /// Queries the Conversational Agent Platform for the current state of the selected /// configuration and generates a UIAudioStatus object representing the state of voice /// activation. /// </summary> /// <returns> A UIAudioStatus representing current voice activation state. </returns> public static async Task <UIAudioStatus> GetVoiceActivationStatusAsync() { var services = (App.Current as App).Services; var keywordRegistration = services.GetRequiredService <IKeywordRegistration>(); var agentSessionManager = services.GetRequiredService <IAgentSessionManager>(); var session = await agentSessionManager.GetSessionAsync(); var configs = await keywordRegistration.GetOrCreateKeywordConfigurationsAsync(); var audioControl = await AudioCaptureControl.GetInstanceAsync(); string glyph = Glyphs.Cancel; Color color = Colors.Red; List <string> status = new List <string>(); ActivationSignalDetectionConfiguration swKeywordConfiguration = null; ActivationSignalDetectionConfiguration hwKeywordConfiguration = null; ActivationSignalDetectionConfiguration defaultKeywordConfiguration = null; foreach (var configuration in configs) { string modelDataType = await configuration.GetModelDataTypeAsync(); if (string.IsNullOrEmpty(modelDataType)) { hwKeywordConfiguration = configuration; } else { swKeywordConfiguration = configuration; } } if (swKeywordConfiguration != null) { defaultKeywordConfiguration = swKeywordConfiguration; } else if (hwKeywordConfiguration != null) { defaultKeywordConfiguration = hwKeywordConfiguration; } if (session == null) { status.Add("Unable to obtain agent session. Please verify registration."); } else if (configs.Count == 0) { status.Add("No valid keyword configuration. Please check your source code configuration."); } else if (swKeywordConfiguration != null && !swKeywordConfiguration.AvailabilityInfo.HasPermission) { status.Add("Voice activation permissions are currently denied."); } else if (hwKeywordConfiguration != null && !hwKeywordConfiguration.AvailabilityInfo.HasPermission) { status.Add("Voice activation permissions are currently denied."); } else if (audioControl.CaptureMuted || audioControl.CaptureVolumeLevel < 5f) { glyph = Glyphs.Warning; color = Colors.DarkOrange; status.Add("Voice activation is available but may be degraded due to microphone state."); } else if (!MVARegistrationHelpers.IsBackgroundTaskRegistered) { glyph = Glyphs.Warning; color = Colors.DarkOrange; status.Add("Background task is not configured and voice activation will only work while the application is already active."); } else if (VoiceActivationIsPowerRestricted()) { glyph = Glyphs.Warning; color = Colors.DarkOrange; status.Add("The system is currently power restricted and voice activation may not be available."); } else if (swKeywordConfiguration != null && swKeywordConfiguration.AvailabilityInfo.IsEnabled && MVARegistrationHelpers.IsBackgroundTaskRegistered) { glyph = Glyphs.FeedbackApp; color = Colors.Green; status.Add(VoiceActivationEnabledMessage); } else if (hwKeywordConfiguration != null && hwKeywordConfiguration.AvailabilityInfo.IsEnabled && MVARegistrationHelpers.IsBackgroundTaskRegistered) { glyph = Glyphs.FeedbackApp; color = Colors.Green; status.Add(VoiceActivationEnabledMessage); } else { glyph = Glyphs.Warning; color = Colors.DarkOrange; } if (swKeywordConfiguration != null) { string configStatus = GetKeywordConfigurationStatusDescription(swKeywordConfiguration, "swKeywordConfig"); if (!string.IsNullOrEmpty(configStatus)) { status.Add(configStatus); } } if (hwKeywordConfiguration != null) { string configStatus = GetKeywordConfigurationStatusDescription(hwKeywordConfiguration, "hwKeywordConfig"); if (!string.IsNullOrEmpty(configStatus)) { status.Add(configStatus); } } return(new UIAudioStatus(glyph, color, status)); }