Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }