发现发音的正确性

我需要借助Microsoft Speech SDK( System.Speech.Recognition )来识别用户语音的“质量”。 我正在使用MS语音引擎 – 美国,所以我真正需要的是找出演讲者的声音与“北美”口音有多接近。

一种做法是通过检查用户的声音与美国英语语音发音的接近程度。 正如在MSDN中提到的,它似乎是这个过程在自己的语音SDK里面完成的,所以我需要把它弄清楚。 既然我们可以通过我们自己的语言来引擎,我相信这是可能的。

但是,我不清楚我必须做什么。 那么,我能做些什么来找出用户的发音质量呢?它与美国北美英语语音发音有多接近呢? 用户只需要说出“Hello World,我在这里”等预先定义的句子。

请帮忙。

UPDATE

我通过使用下面的代码得到了某种“音素”(如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

Solutions Collecting From Web of "发现发音的正确性"

好的,这是我如何处理这个问题。

首先,用发音主题加载听写引擎,该主题将返回用户说出的音素(在识别事件中)。

其次,使用ISpEnginePronunciation :: GetPronunciations方法获取单词的参考音素(如我在这里所概述的)。

一旦你有两组音素,你可以比较它们。 本质上,音素由空格分隔,每个音素由一个短标签表示(在美国英语音素表示规范中描述)。

鉴于此,您应该能够通过比较任意数量的近似字符串匹配方案(例如Levenshtein距离 )的音素来计算得分。

通过比较电话ID而不是字符串,您可能会发现问题更简单; ISpPhoneConverter :: PhoneToId可以将音素字符串转换为一组phoneID,每个音素一个ID。 这会给你一对以null结尾的整型数组,可能更适合你的比较算法。

您可以使用引擎信心来惩罚匹配,因为低引擎可信度表示传入的音频与引擎的音素概念不匹配。