البدء في تحويل الكلام إلى نص

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

انتقل إلى عينات بخصوص GitHub

إذا كنت ترغب في تخطي مباشرة إلى نموذج التعليمات البرمجية، فراجع نماذج بدء التشغيل السريع C#‎ على GitHub.

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

تفترض هذه المقالة أن لديك حساب Azure، واشتراك في خدمة الكلام. إذا لم يكن لديك حساب واشتراك، ⁧⁩فجرّب خدمة الكلام مجانًا⁧⁩.

قم بتثبيت Speech SDK

إذا كنت لا تريد سوى اسم الحزمة للبدء، فقم بتشغيل Install-Package Microsoft.CognitiveServices.Speech وحدة التحكم NuGet.

للحصول على إرشادات التثبيت الخاصة بالمنصة، راجع الارتباطات التالية:

إنشاء تكوين الكلام

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

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    }
}

تتوافر بعض الطرق التي يمكنك من خلالها بدء SpeechConfig:

  • باستخدام نقطة نهاية: انتقل إلى نقطة نهاية خدمة Speech. المفتاح أو رمز التخويل المميز اختياري.
  • باستخدام مضيف: انتقل إلى عنوان مضيف. المفتاح أو رمز التخويل المميز اختياري.
  • مع رمز التخويل المميز: انتقل إلى رمز تخويل مميز والمنطقة/الموقع المقترنين.

ملاحظة

بغض النظر عما إذا كنت تجري التعرف على الكلام أو توليف الكلام أو الترجمة أو التعرف على الهدف، فستنشئ دائماً تكويناً.

التعرف من الميكروفون

للتعرف على الكلام باستخدام ميكروفون الجهاز، أنشئ AudioConfig باستخدام FromDefaultMicrophoneInput(). ثم بادر بتهيئة SpeechRecognizer، مع تمرير audioConfig وspeechConfigخاصتك.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromMic(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

        Console.WriteLine("Speak into your microphone.");
        var result = await recognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
        await FromMic(speechConfig);
    }
}

إذا كنت تريد استخدام جهاز إدخال صوتي محدد، فأنت بحاجة إلى تحديد معرف الجهاز في AudioConfig. تعرف على كيفية الحصول على معرف الجهاز لجهاز إدخال الصوت خاصتك.

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

إذا كنت تريد التعرف على الكلام من ملف صوتي بدلاً من الميكروفون، فإنك لا تزال بحاجة لإنشاء AudioConfig. مع ذلك، عند إنشاء AudioConfig، بدلا من استدعاء، يمكنك استدعاء وتمرير مسار FromDefaultMicrophoneInput()``FromWavFileInput() الملف.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromFile(SpeechConfig speechConfig)
    {
        using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

        var result = await recognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
        await FromFile(speechConfig);
    }
}

التعرف من مجرى الذاكرة

بالنسبة للعديد من حالات الاستخدام، من المحتمل أن تأتي بياناتك الصوتية من وحدة تخزين البيانات الثنائية الكبيرة، أو تكون موجودة بالفعل في الذاكرة byte[]أو بنية بيانات أولية مماثلة. يستخدم المثال التالي PushAudioInputStream للتعرف على الكلام، وهو تدفق مختصر للذاكرة في الأساس. يقوم نموذج التعليمة البرمجية بما يلي:

  • كتابة البيانات الصوتية غير المُعدّلة (PCM) PushAudioInputStreamباستخدام الدالة Write()، التي تقبل byte[].
  • قراءة .wav ملف يستخدم لأغراض العرض FileReader التوضيحي، ولكن إذا كان لديك بالفعل بيانات صوتية في byte[]، فيمكنك تخطيه مباشرة لكتابة المحتوى إلى مجرى الإدخال.
  • التنسيق الافتراضي هو 16 بت، 16 كيلو هرتز، PCM أحادي. لتخصيص التنسيق، يمكنك تمرير كائن AudioStreamFormat إلى CreatePushStream() باستخدام الدالة الثابتة AudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels) .
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromStream(SpeechConfig speechConfig)
    {
        var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
        using var audioInputStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioInputStream);
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

        byte[] readBytes;
        do
        {
            readBytes = reader.ReadBytes(1024);
            audioInputStream.Write(readBytes, readBytes.Length);
        } while (readBytes.Length > 0);

        var result = await recognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
        await FromStream(speechConfig);
    }
}

باستخدام مجرى دفع كمدخل، يفترض أن البيانات الصوتية هي PCM الخام، على سبيل المثال تخطي أي عناوين رئيسية. ستستمر واجهة برمجة التطبيقات في العمل في حالات معينة إذا لم يتم تخطي العناوين الرئيسية، ولكن للحصول على أفضل النتائج، ضع في اعتبارك تطبيق المنطق لقراءة العناوين الرئيسية بحيث يبدأ byte[] في بداية البيانات الصوتية.

معالجة الأخطاء

تحصل الأمثلة السابقة ببساطة على النص المتعرف عليه من result.text، ولكن لمعالجة الأخطاء والاستجابات الأخرى، تحتاج إلى كتابة بعض التعليمات البرمجية لمعالجة النتيجة. تقيِّم الشفرة التالية خاصية result.Reason و:

  • تطبع نتيجة التعرف: ResultReason.RecognizedSpeech
  • إذا لم يكن هناك تطابق في التعرف، أبلغ المستخدم: ResultReason.NoMatch
  • في حالة مواجهة خطأ، اطبع رسالة الخطأ: ResultReason.Canceled
switch (result.Reason)
{
    case ResultReason.RecognizedSpeech:
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        break;
    case ResultReason.NoMatch:
        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
        break;
    case 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 speech key and location/region info?");
        }
        break;
}

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

تستخدم الأمثلة السابقة التعرف من لقطة واحدة، والتي تعترف بلفظٍ واحدٍ. يتم تحديد نهاية اللفظ الواحد من خلال الاستماع إلى الجزء الصامت بالنهاية أو حتى 15 ثانية بحد أقصى من الصوت الذي تمت معالجته.

في المقابل، يُستخدم التعرف المستمر عندما تريد التحكم في وقت إيقاف التعرف. يتطلب منك الاشتراك في الأحداث Recognizing، وRecognized، وCanceled للحصول على نتائج التعرف. لإيقاف التعرف، يجب الاتصال بـStopContinuousRecognitionAsync. وفيما يلي مثال على كيفية إجراء التعرف المستمر على ملف إدخال الصوت.

لنبدأ بتعريف الإدخال وتهيئة SpeechRecognizer:

using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

ثم ننشئ TaskCompletionSource<int> لإدارة حالة التعرف على الكلام.

var stopRecognition = new TaskCompletionSource<int>();

بعد ذلك، اشترك في الأحداث المرسلة من SpeechRecognizer.

  • Recognizing:إشارة للأحداث التي تحتوي على نتائج التعرف الوسيطة.
  • Recognized: إشارة للأحداث التي تحتوي على نتائج التعرف النهائي (تشير إلى محاولة التعرف الناجحة).
  • SessionStopped: إشارة للأحداث التي تشير إلى نهاية جلسة التعرف (العملية).
  • Canceled : إشارة للأحداث التي تحتوي على نتائج التعرف الملغاة (تشير إلى محاولة التعرف التي تم إلغاؤها كنتيجة أو طلب إلغاء مباشر أو، بدلاً من ذلك، فشل النقل أو البروتوكول).
recognizer.Recognizing += (s, e) =>
{
    Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};

recognizer.Recognized += (s, e) =>
{
    if (e.Result.Reason == ResultReason.RecognizedSpeech)
    {
        Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
    }
    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 speech key and location/region info?");
    }

    stopRecognition.TrySetResult(0);
};

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

مع إعداد كل شيء، اتصل بـStartContinuousRecognitionAsync لبدء التعرف.

await recognizer.StartContinuousRecognitionAsync();

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

// make the following call at some point to stop recognition.
// await recognizer.StopContinuousRecognitionAsync();

وضع الإملاء

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

لتمكين وضع الإملاء، استخدم الأسلوب EnableDictation على SpeechConfig خاصتك.

speechConfig.EnableDictation();

تغيير لغة المصدر

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

speechConfig.SpeechRecognitionLanguage = "it-IT";

SpeechRecognitionLanguageتتوقع الخاصية سلسلة تنسيق لغوية محلية. يمكنك توفير أي قيمة في قائمة اللغات المحلية/اللغات المعتمدة.

تحسين دقة التعرف

تستخدم قوائم العبارات لتحديد العبارات المعروفة في البيانات الصوتية، مثل اسم الشخص أو موقع معين. من خلال توفير قائمة من العبارات، يمكنك تحسين دقة التعرف على الكلام.

مثلاً، إذا كان لديك أمر "الانتقال إلى" ووجهة محتملة من "Ward" التي قد يتم التحدث بها، يمكنك إضافة إدخال "الانتقال إلى Ward". إضافة عبارة تزيد من احتمال أنه عندما يتم التعرف على الصوت يتم التعرف على "الانتقال إلى Ward" بدلاً من "التحرك نحو"

يمكن إضافة كلمات مفردة أو عبارات كاملة إلى قائمة العبارات. في أثناء التعرف، يتم استخدام إدخال في قائمة عبارات لزيادة التعرف على الكلمات والعبارات في القائمة حتى عندما تظهر الإدخالات في منتصف اللفظ.

هام

تتوفر ميزة قائمة العبارات باللغات التالية: الإنجليزية الأمريكية، والألمانية، والإنجليزية الأسترالية، والإنجليزية الكندية، والإنجليزية البريطانية، والإنجليزية الهندية، والإسبانية، والفرنسية، والإيطالية، واليابانية، والبرتغالية البرازيلية، والصينية

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

ميزة قائمة العبارات غير مدعومة بنقاط النهاية المخصصة. لا تستخدمه مع نقاط النهاية المخصصة. بدلاً من ذلك، بادر بتدريب طراز مخصص يتضمن العبارات.

لاستخدام قائمة عبارات، بادر أولاً بإنشاء PhraseListGrammar كائن، ثم أضف كلمات وعبارات محددة باستخدام AddPhrase.

أي تغييرات PhraseListGrammar تسري على التعرف التالي أو بعد إعادة الاتصال بخدمة الكلام.

var phraseList = PhraseListGrammar.FromRecognizer(recognizer);
phraseList.AddPhrase("Supercalifragilisticexpialidocious");

إذا كنت بحاجة إلى مسح قائمة العبارات خاصتك:

phraseList.Clear();

خيارات أخرى لتحسين دقة التعرف

قوائم العبارات هي خيار واحد فقط لتحسين دقة التعرف. يمكنك أيضًا:

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

انتقل إلى عينات بخصوص GitHub

إذا كنت ترغب في تخطي نموذج التعليمات البرمجية، فراجع «C++ quickstart samples on GitHub».

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

تفترض هذه المقالة أن لديك حساب Azure، واشتراك في خدمة الكلام. إذا لم يكن لديك حساب واشتراك، ⁧⁩فجرّب خدمة الكلام مجانًا⁧⁩.

تثبيت Speech SDK

قبل أن تتمكن من أي شيء، ستحتاج إلى تثبيت Speech SDK. اعتمادًا على النظام الأساسي الخاص بك، استخدم الإرشادات التالية:

إنشاء تهيئة الكلام

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

using namespace std;
using namespace Microsoft::CognitiveServices::Speech;

auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

تتوافر بعض الطرق التي يمكنك من خلالها بدء SpeechConfig:

  • باستخدام نقطة نهاية: انتقل إلى نقطة نهاية خدمة Speech. المفتاح أو رمز التخويل المميز اختياري.
  • باستخدام مضيف: انتقل إلى عنوان مضيف. المفتاح أو رمز التخويل المميز اختياري.
  • مع رمز التخويل المميز: انتقل إلى رمز تخويل مميز والمنطقة المقترنة.

ملاحظة

بغض النظر عما إذا كنت تجري التعرف على الكلام أو توليف الكلام أو الترجمة أو التعرف على الهدف، فستنشئ دائماً تكويناً.

التعرف من الميكروفون

للتعرف على الكلام باستخدام ميكروفون الجهاز، أنشئ AudioConfig باستخدام FromDefaultMicrophoneInput(). ثم بادر بتهيئة SpeechRecognizer، مع تمرير audioConfig وconfigخاصتك.

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto recognizer = SpeechRecognizer::FromConfig(config, audioConfig);

cout << "Speak into your microphone." << std::endl;
auto result = recognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

إذا كنت تريد استخدام جهاز إدخال صوتي محدد، فأنت بحاجة إلى تحديد معرف الجهاز في AudioConfig. تعرف على كيفية الحصول على معرف الجهاز لجهاز إدخال الصوت خاصتك.

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

إذا كنت تريد التعرف على الكلام من ملف صوتي بدلاً من استخدام ميكروفون، فإنك لا تزال بحاجة لإنشاء AudioConfig. مع ذلك، عند إنشاء AudioConfig، بدلا من استدعاء، يمكنك استدعاء وتمرير مسار FromDefaultMicrophoneInput()``FromWavFileInput() الملف.

using namespace Microsoft::CognitiveServices::Speech::Audio;

auto audioInput = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto recognizer = SpeechRecognizer::FromConfig(config, audioInput);

auto result = recognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;

التعرف على الكلام

تكشف فئة أداة التعرف الخاصة بـ Speech SDK لـ C ++ بعض الطرق التي يمكنك استخدامها للتعرف على الكلام.

التعرف على لقطة واحدة

يتعرف التعرف على اللقطة الواحدة بشكل غير متزامن على لفظ واحد. يتم تحديد نهاية النطق الواحد من خلال الاستماع إلى الجزء الصامت بالنهاية أو حتى 15 ثانية بحد أقصى من الصوت الذي تمت معالجته. وفيما يلي مثال على التعرف على طلقة واحدة غير متزامنة باستخدام RecognizeOnceAsync:

auto result = recognizer->RecognizeOnceAsync().get();

ستحتاج إلى كتابة بعض التعليمات البرمجية للتعامل مع النتيجة. تقيم هذه العينة result->Reason:

  • تطبع نتيجة التعرف: ResultReason::RecognizedSpeech
  • إذا لم يكن هناك تطابق في التعرف، أبلغ المستخدم: ResultReason::NoMatch
  • في حالة مواجهة خطأ، اطبع رسالة الخطأ: ResultReason::Canceled
switch (result->Reason)
{
    case ResultReason::RecognizedSpeech:
        cout << "We recognized: " << result->Text << std::endl;
        break;
    case ResultReason::NoMatch:
        cout << "NOMATCH: Speech could not be recognized." << std::endl;
        break;
    case ResultReason::Canceled:
        {
            auto cancellation = CancellationDetails::FromResult(result);
            cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
    
            if (cancellation->Reason == CancellationReason::Error) {
                cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
                cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
                cout << "CANCELED: Did you update the speech key and location/region info?" << std::endl;
            }
        }
        break;
    default:
        break;
}

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

الاعتراف المستمر هو أكثر قليلاً من المشاركة في التعرف في لقطة واحدة. يتطلب منك الاشتراك في Recognizing، Recognized``Canceled والأحداث للحصول على نتائج التعرف. لإيقاف التعرف، يجب استدعاء StopContinuousRecognitionAsync. وفيما يلي مثال على كيفية إجراء التعرف المستمر على ملف إدخال الصوت.

لنبدأ بتعريف الإدخال وتهيئة SpeechRecognizer:

auto audioInput = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto recognizer = SpeechRecognizer::FromConfig(config, audioInput);

بعد ذلك، لننشئ متغير لإدارة حالة التعرف على الكلام. للبدء، نقوم بتعيين هذا إلى promise<void>، لأنه في بداية التعرف يمكننا أن نفترض بأمان أنه لم ينته.

promise<void> recognitionEnd;

بعد ذلك، اشترك في الأحداث المرسلة من SpeechRecognizer.

  • Recognizing:إشارة للأحداث التي تحتوي على نتائج التعرف الوسيطة.
  • Recognized: إشارة للأحداث التي تحتوي على نتائج التعرف النهائي (تشير إلى محاولة التعرف الناجحة).
  • SessionStopped: إشارة للأحداث التي تشير إلى نهاية جلسة التعرف (العملية).
  • Canceled : إشارة للأحداث التي تحتوي على نتائج التعرف الملغاة (تشير إلى محاولة التعرف التي تم إلغاؤها كنتيجة أو طلب إلغاء مباشر أو، بدلاً من ذلك، فشل النقل أو البروتوكول).
recognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
    {
        cout << "Recognizing:" << e.Result->Text << std::endl;
    });

recognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
    {
        if (e.Result->Reason == ResultReason::RecognizedSpeech)
        {
            cout << "RECOGNIZED: Text=" << e.Result->Text 
                 << " (text could not be translated)" << std::endl;
        }
        else if (e.Result->Reason == ResultReason::NoMatch)
        {
            cout << "NOMATCH: Speech could not be recognized." << std::endl;
        }
    });

recognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
    {
        cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
        if (e.Reason == CancellationReason::Error)
        {
            cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
                 << "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
                 << "CANCELED: Did you update the speech key and location/region info?" << std::endl;

            recognitionEnd.set_value(); // Notify to stop recognition.
        }
    });

recognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
    {
        cout << "Session stopped.";
        recognitionEnd.set_value(); // Notify to stop recognition.
    });

مع إعداد كل شيء، يمكننا الاتصال StopContinuousRecognitionAsync.

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
recognizer->StartContinuousRecognitionAsync().get();

// Waits for recognition end.
recognitionEnd.get_future().get();

// Stops recognition.
recognizer->StopContinuousRecognitionAsync().get();

وضع الإملاء

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

لتمكين وضع الإملاء، استخدم الأسلوب EnableDictation على SpeechConfig خاصتك.

config->EnableDictation();

تغيير لغة المصدر

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

config->SetSpeechRecognitionLanguage("de-DE");

SetSpeechRecognitionLanguage هي معلمة تعامل السلسلة كوسيطة. يمكنك توفير أي قيمة في قائمة اللغات المحلية/ اللغاتالمعتمدة.

تحسين دقة التعرف

تستخدم قوائم العبارات لتحديد العبارات المعروفة في البيانات الصوتية، مثل اسم الشخص أو موقع معين. من خلال توفير قائمة من العبارات، يمكنك تحسين دقة التعرف على الكلام.

مثلاً، إذا كان لديك أمر "الانتقال إلى" ووجهة محتملة من "Ward" التي قد يتم التحدث بها، يمكنك إضافة إدخال "الانتقال إلى Ward". إضافة عبارة تزيد من احتمال أنه عندما يتم التعرف على الصوت يتم التعرف على "الانتقال إلى Ward" بدلاً من "التحرك نحو"

يمكن إضافة كلمات مفردة أو عبارات كاملة إلى قائمة العبارات. في أثناء التعرف، يتم استخدام إدخال في قائمة عبارات لزيادة التعرف على الكلمات والعبارات في القائمة حتى عندما تظهر الإدخالات في منتصف اللفظ.

هام

تتوفر ميزة قائمة العبارات باللغات التالية: الإنجليزية الأمريكية، والألمانية، والإنجليزية الأسترالية، والإنجليزية الكندية، والإنجليزية البريطانية، والإنجليزية الهندية، والإسبانية، والفرنسية، والإيطالية، واليابانية، والبرتغالية البرازيلية، والصينية

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

ميزة قائمة العبارات غير معتمدة مع نقاط نهاية مخصصة. لا تستخدمه مع نقاط النهاية المخصصة. بدلاً من ذلك، بادر بتدريب طراز مخصص يتضمن العبارات.

لاستخدام قائمة عبارات، بادر أولاً بإنشاء PhraseListGrammar كائن، ثم أضف كلمات وعبارات محددة باستخدام AddPhrase.

أي تغييرات PhraseListGrammar تسري على التعرف التالي أو بعد إعادة الاتصال بخدمة الكلام.

auto phraseListGrammar = PhraseListGrammar::FromRecognizer(recognizer);
phraseListGrammar->AddPhrase("Supercalifragilisticexpialidocious");

إذا كنت بحاجة إلى مسح قائمة العبارات خاصتك:

phraseListGrammar->Clear();

خيارات أخرى لتحسين دقة التعرف

قوائم العبارات هي خيار واحد فقط لتحسين دقة التعرف. يمكنك أيضًا:

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

انتقل إلى عينات على GitHub

إذا كنت تريد التخطي مباشرة إلى نموذج التعليمة البرمجية، فراجع ⁧⁩ الانتقال إلى نماذج البدء السريع ⁧⁩ على GitHub.

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

تفترض هذه المقالة أن لديك حساب Azure، واشتراك في خدمة الكلام. إذا لم يكن لديك حساب واشتراك، ⁧⁩فجرّب خدمة الكلام مجانًا⁧⁩.

قم بتثبيت Speech SDK

قبل أن تتمكن من القيام بأي شيء، ستحتاج إلى تثبيت Speech SDK for Go.

تحويل الكلام الصادر من ميكروفون إلى نص

استخدم نموذج التعليمات البرمجية التالي لتشغيل التعرف على الكلام من ميكروفون الجهاز الافتراضي. استبدل المتغيراتsubscription وregion مفتاح الكلام والموقع/المنطقة. راجع صفحة البحث عن المفاتيح والموقع/المنطقة للعثور على زوج موقع/منطقة المفتاح. تشغيل البرنامج النصي سيبدأ جلسة التعرف على الميكروفون الافتراضي ونص الإخراج.

package main

import (
    "bufio"
    "fmt"
    "os"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func sessionStartedHandler(event speech.SessionEventArgs) {
    defer event.Close()
    fmt.Println("Session Started (ID=", event.SessionID, ")")
}

func sessionStoppedHandler(event speech.SessionEventArgs) {
    defer event.Close()
    fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}

func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
    defer event.Close()
    fmt.Println("Recognizing:", event.Result.Text)
}

func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
    defer event.Close()
    fmt.Println("Recognized:", event.Result.Text)
}

func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
    defer event.Close()
    fmt.Println("Received a cancellation: ", event.ErrorDetails)
}

func main() {
    subscription :=  "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"

    audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer config.Close()
    speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechRecognizer.Close()
    speechRecognizer.SessionStarted(sessionStartedHandler)
    speechRecognizer.SessionStopped(sessionStoppedHandler)
    speechRecognizer.Recognizing(recognizingHandler)
    speechRecognizer.Recognized(recognizedHandler)
    speechRecognizer.Canceled(cancelledHandler)
    speechRecognizer.StartContinuousRecognitionAsync()
    defer speechRecognizer.StopContinuousRecognitionAsync()
    bufio.NewReader(os.Stdin).ReadBytes('\n')
}

تشغيل الأوامر التالية لإنشاء ملف go.mod الذي يرتبط بالمكونات المستضافة على GitHub.

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

الآن إنشاء وتشغيل التعليمات البرمجية.

go build
go run quickstart

راجع مستندات المرجع للحصول على معلومات مفصلة حول SpeechConfig وSpeechRecognizer الفئات.

الكلام إلى النص من ملف صوتي

استخدم النموذج التالي لتشغيل التعرف على الكلام من ملف صوتي. استبدل المتغيراتsubscription وregion مفتاح الكلام والموقع/المنطقة. راجع صفحة البحث عن المفاتيح والموقع/المنطقة للعثور على زوج موقع/منطقة المفتاح. بالإضافة إلى ذلك، استبدال المتغير file بمسار إلى ملف .wav. سيتم التعرف على تشغيل البرنامج النصي الكلام من الملف وإخراج نتيجة النص.

package main

import (
    "fmt"
    "time"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func main() {
    subscription :=  "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"
    file := "path/to/file.wav"

    audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer config.Close()
    speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechRecognizer.Close()
    speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
        defer event.Close()
        fmt.Println("Session Started (ID=", event.SessionID, ")")
    })
    speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
        defer event.Close()
        fmt.Println("Session Stopped (ID=", event.SessionID, ")")
    })

    task := speechRecognizer.RecognizeOnceAsync()
    var outcome speech.SpeechRecognitionOutcome
    select {
    case outcome = <-task:
    case <-time.After(5 * time.Second):
        fmt.Println("Timed out")
        return
    }
    defer outcome.Close()
    if outcome.Error != nil {
        fmt.Println("Got an error: ", outcome.Error)
    }
    fmt.Println("Got a recognition!")
    fmt.Println(outcome.Result.Text)
}

تشغيل الأوامر التالية لإنشاء ملف go.mod الذي يرتبط بالمكونات المستضافة على GitHub.

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

الآن إنشاء وتشغيل التعليمات البرمجية.

go build
go run quickstart

راجع مستندات المرجع للحصول على معلومات مفصلة حول SpeechConfig وSpeechRecognizer الفئات.

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

انتقل إلى عينات على GitHub

في حالة رغبتك في إجراء تخطي مباشر إلى نموذج التعليمات البرمجية، راجع نماذج التشغيل السريع Java على GitHub.

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

تفترض هذه المقالة أن لديك حساب Azure، واشتراك في خدمة الكلام. إذا لم يكن لديك حساب واشتراك، ⁧⁩فجرّب خدمة الكلام مجانًا⁧⁩.

تثبيت Speech SDK

قبل أن تتمكن من أي شيء، ستحتاج إلى تثبيت Speech SDK. اعتمادًا على نظامك الأساسي، استخدم الإرشادات التالية:

إنشاء تكوين الكلام

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

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
    }
}

تتوافر بعض الطرق التي يمكنك من خلالها بدء SpeechConfig:

  • باستخدام نقطة نهاية: انتقل إلى نقطة نهاية خدمة Speech. المفتاح أو رمز التخويل المميز اختياري.
  • باستخدام مضيف: انتقل إلى عنوان مضيف. المفتاح أو رمز التخويل المميز اختياري.
  • مع رمز التخويل المميز: انتقل إلى رمز تخويل مميز والمنطقة المقترنة.

ملاحظة

بغض النظر عما إذا كنت تجري التعرف على الكلام أو توليف الكلام أو الترجمة أو التعرف على الهدف، فستنشئ دائماً تكويناً.

التعرف من الميكروفون

للتعرف على الكلام باستخدام ميكروفون الجهاز، أنشئ AudioConfig باستخدام fromDefaultMicrophoneInput(). ثم بادر بتهيئة SpeechRecognizer، مع تمرير audioConfig وconfigخاصتك.

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        fromMic(speechConfig);
    }

    public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
        SpeechRecognizer recognizer = new SpeechRecognizer(speechConfig, audioConfig);

        System.out.println("Speak into your microphone.");
        Future<SpeechRecognitionResult> task = recognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

إذا كنت تريد استخدام جهاز إدخال صوتي محدد، فأنت بحاجة إلى تحديد معرف الجهاز في AudioConfig. تعرف على كيفية الحصول على معرف الجهاز لجهاز إدخال الصوت خاصتك.

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

إذا كنت تريد التعرف على الكلام من ملف صوتي بدلاً من استخدام ميكروفون، فإنك لا تزال بحاجة لإنشاء AudioConfig. مع ذلك، عند إنشاء AudioConfig، بدلاً من استدعاء fromDefaultMicrophoneInput()، استدعِ fromWavFileInput() ومرر مسار الملف.

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class Program {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        fromFile(speechConfig);
    }

    public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
        AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
        SpeechRecognizer recognizer = new SpeechRecognizer(speechConfig, audioConfig);
        
        Future<SpeechRecognitionResult> task = recognizer.recognizeOnceAsync();
        SpeechRecognitionResult result = task.get();
        System.out.println("RECOGNIZED: Text=" + result.getText());
    }
}

معالجة الأخطاء

تحصل الأمثلة السابقة ببساطة على النص المتعرف عليه باستخدام result.getText()، ولكن لمعالجة الأخطاء والاستجابات الأخرى، تحتاج إلى كتابة بعض التعليمات البرمجية لمعالجة النتيجة. يقيم المثال التالي result.getReason() و:

  • تطبع نتيجة التعرف: ResultReason.RecognizedSpeech
  • إذا لم يكن هناك تطابق في التعرف، أبلغ المستخدم: ResultReason.NoMatch
  • في حالة مواجهة خطأ، اطبع رسالة الخطأ: ResultReason.Canceled
switch (result.getReason()) {
    case ResultReason.RecognizedSpeech:
        System.out.println("We recognized: " + result.getText());
        exitCode = 0;
        break;
    case ResultReason.NoMatch:
        System.out.println("NOMATCH: Speech could not be recognized.");
        break;
    case ResultReason.Canceled: {
            CancellationDetails cancellation = CancellationDetails.fromResult(result);
            System.out.println("CANCELED: Reason=" + cancellation.getReason());

            if (cancellation.getReason() == CancellationReason.Error) {
                System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                System.out.println("CANCELED: Did you update the subscription info?");
            }
        }
        break;
}

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

تستخدم الأمثلة السابقة التعرف من لقطة واحدة، والتي تعترف بلفظٍ واحدٍ. يتم تحديد نهاية اللفظ الواحد من خلال الاستماع إلى الجزء الصامت بالنهاية أو حتى 15 ثانية بحد أقصى من الصوت الذي تمت معالجته.

في المقابل، يُستخدم التعرف المستمر عندما تريد التحكم في وقت إيقاف التعرف. يتطلب منك الاشتراك في الأحداث recognizing، وrecognized، وcanceled للحصول على نتائج التعرف. لإيقاف التعرف، يجب الاتصال بـstopContinuousRecognitionAsync. وفيما يلي مثال على كيفية إجراء التعرف المستمر على ملف إدخال الصوت.

لنبدأ بتعريف الإدخال وتهيئة SpeechRecognizer:

AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer recognizer = new SpeechRecognizer(config, audioConfig);

بعد ذلك، لننشئ متغير لإدارة حالة التعرف على الكلام. للبدء، سنعلن Semaphore في نطاق الصف.

private static Semaphore stopTranslationWithFileSemaphore;

سنشترك في الأحداث المرسلة من SpeechRecognizer.

  • recognizing:إشارة للأحداث التي تحتوي على نتائج التعرف الوسيطة.
  • recognized: إشارة للأحداث التي تحتوي على نتائج التعرف النهائي (تشير إلى محاولة التعرف الناجحة).
  • sessionStopped: إشارة للأحداث التي تشير إلى نهاية جلسة التعرف (العملية).
  • canceled : إشارة للأحداث التي تحتوي على نتائج التعرف الملغاة (تشير إلى محاولة التعرف التي تم إلغاؤها كنتيجة أو طلب إلغاء مباشر أو، بدلاً من ذلك، فشل النقل أو البروتوكول).
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);

recognizer.recognizing.addEventListener((s, e) -> {
    System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});

recognizer.recognized.addEventListener((s, e) -> {
    if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
        System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
    }
    else if (e.getResult().getReason() == ResultReason.NoMatch) {
        System.out.println("NOMATCH: Speech could not be recognized.");
    }
});

recognizer.canceled.addEventListener((s, e) -> {
    System.out.println("CANCELED: Reason=" + e.getReason());

    if (e.getReason() == CancellationReason.Error) {
        System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
        System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
        System.out.println("CANCELED: Did you update the subscription info?");
    }

    stopTranslationWithFileSemaphore.release();
});

recognizer.sessionStopped.addEventListener((s, e) -> {
    System.out.println("\n    Session stopped event.");
    stopTranslationWithFileSemaphore.release();
});

مع إعداد كل شيء، يمكننا الاتصال startContinuousRecognitionAsync.

// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
recognizer.startContinuousRecognitionAsync().get();

// Waits for completion.
stopTranslationWithFileSemaphore.acquire();

// Stops recognition.
recognizer.stopContinuousRecognitionAsync().get();

وضع الإملاء

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

لتمكين وضع الإملاء، استخدم الأسلوب enableDictation على SpeechConfig خاصتك.

config.enableDictation();

تغيير لغة المصدر

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

config.setSpeechRecognitionLanguage("fr-FR");

setSpeechRecognitionLanguage هي معلمة تعامل السلسلة كوسيطة. يمكنك توفير أي قيمة في قائمة اللغات المحلية/ اللغاتالمعتمدة.

تحسين دقة التعرف

تستخدم قوائم العبارات لتحديد العبارات المعروفة في البيانات الصوتية، مثل اسم الشخص أو موقع معين. من خلال توفير قائمة من العبارات، يمكنك تحسين دقة التعرف على الكلام.

مثلاً، إذا كان لديك أمر "الانتقال إلى" ووجهة محتملة من "Ward" التي قد يتم التحدث بها، يمكنك إضافة إدخال "الانتقال إلى Ward". إضافة عبارة تزيد من احتمال أنه عندما يتم التعرف على الصوت يتم التعرف على "الانتقال إلى Ward" بدلاً من "التحرك نحو"

يمكن إضافة كلمات مفردة أو عبارات كاملة إلى قائمة العبارات. في أثناء التعرف، يتم استخدام إدخال في قائمة عبارات لزيادة التعرف على الكلمات والعبارات في القائمة حتى عندما تظهر الإدخالات في منتصف اللفظ.

هام

تتوفر ميزة قائمة العبارات باللغات التالية: الإنجليزية الأمريكية، والألمانية، والإنجليزية الأسترالية، والإنجليزية الكندية، والإنجليزية البريطانية، والإنجليزية الهندية، والإسبانية، والفرنسية، والإيطالية، واليابانية، والبرتغالية البرازيلية، والصينية

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

ميزة قائمة العبارات غير مدعومة بنقاط النهاية المخصصة. لا تستخدمه مع نقاط النهاية المخصصة. بدلاً من ذلك، بادر بتدريب طراز مخصص يتضمن العبارات.

لاستخدام قائمة عبارات، بادر أولاً بإنشاء PhraseListGrammar كائن، ثم أضف كلمات وعبارات محددة باستخدام AddPhrase.

أي تغييرات PhraseListGrammar تسري على التعرف التالي أو بعد إعادة الاتصال بخدمة الكلام.

PhraseListGrammar phraseList = PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Supercalifragilisticexpialidocious");

إذا كنت بحاجة إلى مسح قائمة العبارات خاصتك:

phraseList.clear();

خيارات أخرى لتحسين دقة التعرف

قوائم العبارات هي خيار واحد فقط لتحسين دقة التعرف. يمكنك أيضًا:

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

انتقل إلى عينات بخصوص GitHub

في حالة رغبتك في إجراء تخطي مباشر إلى نموذج التعليمات البرمجية، راجع نماذج التشغيل السريع لـJavaScript على GitHub.

انتقل إلى نموذج React على GitHub لمعرفة كيفية استخدام Speech SDK في بيئة JavaScript المستندة إلى المتصفح.

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

تفترض هذه المقالة أن لديك حساب Azure، واشتراك في خدمة الكلام. إذا لم يكن لديك حساب واشتراك، ⁧⁩فجرّب خدمة الكلام مجانًا⁧⁩.

تثبيت Speech SDK

قبل أن تتمكن من القيام بأي شيء، تحتاج إلى تثبيت Speech SDK لـNode.js. إذا كنت تريد فقط تثبيت اسم الحزمة، فقم بتشغيل npm install microsoft-cognitiveservices-speech-sdk . للحصول على إرشادات التثبيت الإرشادية، راجع مقالة البدء.

استخدم العبارة التالية require لاستيراد SDK.

const sdk = require("microsoft-cognitiveservices-speech-sdk");

لمزيد من المعلومات حول require، راجع الوثائق المطلوبة.

إنشاء تهيئة الكلام

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

const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

تتوافر بعض الطرق التي يمكنك من خلالها بدء SpeechConfig:

  • باستخدام نقطة نهاية: انتقل إلى نقطة نهاية خدمة Speech. المفتاح أو رمز التخويل المميز اختياري.
  • باستخدام مضيف: انتقل إلى عنوان مضيف. المفتاح أو رمز التخويل المميز اختياري.
  • باستخدام رمز تخويل: انتقل إلى رمز تخويل والموقع/المنطقة المقترنة.

ملاحظة

بغض النظر عما إذا كنت تقوم بإجراء التعرف على الكلام أو توليف الكلام أو الترجمة أو التعرف على الأهداف، فستقوم دائماً بإنشاء تكوين.

التعرف من الميكروفون (المتصفح فقط)

التعرف على الكلام من ميكروفون غير معتمد في Node.js، وهو مدعوم فقط في بيئة JavaScript المستندة إلى المتصفح. راجع عينة React على GitHub لمشاهدة تحويل الكلام إلى النص من تطبيق الميكروفون.

ملاحظة

إذا كنت تريد استخدام جهاز إدخال صوتي محدد، فأنت بحاجة إلى تحديد معرف الجهاز في AudioConfig. تعرف على كيفية الحصول على معرف الجهاز لجهاز إدخال الصوت خاصتك.

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

للتعرف على الكلام من ملف صوتي، قم بإنشاء AudioConfig استخدام fromWavFileInput() والذي يقبل Buffer كائناً. ثم تهيئة SpeechRecognizer ، تمرير الخاص بك وaudioConfig``speechConfig.

const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

function fromFile() {
    let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
    let recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

    recognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        recognizer.close();
    });
}
fromFile();

التعرف من مجرى الذاكرة

بالنسبة للعديد من حالات الاستخدام، من المحتمل أن تأتي بياناتك الصوتية من وحدة تخزين البيانات الثنائية الكبيرة، أو تكون موجودة بالفعل في الذاكرة ArrayBuffer أو بنية بيانات أولية مماثلة. الرمز التالي:

  • إنشاء دفق دفع باستخدام createPushStream().
  • قراءة .wav ملف يستخدم لأغراض العرض fs.createReadStream التوضيحي، ولكن إذا كان لديك بالفعل بيانات صوتية في ArrayBuffer، فيمكنك تخطيه مباشرة لكتابة المحتوى إلى مجرى الإدخال.
  • إنشاء تهيئة للصوت باستخدام مجرى الضغط.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

function fromStream() {
    let pushStream = sdk.AudioInputStream.createPushStream();

    fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
        pushStream.write(arrayBuffer.slice());
    }).on('end', function() {
        pushStream.close();
    });
 
    let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
    let recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
    recognizer.recognizeOnceAsync(result => {
        console.log(`RECOGNIZED: Text=${result.text}`);
        recognizer.close();
    });
}
fromStream();

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

معالجة الأخطاء

تحصل الأمثلة السابقة ببساطة على النص المتعرف عليه من result.text، ولكن لمعالجة الأخطاء والاستجابات الأخرى، تحتاج إلى كتابة بعض التعليمات البرمجية لمعالجة النتيجة. تقيِّم الشفرة التالية خاصية result.reason و:

  • تطبع نتيجة التعرف: ResultReason.RecognizedSpeech
  • إذا لم يكن هناك تطابق في التعرف، أبلغ المستخدم: ResultReason.NoMatch
  • في حالة مواجهة خطأ، اطبع رسالة الخطأ: ResultReason.Canceled
switch (result.reason) {
    case sdk.ResultReason.RecognizedSpeech:
        console.log(`RECOGNIZED: Text=${result.text}`);
        break;
    case sdk.ResultReason.NoMatch:
        console.log("NOMATCH: Speech could not be recognized.");
        break;
    case sdk.ResultReason.Canceled:
        const cancellation = CancellationDetails.fromResult(result);
        console.log(`CANCELED: Reason=${cancellation.reason}`);

        if (cancellation.reason == sdk.CancellationReason.Error) {
            console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
            console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
            console.log("CANCELED: Did you update the key and location/region info?");
        }
        break;
    }

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

تستخدم الأمثلة السابقة التعرف من لقطة واحدة، والتي تعترف بلفظٍ واحدٍ. يتم تحديد نهاية اللفظ الواحد من خلال الاستماع إلى الجزء الصامت بالنهاية أو حتى 15 ثانية بحد أقصى من الصوت الذي تمت معالجته.

في المقابل، يُستخدم التعرف المستمر عندما تريد التحكم في وقت إيقاف التعرف. يتطلب منك الاشتراك في الأحداث Recognizing، وRecognized، وCanceled للحصول على نتائج التعرف. لإيقاف التعرف، يجب الاتصال بـstopContinuousRecognitionAsync. وفيما يلي مثال على كيفية إجراء التعرف المستمر على ملف إدخال الصوت.

لنبدأ بتعريف الإدخال وتهيئة SpeechRecognizer:

const recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

بعد ذلك، اشترك في الأحداث المرسلة من SpeechRecognizer.

  • recognizing:إشارة للأحداث التي تحتوي على نتائج التعرف الوسيطة.
  • recognized: إشارة للأحداث التي تحتوي على نتائج التعرف النهائي (تشير إلى محاولة التعرف الناجحة).
  • sessionStopped: إشارة للأحداث التي تشير إلى نهاية جلسة التعرف (العملية).
  • canceled : إشارة للأحداث التي تحتوي على نتائج التعرف الملغاة (تشير إلى محاولة التعرف التي تم إلغاؤها كنتيجة أو طلب إلغاء مباشر أو، بدلاً من ذلك، فشل النقل أو البروتوكول).
recognizer.recognizing = (s, e) => {
    console.log(`RECOGNIZING: Text=${e.result.text}`);
};

recognizer.recognized = (s, e) => {
    if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
        console.log(`RECOGNIZED: Text=${e.result.text}`);
    }
    else if (e.result.reason == sdk.ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be recognized.");
    }
};

recognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);

    if (e.reason == sdk.CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you update the key and location/region info?");
    }

    recognizer.stopContinuousRecognitionAsync();
};

recognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    recognizer.stopContinuousRecognitionAsync();
};

مع إعداد كل شيء، اتصل بـstartContinuousRecognitionAsync لبدء التعرف.

recognizer.startContinuousRecognitionAsync();

// make the following call at some point to stop recognition.
// recognizer.stopContinuousRecognitionAsync();

وضع الإملاء

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

لتمكين وضع الإملاء، استخدم الأسلوب enableDictation على SpeechConfig خاصتك.

speechConfig.enableDictation();

تغيير لغة المصدر

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

speechConfig.speechRecognitionLanguage = "it-IT";

speechRecognitionLanguageتتوقع الخاصية سلسلة تنسيق لغوية محلية. يمكنك توفير أي قيمة في قائمة اللغات المحلية/اللغات المعتمدة.

تحسين دقة التعرف

تستخدم قوائم العبارات لتحديد العبارات المعروفة في البيانات الصوتية، مثل اسم الشخص أو موقع معين. من خلال توفير قائمة من العبارات، يمكنك تحسين دقة التعرف على الكلام.

مثلاً، إذا كان لديك أمر "الانتقال إلى" ووجهة محتملة من "Ward" التي قد يتم التحدث بها، يمكنك إضافة إدخال "الانتقال إلى Ward". إضافة عبارة تزيد من احتمال أنه عندما يتم التعرف على الصوت يتم التعرف على "الانتقال إلى Ward" بدلاً من "التحرك نحو"

يمكن إضافة كلمات مفردة أو عبارات كاملة إلى قائمة العبارات. في أثناء التعرف، يتم استخدام إدخال في قائمة عبارات لزيادة التعرف على الكلمات والعبارات في القائمة حتى عندما تظهر الإدخالات في منتصف اللفظ.

هام

تتوفر ميزة قائمة العبارات باللغات التالية: الإنجليزية الأمريكية، والألمانية، والإنجليزية الأسترالية، والإنجليزية الكندية، والإنجليزية البريطانية، والإنجليزية الهندية، والإسبانية، والفرنسية، والإيطالية، واليابانية، والبرتغالية البرازيلية، والصينية

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

ميزة قائمة العبارات غير مدعومة بنقاط النهاية المخصصة. لا تستخدمه مع نقاط النهاية المخصصة. بدلاً من ذلك، بادر بتدريب طراز مخصص يتضمن العبارات.

لاستخدام قائمة عبارات، بادر أولاً بإنشاء PhraseListGrammar كائن، ثم أضف كلمات وعبارات محددة باستخدام addPhrase.

أي تغييرات PhraseListGrammar تسري على التعرف التالي أو بعد إعادة الاتصال بخدمة الكلام.

const phraseList = sdk.PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Supercalifragilisticexpialidocious");

إذا كنت بحاجة إلى مسح قائمة العبارات خاصتك:

phraseList.clear();

خيارات أخرى لتحسين دقة التعرف

قوائم العبارات هي خيار واحد فقط لتحسين دقة التعرف. يمكنك أيضًا:

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

عينة React الموجودة في GitHub

انتقل إلى نموذج React على GitHub لمعرفة كيفية استخدام Speech SDK في بيئة JavaScript المستندة إلى المتصفح. تعرض هذه العينة أمثلة نمط التصميم لتبادل رمز المصادقة وإدارته، وتسجيل الصوت من ميكروفون أو ملف لتحويل الكلام إلى نص.

بالإضافة إلى ذلك، تُستخدم أيضاً أنماط التصميم المستخدمة في Node.js quickstart في بيئة المتصفح.

يمكنك نسخ الكلام إلى نص باستخدام حزمة Speech SDK لصالح Swift وObjective-C.

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

تفترض النماذج التالية أن لديك حساب Azure وأنك مشترك في خدمة Speech. إذا لم يكن لديك حساب أو اشتراك، فجرب خدمة Speech مجانًا.

تثبيت حزمة Speech SDK والنماذج

تحتوي حزمة Speech SDK للخدمات المعرفية على نماذج مكتوبة في Swift وObjective-C لصالح نظامي التشغيل iOS وMac. انقر فوق الرابط للتعرف على إرشادات التثبيت لكل نموذج:

نوفر أيضًا حزمة Speech SDK عبر الإنترنت لصالح المرجع Objective-C.

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

انتقل إلى عينات على GitHub

إذا كنت تريد التخطي مباشرةً إلى نموذج التعليمات البرمجية، فراجع نماذج بدء التشغيل السريع في Python على GitHub.

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

تفترض هذه المقالة:

تثبيت Speech SDK وإدخاله

قبل أن تتمكن من القيام بأي شيء، ستحتاج إلى تثبيت Speech SDK.

pip install azure-cognitiveservices-speech

إذا كنت تعمل على macOS وواجهت مشكلات في التثبيت، فقد تحتاج إلى تشغيل هذا الأمر أولاً.

python3 -m pip install --upgrade pip

بعد تثبيتSpeech SDK، أدخله إلى المشروع بايثون.

import azure.cognitiveservices.speech as speechsdk

إنشاء تكوين كلام

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

speech_config = speechsdk.SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")

تتوافر بعض الطرق التي يمكنك من خلالها بدء SpeechConfig:

  • باستخدام نقطة نهاية: انتقل إلى نقطة نهاية خدمة Speech. المفتاح أو رمز التخويل المميز اختياري.
  • باستخدام مضيف: انتقل إلى عنوان مضيف. المفتاح أو رمز التخويل المميز اختياري.
  • مع رمز التخويل المميز: انتقل إلى رمز تخويل مميز والمنطقة المقترنة.

ملاحظة

بغض النظر عما إذا كنت تجري التعرف على الكلام أو توليف الكلام أو الترجمة أو التعرف على الهدف، فستنشئ دائماً تكويناً.

التعرف من الميكروفون

للتعرف على الكلام باستخدام ميكروفون جهازك، ببساطة قم بإنشاء SpeechRecognizer دون تمرير، وتمرير الخاص بك AudioConfig``speech_config .

import azure.cognitiveservices.speech as speechsdk

def from_mic():
    speech_config = speechsdk.SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
    
    print("Speak into your microphone.")
    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_mic()

إذا كنت ترغب في استخدام جهاز إدخال صوت معين، تحتاج إلى تحديد معرف الجهاز في AudioConfig، SpeechRecognizerوتمريره إلى audio_config مؤشر المنشئ. تعرف على كيفية الحصول على معرف الجهاز لجهاز إدخال الصوت.

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

إذا كنت تريد التعرف على الكلام من ملف صوتي بدلاً من استخدام ميكروفون، قم بإنشاء AudioConfigfilename المعلمة واستخدامها.

import azure.cognitiveservices.speech as speechsdk

def from_file():
    speech_config = speechsdk.SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")
    audio_input = speechsdk.AudioConfig(filename="your_file_name.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_input)
    
    result = speech_recognizer.recognize_once_async().get()
    print(result.text)

from_file()

معالجة الأخطاء

تحصل الأمثلة السابقة ببساطة على النص المتعرف عليه من result.text، ولكن لمعالجة الأخطاء والاستجابات الأخرى، تحتاج إلى كتابة بعض التعليمات البرمجية لمعالجة النتيجة. تقيِّم الشفرة التالية خاصية result.reason و:

  • تطبع نتيجة التعرف: speechsdk.ResultReason.RecognizedSpeech
  • إذا لم يكن هناك تطابق في التعرف، أبلغ المستخدم: speechsdk.ResultReason.NoMatch
  • في حالة مواجهة خطأ، اطبع رسالة الخطأ: speechsdk.ResultReason.Canceled
if result.reason == speechsdk.ResultReason.RecognizedSpeech:
    print("Recognized: {}".format(result.text))
elif result.reason == speechsdk.ResultReason.NoMatch:
    print("No speech could be recognized: {}".format(result.no_match_details))
elif result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = result.cancellation_details
    print("Speech Recognition canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        print("Error details: {}".format(cancellation_details.error_details))

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

تستخدم الأمثلة السابقة التعرف من لقطة واحدة، والتي تعترف بلفظٍ واحدٍ. يتم تحديد نهاية اللفظ الواحد من خلال الاستماع إلى الجزء الصامت بالنهاية أو حتى 15 ثانية بحد أقصى من الصوت الذي تمت معالجته.

في المقابل، يتم استخدام التعرف المستمر عندما تريد التحكم في وقت إيقاف التعرف. يتطلب منك الاتصال إلى EventSignal للحصول على نتائج التعرف ثم لإيقاف التعرف يجب استدعاء stop_continuous_recognition() أو stop_continuous_recognition(). وفيما يلي مثال على كيفية إجراء التعرف المستمر على ملف إدخال الصوت.

لنبدأ بتعريف الإدخال وتهيئة SpeechRecognizer:

audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

بعد ذلك، لننشئ متغيراً لإدارة حالة التعرف على الكلام. للبدء، نقوم بتعيين هذا إلى False ، لأنه في بداية التعرف يمكننا أن نفترض بأمان أنه لم ينته.

done = False

الآن، ننشئ رد اتصال لإيقاف التعرف المستمر عند evt الاستلام. يوجد بعض الأشياء التي تجب مراعاتها.

  • عند evt تلقي رسالة evt تتم طباعة.
  • بعد evt تلقي stop_continuous_recognition() يتم استدعاؤه لإيقاف التعرف.
  • يتم تغيير حالة التعرف إلى True .
def stop_cb(evt):
    print('CLOSING on {}'.format(evt))
    speech_recognizer.stop_continuous_recognition()
    nonlocal done
    done = True

يوضح نموذج التعليمات البرمجية هذا كيفية توصيل عمليات الاسترجاعات بالأحداث المرسلة من SpeechRecognizer .

  • recognizing:إشارة للأحداث التي تحتوي على نتائج التعرف الوسيطة.
  • recognized: إشارة للأحداث التي تحتوي على نتائج التعرف النهائي (تشير إلى محاولة التعرف الناجحة).
  • session_started: إشارة للأحداث التي تشير إلى بدء جلسة عمل التعرف (عملية).
  • session_stopped: إشارة للأحداث التي تشير إلى نهاية جلسة عمل التعرف (عملية).
  • canceled: إشارة للأحداث التي تحتوي على نتائج التعرف الملغاة (تشير إلى محاولة التعرف التي تم إلغاؤها نتيجة أو طلب إلغاء مباشر أو، بدلاً من ذلك، فشل النقل أو البروتوكول).
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))

speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)

مع كل إعداد، يمكننا استدعاء start_continuous_recognition().

speech_recognizer.start_continuous_recognition()
while not done:
    time.sleep(.5)

وضع الإملاء

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

لتمكين وضع الإملاء، استخدم الأسلوب enable_dictation() على SpeechConfig خاصتك.

SpeechConfig.enable_dictation()

تغيير لغة المصدر

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

speech_config.speech_recognition_language="de-DE"

speech_recognition_language معلمة تأخذ سلسلة كوسيطة. يمكنك توفير أي قيمة في قائمة اللغات المحلية/ اللغاتالمعتمدة.

تحسين دقة التعرف

تستخدم قوائم العبارات لتحديد العبارات المعروفة في البيانات الصوتية، مثل اسم الشخص أو موقع معين. من خلال توفير قائمة من العبارات، يمكنك تحسين دقة التعرف على الكلام.

مثلاً، إذا كان لديك أمر "الانتقال إلى" ووجهة محتملة من "Ward" التي قد يتم التحدث بها، يمكنك إضافة إدخال "الانتقال إلى Ward". إضافة عبارة تزيد من احتمال أنه عندما يتم التعرف على الصوت يتم التعرف على "الانتقال إلى Ward" بدلاً من "التحرك نحو"

يمكن إضافة كلمات مفردة أو عبارات كاملة إلى قائمة العبارات. في أثناء التعرف، يتم استخدام إدخال في قائمة عبارات لزيادة التعرف على الكلمات والعبارات في القائمة حتى عندما تظهر الإدخالات في منتصف اللفظ.

هام

تتوفر ميزة قائمة العبارات باللغات التالية: الإنجليزية الأمريكية، والألمانية، والإنجليزية الأسترالية، والإنجليزية الكندية، والإنجليزية البريطانية، والإنجليزية الهندية، والإسبانية، والفرنسية، والإيطالية، واليابانية، والبرتغالية البرازيلية، والصينية

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

ميزة Phrase List غير مدعمة بنقاط النهاية المخصصة. لا تستخدمه مع نقاط النهاية المخصصة. بدلاً من ذلك، بادر بتدريب طراز مخصص يتضمن العبارات.

لاستخدام قائمة عبارات، بادر أولاً بإنشاء PhraseListGrammar كائن، ثم أضف كلمات وعبارات محددة باستخدام addPhrase.

أي تغييرات PhraseListGrammar تسري على التعرف التالي أو بعد إعادة الاتصال بخدمة الكلام.

phrase_list_grammar = speechsdk.PhraseListGrammar.from_recognizer(reco)
phrase_list_grammar.addPhrase("Supercalifragilisticexpialidocious")

إذا كنت بحاجة إلى مسح قائمة العبارات خاصتك:

phrase_list_grammar.clear()

خيارات أخرى لتحسين دقة التعرف

قوائم العبارات هي خيار واحد فقط لتحسين دقة التعرف. يمكنك أيضًا:

في هذه البداية السريعة، ستتعلم كيفية تحويل الكلام إلى نص باستخدام خدمة الكلام و cURL.

لإلقاء نظرة عالية المستوى على مفاهيم تحويل الكلام إلى نص، راجع مقالة نظرة عامة .

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

تفترض هذه المقالة أن لديك حساب Azure، واشتراك في خدمة الكلام. إذا لم يكن لديك حساب واشتراك، فجرّب خدمة الكلام مجانًا .

تحويل الكلام إلى نص

في موجه الأوامر، قم بتشغيل الأمر التالي. ستحتاج إلى إدخال القيم التالية في الأمر.

  • مفتاح الاشتراك في خدمة الكلام الخاص بك.
  • منطقة خدمة الكلام الخاصة بك.
  • مسار ملف الصوت الإدخال. يمكنك إنشاء ملفات صوتية باستخدام تحويل النص إلى كلام .
curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary 'INSERT_AUDIO_FILE_PATH_HERE'

يجب أن تتلقى ردًا مثل الرد التالي.

{
    "RecognitionStatus": "Success",
    "DisplayText": "My voice is my passport, verify me.",
    "Offset": 6600000,
    "Duration": 32100000
}

لمزيد من المعلومات، راجع مرجع REST API الكلام إلى نص .

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

تنزيل وتثبيت

اتبع الخطوات التالية لتثبيت Speech CLI على Windows:

  1. في Windows، تحتاج إلى Microsoft Visual C++ Redistributable لـ Visual Studio 2019 للنظام الأساسي الخاص بك. قد يتطلب تثبيت هذا للمرة الأولى إعادة تشغيل.

  2. تثبيت .NET Core 3.1 SDK.

  3. تثبيت Speech CLI باستخدام NuGet بإدخال هذا الأمر:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    

اكتب spx لمشاهدة تعليمات لـSpeech CLI.

ملاحظة

كبديل لـNuGet، يمكنك تنزيل واستخراج Speech CLI لنظام تشغيل Windows كملف مضغوط.

حدود الخط

في نظام التشغيل Windows، يمكن لـ Speech CLI إظهار الخطوط المتاحة فقط لموجه الأوامر على الكمبيوتر المحلي. وحدة طرفية نظام تشغيل Windows يدعم كافة الخطوط التي يتم إنتاجها بشكل تفاعلي بواسطة Speech CLI.

إذا قمت بالإخراج إلى ملف ، فيمكن أيضاً لمحرر نصوص مثل Notepad أو متصفح ويب مثل Microsoft Edge عرض جميع الخطوط.

إنشاء تكوين اشتراك

لبدء استخدام Speech CL، تحتاج إلى إدخال مفتاح الاشتراك الكلام ومعرف المنطقة. احصل على بيانات الاعتماد هذه باتباع الخطوات الواردة في جرب خدمة Speech مجاناً . بمجرد أن يكون لديك مفتاح الاشتراك ومعرف المنطقة (على سبيل المثال، eastus``westus، قم بتشغيل الأوامر التالية.

spx config @key --set SUBSCRIPTION-KEY
spx config @region --set REGION

يتم الآن تخزين مصادقة الاشتراك لطلبات SPX المستقبلية. إذا كنت بحاجة إلى إزالة أي من هذه القيم المخزنة، قم بتشغيل spx config @region --clear أو spx config @key --clear.

تحويل الكلام الصادر من ميكروفون إلى نص

وصل الميكروفون وشغله، ثم أوقف تشغيل أي تطبيقات قد تستخدم الميكروفون أيضا. تحتوي بعض أجهزة الكمبيوتر على ميكروفون مدمج، بينما تتطلب أجهزة أخرى تهيئة جهاز Bluetooth.

الآن أنت جاهز لتشغيل Speech CLI للتعرف على الكلام من الميكروفون. من سطر الأوامر، غير إلى الدليل الذي يحتوي على ملف Speech CLI، ثنائي ثم شغل الأمر التالي.

spx recognize --microphone

ملاحظة

يتم Speech CLI باللغة الإنجليزية بشكل افتراضي. يمكنك اختيار لغة مختلفة من جدول تحويل الكلام إلى النص. على سبيل المثال، أضف --source de-DE للتعرف على النصوص الألمانية.

تحدث في الميكروفون لترى عملية التحويل الفوري لكلماتك المنطوقة إلى نص كتابي. يتوقف Speech CLI بعد فترة من الصمت، أو عند الضغط على ctrl-C.

الكلام إلى النص من ملف صوتي

ويمكن لـ Speech CLI التعرف على الكلام فيما يخص العديد من تنسيقات الملفات واللغات الطبيعية. في هذا المثال، يمكنك استخدام أي ملف WAV (16 كيلوهرتز أو 8 كيلوهرتز و16 بت وPCM أحادي) يحتوي على الكلام باللغة الإنجليزية. وفي حال كنت تريد عينة سريعة، نزل الملف whatstheweatherlike.wav ، وانسخه إلى نفس الدليل كملف Speech CLI ثنائي.

والآن أنت على أتمة الاستعداد لتشغيل Speech CLI للتعرف على الكلام الموجود في ملف الصوت عبر تشغيل الأمر التالي.

spx recognize --file whatstheweatherlike.wav

ملاحظة

يتم Speech CLI باللغة الإنجليزية بشكل افتراضي. يمكنك اختيار لغة مختلفة من جدول تحويل الكلام إلى النص. على سبيل المثال، أضف --source de-DE للتعرف على النصوص الألمانية.

يعرض Speech CLI كتابة الحديث على الشاشة.

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