Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это руководство поможет вам приступить к распознаванию входных данных DTMF, предоставляемых участниками с помощью пакета SDK для автоматизации вызовов Службы коммуникации Azure.
Предварительные условия
- Учетная запись Azure с активной подпиской, подробнее см. в статье "Создайте учетную запись бесплатно".
- Ресурс служб связи Azure. См. статью "Создание ресурса Службы коммуникации Azure". Обратите внимание на строку подключения этого ресурса.
- Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
- Последняя библиотека .NET для вашей операционной системы.
- Последняя версия пакета NuGet.
Для функций ИИ
- Создайте и подключите средства Foundry к ресурсу Служб коммуникации Azure.
- Создайте настраиваемый поддомен для ресурса служб искусственного интеллекта Azure.
Технические характеристики
Для настройки функции Распознавания доступны следующие параметры:
| Параметр | Тип | Значение по умолчанию (если не указано) | Описание | Обязательный или необязательный |
|---|---|---|---|---|
Prompt (Для получения подробной информации см. Настройка голосовых подсказок для пользователей с помощью действия воспроизведения) |
ФайлИсточник, ТекстИсточник | Не установлено | Сообщение, которое будет воспроизводиться перед распознаванием входных данных. | Необязательно |
InterToneTimeout |
Интервал времени | 2 секунды Мин: 1 секунда Максимальное значение: 60 секунд |
Ограничение в секундах, которое Службы коммуникации Azure ожидают, пока абонент нажмет следующую цифру (время ожидания между цифрами). | Необязательно |
InitialSegmentationSilenceTimeoutInSeconds |
Целое число | 0,5 секунды | Как долго действие распознавания ожидает входных данных, прежде чем считать это тайм-аутом. Узнайте , как распознать речь. | Необязательно |
RecognizeInputsType |
Перечисление | dtmf | Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. |
Обязательное поле |
InitialSilenceTimeout |
Интервал времени | 5 секунд Мин: 0 секунд Макс: 300 секунд (DTMF) Макс: 20 секунд (варианты) Макс: 20 секунд (речь) |
Настройка времени ожидания молчания регулирует, сколько незвуковой аудиоинформации допускается перед фразой, прежде чем попытка распознавания завершается с результатом "без совпадения". Узнайте , как распознать речь. | Необязательно |
MaxTonesToCollect |
Целое число | Нет по умолчанию Мин: 1 |
Число цифр, которые разработчик ожидает в качестве входных данных от участника. | Обязательное поле |
StopTones |
IEnumeration<DtmfTone> | Не установлено | Участники могут нажать цифру, чтобы прервать пакетное событие DTMF. | Необязательно |
InterruptPrompt |
Булев | Истина | Если участник может прервать воспроизведение сообщения, нажав цифру. | Необязательно |
InterruptCallMediaOperation |
Булев | Истина | Если этот флаг задан, он прерывает текущую операцию носителя вызовов. Например, если звук воспроизводится, он прерывает операцию и инициирует распознавание. | Необязательно |
OperationContext |
Строка | Не установлено | Строка, которую разработчики могут передать во время выполнения действия, полезная для хранения разработчиками контекста о событиях, которые они получают. | Необязательно |
Phrases |
Строка | Не установлено | Список фраз, которые связываются с меткой. Слушание любой из этих фраз приводит к успешному распознаванию. | Обязательное поле |
Tone |
Строка | Не установлено | Тон для распознавания того, решит ли пользователь нажать число вместо использования речи. | Необязательно |
Label |
Строка | Не установлено | Ключевое значение для распознавания. | Обязательное поле |
Language |
Строка | Эн-юс | Язык, используемый для распознавания речи. | Необязательно |
EndSilenceTimeout |
Интервал времени | 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",
SpeechLanguages = new List<string> { "en-US", "hi-IN", "fr-FR" },
//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",
SpeechLanguages = new List<string> { "en-US", "hi-IN", "fr-FR" },
//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: new PhoneNumberIdentifier(targetParticipant))
{
Prompt = playSource,
InterruptCallMediaOperation = false,
InterruptPrompt = false,
InitialSilenceTimeout = TimeSpan.FromSeconds(10),
OperationContext = "OpenQuestionSpeech",
// Enable Language Identification
SpeechLanguages = new List<string> { "en-US", "hi-IN", "fr-FR" },
// 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);
Примечание.
Ограничения поддержки языка
При использовании API с речью Recognize в качестве входного типа:
- Можно указать до 10 языков с помощью
setSpeechLanguages(...). - Помните, что использование дополнительных языков может увеличить время, необходимое для получения
RecognizeCompletedсобытия из-за дополнительной обработки.
При использовании API с Recognize:
- Поддерживаются только до 4 языков .
- Указание более 4 языков в режиме выбора может привести к ошибкам или снижению производительности.
Анализ тональности (предварительная версия)
API Распознавания поддерживает анализ тональности при использовании входных данных речи. Отслеживайте эмоциональный тон бесед в режиме реального времени для поддержки взаимодействия клиентов и агентов и позволяют руководителям вмешиваться при необходимости. Это также может быть полезно для маршрутизации, персонализации или аналитики.
string textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(targetParticipant: new PhoneNumberIdentifier(targetParticipant))
{
Prompt = playSource,
InterruptCallMediaOperation = false,
InterruptPrompt = false,
InitialSilenceTimeout = TimeSpan.FromSeconds(10),
OperationContext = "OpenQuestionSpeech",
// Enable Sentiment Analysis
IsSentimentAnalysisEnabled = true
};
var recognizeResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartRecognizingAsync(recognizeOptions);
Получение обновлений событий распознавания
Разработчики могут подписаться на события RecognizeCompleted и RecognizeFailed на зарегистрированном обратном вызове веб-перехватчика. Используйте этот обратный вызов с бизнес-логикой в приложении, чтобы определить следующие шаги при возникновении одного из событий.
Пример того, как можно десериализовать событие RecognizeCompleted :
if (parsedEvent is RecognizeCompleted recognizeCompleted)
{
logger.LogInformation($"Received call event: {recognizeCompleted.GetType()}");
callConnectionId = recognizeCompleted.CallConnectionId;
switch (recognizeCompleted.RecognizeResult)
{
case DtmfResult dtmfResult:
var tones = dtmfResult.Tones;
logger.LogInformation("Recognize completed successfully, tones={tones}", tones);
break;
case ChoiceResult choiceResult:
var labelDetected = choiceResult.Label;
var phraseDetected = choiceResult.RecognizedPhrase;
var sentimentAnalysis = choiceResult.SentimentAnalysisResult;
logger.LogInformation("Recognize completed successfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
logger.LogInformation("Language Identified: {language}", choiceResult.LanguageIdentified);
if (sentimentAnalysis != null)
{
logger.LogInformation("Sentiment: {sentiment}", sentimentAnalysis.Sentiment);
}
break;
case SpeechResult speechResult:
var text = speechResult.Speech;
var speechSentiment = speechResult.SentimentAnalysisResult;
logger.LogInformation("Recognize completed successfully, text={text}", text);
logger.LogInformation("Language Identified: {language}", speechResult.LanguageIdentified);
if (speechSentiment != null)
{
logger.LogInformation("Sentiment: {sentiment}", speechSentiment.Sentiment);
}
break;
default:
logger.LogInformation("Recognize completed successfully, 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 silence 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. См. статью "Создание ресурса Службы коммуникации Azure"
- Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
- Пакет средств разработки Java версии 8 или более поздней.
- Apache Maven.
Для функций ИИ
- Создайте и подключите средства Foundry к ресурсу Служб коммуникации Azure.
- Создайте настраиваемый поддомен для ресурса служб искусственного интеллекта Azure.
Технические характеристики
Для настройки функции Распознавания доступны следующие параметры:
| Параметр | Тип | Значение по умолчанию (если не указано) | Описание | Обязательный или необязательный |
|---|---|---|---|---|
Prompt (Для получения подробной информации см. Настройка голосовых подсказок для пользователей с помощью действия воспроизведения) |
ФайлИсточник, ТекстИсточник | Не установлено | Сообщение, которое будет воспроизводиться перед распознаванием входных данных. | Необязательно |
InterToneTimeout |
Интервал времени | 2 секунды Мин: 1 секунда Максимальное значение: 60 секунд |
Ограничение в секундах, которое Службы коммуникации Azure ожидают, пока абонент нажмет следующую цифру (время ожидания между цифрами). | Необязательно |
InitialSegmentationSilenceTimeoutInSeconds |
Целое число | 0,5 секунды | Как долго действие распознавания ожидает входных данных, прежде чем считать это тайм-аутом. Узнайте , как распознать речь. | Необязательно |
RecognizeInputsType |
Перечисление | dtmf | Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. |
Обязательное поле |
InitialSilenceTimeout |
Интервал времени | 5 секунд Мин: 0 секунд Макс: 300 секунд (DTMF) Макс: 20 секунд (варианты) Макс: 20 секунд (речь) |
Настройка времени ожидания молчания регулирует, сколько незвуковой аудиоинформации допускается перед фразой, прежде чем попытка распознавания завершается с результатом "без совпадения". Узнайте , как распознать речь. | Необязательно |
MaxTonesToCollect |
Целое число | Нет по умолчанию Мин: 1 |
Число цифр, которые разработчик ожидает в качестве входных данных от участника. | Обязательное поле |
StopTones |
IEnumeration<DtmfTone> | Не установлено | Участники могут нажать цифру, чтобы прервать пакетное событие DTMF. | Необязательно |
InterruptPrompt |
Булев | Истина | Если участник может прервать воспроизведение сообщения, нажав цифру. | Необязательно |
InterruptCallMediaOperation |
Булев | Истина | Если этот флаг задан, он прерывает текущую операцию носителя вызовов. Например, если звук воспроизводится, он прерывает операцию и инициирует распознавание. | Необязательно |
OperationContext |
Строка | Не установлено | Строка, которую разработчики могут передать во время выполнения действия, полезная для хранения разработчиками контекста о событиях, которые они получают. | Необязательно |
Phrases |
Строка | Не установлено | Список фраз, которые связываются с меткой. Слушание любой из этих фраз приводит к успешному распознаванию. | Обязательное поле |
Tone |
Строка | Не установлено | Тон для распознавания того, решит ли пользователь нажать число вместо использования речи. | Необязательно |
Label |
Строка | Не установлено | Ключевое значение для распознавания. | Обязательное поле |
Language |
Строка | Эн-юс | Язык, используемый для распознавания речи. | Необязательно |
EndSilenceTimeout |
Интервал времени | 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. Каталог 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 (система автоматизации вызовов Azure Communication)
<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)
.setSpeechLanguages("en-US", "es-ES", "hi-IN")
.setSentimentAnalysisEnabled(true)
.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();
Примечание.
Если параметры не заданы, по возможности применяются значения по умолчанию.
Идентификация языка в режиме реального времени (предварительная версия)
Благодаря дополнительной идентификации языка в режиме реального времени разработчики могут автоматически обнаруживать языки, чтобы обеспечить естественное, человеческое взаимодействие и исключить выбор языка вручную конечными пользователями.
String textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(participant, Duration.ofSeconds(15))
.setPlayPrompt(playSource)
.setInterruptPrompt(false)
.setInitialSilenceTimeout(Duration.ofSeconds(15))
.setSentimentAnalysisEnabled(true)
.setSpeechLanguages("en-US", "es-ES", "hi-IN")
.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();
Примечание.
Ограничения поддержки языка
При использовании API с речью Recognize в качестве входного типа:
- Можно указать до 10 языков с помощью
setSpeechLanguages(...). - Помните, что использование дополнительных языков может увеличить время, необходимое для получения
RecognizeCompletedсобытия из-за дополнительной обработки.
При использовании API с Recognize:
- Поддерживаются только до 4 языков .
- Указание более 4 языков в режиме выбора может привести к ошибкам или снижению производительности.
Анализ тональности (предварительная версия)
API Распознавания поддерживает анализ тональности при использовании входных данных речи. Отслеживайте эмоциональный тон бесед в режиме реального времени для поддержки взаимодействия клиентов и агентов и позволяют руководителям вмешиваться при необходимости. Это также может быть полезно для маршрутизации, персонализации или аналитики.
String textToPlay = "Hi, how can I help you today?";
var playSource = new TextSource()
.setText(textToPlay)
.setVoiceName("en-US-ElizabethNeural");
var recognizeOptions = new CallMediaRecognizeSpeechOptions(participant, Duration.ofSeconds(15))
.setPlayPrompt(playSource)
.setInterruptPrompt(false)
.setInitialSilenceTimeout(Duration.ofSeconds(15))
.setSentimentAnalysisEnabled(true)
.setSpeechLanguages("en-US", "es-ES", "hi-IN")
.setOperationContext("SpeechContext");
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();
String languageIdentified = collectChoiceResult.getLanguageIdentified();
log.info("Recognition completed, labelDetected=" + labelDetected + ", phraseDetected=" + phraseDetected + ", context=" + event.getOperationContext());
log.info("Language Identified: " + languageIdentified);
if (choiceResult.getSentimentAnalysisResult() != null) {
log.info("Sentiment: " + choiceResult.getSentimentAnalysisResult().getSentiment());
}
} else if (recognizeResult instanceof SpeechResult) {
SpeechResult speechResult = (SpeechResult) recognizeResult;
String text = speechResult.getSpeech();
String languageIdentified = speechResult.getLanguageIdentified();
log.info("Recognition completed, text=" + text + ", context=" + event.getOperationContext());
log.info("Language Identified: " + languageIdentified);
if (speechResult.getSentimentAnalysisResult() != null) {
log.info("Sentiment: " + speechResult.getSentimentAnalysisResult().getSentiment());
}
} 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. См. статью "Создание ресурса Службы коммуникации Azure". Обратите внимание на строку подключения этого ресурса.
- Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
- Установите Node.js, вы можете установить его с официального веб-сайта.
Для функций ИИ
- Создайте и подключите средства Foundry к ресурсу Служб коммуникации Azure.
- Создайте настраиваемый поддомен для ресурса служб искусственного интеллекта Azure.
Технические характеристики
Для настройки функции Распознавания доступны следующие параметры:
| Параметр | Тип | Значение по умолчанию (если не указано) | Описание | Обязательный или необязательный |
|---|---|---|---|---|
Prompt (Для получения подробной информации см. Настройка голосовых подсказок для пользователей с помощью действия воспроизведения) |
ФайлИсточник, ТекстИсточник | Не установлено | Сообщение, которое будет воспроизводиться перед распознаванием входных данных. | Необязательно |
InterToneTimeout |
Интервал времени | 2 секунды Мин: 1 секунда Максимальное значение: 60 секунд |
Ограничение в секундах, которое Службы коммуникации Azure ожидают, пока абонент нажмет следующую цифру (время ожидания между цифрами). | Необязательно |
InitialSegmentationSilenceTimeoutInSeconds |
Целое число | 0,5 секунды | Как долго действие распознавания ожидает входных данных, прежде чем считать это тайм-аутом. Узнайте , как распознать речь. | Необязательно |
RecognizeInputsType |
Перечисление | dtmf | Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. |
Обязательное поле |
InitialSilenceTimeout |
Интервал времени | 5 секунд Мин: 0 секунд Макс: 300 секунд (DTMF) Макс: 20 секунд (варианты) Макс: 20 секунд (речь) |
Настройка времени ожидания молчания регулирует, сколько незвуковой аудиоинформации допускается перед фразой, прежде чем попытка распознавания завершается с результатом "без совпадения". Узнайте , как распознать речь. | Необязательно |
MaxTonesToCollect |
Целое число | Нет по умолчанию Мин: 1 |
Число цифр, которые разработчик ожидает в качестве входных данных от участника. | Обязательное поле |
StopTones |
IEnumeration<DtmfTone> | Не установлено | Участники могут нажать цифру, чтобы прервать пакетное событие DTMF. | Необязательно |
InterruptPrompt |
Булев | Истина | Если участник может прервать воспроизведение сообщения, нажав цифру. | Необязательно |
InterruptCallMediaOperation |
Булев | Истина | Если этот флаг задан, он прерывает текущую операцию носителя вызовов. Например, если звук воспроизводится, он прерывает операцию и инициирует распознавание. | Необязательно |
OperationContext |
Строка | Не установлено | Строка, которую разработчики могут передать во время выполнения действия, полезная для хранения разработчиками контекста о событиях, которые они получают. | Необязательно |
Phrases |
Строка | Не установлено | Список фраз, которые связываются с меткой. Слушание любой из этих фраз приводит к успешному распознаванию. | Обязательное поле |
Tone |
Строка | Не установлено | Тон для распознавания того, решит ли пользователь нажать число вместо использования речи. | Необязательно |
Label |
Строка | Не установлено | Ключевое значение для распознавания. | Обязательное поле |
Language |
Строка | Эн-юс | Язык, используемый для распознавания речи. | Необязательно |
EndSilenceTimeout |
Интервал времени | 0,5 секунды | Последняя пауза говорящего, используемая для обнаружения окончательного результата, создаваемого как речь. | Необязательно |
Примечание.
В ситуациях, когда DTMF и речь присутствуют в recognizeInputsType, действие распознавания применяется к первому полученному типу ввода. Например, если пользователь нажимает номер клавиатуры сначала, то действие распознавания считает его событием DTMF и продолжает прослушивать тоны DTMF. Если пользователь сначала говорит, то действие распознавания речи считает его событием распознавания речи и прослушивает входные данные голоса.
Создание приложения JavaScript
Создайте приложение JavaScript в каталоге проекта. Инициализировать новый проект Node.js с помощью следующей команды. При этом создается файл package.json для проекта, который управляет зависимостями проекта.
npm init -y
Установка пакета автоматизации вызовов Службы коммуникации Azure
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);
Примечание.
Если параметры не заданы, по возможности применяются значения по умолчанию.
Идентификация языка в режиме реального времени (предварительная версия)
Благодаря дополнительной идентификации языка в режиме реального времени разработчики могут автоматически обнаруживать языки, чтобы обеспечить естественное, человеческое взаимодействие и исключить выбор языка вручную конечными пользователями.
const textToPlay = "Hi, how can I help you today?";
const playSource: TextSource = {
text: textToPlay,
voiceName: "en-US-ElizabethNeural",
kind: "textSource"
};
const recognizeOptions: CallMediaRecognizeSpeechOptions = {
endSilenceTimeoutInSeconds: 30,
playPrompt: playSource,
operationContext: "speechContext",
kind: "callMediaRecognizeSpeechOptions",
// Enable Language Identification
speechLanguages: ["en-US", "hi-IN", "fr-FR"],
// 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);
Примечание.
Ограничения поддержки языка
При использовании API с речью Recognize в качестве входного типа:
- Можно указать до 10 языков с помощью
setSpeechLanguages(...). - Помните, что использование дополнительных языков может увеличить время, необходимое для получения
RecognizeCompletedсобытия из-за дополнительной обработки.
При использовании API с Recognize:
- Поддерживаются только до 4 языков .
- Указание более 4 языков в режиме выбора может привести к ошибкам или снижению производительности.
Анализ тональности (предварительная версия)
API Распознавания поддерживает анализ тональности при использовании входных данных речи. Отслеживайте эмоциональный тон бесед в режиме реального времени для поддержки взаимодействия клиентов и агентов и позволяют руководителям вмешиваться при необходимости. Это также может быть полезно для маршрутизации, персонализации или аналитики.
const textToPlay = "Hi, how can I help you today?";
const playSource: TextSource = {
text: textToPlay,
voiceName: "en-US-ElizabethNeural",
kind: "textSource"
};
const recognizeOptions: CallMediaRecognizeSpeechOptions = {
endSilenceTimeoutInSeconds: 30,
playPrompt: playSource,
operationContext: "speechContext",
kind: "callMediaRecognizeSpeechOptions",
// Enable Sentiment Analysis
enableSentimentAnalysis: true
};
await callAutomationClient.getCallConnection(callConnectionId)
.getCallMedia()
.startRecognizing(targetParticipant, recognizeOptions);
Получение обновлений событий распознавания
Разработчики могут подписаться на события RecognizeCompleted и RecognizeFailed на зарегистрированном обратном вызове веб-перехватчика. Используйте этот обратный вызов с бизнес-логикой в приложении, чтобы определить следующие шаги при возникновении одного из событий.
Пример того, как можно десериализовать событие RecognizeCompleted :
if (event.type === "Microsoft.Communication.RecognizeCompleted") {
console.log("Received RecognizeCompleted event");
const callConnectionId = eventData.callConnectionId;
if (eventData.recognitionType === "choices") {
const labelDetected = eventData.choiceResult.label;
console.log(`Detected label: ${labelDetected}`);
console.log("Choice Result:", JSON.stringify(eventData.choiceResult, null, 2));
console.log(`Language Identified: ${eventData.choiceResult.languageIdentified}`);
if (eventData.choiceResult?.sentimentAnalysisResult !== undefined) {
console.log(`Sentiment: ${eventData.choiceResult.sentimentAnalysisResult.sentiment}`);
}
}
if (eventData.recognitionType === "dtmf") {
const tones = eventData.dtmfResult.tones;
console.log(`DTMF Tones: ${tones}`);
console.log(`Current Context: ${eventData.operationContext}`);
}
if (eventData.recognitionType === "speech") {
const text = eventData.speechResult.speech;
console.log(`Recognition completed, text: ${text}, context: ${eventData.operationContext}`);
console.log(`Language Identified: ${eventData.speechResult.languageIdentified}`);
if (eventData.speechResult?.sentimentAnalysisResult !== undefined) {
console.log(`Sentiment: ${eventData.speechResult.sentimentAnalysisResult.sentiment}`);
}
}
}
Пример, как можно десериализовать событие 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. См. статью "Создание ресурса Службы коммуникации Azure". Обратите внимание на строку подключения этого ресурса.
- Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
- Установите Python из Python.org.
Для функций ИИ
- Создайте и подключите средства Foundry к ресурсу Служб коммуникации Azure.
- Создайте настраиваемый поддомен для ресурса служб искусственного интеллекта Azure.
Технические характеристики
Для настройки функции Распознавания доступны следующие параметры:
| Параметр | Тип | Значение по умолчанию (если не указано) | Описание | Обязательный или необязательный |
|---|---|---|---|---|
Prompt (Для получения подробной информации см. Настройка голосовых подсказок для пользователей с помощью действия воспроизведения) |
ФайлИсточник, ТекстИсточник | Не установлено | Сообщение, которое будет воспроизводиться перед распознаванием входных данных. | Необязательно |
InterToneTimeout |
Интервал времени | 2 секунды Мин: 1 секунда Максимальное значение: 60 секунд |
Ограничение в секундах, которое Службы коммуникации Azure ожидают, пока абонент нажмет следующую цифру (время ожидания между цифрами). | Необязательно |
InitialSegmentationSilenceTimeoutInSeconds |
Целое число | 0,5 секунды | Как долго действие распознавания ожидает входных данных, прежде чем считать это тайм-аутом. Узнайте , как распознать речь. | Необязательно |
RecognizeInputsType |
Перечисление | dtmf | Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. |
Обязательное поле |
InitialSilenceTimeout |
Интервал времени | 5 секунд Мин: 0 секунд Макс: 300 секунд (DTMF) Макс: 20 секунд (варианты) Макс: 20 секунд (речь) |
Настройка времени ожидания молчания регулирует, сколько незвуковой аудиоинформации допускается перед фразой, прежде чем попытка распознавания завершается с результатом "без совпадения". Узнайте , как распознать речь. | Необязательно |
MaxTonesToCollect |
Целое число | Нет по умолчанию Мин: 1 |
Число цифр, которые разработчик ожидает в качестве входных данных от участника. | Обязательное поле |
StopTones |
IEnumeration<DtmfTone> | Не установлено | Участники могут нажать цифру, чтобы прервать пакетное событие DTMF. | Необязательно |
InterruptPrompt |
Булев | Истина | Если участник может прервать воспроизведение сообщения, нажав цифру. | Необязательно |
InterruptCallMediaOperation |
Булев | Истина | Если этот флаг задан, он прерывает текущую операцию носителя вызовов. Например, если звук воспроизводится, он прерывает операцию и инициирует распознавание. | Необязательно |
OperationContext |
Строка | Не установлено | Строка, которую разработчики могут передать во время выполнения действия, полезная для хранения разработчиками контекста о событиях, которые они получают. | Необязательно |
Phrases |
Строка | Не установлено | Список фраз, которые связываются с меткой. Слушание любой из этих фраз приводит к успешному распознаванию. | Обязательное поле |
Tone |
Строка | Не установлено | Тон для распознавания того, решит ли пользователь нажать число вместо использования речи. | Необязательно |
Label |
Строка | Не установлено | Ключевое значение для распознавания. | Обязательное поле |
Language |
Строка | Эн-юс | Язык, используемый для распознавания речи. | Необязательно |
EndSilenceTimeout |
Интервал времени | 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
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")
Примечание.
Если параметры не заданы, по возможности применяются значения по умолчанию.
Идентификация языка в режиме реального времени (предварительная версия)
Благодаря дополнительной идентификации языка в режиме реального времени разработчики могут автоматически обнаруживать языки, чтобы обеспечить естественное, человеческое взаимодействие и исключить выбор языка вручную конечными пользователями.
text_to_play = "Hi, how can I help you today?"
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
connection_client = call_automation_client.get_call_connection(call_connection_id)
recognize_result = await connection_client.start_recognizing_media(
input_type=RecognizeInputType.SPEECH,
target_participant=PhoneNumberIdentifier(caller_id),
end_silence_timeout=15,
play_prompt=play_source,
operation_context="OpenQuestionSpeech",
# Enable language identification
speech_language=["en-US", "es-ES", "hi-IN"],
# 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"
)
Примечание.
Ограничения поддержки языка
При использовании API с речью Recognize в качестве входного типа:
- Можно указать до 10 языков с помощью
setSpeechLanguages(...). - Помните, что использование дополнительных языков может увеличить время, необходимое для получения
RecognizeCompletedсобытия из-за дополнительной обработки.
При использовании API с Recognize:
- Поддерживаются только до 4 языков .
- Указание более 4 языков в режиме выбора может привести к ошибкам или снижению производительности.
Анализ тональности (предварительная версия)
API Распознавания поддерживает анализ тональности при использовании входных данных речи. Отслеживайте эмоциональный тон бесед в режиме реального времени для поддержки взаимодействия клиентов и агентов и позволяют руководителям вмешиваться при необходимости. Это также может быть полезно для маршрутизации, персонализации или аналитики.
text_to_play = "Hi, how can I help you today?"
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
connection_client = call_automation_client.get_call_connection(call_connection_id)
recognize_result = await connection_client.start_recognizing_media(
input_type=RecognizeInputType.SPEECH,
target_participant=PhoneNumberIdentifier(caller_id),
end_silence_timeout=15,
play_prompt=play_source,
operation_context="OpenQuestionSpeech",
# Enable sentiment analysis
IsSentimentAnalysisEnabled = true,
# 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"
)
Получение обновлений событий распознавания
Разработчики могут подписаться на события RecognizeCompleted и RecognizeFailed на зарегистрированном обратном вызове веб-перехватчика. Используйте этот обратный вызов с бизнес-логикой в приложении, чтобы определить следующие шаги при возникновении одного из событий.
Пример того, как можно десериализовать событие RecognizeCompleted :
if event.type == "Microsoft.Communication.RecognizeCompleted":
print(f"Received RecognizeCompleted event for connection id: {call_connection_id}")
recognition_type = event.data.get("recognitionType")
if recognition_type == "dtmf":
tones = event.data["dtmfResult"]["tones"]
context = event.data["operationContext"]
print(f"Recognition completed, tones={tones}, context={context}")
elif recognition_type == "choices":
choice_result = event.data["choiceResult"]
label_detected = choice_result["label"]
phrase_detected = choice_result["recognizedPhrase"]
language_identified = choice_result.get("languageIdentified")
sentiment = choice_result.get("sentimentAnalysisResult", {}).get("sentiment")
print(f"Recognition completed, labelDetected={label_detected}, phraseDetected={phrase_detected}, context={event.data['operationContext']}")
print(f"Language Identified: {language_identified}")
print(f"Sentiment: {sentiment}")
elif recognition_type == "speech":
speech_result = event.data["speechResult"]
text = speech_result["speech"]
language_identified = speech_result.get("languageIdentified")
sentiment = speech_result.get("sentimentAnalysisResult", {}).get("sentiment")
print(f"Recognition completed, text={text}, context={event.data['operationContext']}")
print(f"Language Identified: {language_identified}")
print(f"Sentiment: {sentiment}")
else:
print(f"Recognition completed: data={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 AI запрещен, бесплатная подписка, использованная для запроса, исчерпала квоту. |
RecognizeFailed |
429 | 8565 | Сбой действия, запросы превысили количество разрешенных одновременных запросов для подписки на службы искусственного интеллекта Azure. |
RecognizeFailed |
408 | 8565 | Действие не выполнено: время ожидания запроса к службам ИИ Azure истекло. |
RecognizeFailed |
500 | 8511 | Не удалось выполнить действие, произошла ошибка при попытке воспроизвести подсказку. |
RecognizeFailed |
500 | 8512 | Неизвестная внутренняя ошибка сервера. |
Известные ограничения
- In-band DTMF не поддерживается. Вместо этого используйте RFC 2833 DTMF.
- Подсказки для преобразования текста в речь поддерживают максимум 4 000 символов. Если ваш запрос превышает это ограничение, мы рекомендуем использовать SSML для работы с функциями преобразования текста в речь.
- Входные данные речи для записей записываются для вызовов 1:1, но не записываются в групповых вызовах при включении записи.
- Увеличение квоты службы распознавания речи можно запросить, если превышено ограничение квоты. Выполните описанные здесь действия, чтобы запросить увеличение.
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.
Следующие шаги
- Дополнительные сведения о сборе входных данных пользователей
- Узнайте больше о воспроизведении звука в вызове
- Дополнительные сведения об автоматизации вызовов