Нахождение правильности произношения

Мне нужно определить "качество" произношения пользователя с помощью речевого SDK Microsoft (System.Speech.Recognition). Я использую MS Speech Engine - США, поэтому мне нужно выяснить, насколько близок голос говорящего к "североамериканскому" акценту.

Один из способов сделать это - проверить, насколько близок голос пользователя к фонетическому произношению в США. Как упоминалось в MSDN, кажется, что этот процесс выполняется внутри речевого SDK самостоятельно, поэтому мне нужно это выяснить. Так как мы можем сами установить фонетику в двигатель, я уверен, что это возможно.

Тем не менее, я не имею четкого представления о том, что я должен делать. Итак, что я могу сделать, чтобы узнать качество произношения пользователя / Насколько оно близко к фонетическому произношению в Северной Америке, США? Пользователь должен будет произносить только заранее определенные предложения, такие как "Привет, мир. Я здесь".

Пожалуйста помоги.

ОБНОВИТЬ

Я получил какие-то "фонемы" (как указано в MSDN) с помощью следующего кода

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Windows.Forms;
using System.IO;

namespace US_Speech_Recognizer
{
    public class RecognizeSpeech
    {
        private SpeechRecognitionEngine sEngine; //Speech recognition engine
        private SpeechSynthesizer sSpeak; //Speech synthesizer
        string text3 = "";

        public RecognizeSpeech()
        {
            //Make the recognizer ready
            sEngine = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US"));


            //Load grammar
            Choices sentences = new Choices();
            sentences.Add(new string[] { "I am hungry" });

            GrammarBuilder gBuilder = new GrammarBuilder(sentences);

            Grammar g = new Grammar(gBuilder);

            sEngine.LoadGrammar(g);

            //Add a handler
            sEngine.SpeechRecognized +=new EventHandler<SpeechRecognizedEventArgs>(sEngine_SpeechRecognized);


            sSpeak = new SpeechSynthesizer();
            sSpeak.Rate = -2;



            //Computer speaks the words to get the phones
            Stream stream = new MemoryStream();
            sSpeak.SetOutputToWaveStream(stream);


            sSpeak.Speak("I was hungry");
            stream.Position = 0;
            sSpeak.SetOutputToNull();


            //Configure the recognizer to stream
            sEngine.SetInputToWaveStream(stream);

            sEngine.RecognizeAsync(RecognizeMode.Single);


        }


        //Start the speech recognition task
        private void sEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string text = "";

            if (e.Result.Text == "I am hungry")
            {
                foreach (RecognizedWordUnit wordUnit in e.Result.Words)
                {
                    text = text + wordUnit.Pronunciation + "\n";
                }

                MessageBox.Show(e.Result.Text + "\n" + text);
            }


        }
    }
}

Это фрагмент прямого кода, относящийся к фонемам (извлеченный из приведенного выше кода)

   //Start the speech recognition task
    private void sEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        string text = "";

        if (e.Result.Text == "I am hungry")
        {
            foreach (RecognizedWordUnit wordUnit in e.Result.Words)
            {
                text = text + wordUnit.Pronunciation + "\n";
            }

            MessageBox.Show(e.Result.Text + "\n" + text);
        }


    }

Следующее - мой вывод. Полученные фонемы отображаются начиная со второй строки. Первая строка просто показывает распознанное предложение

Итак, скажите, пожалуйста, в соответствии с MSDN это "фонемы". Так это на самом деле "фонемы"? Я никогда не видел их, вот почему.

приведенный выше код выполняется по этой ссылке http://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.srgsgrammar.srgstoken.pronunciation(v=office.14).aspx

1 ответ

Решение

Хорошо, вот как я подхожу к проблеме.

Сначала загрузите механизм диктовки с темой "Произношение", которая будет возвращать фонемы, на которых говорил пользователь (в событии "Распознавание").

Во-вторых, получите справочные фонемы для слова, используя метод ISpEnginePronasion::GetPronunciations (как я обрисовал здесь).

Если у вас есть два набора фонем, вы можете сравнить их. По сути, фонемы разделены пробелами, и каждая фонема представлена ​​коротким тегом (описанным в спецификации представления фонем американского английского).

Учитывая это, вы должны быть в состоянии вычислить оценку путем сравнения фонем по любому количеству приблизительных схем сопоставления строк (например, расстояние Левенштейна).

Вы можете найти проблему проще, сравнивая телефонные идентификаторы, а не строки; ISpPhoneConverter:: PhoneToId может преобразовывать строки фонем в массив идентификаторов телефонов, по одному идентификатору на каждую фонему. Это дало бы вам пару целочисленных массивов с нулевым символом в конце, возможно, лучше подходящих для вашего алгоритма сравнения.

Вы можете использовать достоверность движка, чтобы оштрафовать совпадения, так как низкая достоверность движка указывает на то, что входящее аудио не совсем соответствует представлению движка о фонеме.

Другие вопросы по тегам