جمع إدخال المستخدم باستخدام إجراء Recognize

يساعدك هذا الدليل على البدء في التعرف على مدخلات DTMF التي يوفرها المشاركون من خلال Azure Communication Services Call Automation SDK.

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

  • حساب Azure مع اشتراك نشط، للحصول على التفاصيل، راجع إنشاء حساب مجانا.
  • مورد Azure Communication Services. راجع إنشاء مورد Azure Communication Services. لاحظ سلسلة الاتصال لهذا المورد.
  • إنشاء تطبيق خدمة ويب جديد باستخدام SDK أتمتة المكالمات.
  • أحدث مكتبة .NET لنظام التشغيل الخاص بك.
  • أحدث حزمة NuGet.

للحصول على ميزات الذكاء الاصطناعي

  • إنشاء خدمات Azure الذكاء الاصطناعي وتوصيلها بمورد Azure Communication Services.
  • إنشاء مجال فرعي مخصص لمورد خدمات Azure الذكاء الاصطناعي.

المواصفات الفنية

تتوفر المعلمات التالية لتخصيص دالة Recognize:

المعلمة النوع الافتراضي (إذا لم يتم تحديده) ‏‏الوصف مطلوب أو اختياري
Prompt

(للحصول على التفاصيل، راجع تخصيص المطالبات الصوتية للمستخدمين باستخدام إجراء Play)
FileSource, TextSource غير معين الرسالة التي يجب تشغيلها قبل التعرف على الإدخال. اختياري
InterToneTimeout TimeSpan ثانيتين

الحد الأدنى: 1 ثانية
الحد الأقصى: 60 ثانية
الحد بالثوان التي تنتظرها Azure Communication Services للمتصل للضغط على رقم آخر (مهلة بين الأرقام). اختياري
InitialSegmentationSilenceTimeoutInSeconds رقم صحيح 0.5 ثانية كم من الوقت ينتظر إجراء التعرف على الإدخال قبل اعتباره مهلة. راجع كيفية التعرف على الكلام. اختياري
RecognizeInputsType التعداد dtmf نوع الإدخال الذي يتم التعرف عليه. الخيارات هي dtmfو choicesspeechو و.speechordtmf المطلوب
InitialSilenceTimeout TimeSpan 5 seconds

الحد الأدنى: 0 ثانية
الحد الأقصى: 300 ثانية (DTMF)
الحد الأقصى: 20 ثانية (خيارات)
الحد الأقصى: 20 ثانية (الكلام)
تضبط مهلة الصمت الأولي مقدار الصوت غير المنسوخ قبل انتهاء محاولة التعرف بنتيجة "عدم التطابق". راجع كيفية التعرف على الكلام. اختياري
MaxTonesToCollect رقم صحيح لا يوجد تقصير

الحد الأدنى: 1
عدد الأرقام التي يتوقعها المطور كمدخل من المشارك. المطلوب
StopTones IEnumeration<DtmfTone> غير معين يمكن للمشاركين في الأرقام الضغط للهروب من حدث DTMF الدفعي. اختياري
InterruptPrompt مجموعة صواب إذا كان لدى المشارك القدرة على مقاطعة playMessage بالضغط على رقم. اختياري
InterruptCallMediaOperation مجموعة صواب إذا تم تعيين هذه العلامة، فإنها تقاطع عملية وسائط الاستدعاء الحالية. على سبيل المثال، إذا كان يتم تشغيل أي صوت، فإنه يقطع هذه العملية ويبدأ التعرف. اختياري
OperationContext السلسلة‬ غير معين السلسلة التي يمكن للمطورين تمريرها في منتصف الإجراء، وهي مفيدة للسماح للمطورين بتخزين سياق حول الأحداث التي يتلقونها. اختياري
Phrases السلسلة‬ غير معين قائمة العبارات التي تقترن بالتسمية. يؤدي سماع أي من هذه العبارات إلى التعرف الناجح. المطلوب
Tone السلسلة‬ غير معين النغمة التي يجب التعرف عليها إذا قرر المستخدم الضغط على رقم بدلا من استخدام الكلام. اختياري
Label السلسلة‬ غير معين القيمة الرئيسية للتعرف. المطلوب
Language السلسلة‬ En-us اللغة المستخدمة للتعرف على الكلام. اختياري
EndSilenceTimeout TimeSpan 0.5 ثانية الإيقاف المؤقت النهائي للسماعة المستخدمة للكشف عن النتيجة النهائية التي يتم إنشاؤها ككلمة. اختياري

إشعار

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

إنشاء تطبيق C# جديد

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

dotnet new web -n MyApplication

تثبيت حزمة NuGet

الحصول على حزمة NuGet من معرض NuGet | Azure.Communication.CallAutomation. اتبع الإرشادات لتثبيت الحزمة.

إنشاء مكالمة

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

var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");

var answerCallOptions = new AnswerCallOptions("<Incoming call context once call is connected>", new Uri("<https://sample-callback-uri>"))  
{  
    CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri("<Azure Cognitive Services Endpoint>") } 
};  

var answerCallResult = await callAutomationClient.AnswerCallAsync(answerCallOptions); 

استدعاء إجراء التعرف

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

DTMF

var maxTonesToCollect = 3;
String textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeDtmfOptions(targetParticipant, maxTonesToCollect) {
  InitialSilenceTimeout = TimeSpan.FromSeconds(30),
    Prompt = playSource,
    InterToneTimeout = TimeSpan.FromSeconds(5),
    InterruptPrompt = true,
    StopTones = new DtmfTone[] {
      DtmfTone.Pound
    },
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
  .GetCallMedia()
  .StartRecognizingAsync(recognizeOptions);

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

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

var choices = new List < RecognitionChoice > {
  new RecognitionChoice("Confirm", new List < string > {
    "Confirm",
    "First",
    "One"
  }) {
    Tone = DtmfTone.One
  },
  new RecognitionChoice("Cancel", new List < string > {
    "Cancel",
    "Second",
    "Two"
  }) {
    Tone = DtmfTone.Two
  }
};
String textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";

var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant, choices) {
  InterruptPrompt = true,
    InitialSilenceTimeout = TimeSpan.FromSeconds(30),
    Prompt = playSource,
    OperationContext = "AppointmentReminderMenu",
    //Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
    SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
  .GetCallMedia()
  .StartRecognizingAsync(recognizeOptions);

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

String textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant) {
  Prompt = playSource,
    EndSilenceTimeout = TimeSpan.FromMilliseconds(1000),
    OperationContext = "OpenQuestionSpeech",
    //Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
    SpeechModelEndpointId = "YourCustomSpeechModelEndpointId"
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
  .GetCallMedia()
  .StartRecognizingAsync(recognizeOptions);

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

var maxTonesToCollect = 1; 
String textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?"; 
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural"); 
var recognizeOptions = new CallMediaRecognizeSpeechOrDtmfOptions(targetParticipant, maxTonesToCollect) 
{ 
    Prompt = playSource, 
    EndSilenceTimeout = TimeSpan.FromMilliseconds(1000), 
    InitialSilenceTimeout = TimeSpan.FromSeconds(30), 
    InterruptPrompt = true, 
    OperationContext = "OpenQuestionSpeechOrDtmf",
    //Only add the SpeechModelEndpointId if you have a custom speech model you would like to use
    SpeechModelEndpointId = "YourCustomSpeechModelEndpointId" 
}; 
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .StartRecognizingAsync(recognizeOptions); 

إشعار

إذا لم يتم تعيين المعلمات، يتم تطبيق الإعدادات الافتراضية حيثما أمكن ذلك.

تلقي تحديثات حدث التعرف

يمكن للمطورين الاشتراك في RecognizeCompleted أحداث و RecognizeFailed على رد اتصال خطاف الويب المسجل. استخدم رد الاتصال هذا مع منطق العمل في التطبيق الخاص بك لتحديد الخطوات التالية عند حدوث أحد الأحداث.

مثال على كيفية إلغاء تسلسل الحدث RecognizeCompleted :

if (acsEvent is RecognizeCompleted recognizeCompleted) 
{ 
    switch (recognizeCompleted.RecognizeResult) 
    { 
        case DtmfResult dtmfResult: 
            //Take action for Recognition through DTMF 
            var tones = dtmfResult.Tones; 
            logger.LogInformation("Recognize completed succesfully, tones={tones}", tones); 
            break; 
        case ChoiceResult choiceResult: 
            // Take action for Recognition through Choices 
            var labelDetected = choiceResult.Label; 
            var phraseDetected = choiceResult.RecognizedPhrase; 
            // If choice is detected by phrase, choiceResult.RecognizedPhrase will have the phrase detected, 
            // If choice is detected using dtmf tone, phrase will be null 
            logger.LogInformation("Recognize completed succesfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
            break; 
        case SpeechResult speechResult: 
            // Take action for Recognition through Choices 
            var text = speechResult.Speech; 
            logger.LogInformation("Recognize completed succesfully, text={text}", text); 
            break; 
        default: 
            logger.LogInformation("Recognize completed succesfully, recognizeResult={recognizeResult}", recognizeCompleted.RecognizeResult); 
            break; 
    } 
} 

مثال على كيفية إلغاء تسلسل الحدث RecognizeFailed :

if (acsEvent is RecognizeFailed recognizeFailed) 
{ 
    if (MediaEventReasonCode.RecognizeInitialSilenceTimedOut.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for time out 
        logger.LogInformation("Recognition failed: initial silencev time out"); 
    } 
    else if (MediaEventReasonCode.RecognizeSpeechOptionNotMatched.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for option not matched 
        logger.LogInformation("Recognition failed: speech option not matched"); 
    } 
    else if (MediaEventReasonCode.RecognizeIncorrectToneDetected.Equals(recognizeFailed.ReasonCode)) 
    { 
        // Take action for incorrect tone 
        logger.LogInformation("Recognition failed: incorrect tone detected"); 
    } 
    else 
    { 
        logger.LogInformation("Recognition failed, result={result}, context={context}", recognizeFailed.ResultInformation?.Message, recognizeFailed.OperationContext); 
    } 
} 

مثال على كيفية إلغاء تسلسل الحدث RecognizeCanceled :

if (acsEvent is RecognizeCanceled { OperationContext: "AppointmentReminderMenu" })
        {
            logger.LogInformation($"RecognizeCanceled event received for call connection id: {@event.CallConnectionId}");
            //Take action on recognize canceled operation
           await callConnection.HangUpAsync(forEveryone: true);
        }

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

للحصول على ميزات الذكاء الاصطناعي

  • إنشاء خدمات Azure الذكاء الاصطناعي وتوصيلها بمورد Azure Communication Services.
  • إنشاء مجال فرعي مخصص لمورد خدمات Azure الذكاء الاصطناعي.

المواصفات الفنية

تتوفر المعلمات التالية لتخصيص دالة Recognize:

المعلمة النوع الافتراضي (إذا لم يتم تحديده) ‏‏الوصف مطلوب أو اختياري
Prompt

(للحصول على التفاصيل، راجع تخصيص المطالبات الصوتية للمستخدمين باستخدام إجراء Play)
FileSource, TextSource غير معين الرسالة التي يجب تشغيلها قبل التعرف على الإدخال. اختياري
InterToneTimeout TimeSpan ثانيتين

الحد الأدنى: 1 ثانية
الحد الأقصى: 60 ثانية
الحد بالثوان التي تنتظرها Azure Communication Services للمتصل للضغط على رقم آخر (مهلة بين الأرقام). اختياري
InitialSegmentationSilenceTimeoutInSeconds رقم صحيح 0.5 ثانية كم من الوقت ينتظر إجراء التعرف على الإدخال قبل اعتباره مهلة. راجع كيفية التعرف على الكلام. اختياري
RecognizeInputsType التعداد dtmf نوع الإدخال الذي يتم التعرف عليه. الخيارات هي dtmfو choicesspeechو و.speechordtmf المطلوب
InitialSilenceTimeout TimeSpan 5 seconds

الحد الأدنى: 0 ثانية
الحد الأقصى: 300 ثانية (DTMF)
الحد الأقصى: 20 ثانية (خيارات)
الحد الأقصى: 20 ثانية (الكلام)
تضبط مهلة الصمت الأولي مقدار الصوت غير المنسوخ قبل انتهاء محاولة التعرف بنتيجة "عدم التطابق". راجع كيفية التعرف على الكلام. اختياري
MaxTonesToCollect رقم صحيح لا يوجد تقصير

الحد الأدنى: 1
عدد الأرقام التي يتوقعها المطور كمدخل من المشارك. المطلوب
StopTones IEnumeration<DtmfTone> غير معين يمكن للمشاركين في الأرقام الضغط للهروب من حدث DTMF الدفعي. اختياري
InterruptPrompt مجموعة صواب إذا كان لدى المشارك القدرة على مقاطعة playMessage بالضغط على رقم. اختياري
InterruptCallMediaOperation مجموعة صواب إذا تم تعيين هذه العلامة، فإنها تقاطع عملية وسائط الاستدعاء الحالية. على سبيل المثال، إذا كان يتم تشغيل أي صوت، فإنه يقطع هذه العملية ويبدأ التعرف. اختياري
OperationContext السلسلة‬ غير معين السلسلة التي يمكن للمطورين تمريرها في منتصف الإجراء، وهي مفيدة للسماح للمطورين بتخزين سياق حول الأحداث التي يتلقونها. اختياري
Phrases السلسلة‬ غير معين قائمة العبارات التي تقترن بالتسمية. يؤدي سماع أي من هذه العبارات إلى التعرف الناجح. المطلوب
Tone السلسلة‬ غير معين النغمة التي يجب التعرف عليها إذا قرر المستخدم الضغط على رقم بدلا من استخدام الكلام. اختياري
Label السلسلة‬ غير معين القيمة الرئيسية للتعرف. المطلوب
Language السلسلة‬ En-us اللغة المستخدمة للتعرف على الكلام. اختياري
EndSilenceTimeout TimeSpan 0.5 ثانية الإيقاف المؤقت النهائي للسماعة المستخدمة للكشف عن النتيجة النهائية التي يتم إنشاؤها ككلمة. اختياري

إشعار

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

إنشاء تطبيق Java جديد

في نافذة المحطة الطرفية أو نافذة الأوامر، انتقل إلى الدليل حيث تريد إنشاء تطبيق Java الخاص بك. mvn قم بتشغيل الأمر لإنشاء مشروع Java من قالب maven-archetype-quickstart.

mvn archetype:generate -DgroupId=com.communication.quickstart -DartifactId=communication-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

mvn يقوم الأمر بإنشاء دليل بنفس اسم الوسيطةartifactId. src/main/java يحتوي الدليل على التعليمات البرمجية المصدر للمشروع. src/test/java يحتوي الدليل على مصدر الاختبار.

لاحظ أن generate الخطوة أنشأت دليلا بنفس اسم artifactId. src/main/java يحتوي الدليل على التعليمات البرمجية المصدر. src/test/java يحتوي الدليل على اختبارات. الملف pom.xml هو نموذج كائن المشروع (POM) للمشروع.

قم بتحديث ملف POM للتطبيقات لاستخدام Java 8 أو أعلى.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

إضافة مراجع الحزمة

في ملف POM، أضف المرجع التالي للمشروع:

azure-communication-callautomation

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-communication-callautomation</artifactId>
  <version>1.0.0</version>
</dependency>

إنشاء مكالمة

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

CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions().setCognitiveServicesEndpoint("https://sample-cognitive-service-resource.cognitiveservices.azure.com/"); 
answerCallOptions = new AnswerCallOptions("<Incoming call context>", "<https://sample-callback-uri>").setCallIntelligenceOptions(callIntelligenceOptions); 
Response < AnswerCallResult > answerCallResult = callAutomationClient
  .answerCallWithResponse(answerCallOptions)
  .block();

استدعاء إجراء التعرف

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

DTMF

var maxTonesToCollect = 3;
String textToPlay = "Welcome to Contoso, please enter 3 DTMF.";
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural");

var recognizeOptions = new CallMediaRecognizeDtmfOptions(targetParticipant, maxTonesToCollect) 
    .setInitialSilenceTimeout(Duration.ofSeconds(30)) 
    .setPlayPrompt(playSource) 
    .setInterToneTimeout(Duration.ofSeconds(5)) 
    .setInterruptPrompt(true) 
    .setStopTones(Arrays.asList(DtmfTone.POUND));

var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .startRecognizingWithResponse(recognizeOptions) 
    .block(); 

log.info("Start recognizing result: " + recognizeResponse.getStatusCode()); 

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

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

var choices = Arrays.asList(
  new RecognitionChoice()
  .setLabel("Confirm")
  .setPhrases(Arrays.asList("Confirm", "First", "One"))
  .setTone(DtmfTone.ONE),
  new RecognitionChoice()
  .setLabel("Cancel")
  .setPhrases(Arrays.asList("Cancel", "Second", "Two"))
  .setTone(DtmfTone.TWO)
);

String textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!";
var playSource = new TextSource()
  .setText(textToPlay)
  .setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeChoiceOptions(targetParticipant, choices)
  .setInterruptPrompt(true)
  .setInitialSilenceTimeout(Duration.ofSeconds(30))
  .setPlayPrompt(playSource)
  .setOperationContext("AppointmentReminderMenu")
  //Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
  .setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID"); 
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId)
  .getCallMediaAsync()
  .startRecognizingWithResponse(recognizeOptions)
  .block();

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

String textToPlay = "Hi, how can I help you today?"; 
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural"); 
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant, Duration.ofMillis(1000)) 
    .setPlayPrompt(playSource) 
    .setOperationContext("OpenQuestionSpeech")
    //Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
    .setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");  
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .startRecognizingWithResponse(recognizeOptions) 
    .block(); 

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

var maxTonesToCollect = 1; 
String textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?"; 
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural"); 
var recognizeOptions = new CallMediaRecognizeSpeechOrDtmfOptions(targetParticipant, maxTonesToCollect, Duration.ofMillis(1000)) 
    .setPlayPrompt(playSource) 
    .setInitialSilenceTimeout(Duration.ofSeconds(30)) 
    .setInterruptPrompt(true) 
    .setOperationContext("OpenQuestionSpeechOrDtmf")
    //Only add the SpeechRecognitionModelEndpointId if you have a custom speech model you would like to use
    .setSpeechRecognitionModelEndpointId("YourCustomSpeechModelEndpointID");  
var recognizeResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .startRecognizingWithResponse(recognizeOptions) 
    .block(); 

إشعار

إذا لم يتم تعيين المعلمات، يتم تطبيق الإعدادات الافتراضية حيثما أمكن ذلك.

تلقي تحديثات حدث التعرف

يمكن للمطورين الاشتراك في RecognizeCompleted أحداث و RecognizeFailed على رد اتصال خطاف الويب المسجل. استخدم رد الاتصال هذا مع منطق العمل في التطبيق الخاص بك لتحديد الخطوات التالية عند حدوث أحد الأحداث.

مثال على كيفية إلغاء تسلسل الحدث RecognizeCompleted :

if (acsEvent instanceof RecognizeCompleted) { 
    RecognizeCompleted event = (RecognizeCompleted) acsEvent; 
    RecognizeResult recognizeResult = event.getRecognizeResult().get(); 
    if (recognizeResult instanceof DtmfResult) { 
        // Take action on collect tones 
        DtmfResult dtmfResult = (DtmfResult) recognizeResult; 
        List<DtmfTone> tones = dtmfResult.getTones(); 
        log.info("Recognition completed, tones=" + tones + ", context=" + event.getOperationContext()); 
    } else if (recognizeResult instanceof ChoiceResult) { 
        ChoiceResult collectChoiceResult = (ChoiceResult) recognizeResult; 
        String labelDetected = collectChoiceResult.getLabel(); 
        String phraseDetected = collectChoiceResult.getRecognizedPhrase(); 
        log.info("Recognition completed, labelDetected=" + labelDetected + ", phraseDetected=" + phraseDetected + ", context=" + event.getOperationContext()); 
    } else if (recognizeResult instanceof SpeechResult) { 
        SpeechResult speechResult = (SpeechResult) recognizeResult; 
        String text = speechResult.getSpeech(); 
        log.info("Recognition completed, text=" + text + ", context=" + event.getOperationContext()); 
    } else { 
        log.info("Recognition completed, result=" + recognizeResult + ", context=" + event.getOperationContext()); 
    } 
} 

مثال على كيفية إلغاء تسلسل الحدث RecognizeFailed :

if (acsEvent instanceof RecognizeFailed) { 
    RecognizeFailed event = (RecognizeFailed) acsEvent; 
    if (ReasonCode.Recognize.INITIAL_SILENCE_TIMEOUT.equals(event.getReasonCode())) { 
        // Take action for time out 
        log.info("Recognition failed: initial silence time out"); 
    } else if (ReasonCode.Recognize.SPEECH_OPTION_NOT_MATCHED.equals(event.getReasonCode())) { 
        // Take action for option not matched 
        log.info("Recognition failed: speech option not matched"); 
    } else if (ReasonCode.Recognize.DMTF_OPTION_MATCHED.equals(event.getReasonCode())) { 
        // Take action for incorrect tone 
        log.info("Recognition failed: incorrect tone detected"); 
    } else { 
        log.info("Recognition failed, result=" + event.getResultInformation().getMessage() + ", context=" + event.getOperationContext()); 
    } 
} 

مثال على كيفية إلغاء تسلسل الحدث RecognizeCanceled :

if (acsEvent instanceof RecognizeCanceled) { 
    RecognizeCanceled event = (RecognizeCanceled) acsEvent; 
    log.info("Recognition canceled, context=" + event.getOperationContext()); 
}

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

  • حساب Azure مع اشتراك نشط، للحصول على التفاصيل، راجع إنشاء حساب مجانا.
  • مورد Azure Communication Services. راجع إنشاء مورد Azure Communication Services. لاحظ سلسلة الاتصال لهذا المورد.
  • إنشاء تطبيق خدمة ويب جديد باستخدام SDK أتمتة المكالمات.
  • بعد تثبيت Node.js، يمكنك تثبيته من موقعه الرسمي على الويب.

للحصول على ميزات الذكاء الاصطناعي

  • إنشاء خدمات Azure الذكاء الاصطناعي وتوصيلها بمورد Azure Communication Services.
  • إنشاء مجال فرعي مخصص لمورد خدمات Azure الذكاء الاصطناعي.

المواصفات الفنية

تتوفر المعلمات التالية لتخصيص دالة Recognize:

المعلمة النوع الافتراضي (إذا لم يتم تحديده) ‏‏الوصف مطلوب أو اختياري
Prompt

(للحصول على التفاصيل، راجع تخصيص المطالبات الصوتية للمستخدمين باستخدام إجراء Play)
FileSource, TextSource غير معين الرسالة التي يجب تشغيلها قبل التعرف على الإدخال. اختياري
InterToneTimeout TimeSpan ثانيتين

الحد الأدنى: 1 ثانية
الحد الأقصى: 60 ثانية
الحد بالثوان التي تنتظرها Azure Communication Services للمتصل للضغط على رقم آخر (مهلة بين الأرقام). اختياري
InitialSegmentationSilenceTimeoutInSeconds رقم صحيح 0.5 ثانية كم من الوقت ينتظر إجراء التعرف على الإدخال قبل اعتباره مهلة. راجع كيفية التعرف على الكلام. اختياري
RecognizeInputsType التعداد dtmf نوع الإدخال الذي يتم التعرف عليه. الخيارات هي dtmfو choicesspeechو و.speechordtmf المطلوب
InitialSilenceTimeout TimeSpan 5 seconds

الحد الأدنى: 0 ثانية
الحد الأقصى: 300 ثانية (DTMF)
الحد الأقصى: 20 ثانية (خيارات)
الحد الأقصى: 20 ثانية (الكلام)
تضبط مهلة الصمت الأولي مقدار الصوت غير المنسوخ قبل انتهاء محاولة التعرف بنتيجة "عدم التطابق". راجع كيفية التعرف على الكلام. اختياري
MaxTonesToCollect رقم صحيح لا يوجد تقصير

الحد الأدنى: 1
عدد الأرقام التي يتوقعها المطور كمدخل من المشارك. المطلوب
StopTones IEnumeration<DtmfTone> غير معين يمكن للمشاركين في الأرقام الضغط للهروب من حدث DTMF الدفعي. اختياري
InterruptPrompt مجموعة صواب إذا كان لدى المشارك القدرة على مقاطعة playMessage بالضغط على رقم. اختياري
InterruptCallMediaOperation مجموعة صواب إذا تم تعيين هذه العلامة، فإنها تقاطع عملية وسائط الاستدعاء الحالية. على سبيل المثال، إذا كان يتم تشغيل أي صوت، فإنه يقطع هذه العملية ويبدأ التعرف. اختياري
OperationContext السلسلة‬ غير معين السلسلة التي يمكن للمطورين تمريرها في منتصف الإجراء، وهي مفيدة للسماح للمطورين بتخزين سياق حول الأحداث التي يتلقونها. اختياري
Phrases السلسلة‬ غير معين قائمة العبارات التي تقترن بالتسمية. يؤدي سماع أي من هذه العبارات إلى التعرف الناجح. المطلوب
Tone السلسلة‬ غير معين النغمة التي يجب التعرف عليها إذا قرر المستخدم الضغط على رقم بدلا من استخدام الكلام. اختياري
Label السلسلة‬ غير معين القيمة الرئيسية للتعرف. المطلوب
Language السلسلة‬ En-us اللغة المستخدمة للتعرف على الكلام. اختياري
EndSilenceTimeout TimeSpan 0.5 ثانية الإيقاف المؤقت النهائي للسماعة المستخدمة للكشف عن النتيجة النهائية التي يتم إنشاؤها ككلمة. اختياري

إشعار

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

إنشاء تطبيق JavaScript الجديد

إنشاء تطبيق JavaScript جديد في دليل المشروع الخاص بك. تهيئة مشروع Node.js جديد باستخدام الأمر التالي. يؤدي هذا إلى إنشاء ملف package.json لمشروعك، والذي يدير تبعيات مشروعك.

npm init -y

تثبيت حزمة Azure Communication Services Call Automation

npm install @azure/communication-call-automation

قم بإنشاء ملف JavaScript جديد في دليل المشروع الخاص بك، على سبيل المثال، قم بتسمية .app.js اكتب تعليمة JavaScript البرمجية في هذا الملف.

قم بتشغيل التطبيق الخاص بك باستخدام Node.js باستخدام الأمر التالي.

node app.js

إنشاء مكالمة

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

استدعاء إجراء التعرف

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

DTMF

const maxTonesToCollect = 3; 
const textToPlay = "Welcome to Contoso, please enter 3 DTMF."; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeDtmfOptions = { 
    maxTonesToCollect: maxTonesToCollect, 
    initialSilenceTimeoutInSeconds: 30, 
    playPrompt: playSource, 
    interToneTimeoutInSeconds: 5, 
    interruptPrompt: true, 
    stopDtmfTones: [ DtmfTone.Pound ], 
    kind: "callMediaRecognizeDtmfOptions" 
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

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

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

const choices = [ 
    {  
        label: "Confirm", 
        phrases: [ "Confirm", "First", "One" ], 
        tone: DtmfTone.One 
    }, 
    { 
        label: "Cancel", 
        phrases: [ "Cancel", "Second", "Two" ], 
        tone: DtmfTone.Two 
    } 
]; 

const textToPlay = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!"; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeChoiceOptions = { 
    choices: choices, 
    interruptPrompt: true, 
    initialSilenceTimeoutInSeconds: 30, 
    playPrompt: playSource, 
    operationContext: "AppointmentReminderMenu", 
    kind: "callMediaRecognizeChoiceOptions",
    //Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
    speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

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

const textToPlay = "Hi, how can I help you today?"; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeSpeechOptions = { 
    endSilenceTimeoutInSeconds: 1, 
    playPrompt: playSource, 
    operationContext: "OpenQuestionSpeech", 
    kind: "callMediaRecognizeSpeechOptions",
    //Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
    speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

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

const maxTonesToCollect = 1; 
const textToPlay = "Hi, how can I help you today, you can press 0 to speak to an agent?"; 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 
const recognizeOptions: CallMediaRecognizeSpeechOrDtmfOptions = { 
    maxTonesToCollect: maxTonesToCollect, 
    endSilenceTimeoutInSeconds: 1, 
    playPrompt: playSource, 
    initialSilenceTimeoutInSeconds: 30, 
    interruptPrompt: true, 
    operationContext: "OpenQuestionSpeechOrDtmf", 
    kind: "callMediaRecognizeSpeechOrDtmfOptions",
    //Only add the speechRecognitionModelEndpointId if you have a custom speech model you would like to use
    speechRecognitionModelEndpointId: "YourCustomSpeechEndpointId"
}; 

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .startRecognizing(targetParticipant, recognizeOptions); 

إشعار

إذا لم يتم تعيين المعلمات، يتم تطبيق الإعدادات الافتراضية حيثما أمكن ذلك.

تلقي تحديثات حدث التعرف

يمكن للمطورين الاشتراك في RecognizeCompleted أحداث و RecognizeFailed على رد اتصال خطاف الويب المسجل. استخدم رد الاتصال هذا مع منطق العمل في التطبيق الخاص بك لتحديد الخطوات التالية عند حدوث أحد الأحداث.

مثال على كيفية إلغاء تسلسل الحدث RecognizeCompleted :

if (event.type === "Microsoft.Communication.RecognizeCompleted") { 
    if (eventData.recognitionType === "dtmf") { 
        const tones = eventData.dtmfResult.tones; 
        console.log("Recognition completed, tones=%s, context=%s", tones, eventData.operationContext); 
    } else if (eventData.recognitionType === "choices") { 
        const labelDetected = eventData.choiceResult.label; 
        const phraseDetected = eventData.choiceResult.recognizedPhrase; 
        console.log("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, eventData.operationContext); 
    } else if (eventData.recognitionType === "speech") { 
        const text = eventData.speechResult.speech; 
        console.log("Recognition completed, text=%s, context=%s", text, eventData.operationContext); 
    } else { 
        console.log("Recognition completed: data=%s", JSON.stringify(eventData, null, 2)); 
    } 
} 

مثال على كيفية إلغاء تسلسل الحدث RecognizeFailed :

if (event.type === "Microsoft.Communication.RecognizeFailed") {
    console.log("Recognize failed: data=%s", JSON.stringify(eventData, null, 2));
}

مثال على كيفية إلغاء تسلسل الحدث RecognizeCanceled :

if (event.type === "Microsoft.Communication.RecognizeCanceled") {
    console.log("Recognize canceled, context=%s", eventData.operationContext);
}

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

  • حساب Azure مع اشتراك نشط، للحصول على التفاصيل، راجع إنشاء حساب مجانا.
  • مورد Azure Communication Services. راجع إنشاء مورد Azure Communication Services. لاحظ سلسلة الاتصال لهذا المورد.
  • إنشاء تطبيق خدمة ويب جديد باستخدام SDK أتمتة المكالمات.
  • تثبيت Python من Python.org.

للحصول على ميزات الذكاء الاصطناعي

  • إنشاء خدمات Azure الذكاء الاصطناعي وتوصيلها بمورد Azure Communication Services.
  • إنشاء مجال فرعي مخصص لمورد خدمات Azure الذكاء الاصطناعي.

المواصفات الفنية

تتوفر المعلمات التالية لتخصيص دالة Recognize:

المعلمة النوع الافتراضي (إذا لم يتم تحديده) ‏‏الوصف مطلوب أو اختياري
Prompt

(للحصول على التفاصيل، راجع تخصيص المطالبات الصوتية للمستخدمين باستخدام إجراء Play)
FileSource, TextSource غير معين الرسالة التي يجب تشغيلها قبل التعرف على الإدخال. اختياري
InterToneTimeout TimeSpan ثانيتين

الحد الأدنى: 1 ثانية
الحد الأقصى: 60 ثانية
الحد بالثوان التي تنتظرها Azure Communication Services للمتصل للضغط على رقم آخر (مهلة بين الأرقام). اختياري
InitialSegmentationSilenceTimeoutInSeconds رقم صحيح 0.5 ثانية كم من الوقت ينتظر إجراء التعرف على الإدخال قبل اعتباره مهلة. راجع كيفية التعرف على الكلام. اختياري
RecognizeInputsType التعداد dtmf نوع الإدخال الذي يتم التعرف عليه. الخيارات هي dtmfو choicesspeechو و.speechordtmf المطلوب
InitialSilenceTimeout TimeSpan 5 seconds

الحد الأدنى: 0 ثانية
الحد الأقصى: 300 ثانية (DTMF)
الحد الأقصى: 20 ثانية (خيارات)
الحد الأقصى: 20 ثانية (الكلام)
تضبط مهلة الصمت الأولي مقدار الصوت غير المنسوخ قبل انتهاء محاولة التعرف بنتيجة "عدم التطابق". راجع كيفية التعرف على الكلام. اختياري
MaxTonesToCollect رقم صحيح لا يوجد تقصير

الحد الأدنى: 1
عدد الأرقام التي يتوقعها المطور كمدخل من المشارك. المطلوب
StopTones IEnumeration<DtmfTone> غير معين يمكن للمشاركين في الأرقام الضغط للهروب من حدث DTMF الدفعي. اختياري
InterruptPrompt مجموعة صواب إذا كان لدى المشارك القدرة على مقاطعة playMessage بالضغط على رقم. اختياري
InterruptCallMediaOperation مجموعة صواب إذا تم تعيين هذه العلامة، فإنها تقاطع عملية وسائط الاستدعاء الحالية. على سبيل المثال، إذا كان يتم تشغيل أي صوت، فإنه يقطع هذه العملية ويبدأ التعرف. اختياري
OperationContext السلسلة‬ غير معين السلسلة التي يمكن للمطورين تمريرها في منتصف الإجراء، وهي مفيدة للسماح للمطورين بتخزين سياق حول الأحداث التي يتلقونها. اختياري
Phrases السلسلة‬ غير معين قائمة العبارات التي تقترن بالتسمية. يؤدي سماع أي من هذه العبارات إلى التعرف الناجح. المطلوب
Tone السلسلة‬ غير معين النغمة التي يجب التعرف عليها إذا قرر المستخدم الضغط على رقم بدلا من استخدام الكلام. اختياري
Label السلسلة‬ غير معين القيمة الرئيسية للتعرف. المطلوب
Language السلسلة‬ En-us اللغة المستخدمة للتعرف على الكلام. اختياري
EndSilenceTimeout TimeSpan 0.5 ثانية الإيقاف المؤقت النهائي للسماعة المستخدمة للكشف عن النتيجة النهائية التي يتم إنشاؤها ككلمة. اختياري

إشعار

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

إنشاء تطبيق Python جديد

إعداد بيئة Python ظاهرية لمشروعك

python -m venv play-audio-app

تنشيط البيئة الظاهرية

في Windows، استخدم الأمر التالي:

.\ play-audio-quickstart \Scripts\activate

في Unix، استخدم الأمر التالي:

source play-audio-quickstart /bin/activate

تثبيت حزمة Azure Communication Services Call Automation

pip install azure-communication-callautomation

قم بإنشاء ملف التطبيق الخاص بك في دليل المشروع الخاص بك، على سبيل المثال، قم بتسمية .app.py اكتب تعليمة Python البرمجية في هذا الملف.

قم بتشغيل التطبيق الخاص بك باستخدام Python باستخدام الأمر التالي.

python app.py

إنشاء مكالمة

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

استدعاء إجراء التعرف

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

DTMF

max_tones_to_collect = 3 
text_to_play = "Welcome to Contoso, please enter 3 DTMF." 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    dtmf_max_tones_to_collect=max_tones_to_collect, 
    input_type=RecognizeInputType.DTMF, 
    target_participant=target_participant, 
    initial_silence_timeout=30, 
    play_prompt=play_source, 
    dtmf_inter_tone_timeout=5, 
    interrupt_prompt=True, 
    dtmf_stop_tones=[ DtmfTone.Pound ]) 

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

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

choices = [ 
    RecognitionChoice( 
        label="Confirm", 
        phrases=[ "Confirm", "First", "One" ], 
        tone=DtmfTone.ONE 
    ), 
    RecognitionChoice( 
        label="Cancel", 
        phrases=[ "Cancel", "Second", "Two" ], 
        tone=DtmfTone.TWO 
    ) 
] 
text_to_play = "Hello, This is a reminder for your appointment at 2 PM, Say Confirm to confirm your appointment or Cancel to cancel the appointment. Thank you!" 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    input_type=RecognizeInputType.CHOICES, 
    target_participant=target_participant, 
    choices=choices, 
    interrupt_prompt=True, 
    initial_silence_timeout=30, 
    play_prompt=play_source, 
    operation_context="AppointmentReminderMenu",
    # Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
    speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")  

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

text_to_play = "Hi, how can I help you today?" 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    input_type=RecognizeInputType.SPEECH, 
    target_participant=target_participant, 
    end_silence_timeout=1, 
    play_prompt=play_source, 
    operation_context="OpenQuestionSpeech",
    # Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
    speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId") 

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

max_tones_to_collect = 1 
text_to_play = "Hi, how can I help you today, you can also press 0 to speak to an agent." 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural") 
call_automation_client.get_call_connection(call_connection_id).start_recognizing_media( 
    dtmf_max_tones_to_collect=max_tones_to_collect, 
    input_type=RecognizeInputType.SPEECH_OR_DTMF, 
    target_participant=target_participant, 
    end_silence_timeout=1, 
    play_prompt=play_source, 
    initial_silence_timeout=30, 
    interrupt_prompt=True, 
    operation_context="OpenQuestionSpeechOrDtmf",
    # Only add the speech_recognition_model_endpoint_id if you have a custom speech model you would like to use
    speech_recognition_model_endpoint_id="YourCustomSpeechModelEndpointId")  
app.logger.info("Start recognizing") 

إشعار

إذا لم يتم تعيين المعلمات، يتم تطبيق الإعدادات الافتراضية حيثما أمكن ذلك.

تلقي تحديثات حدث التعرف

يمكن للمطورين الاشتراك في RecognizeCompleted أحداث و RecognizeFailed على رد اتصال خطاف الويب المسجل. استخدم رد الاتصال هذا مع منطق العمل في التطبيق الخاص بك لتحديد الخطوات التالية عند حدوث أحد الأحداث.

مثال على كيفية إلغاء تسلسل الحدث RecognizeCompleted :

if event.type == "Microsoft.Communication.RecognizeCompleted": 
    app.logger.info("Recognize completed: data=%s", event.data) 
    if event.data['recognitionType'] == "dtmf": 
        tones = event.data['dtmfResult']['tones'] 
        app.logger.info("Recognition completed, tones=%s, context=%s", tones, event.data.get('operationContext')) 
    elif event.data['recognitionType'] == "choices": 
        labelDetected = event.data['choiceResult']['label']; 
        phraseDetected = event.data['choiceResult']['recognizedPhrase']; 
        app.logger.info("Recognition completed, labelDetected=%s, phraseDetected=%s, context=%s", labelDetected, phraseDetected, event.data.get('operationContext')); 
    elif event.data['recognitionType'] == "speech": 
        text = event.data['speechResult']['speech']; 
        app.logger.info("Recognition completed, text=%s, context=%s", text, event.data.get('operationContext')); 
    else: 
        app.logger.info("Recognition completed: data=%s", event.data); 

مثال على كيفية إلغاء تسلسل الحدث RecognizeFailed :

if event.type == "Microsoft.Communication.RecognizeFailed": 
    app.logger.info("Recognize failed: data=%s", event.data); 

مثال على كيفية إلغاء تسلسل الحدث RecognizeCanceled :

if event.type == "Microsoft.Communication.RecognizeCanceled":
    # Handle the RecognizeCanceled event according to your application logic

رموز الأحداث

‏الحالة رمز الرمز الفرعي رسالة
RecognizeCompleted 200 8531 اكتمل الإجراء، تم تلقي الأرقام القصوى.
RecognizeCompleted 200 8514 تم إكمال الإجراء عند اكتشاف نغمة الإيقاف.
RecognizeCompleted 400 8508 فشل الإجراء، تم إلغاء العملية.
RecognizeCompleted 400 8532 فشل الإجراء، تم الوصول إلى مهلة الصمت بين الأرقام.
RecognizeCanceled 400 8508 فشل الإجراء، تم إلغاء العملية.
RecognizeFailed 400 8510 فشل الإجراء، تم الوصول إلى مهلة الصمت الأولية.
RecognizeFailed 500 8511 فشل الإجراء، صادف فشلا أثناء محاولة تشغيل المطالبة.
RecognizeFailed 500 8512 خطأ خادم داخلي غير معروف.
RecognizeFailed 400 8510 فشل الإجراء، تم الوصول إلى مهلة الصمت الأولية
RecognizeFailed 400 8532 فشل الإجراء، تم الوصول إلى مهلة الصمت بين الأرقام.
RecognizeFailed 400 8565 فشل الإجراء، طلب غير صحيح إلى خدمات Azure الذكاء الاصطناعي. تحقق من معلمات الإدخال.
RecognizeFailed 400 8565 فشل الإجراء، طلب غير صحيح إلى خدمات Azure الذكاء الاصطناعي. يتعذر معالجة الحمولة المتوفرة، تحقق من إدخال مصدر التشغيل.
RecognizeFailed 401 8565 فشل الإجراء، خطأ مصادقة خدمات Azure الذكاء الاصطناعي.
RecognizeFailed 403 8565 فشل الإجراء، طلب محظور لخدمات Azure الذكاء الاصطناعي، نفدت الحصة النسبية للاشتراك المجاني الذي يستخدمه الطلب.
RecognizeFailed 429 8565 فشل الإجراء، تجاوزت الطلبات عدد الطلبات المتزامنة المسموح بها لاشتراك خدمات Azure الذكاء الاصطناعي.
RecognizeFailed 408 8565 فشل الإجراء، انتهت مهلة طلب خدمات Azure الذكاء الاصطناعي.
RecognizeFailed 500 8511 فشل الإجراء، صادف فشلا أثناء محاولة تشغيل المطالبة.
RecognizeFailed 500 8512 خطأ خادم داخلي غير معروف.

القيود المعروفة

  • DTMF داخل النطاق غير مدعوم. استخدم RFC 2833 DTMF بدلا من ذلك.
  • تدعم المطالبات النصية لتحويل النص إلى كلام 400 حرف كحد أقصى، إذا كانت المطالبة أطول من هذا، نقترح استخدام SSML لإجراءات التشغيل المستندة إلى النص إلى كلام.
  • بالنسبة للسيناريوهات التي تتجاوز فيها حد الحصة النسبية لخدمة Speech، يمكنك طلب زيادة هذا الحد باتباع الخطوات الموضحة في حصص وحدود خدمات الكلام.

تنظيف الموارد

إذا كنت ترغب في تنظيف وإزالة اشتراك Communication Services، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا. تعرّف على المزيد حول تنظيف الموارد.

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