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