/// <summary> /// Submits text analytics requests depending on the settings (sentimentAnalysisSetting). The whole transcript (per channel) will be submitted in a single request. /// (This means for instance that one single sentiment score will be generated per channel). /// </summary> /// <param name="speechTranscript">The speech transcript object.</param> /// <param name="sentimentAnalysisSetting">The sentiment analysis setting.</param> /// <param name="piiRedactionSetting">The PII redaction setting.</param> /// <returns>The job ids and errors, if any were found.</returns> public async Task <(IEnumerable <string> jobIds, IEnumerable <string> errors)> SubmitAudioLevelRequests( SpeechTranscript speechTranscript, SentimentAnalysisSetting sentimentAnalysisSetting, PiiRedactionSetting piiRedactionSetting) { speechTranscript = speechTranscript ?? throw new ArgumentNullException(nameof(speechTranscript)); if (sentimentAnalysisSetting != SentimentAnalysisSetting.AudioLevel && piiRedactionSetting != PiiRedactionSetting.UtteranceAndAudioLevel) { return(new List <string>(), new List <string>()); } var documents = speechTranscript.CombinedRecognizedPhrases.Where(r => !string.IsNullOrEmpty(r.Display)).Select(r => new TextDocumentInput($"{r.Channel}", r.Display) { Language = Locale }); var actions = new TextAnalyticsActions { DisplayName = "IngestionClient" }; if (sentimentAnalysisSetting == SentimentAnalysisSetting.AudioLevel) { actions.AnalyzeSentimentActions = new List <AnalyzeSentimentAction>() { new AnalyzeSentimentAction() }; } if (piiRedactionSetting == PiiRedactionSetting.UtteranceAndAudioLevel) { var action = new RecognizePiiEntitiesAction(); if (!string.IsNullOrEmpty(FetchTranscriptionEnvironmentVariables.PiiCategories)) { var piiEntityCategories = FetchTranscriptionEnvironmentVariables.PiiCategories.Split(",").Select(c => new PiiEntityCategory(c)); foreach (var category in piiEntityCategories) { action.CategoriesFilter.Add(category); } } actions.RecognizePiiEntitiesActions = new List <RecognizePiiEntitiesAction>() { action }; } return(await SubmitDocumentsAsync(documents, actions).ConfigureAwait(false)); }
public static double GetCostEstimation( TimeSpan timeSpan, int numberOfChannels, bool isCustomModel, SentimentAnalysisSetting sentimentSetting, PiiRedactionSetting entityRedactionSetting) { double costPerHour = isCustomModel ? STTCustomModelCostPerHour : STTCostPerHour; var price = timeSpan.TotalHours * costPerHour; if (sentimentSetting != SentimentAnalysisSetting.None) { price += timeSpan.TotalHours * TextAnalyticsCostPerHour; } if (entityRedactionSetting != PiiRedactionSetting.None) { price += timeSpan.TotalHours * TextAnalyticsCostPerHour; } price *= numberOfChannels; return(price); }
public async Task <IEnumerable <string> > AddAudioLevelEntitiesAsync( SpeechTranscript speechTranscript, SentimentAnalysisSetting sentimentAnalysisSetting, PiiRedactionSetting piiRedactionSetting) { speechTranscript = speechTranscript ?? throw new ArgumentNullException(nameof(speechTranscript)); var errors = new List <string>(); if (sentimentAnalysisSetting != SentimentAnalysisSetting.AudioLevel && piiRedactionSetting != PiiRedactionSetting.UtteranceAndAudioLevel) { return(errors); } // Remove other nBests if pii is redacted if (piiRedactionSetting != PiiRedactionSetting.None) { speechTranscript.RecognizedPhrases.ToList().ForEach(phrase => { if (phrase.NBest != null && phrase.NBest.Any()) { var firstNBest = phrase.NBest.First(); phrase.NBest = new[] { firstNBest }; } }); } var documents = speechTranscript.CombinedRecognizedPhrases.Where(r => !string.IsNullOrEmpty(r.Display)).Select(r => new TextDocumentInput($"{r.Channel}", r.Display) { Language = Locale }); var actions = new TextAnalyticsActions { DisplayName = "IngestionClient" }; if (sentimentAnalysisSetting == SentimentAnalysisSetting.AudioLevel) { actions.AnalyzeSentimentActions = new List <AnalyzeSentimentAction>() { new AnalyzeSentimentAction() }; } if (piiRedactionSetting == PiiRedactionSetting.UtteranceAndAudioLevel) { var action = new RecognizePiiEntitiesAction(); if (!string.IsNullOrEmpty(FetchTranscriptionEnvironmentVariables.PiiCategories)) { var piiEntityCategories = FetchTranscriptionEnvironmentVariables.PiiCategories.Split(",").Select(c => new PiiEntityCategory(c)); foreach (var category in piiEntityCategories) { action.CategoriesFilter.Add(category); } } actions.RecognizePiiEntitiesActions = new List <RecognizePiiEntitiesAction>() { action }; } var(sentimentResults, piiResults, requestErrors) = await this.GetDocumentResultsAsync(documents, actions).ConfigureAwait(false); errors.AddRange(requestErrors); foreach (var combinedRecognizedPhrase in speechTranscript.CombinedRecognizedPhrases) { var channel = combinedRecognizedPhrase.Channel; var sentimentResult = sentimentResults.Where(document => document.Id.Equals($"{channel}", StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); if (sentimentResult != null) { combinedRecognizedPhrase.Sentiment = new Sentiment() { Negative = sentimentResult.DocumentSentiment.ConfidenceScores.Negative, Positive = sentimentResult.DocumentSentiment.ConfidenceScores.Positive, Neutral = sentimentResult.DocumentSentiment.ConfidenceScores.Neutral, }; } var piiResult = piiResults.Where(document => document.Id.Equals($"{channel}", StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); if (piiResult != null) { var redactedText = piiResult.Entities.RedactedText; combinedRecognizedPhrase.Display = redactedText; combinedRecognizedPhrase.ITN = string.Empty; combinedRecognizedPhrase.MaskedITN = string.Empty; combinedRecognizedPhrase.Lexical = string.Empty; var phrases = speechTranscript.RecognizedPhrases.Where(phrase => phrase.Channel == channel); var startIndex = 0; foreach (var phrase in phrases) { var firstNBest = phrase.NBest.FirstOrDefault(); if (firstNBest != null && !string.IsNullOrEmpty(firstNBest.Display)) { firstNBest.Display = redactedText.Substring(startIndex, firstNBest.Display.Length); firstNBest.ITN = string.Empty; firstNBest.MaskedITN = string.Empty; firstNBest.Lexical = string.Empty; startIndex += firstNBest.Display.Length + 1; } } } } return(errors); }