كيفية التعرف على المقاصد من الكلام باستخدام Speech SDK ل C #

تتكامل مجموعة تطوير البرامج المعرفية لبيانات الكلام مع خدمة فهم اللغة (LUIS) لتوفير التعرف على النية. النية هي شيء يريد المستخدم القيام به: حجز رحلة ، أو التحقق من الطقس ، أو إجراء مكالمة. يمكن للمستخدم استخدام أي مصطلحات تبدو طبيعية. باستخدام التعلم الآلي، يقوم LUIS بتعيين طلبات المستخدمين وفقا للنوايا التي حددتها.

ملاحظة

يحدد تطبيق LUIS المقاصد والكيانات التي تريد التعرف عليها. إنه منفصل عن تطبيق C # الذي يستخدم خدمة الكلام. في هذه المقالة، يعني "التطبيق" تطبيق LUIS، بينما يعني "التطبيق" رمز C #.

في هذا الدليل، يمكنك استخدام Speech SDK لتطوير تطبيق وحدة تحكم C# يستمد النوايا من أقوال المستخدم من خلال ميكروفون جهازك. ستتعلم كيفية:

  • إنشاء مشروع Visual Studio يشير إلى حزمة NuGet الخاصة ب Speech SDK
  • إنشاء تكوين كلام والحصول على أداة التعرف على النية
  • احصل على نموذج تطبيق LUIS الخاص بك وأضف النوايا التي تحتاجها
  • تحديد اللغة للتعرف على الكلام
  • التعرف على الكلام من ملف
  • استخدام التعرف المستمر غير المتزامن القائم على الأحداث

المتطلبات الأساسية

تأكد من أن لديك العناصر التالية قبل البدء في هذا الدليل:

لويس والكلام

يتكامل LUIS مع خدمة الكلام للتعرف على النوايا من الكلام. لا تحتاج إلى اشتراك في خدمة الكلام ، فقط LUIS.

يستخدم LUIS نوعين من المفاتيح:

نوع المفتاح الغرض
التأليف يتيح لك إنشاء تطبيقات LUIS وتعديلها برمجيا
التنبؤ يستخدم للوصول إلى تطبيق LUIS في وقت التشغيل

بالنسبة لهذا الدليل ، تحتاج إلى نوع مفتاح التنبؤ. يستخدم هذا الدليل مثال تطبيق LUIS لأتمتة المنزل، والذي يمكنك إنشاؤه باتباع التشغيل السريع لتطبيق التشغيل السريع لاستخدام التشغيل الآلي للمنزل الذي تم إنشاؤه مسبقا . إذا كنت قد أنشأت تطبيق LUIS خاصا بك، فيمكنك استخدامه بدلا من ذلك.

عند إنشاء تطبيق LUIS، يقوم LUIS تلقائيا بإنشاء مفتاح تأليف حتى تتمكن من اختبار التطبيق باستخدام الاستعلامات النصية. لا يعمل هذا المفتاح على تمكين تكامل خدمة الكلام ولن يعمل مع هذا الدليل. قم بإنشاء مورد LUIS في لوحة معلومات Azure وقم بتعيينه إلى تطبيق LUIS. يمكنك استخدام طبقة الاشتراك المجاني لهذا الدليل.

بعد إنشاء مورد LUIS في لوحة معلومات Azure، قم بتسجيل الدخول إلى مدخل LUIS، واختر تطبيقك في صفحة تطبيقاتي، ثم قم بالتبديل إلى صفحة إدارة التطبيق. وأخيرا، حدد موارد Azure في الشريط الجانبي.

A screenshot of the LUIS portal keys and endpoint settings.

في صفحة موارد Azure :

حدد الرمز الموجود بجوار مفتاح لنسخه إلى الحافظة. (يمكنك استخدام أي من المفتاحين.)

إنشاء مشروع كلام في Visual Studio

لإنشاء مشروع Visual Studio لتطوير Windows، تحتاج إلى إنشاء المشروع وإعداد Visual Studio لتطوير سطح المكتب .NET وتثبيت Speech SDK واختيار البنية الهدف.

إنشاء المشروع وإضافة عبء العمل

للبدء، قم بإنشاء المشروع في Visual Studio، وتأكد من إعداد Visual Studio لتطوير سطح المكتب.NET:

  1. افتح Visual Studio 2019.

  2. في نافذة البدء، حدد⁧⁩Create a new project⁧⁩.

  3. في نافذة ⁧⁩Create a new project⁧⁩، اختر⁧⁩ Console App (.NET Framework)⁧⁩، ثم حدد ⁧⁩Next⁧⁩.

  4. في نافذة ⁧⁩Configure your new project⁧⁩، أدخل ⁧⁩ helloworld ⁧⁩ في ⁧⁩Project name⁧⁩، واختر مسار الدليل، أو أنشئه في ⁧⁩ Location⁧⁩ ، ثم حدد ⁧⁩Create⁧⁩.

  5. من شريط قائمة Visual Studio، حدد⁧⁩Tools⁧⁩ ⁧>⁩ ⁧⁩Get Tools and Features⁧⁩، والذي يفتح مثبت Visual Studio، ويعرض مربع الحوار ⁧⁩Modifying⁧⁩.

  6. تحقق مما إذا كان حمل عمل ⁧⁩.NET desktop development ⁧⁩ متاحًا. إذا لم يتم تثبيت حمل العمل، فحدد مربع الاختيار المجاور له، ثم حدد⁧⁩Modify⁧⁩ لبدء التثبيت. قد يستغرق التنزيل والتثبيت بضع دقائق.

    إذا تم تحديد مربع الاختيار بجوار⁧⁩.NET desktop development ⁧⁩ بالفعل، فحدد⁧⁩Close⁧⁩ للخروج من مربع الحوار.

    Enable .NET desktop development

  7. أغلق Visual Studio Installer.

تثبيت Speech SDK

الخطوة التالية هي تثبيت حزمة Speech SDK NuGet ، بحيث يمكنك الرجوع إليها في التعليمة البرمجية.

  1. في مستكشف الحلول، انقر بزر الماوس الأيمن فوق مشروع ⁧⁩ helloworld ⁧⁩، ثم حدد⁧⁩ Manage NuGet Packages ⁧⁩ لإظهار NuGet Package Manager.

    NuGet Package Manager

  2. في الزاوية العلوية اليسرى، ابحث عن المربع المنسدل مصدر الحزمة ، وتأكد من تحديد nuget.org .

  3. في الزاوية العلوية اليمنى، حدد⁧⁩ Browse⁧⁩.

  4. في مربع البحث، اكتب⁧⁩ Microsoft.CognitiveServices.Speech⁧⁩ وحدد⁧⁩Enter⁧⁩.

  5. من نتائج البحث، حدد حزمة⁧⁩ Microsoft.CognitiveServices.Speech ⁧⁩، ثم حدد⁧⁩Install⁧⁩ لتثبيت أحدث إصدار ثابت.

    Install Microsoft.CognitiveServices.Speech NuGet package

  6. اقبل جميع الاتفاقيات والتراخيص لبدء التثبيت.

    بعد تثبيت الحزمة، يظهر تأكيد في نافذة⁧⁩Package Manager Console⁧⁩.

اختر البنية المستهدفة

الآن ، لإنشاء تطبيق وحدة التحكم وتشغيله ، قم بإنشاء تكوين نظام أساسي يطابق بنية جهاز الكمبيوتر الخاص بك.

  1. من شريط القائمة، حدد⁧⁩ Build⁧⁩⁧>⁩⁧⁩Configuration Manager⁧⁩. يظهر مربع الحوار⁧⁩Configuration Manager⁧⁩.

    Configuration Manager dialog box

  2. في المربع المنسدل ⁧⁩Active solution platform⁧⁩، حدد ⁧⁩New⁧⁩. يظهر مربع الحوار⁧⁩New Solution Platform⁧⁩.

  3. في المربع المنسدل⁧⁩Type or select the new platform⁧⁩:

    • إذا كنت تقوم بتشغيل Windows 64 بت، فحدد⁧⁩ x64⁧⁩.
    • إذا كنت تقوم بتشغيل Windows 32 بت، فحدد⁧⁩ x86 ⁧⁩.
  4. حدد ⁧⁩OK⁧⁩، ثم ⁧⁩Close⁧⁩.

أضف التعليمات البرمجية

بعد ذلك، يمكنك إضافة تعليمات برمجية إلى المشروع.

  1. من مستكشف الحلول، افتح الملف "البرنامج.cs.

  2. يستعاض عن كتلة using البيانات في بداية الملف بالإعلانات التالية:

    using System;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Intent;
    
  3. يستعاض عن الطريقة المقدمة Main() بما يعادلها غير المتزامن التالية:

    public static async Task Main()
    {
        await RecognizeIntentAsync();
        Console.WriteLine("Please press Enter to continue.");
        Console.ReadLine();
    }
    
  4. إنشاء طريقة RecognizeIntentAsync()غير متزامنة فارغة ، كما هو موضح هنا:

    static async Task RecognizeIntentAsync()
    {
    }
    
  5. في نص هذه الطريقة الجديدة، أضف هذه التعليمة البرمجية:

    // Creates an instance of a speech config with specified subscription key
    // and service region. Note that in contrast to other services supported by
    // the Cognitive Services Speech SDK, the Language Understanding service
    // requires a specific subscription key from https://www.luis.ai/.
    // The Language Understanding service calls the required key 'endpoint key'.
    // Once you've obtained it, replace with below with your own Language Understanding subscription key
    // and service region (e.g., "westus").
    // The default language is "en-us".
    var config = SpeechConfig.FromSubscription("YourLanguageUnderstandingSubscriptionKey", "YourLanguageUnderstandingServiceRegion");
    
    // Creates an intent recognizer using microphone as audio input.
    using (var recognizer = new IntentRecognizer(config))
    {
        // Creates a Language Understanding model using the app id, and adds specific intents from your model
        var model = LanguageUnderstandingModel.FromAppId("YourLanguageUnderstandingAppId");
        recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
        recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
        recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");
    
        // Starts recognizing.
        Console.WriteLine("Say something...");
    
        // Starts intent recognition, and returns after a single utterance is recognized. The end of a
        // single utterance is determined by listening for silence at the end or until a maximum of 15
        // seconds of audio is processed.  The task returns the recognition text as result. 
        // Note: Since RecognizeOnceAsync() returns only a single utterance, it is suitable only for single
        // shot recognition like command or query. 
        // For long-running multi-utterance recognition, use StartContinuousRecognitionAsync() instead.
        var result = await recognizer.RecognizeOnceAsync().ConfigureAwait(false);
    
        // Checks result.
        if (result.Reason == ResultReason.RecognizedIntent)
        {
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
            Console.WriteLine($"    Intent Id: {result.IntentId}.");
            Console.WriteLine($"    Language Understanding JSON: {result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}.");
        }
        else if (result.Reason == ResultReason.RecognizedSpeech)
        {
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
            Console.WriteLine($"    Intent not recognized.");
        }
        else if (result.Reason == ResultReason.NoMatch)
        {
            Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        }
        else if (result.Reason == ResultReason.Canceled)
        {
            var cancellation = CancellationDetails.FromResult(result);
            Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
    
            if (cancellation.Reason == CancellationReason.Error)
            {
                Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
                Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
                Console.WriteLine($"CANCELED: Did you update the subscription info?");
            }
        }
    }
    
  6. استبدل العناصر النائبة في هذه الطريقة بمفتاح اشتراك LUIS والمنطقة ومعرف التطبيق كما يلي.

    العنصر النائب استبدال بـ
    YourLanguageUnderstandingSubscriptionKey مفتاح LUIS الخاص بك. مرة أخرى، يجب أن تحصل على هذا العنصر من لوحة معلومات Azure. يمكنك العثور عليه في صفحة موارد Azure الخاصة بتطبيقك (ضمن إدارة) في مدخل LUIS.
    YourLanguageUnderstandingServiceRegion المعرف القصير للمنطقة التي يوجد فيها اشتراكك في LUIS، مثل westus غرب الولايات المتحدة. راجع المناطق.
    YourLanguageUnderstandingAppId معرف تطبيق LUIS. يمكنك العثور عليه في صفحة الإعدادات الخاصة بتطبيقك في مدخل LUIS.

مع هذه التغييرات التي تم إجراؤها ، يمكنك إنشاء (Control + Shift + B) وتشغيل (F5) التطبيق. عندما تتم مطالبتك، حاول قول "أطفئ الأنوار" في ميكروفون الكمبيوتر. يعرض التطبيق النتيجة في نافذة وحدة التحكم.

تتضمن الأقسام التالية مناقشة للرمز.

إنشاء أداة التعرف على النوايا

أولا، تحتاج إلى إنشاء تكوين كلام من مفتاح التنبؤ LUIS والمنطقة. يمكنك استخدام تكوينات الكلام لإنشاء أدوات التعرف على الإمكانات المختلفة ل Speech SDK. يحتوي تكوين الكلام على طرق متعددة لتحديد الاشتراك الذي تريد استخدامه. هنا ، نستخدم FromSubscription، الذي يأخذ مفتاح الاشتراك والمنطقة.

ملاحظة

استخدم مفتاح ومنطقة اشتراكك في LUIS، وليس اشتراك خدمة الكلام.

بعد ذلك ، قم بإنشاء أداة التعرف على النية باستخدام new IntentRecognizer(config). نظرا لأن التكوين يعرف بالفعل الاشتراك الذي يجب استخدامه، فلن تحتاج إلى تحديد مفتاح الاشتراك مرة أخرى عند إنشاء أداة التعرف.

استيراد نموذج LUIS وإضافة نوايا

الآن قم باستيراد النموذج من تطبيق LUIS باستخدام LanguageUnderstandingModel.FromAppId() وإضافة نوايا LUIS التي ترغب في التعرف عليها عبر طريقة أداة التعرف AddIntent() . تعمل هاتان الخطوتان على تحسين دقة التعرف على الكلام من خلال الإشارة إلى الكلمات التي من المحتمل أن يستخدمها المستخدم في طلباته. ليس عليك إضافة جميع مقاصد التطبيق إذا لم تكن بحاجة إلى التعرف عليها جميعا في تطبيقك.

لإضافة نوايا، يجب عليك توفير ثلاث وسيطات: نموذج LUIS (الذي تم إنشاؤه وتسميته model)، واسم النية، ومعرف النية. الفرق بين المعرف والاسم هو كما يلي.

AddIntent() جدال الغرض
intentName اسم القصد كما هو محدد في تطبيق LUIS. يجب أن تتطابق هذه القيمة مع اسم نية LUIS بالضبط.
intentID معرف تم تعيينه لهدف معترف به بواسطة Speech SDK. هذه القيمة يمكن أن تكون ما تريد. لا يلزم أن يتوافق مع اسم النية كما هو محدد في تطبيق LUIS. إذا تم التعامل مع نوايا متعددة بواسطة نفس الرمز ، على سبيل المثال ، يمكنك استخدام نفس المعرف لهم.

يحتوي تطبيق LUIS للأتمتة المنزلية على هدفين: أحدهما لتشغيل جهاز ، والآخر لإيقاف تشغيل الجهاز. السطور أدناه تضيف هذه المقاصد إلى المعرف. استبدل الأسطر الثلاثة AddIntent في الطريقة RecognizeIntentAsync() بهذا الرمز.

recognizer.AddIntent(model, "HomeAutomation.TurnOff", "off");
recognizer.AddIntent(model, "HomeAutomation.TurnOn", "on");

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

بدء التعرف

مع إنشاء أداة التعرف وإضافة المقاصد، يمكن أن يبدأ الاعتراف. تدعم حزمة تطوير البرامج (SDK) الخاصة بالكلام كلا من اللقطة الواحدة والتعرف المستمر.

وضع التعرف طرق الاتصال النتيجة
لقطة واحدة RecognizeOnceAsync() ترجع هذه الدالة القصد المعترف به، إن وجد، بعد كلام واحد.
مستمر StartContinuousRecognitionAsync()
StopContinuousRecognitionAsync()
يتعرف على الألفاظ المتعددة؛ يصدر أحداثا (على سبيل المثال، IntermediateResultReceived) عندما تتوفر النتائج.

يستخدم التطبيق وضع لقطة واحدة وبالتالي يدعو RecognizeOnceAsync() لبدء التعرف. والنتيجة هي IntentRecognitionResult كائن يحتوي على معلومات حول النية المعترف بها. استخراج استجابة LUIS JSON باستخدام التعبير التالي:

result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)

لا يقوم التطبيق بتحليل نتيجة JSON. يعرض فقط نص JSON في نافذة وحدة التحكم.

Single LUIS recognition results

تحديد لغة الاعتراف

بشكل افتراضي ، يتعرف LUIS على المقاصد باللغة الإنجليزية الأمريكية (en-us). من خلال تعيين رمز الإعدادات المحلية إلى SpeechRecognitionLanguage خاصية تكوين الكلام، يمكنك التعرف على المقاصد بلغات أخرى. على سبيل المثال، أضف config.SpeechRecognitionLanguage = "de-de"; في تطبيقنا قبل إنشاء أداة التعرف للتعرف على المقاصد باللغة الألمانية. لمزيد من المعلومات، راجع دعم لغة LUIS.

التعرف المستمر من ملف

توضح التعليمة البرمجية التالية قدرتين إضافيتين للتعرف على النية باستخدام Speech SDK. الأول ، الذي سبق ذكره ، هو الاعتراف المستمر ، حيث يصدر المتعرف الأحداث عندما تكون النتائج متاحة. يمكن بعد ذلك معالجة هذه الأحداث بواسطة معالجات الأحداث التي تقدمها. باستخدام التعرف المستمر ، يمكنك استدعاء طريقة المعرفين StartContinuousRecognitionAsync() لبدء التعرف بدلا من RecognizeOnceAsync().

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

لتجربة هذه الميزات ، احذف نص RecognizeIntentAsync() الطريقة أو عليه ، وأضف التعليمة البرمجية التالية في مكانها.

// Creates an instance of a speech config with specified subscription key
// and service region. Note that in contrast to other services supported by
// the Cognitive Services Speech SDK, the Language Understanding service
// requires a specific subscription key from https://www.luis.ai/.
// The Language Understanding service calls the required key 'endpoint key'.
// Once you've obtained it, replace with below with your own Language Understanding subscription key
// and service region (e.g., "westus").
var config = SpeechConfig.FromSubscription("YourLanguageUnderstandingSubscriptionKey", "YourLanguageUnderstandingServiceRegion");

// Creates an intent recognizer using file as audio input.
// Replace with your own audio file name.
using (var audioInput = AudioConfig.FromWavFileInput("whatstheweatherlike.wav"))
{
    using (var recognizer = new IntentRecognizer(config, audioInput))
    {
        // The TaskCompletionSource to stop recognition.
        var stopRecognition = new TaskCompletionSource<int>();

        // Creates a Language Understanding model using the app id, and adds specific intents from your model
        var model = LanguageUnderstandingModel.FromAppId("YourLanguageUnderstandingAppId");
        recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName1", "id1");
        recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName2", "id2");
        recognizer.AddIntent(model, "YourLanguageUnderstandingIntentName3", "any-IntentId-here");

        // Subscribes to events.
        recognizer.Recognizing += (s, e) =>
        {
            Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
        };

        recognizer.Recognized += (s, e) =>
        {
            if (e.Result.Reason == ResultReason.RecognizedIntent)
            {
                Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                Console.WriteLine($"    Intent Id: {e.Result.IntentId}.");
                Console.WriteLine($"    Language Understanding JSON: {e.Result.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}.");
            }
            else if (e.Result.Reason == ResultReason.RecognizedSpeech)
            {
                Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                Console.WriteLine($"    Intent not recognized.");
            }
            else if (e.Result.Reason == ResultReason.NoMatch)
            {
                Console.WriteLine($"NOMATCH: Speech could not be recognized.");
            }
        };

        recognizer.Canceled += (s, e) =>
        {
            Console.WriteLine($"CANCELED: Reason={e.Reason}");

            if (e.Reason == CancellationReason.Error)
            {
                Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
                Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
                Console.WriteLine($"CANCELED: Did you update the subscription info?");
            }

            stopRecognition.TrySetResult(0);
        };

        recognizer.SessionStarted += (s, e) =>
        {
            Console.WriteLine("\n    Session started event.");
        };

        recognizer.SessionStopped += (s, e) =>
        {
            Console.WriteLine("\n    Session stopped event.");
            Console.WriteLine("\nStop recognition.");
            stopRecognition.TrySetResult(0);
        };


        // Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
        Console.WriteLine("Say something...");
        await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

        // Waits for completion.
        // Use Task.WaitAny to keep the task rooted.
        Task.WaitAny(new[] { stopRecognition.Task });

        // Stops recognition.
        await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
    }
}

راجع التعليمة البرمجية لتضمين مفتاح تنبؤ LUIS والمنطقة ومعرف التطبيق وإضافة مقاصد التشغيل التلقائي للمنزل، كما كان من قبل. تغيير whatstheweatherlike.wav اسم الملف الصوتي المسجل. ثم قم بإنشاء ملف الصوت ونسخه إلى دليل الإنشاء وتشغيل التطبيق.

على سبيل المثال ، إذا قلت "أطفئ الأضواء" ، وأوقفت مؤقتا ، ثم قلت "تشغيل الأضواء" في ملف الصوت المسجل ، فقد يظهر إخراج وحدة التحكم المشابه لما يلي:

Audio file LUIS recognition results

نموذج التعليمات البرمجية المصدر

يحتفظ فريق Speech SDK بنشاط بمجموعة كبيرة من الأمثلة في مستودع مفتوح المصدر. للحصول على نموذج مستودع التعليمات البرمجية المصدرية، راجع Microsoft Cognitive Services Speech SDK على GitHub . هناك عينات ل C # و C ++ و Java و Python و Objective-C و Swift و JavaScript و UWP و Unity و Xamarin.


GitHub

ابحث عن التعليمة البرمجية من هذه المقالة في مجلد العينات/csharp/sharedcontent/console .

الخطوات التالية

التشغيل السريع: التعرف على الكلام من ميكروفون