جمع إدخال المستخدم باستخدام إجراء 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 و choices speech و و.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 Communication Services
- إنشاء تطبيق خدمة ويب جديد باستخدام SDK أتمتة المكالمات.
- Java Development Kit الإصدار 8 أو أعلى.
- Apache Maven.
للحصول على ميزات الذكاء الاصطناعي
- إنشاء خدمات Azure الذكاء الاصطناعي وتوصيلها بمورد Azure Communication Services.
- إنشاء مجال فرعي مخصص لمورد خدمات Azure الذكاء الاصطناعي.
المواصفات الفنية
تتوفر المعلمات التالية لتخصيص دالة Recognize:
المعلمة | النوع | الافتراضي (إذا لم يتم تحديده) | الوصف | مطلوب أو اختياري |
---|---|---|---|---|
Prompt (للحصول على التفاصيل، راجع تخصيص المطالبات الصوتية للمستخدمين باستخدام إجراء Play) |
FileSource, TextSource | غير معين | الرسالة التي يجب تشغيلها قبل التعرف على الإدخال. | اختياري |
InterToneTimeout |
TimeSpan | ثانيتين الحد الأدنى: 1 ثانية الحد الأقصى: 60 ثانية |
الحد بالثوان التي تنتظرها Azure Communication Services للمتصل للضغط على رقم آخر (مهلة بين الأرقام). | اختياري |
InitialSegmentationSilenceTimeoutInSeconds |
رقم صحيح | 0.5 ثانية | كم من الوقت ينتظر إجراء التعرف على الإدخال قبل اعتباره مهلة. راجع كيفية التعرف على الكلام. | اختياري |
RecognizeInputsType |
التعداد | dtmf | نوع الإدخال الذي يتم التعرف عليه. الخيارات هي dtmf و choices speech و و.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 و choices speech و و.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 و choices speech و و.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، يمكنك حذف المورد أو مجموعة الموارد. يؤدي حذف مجموعة الموارد إلى حذف أية موارد أخرى مقترنة بها أيضًا. تعرّف على المزيد حول تنظيف الموارد.
الخطوات التالية
- تعرف على المزيد حول تجميع إدخال المستخدم
- تعرف على المزيد حول تشغيل الصوت في المكالمة
- تعرف على المزيد حول أتمتة المكالمات