كيفية خلط القواعد (القواعد) والإملاء (حرية التعبير) مع الكلام الكوني في C#

StackOverflow https://stackoverflow.com/questions/3046921

سؤال

أنا حقا أحب microsofts أحدث التعرف على الكلام (والخطاب) عروض.

http://msdn.microsoft.com/en-us/library/ms554855.aspx

http://estellasays.blogspot.com/2009/04/speech-recognition-in-cnet.html

ومع ذلك أشعر أنني محدودة إلى حد ما عند استخدام القواعد.

لا تفهموني أن القواعد النحوية رائعة لإخبار التعرف على الكلام بالضبط ما هي الكلمات / العبارات التي يجب البحث عنها ، ولكن ماذا لو أردت أن أتعرف على شيء لم أعطيه له رأسًا؟ أو أريد تحليل عبارة نصف اسم أمر محدد مسبقًا ونصف الكلمات العشوائية؟

فمثلا..

السيناريو أ - أقول "Google [Oil Spill] وأريد أن يفتح Google مع نتائج البحث عن المصطلح بين قوسين يمكن أن يكون أي شيء.

السيناريو ب - أقول "تحديد موقع [مانشستر] وأريد أن يبحث عن مانشستر في خرائط Google أو أي شيء آخر غير محدد مسبقًا

أريد أن يعرف أن "Google" و "تحديد موقع" هي أوامر وما يأتي بعد أن يكون معلمات (ويمكن أن يكون أي شيء).

سؤال: هل يعرف أي شخص كيفية مزج استخدام القواعد المحددة مسبقًا (الكلمات التي يجب أن يتعرف عليها التعرف على الكلام) والكلمات غير المحددة مسبقًا؟

شظايا الرمز ..

using System.Speech.Recognition;

...
...

SpeechRecognizer rec = new SpeechRecognizer();
rec.SpeechRecognized += rec_SpeechRecognized;

var c = new Choices();
c.Add("search");

var gb = new GrammarBuilder(c);
var g = new Grammar(gb);
rec.LoadGrammar(g);
rec.Enabled = true; 

...
...

void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Text == "search")
    {
        string query = "How can I get a word not defined in Grammar recognised and passed into here!";

        launchGoogle(query);
    }
}

...
...


private void launchGoogle(string term)
{
    Process.Start("IEXPLORE", "google.com?q=" + term);
}
هل كانت مفيدة؟

المحلول

يمكنك تجربة شيء مثل هذا ... إنه يحدد قائمة بالأوامر المعروفة .. ولكن أيضًا يتيح لك استخدام الإملاء المفتوح بعد ذلك. يتوقع أن يكون هناك أمر تم تقديمه قبل الإملاء المفتوح .. ولكن يمكنك عكس هذا ... وإلحاقه ، بإضافة فارغ في نوع الأمر ("") ، سيتيح لك أيضًا الوصول مباشرة إلى الإملاء جزء.

Choices commandtype = new Choices();
commandtype.Add("search");
commandtype.Add("print");
commandtype.Add("open");
commandtype.Add("locate");

SemanticResultKey srkComtype = new SemanticResultKey("comtype",commandtype.ToGrammarBuilder());

 GrammarBuilder gb = new GrammarBuilder();
 gb.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
 gb.Append(srkComtype);
 gb.AppendDictation();

 Grammar gr = new Grammar(gb);

ثم عند التعرف الخاص بك ، فقط استخدم نص النتيجة وما إلى ذلك

private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    System.Console.WriteLine(e.Result.Text);

}

يمكنك إضافة المزيد من خيارات الاختيار ، و Semanticresultkeys إلى الهيكل لصنع أنماط أكثر تعقيدًا إذا كنت ترغب في ذلك. أيضا بطاقة Wildcard (على سبيل المثال gb.appendwildcard () ؛).

نصائح أخرى

لديك خياران:

  1. يمكنك استخدام عقدة الإملاء لاستخدام النص الحر GrammarBuilder :: AppendDictation. المشكلة هي أنه نظرًا لأن معرف التعرف ليس لديه أي سياق ، فإن الاعترافات ليست أعلى جودة.
  2. يمكنك استخدام عقدة TextBuffer وتوفير مجموعة من العناصر باستخدام GrammarBuilder :: إلحاق (سلسلة ، subsetmatchingmode). سيعطي هذا المعترف بالتعرف على سياق كافٍ للحصول على اعترافات جيدة دون الحاجة إلى إعادة بناء شجرة القواعد بأكملها في كل مرة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top