Поделиться через


Сбор входных данных пользователей с помощью действия "Распознать"

Это руководство поможет вам приступить к распознаванию входных данных DTMF, предоставляемых участниками с помощью пакета SDK для автоматизации вызовов Службы коммуникации Azure.

Предварительные условия

  • Учетная запись Azure с активной подпиской, подробнее см. в статье "Создайте учетную запись бесплатно".
  • Ресурс служб связи Azure. См. статью "Создание ресурса Службы коммуникации Azure". Обратите внимание на строку подключения этого ресурса.
  • Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
  • Последняя библиотека .NET для вашей операционной системы.
  • Последняя версия пакета NuGet.

Для функций ИИ

Технические характеристики

Для настройки функции Распознавания доступны следующие параметры:

Параметр Тип Значение по умолчанию (если не указано) Описание Обязательный или необязательный
Prompt

(Для получения подробной информации см. Настройка голосовых подсказок для пользователей с помощью действия воспроизведения)
ФайлИсточник, ТекстИсточник Не установлено Сообщение, которое будет воспроизводиться перед распознаванием входных данных. Необязательно
InterToneTimeout TimeSpan 2 секунды

Мин: 1 секунда
Максимальное значение: 60 секунд
Ограничение в секундах, которое Службы коммуникации Azure ожидают, пока абонент нажмет следующую цифру (время ожидания между цифрами). Необязательно
InitialSegmentationSilenceTimeoutInSeconds Целое число 0,5 секунды Как долго действие распознавания ожидает входных данных, прежде чем считать это тайм-аутом. Узнайте , как распознать речь. Необязательно
RecognizeInputsType Перечисление dtmf Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. Обязательное поле
InitialSilenceTimeout TimeSpan 5 секунд

Мин: 0 секунд
Макс: 300 секунд (DTMF)
Макс: 20 секунд (варианты)
Макс: 20 секунд (речь)
Настройка времени ожидания молчания регулирует, сколько незвуковой аудиоинформации допускается перед фразой, прежде чем попытка распознавания завершается с результатом "без совпадения". Узнайте , как распознать речь. Необязательно
MaxTonesToCollect Целое Нет по умолчанию

Мин: 1
Число цифр, которые разработчик ожидает в качестве входных данных от участника. Обязательное поле
StopTones IEnumeration<DtmfTone> Не установлено Участники могут нажать цифру, чтобы прервать пакетное событие DTMF. Необязательно
InterruptPrompt Bool Истина Если участник может прервать воспроизведение сообщения, нажав цифру. Необязательно
InterruptCallMediaOperation Булев Истина Если этот флаг задан, он прерывает текущую операцию носителя вызовов. Например, если звук воспроизводится, он прерывает операцию и инициирует распознавание. Необязательно
OperationContext Строка Не установлено Строка, которую разработчики могут передать во время выполнения действия, полезная для хранения разработчиками контекста о событиях, которые они получают. Необязательно
Phrases Строка Не установлено Список фраз, которые связываются с меткой. Слушание любой из этих фраз приводит к успешному распознаванию. Обязательное поле
Tone Строка Не установлено Тон для распознавания того, решит ли пользователь нажать число вместо использования речи. Необязательно
Label Строка Не установлено Ключевое значение для распознавания. Обязательное поле
Language Строка (в программировании) Эн-юс Язык, используемый для распознавания речи. Необязательно
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 successfully, 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 successfully, labelDetected={labelDetected}, phraseDetected={phraseDetected}", labelDetected, phraseDetected);
            break; 
        case SpeechResult speechResult: 
            // Take action for Recognition through Choices 
            var text = speechResult.Speech; 
            logger.LogInformation("Recognize completed successfully, text={text}", text); 
            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);
        }

Предварительные условия

Для функций ИИ

Технические характеристики

Для настройки функции Распознавания доступны следующие параметры:

Параметр Тип Значение по умолчанию (если не указано) Описание Обязательный или необязательный
Prompt

(См. Настройка голосовых запросов для пользователей с помощью действия "Воспроизведение" для получения дополнительных сведений)
Источник файла, Источник текста Не установлено Сообщение, которое будет воспроизводиться перед распознаванием входных данных. Необязательно
InterToneTimeout TimeSpan 2 секунды

Мин: 1 секунда
Максимальное значение: 60 секунд
Ограничение в секундах, которые Службы коммуникации Azure ожидают, пока вызывающий объект не нажмет другую цифру (время ожидания между набираемыми цифрами). Необязательно
InitialSegmentationSilenceTimeoutInSeconds Целое 0,5 секунды Как долго действие распознавания ожидает входных данных перед тем, как будет считаться превышение времени ожидания. Узнайте , как распознать речь. Необязательно
RecognizeInputsType Перечисление dtmf Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. Обязательное поле
InitialSilenceTimeout TimeSpan 5 секунд

Мин: 0 секунд
Макс: 300 секунд (DTMF)
Макс: 20 секунд (варианты)
Макс: 20 секунд (речь)
Начальное время ожидания молчания определяет, какой объем неслышественного звука допускается перед фразой, прежде чем попытка распознавания заканчивается без совпадения. Узнайте , как распознать речь. Необязательно
MaxTonesToCollect Целое Нет по умолчанию

Мин: 1
Число цифр, которые разработчик ожидает в качестве входных данных от участника. Обязательное поле
StopTones IEnumeration<DtmfTone> Не установлено Участники могут нажать цифру, чтобы выйти из DTMF-события. Необязательно
InterruptPrompt Bool Истина Если участник может прервать воспроизведение сообщения, нажав цифру. Необязательно
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 содержит источник теста.

Обратите внимание, что шаг создал каталог с тем же именем, что и 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 (система автоматизации вызовов 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)
  .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()); 
}

Пререквизиты

Для функций ИИ

Технические характеристики

Для настройки функции Распознавания доступны следующие параметры:

Параметр Тип Значение по умолчанию (если не указано) Описание Обязательный или факультативный
Prompt

(Дополнительные сведения см. в разделе Настройка голосовых запросов для пользователей с помощью действия "Воспроизведение")
FileSource, TextSource Не установлено Сообщение, которое будет воспроизводиться перед распознаванием входных данных. Необязательно
InterToneTimeout TimeSpan 2 секунды

Мин: 1 секунда
Максимальное значение: 60 секунд
Ограничение в секундах, в течение которых Службы связи Azure ожидают, пока абонент нажмёт другую цифру (интервал между нажатиями цифр). Необязательно
InitialSegmentationSilenceTimeoutInSeconds Целое число 0,5 секунды Как долго действие ждет входных данных, прежде чем будет считаться тайм-аутом. Узнайте , как распознать речь. Необязательно
RecognizeInputsType Перечисление dtmf Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. Обязательное поле
InitialSilenceTimeout TimeSpan 5 секунд

Мин: 0 секунд
Макс: 300 секунд (DTMF)
Макс: 20 секунд (варианты)
Макс: 20 секунд (речь)
Таймаут начальной тишины регулирует, сколько неголосового аудио допускается до того, как попытка распознавания завершается с результатом "нет совпадения". Узнайте , как распознать речь. Необязательно
MaxTonesToCollect Целое число Нет по умолчанию

Мин: 1
Число цифр, которые разработчик ожидает в качестве входных данных от участника. Обязательное поле
StopTones IEnumeration<DtmfTone> Не установлено Цифра, которую участники могут нажать, чтобы выйти из серии событий DTMF. Необязательно
InterruptPrompt Булев Истина Если участник может прервать проигрывание сообщения, нажав цифру. Необязательно
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

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». См. статью "Создание ресурса Службы коммуникации Azure". Обратите внимание на строку подключения для этого ресурса.
  • Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
  • Установите Python из Python.org.

Для функций искусственного интеллекта

Технические характеристики

Для настройки функции Распознавания доступны следующие параметры:

Параметр Тип Значение по умолчанию (если не указано) Описание Обязательный или необязательный
Prompt

(Дополнительные сведения см. в разделе Настройка голосовых вопросов для пользователей с помощью действия Воспроизведение)
Источник файла, Источник текста Не установлено Сообщение, которое будет воспроизводиться перед распознаванием входных данных. Необязательно
InterToneTimeout TimeSpan 2 секунды

Мин: 1 секунда
Максимальное значение: 60 секунд
Предел времени в секундах, в течение которых Службы коммуникации Azure ожидают, пока вызывающий абонент нажмет другую цифру (время ожидания между цифрами). Необязательно
InitialSegmentationSilenceTimeoutInSeconds Целое число 0,5 секунды Как долго одно действие ожидает ввода, прежде чем признать это истечением времени ожидания. Узнайте , как распознать речь. Необязательно
RecognizeInputsType Перечисление dtmf Тип распознаваемых входных данных. Параметры: dtmf, choicesи speechspeechordtmf. Обязательное поле
InitialSilenceTimeout TimeSpan 5 секунд

Мин: 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

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 AI запрещен, бесплатная подписка, использованная для запроса, исчерпала квоту.
RecognizeFailed 429 8565 Сбой действия, запросы превысили количество разрешенных одновременных запросов для подписки на службы искусственного интеллекта Azure.
RecognizeFailed 408 8565 Действие не выполнено: время ожидания запроса к службам ИИ Azure истекло.
RecognizeFailed 500 8511 Сбой действия: не удалось воспроизвести подсказку.
RecognizeFailed 500 8512 Неизвестная внутренняя ошибка сервера.

Известные ограничения

  • In-band DTMF не поддерживается. Вместо этого используйте RFC 2833 DTMF.
  • Текстовые подсказки для преобразования текста в речь поддерживают не более 400 символов, если ваш запрос больше, чем это, мы рекомендуем использовать SSML для действий воспроизведения с текстом в речь.
  • В сценариях, когда превышено ограничение квоты службы "Речь", можно запросить увеличение этого ограничения, выполнив действия, описанные в квотах и ограничениях служб распознавания речи.

Очистка ресурсов

Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. См. сведения об очистке ресурсов.

Следующие шаги