public static SentenceEvaluationResult Evaluate(SupportedLanguage language, string script, byte[] wavData) { var wordList = script.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); var words = wordList.Select(w => language == SupportedLanguage.English ? w.ToUpper() : w).ToArray(); foreach (var word in words) { if (!phonemeDictionary.Contains(word)) { Trace.TraceError("ScoringHost::Evaluate(), unable to identify the word, Content={0}", word); throw new ArgumentOutOfRangeException(word); } } var mfcData = FeatureGenerator.ExtractMfcFeature(wavData); if (mfcData == null || mfcData.Length == 0) { Trace.TraceError("ScoringHost::Evaluate(), mfc extraction error!"); throw new ArgumentException("mfc extraction error!"); } double[] f0Data = FeatureGenerator.ExtractF0Feature(wavData); if (f0Data == null || f0Data.Length == 0) { Trace.TraceWarning("ScoringHost::Evaluate(), f0 extraction error!"); throw new InvalidDataException("f0 extraction error!"); } if (SupportedLanguage.Chinese == language) { mfcData = FeatureGenerator.AppendF0Feature(f0Data, mfcData); } IList <string> wordsWithSilence = new List <string>(words); wordsWithSilence.Insert(0, "<s>"); wordsWithSilence.Add("</s>"); int maxLength = 0; if (language == SupportedLanguage.English) { maxLength = PhonemeResultMaxLength * 12 * words.Length; } else if (language == SupportedLanguage.Chinese) { maxLength = PhonemeResultMaxLength * 5 * words.Length; } if (maxLength < EvaluateResultMinLength) { maxLength = EvaluateResultMinLength; } var resultBuffer = new StringBuilder(maxLength); var resultLength = NativeMethods.Evaluate( mfcData, string.Empty, resultBuffer, maxLength, wordsWithSilence.ToArray(), wordsWithSilence.Count); if (resultLength < 0) { Trace.TraceError("ScoringHost::Evaluate(), invalid audio content, length of evaluation result: {0}.", resultLength); throw new ArgumentException("Invalid audio content."); } var evaluationResult = resultBuffer.ToString(0, resultLength); var phonemeEvaluationResults = evaluationResult.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries); try { return(CreateSentenceEvaluationResult(words.Length, phonemeEvaluationResults, f0Data, language)); } catch (ArgumentException) { Trace.TraceError("ScoringHost::Evaluate(), bad phoneme evaluation result, sentence: {0}, result: {1}", script, evaluationResult); throw; } }
public static SentenceEvaluationResult Evaluate_competingPhones(SupportedLanguage language, string script, byte[] wavData) { Trace.TraceInformation(DateTime.Now.ToString("yyyyMMdd-HHmmss.fff") + " evaluate started " + System.Threading.Thread.CurrentThread.ManagedThreadId); var wordList = script.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); var words = wordList.Select(w => w).ToArray(); var mfcData = FeatureGenerator.ExtractMfcFeature(wavData); if (mfcData == null || mfcData.Length == 0) { Trace.TraceWarning("ScoringHost::Evaluate(), mfc extraction error!"); throw new InvalidDataException("mfc extraction error!"); } if (SupportedLanguage.Chinese == language) { double[] f0Data = FeatureGenerator.ExtractF0Feature(wavData); if (f0Data == null || f0Data.Length == 0) { Trace.TraceWarning("ScoringHost::Evaluate(), f0 extraction error!"); throw new InvalidDataException("f0 extraction error!"); } mfcData = FeatureGenerator.AppendF0Feature(f0Data, mfcData); } IList <string> wordsWithSilence = new List <string>(words); wordsWithSilence.Insert(0, "<s>"); wordsWithSilence.Add("</s>"); int maxLength = 0; if (language == SupportedLanguage.English) { maxLength = PhonemeResultMaxLength * 12 * words.Length; } else if (language == SupportedLanguage.Chinese) { maxLength = PhonemeResultMaxLength * 5 * words.Length; } if (maxLength < EvaluateResultMinLength) { maxLength = EvaluateResultMinLength; } var resultBuffer = new StringBuilder(maxLength); var resultLength = NativeMethods.Evaluate_competingPhones( mfcData, resultBuffer, maxLength, wordsWithSilence.ToArray(), wordsWithSilence.Count, 5, true); /* * var resultLength = NativeMethods.Evaluate( * mfcData, * resultBuffer, * maxLength, * wordsWithSilence.ToArray(), * wordsWithSilence.Count); */ try { if (resultLength < 0) { if (resultLength == -1) { throw new Exception("Script and Wave not match!"); } } var phonemeEvaluationResults = resultBuffer.ToString(0, resultLength).Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries); Trace.TraceInformation(DateTime.Now.ToString("yyyyMMdd-HHmmss.fff") + " evaluate ended " + System.Threading.Thread.CurrentThread.ManagedThreadId); return(CreateSentenceEvaluationResult(phonemeEvaluationResults)); } catch (Exception e) { Trace.TraceError( "ScoringHost::Evaluate(), unexpected exception while parsing, Message={0}, StackTrace={1}", e.Message, e.StackTrace); throw; } }