3

Microsoft speech SDK ( ) を使用して、ユーザーの発音の「品質」を特定する必要がありますSystem.Speech.Recognition。私は MS Speech Engine - US を使用しているので、実際に必要なのは、話者の声が「北米」のアクセントにどれだけ近いかを調べることです。

これを行う 1 つの方法は、ユーザーの声が米国英語の音声発音にどの程度近いかを確認することです。MSDN で言及されているように、このプロセスは Speech SDK 内でそれ自体で行われているように見えるので、それを取り出す必要があります。自分たちで音声をエンジンに設定することもできるので、それは可能だと思います。

しかし、私は自分が何をしなければならないかについて明確な考えを持っていません。では、ユーザーの発音の質を調べるにはどうすればよいでしょうか/アメリカの北米英語の音声発音にどれくらい近いのでしょうか? ユーザーは、「Hello World. I am here.」などの定義済みの文を話すだけで済みます。

アップデート

次のコードを使用して、ある種の「音素」(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);
        }


    }

以下は私の出力です。取得した音素は 2 行目から表示されます。最初の行は、認識された文を単純に示しています

ここに画像の説明を入力

MSDNによると、これは「音素」です。それで、これは実際に「音素」ですか?私はこれらを見たことがありません。

上記のコードは、このリンクに従って行われますhttp://msdn.microsoft.com/en-us/library/microsoft.speech.recognition.srgsgrammar.srgstoken.pronunciation(v=office.14).aspx

4

1 に答える 1

4

わかりました、これが私が問題に取り組む方法です。

最初に、Pronunciation トピックを使用してディクテーション エンジンをロードします。これにより、ユーザーが (Recognition イベントで) 話した音素が返されます。

次に、ISpEnginePronunciation::GetPronunciationsメソッドを使用して、単語の参照音素を取得します (ここで概説したように)。

2 組の音素を取得したら、それらを比較できます。基本的に、音素はスペースで区切られ、各音素は短いタグで表されます ( American English Phoneme Representation仕様で説明されています)。

これにより、任意の数の近似文字列マッチング スキーム (レーベンシュタイン距離など)によって音素を比較することで、スコアを計算できるはずです。

文字列ではなく電話 ID を比較すると、問題が簡単になることがあります。ISpPhoneConverter::PhoneToIdは、音素文字列を phoneID の配列 (音素ごとに 1 つの ID) に変換できます。これにより、おそらく比較アルゴリズムにより適した、null で終わる整数配列のペアが得られます。

エンジンの信頼度を使用して、一致にペナルティを課すことができます。エンジンの信頼度が低いということは、着信オーディオがエンジンの音素の考えと厳密に一致していないことを示しているからです。

于 2013-05-29T03:32:21.473 に答える