Настройка голосовых запросов для пользователей с помощью действия Воспроизведения

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

Необходимые компоненты

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

Создание нового приложения C#

В окне консоли операционной системы используйте dotnet команду для создания нового веб-приложения.

dotnet new web -n MyApplication

Установка пакета NuGet

Пакет NuGet можно получить отсюда, если вы еще этого не сделали.

(Необязательно) Подготовьте звуковой файл, если вы хотите использовать звуковые файлы для воспроизведения запросов

Создайте звуковой файл, если у вас еще нет его, чтобы использовать для воспроизведения запросов и сообщений участникам. Звуковой файл должен размещаться в расположении, доступном для Службы коммуникации Azure с поддержкой проверки подлинности. Сохраните копию URL-адреса, доступного для использования при запросе воспроизведения звукового файла. Службы коммуникации Azure поддерживает оба типа файловMP3-файлы с ID3V2TAG и WAV-файлами, моно 16-разрядная pcM с частотой выборки 16 КГц. .

Вы можете протестировать создание собственного звукового файла с помощью средства синтеза речи с помощью средства создания аудиоконтентов.

(Необязательно) Подключение Azure Cognitive Service в службу коммуникации Azure

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

Установка вызова

К этому моменту вы должны ознакомиться с начальными звонками, если вам нужно узнать больше о вызове, следуйте нашему краткому руководству. Вы также можете использовать фрагмент кода, предоставленный здесь, чтобы понять, как ответить на вызов.

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); 

Воспроизведение звука

После установки вызова существует несколько вариантов того, как вы можете воспроизвести звук. Вы можете воспроизводить звук для участника, присоединенного к вызову или воспроизведения звука всем участникам звонка.

Источник воспроизведения — звуковой файл

Чтобы воспроизвести звук для участников с помощью звуковых файлов, необходимо убедиться, что звуковой файл является WAV-файлом, моно и 16 КГц. Чтобы воспроизвести звуковые файлы, необходимо убедиться, что вы предоставляете Службы коммуникации Azure URI для файла, размещенного в расположении, где Службы коммуникации Azure может получить к нему доступ. Тип FileSource в нашем пакете SDK можно использовать для указания звуковых файлов для действия воспроизведения.

var playSource = new FileSource(new Uri(audioUri));

Источник воспроизведения — преобразование текста в речь

Чтобы воспроизвести звук с помощью служб ИИ Azure, необходимо указать текст, который вы хотите воспроизвести, а также SourceLocale и VoiceKind или VoiceName, которые вы хотите использовать. Мы поддерживаем все голосовые имена, поддерживаемые службами ИИ Azure, полный список здесь.

String textToPlay = "Welcome to Contoso";

// Provide SourceLocale and VoiceKind to select an appropriate voice. 
var playSource = new TextSource(textToPlay, "en-US", VoiceKind.Female); 
String textToPlay = "Welcome to Contoso"; 
 
// Provide VoiceName to select a specific voice. 
var playSource = new TextSource(textToPlay, "en-US-ElizabethNeural");

Источник воспроизведения — преобразование текста в речь с помощью SSML

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

String ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello World!</voice></speak>"; 

var playSource = new SsmlSource(ssmlToPlay);

Пользовательские модели голосовой связи

Если вы хотите улучшить запросы больше и включить пользовательские модели голосовой связи, то теперь действие воспроизведения "Текст в речь" теперь поддерживает эти пользовательские голоса. Это отличный вариант, если вы пытаетесь предоставить клиентам более локальный, персонализированный опыт или иметь ситуации, когда модели по умолчанию могут не охватывать слова и акценты, которые вы пытаетесь пропустить. Дополнительные сведения о создании и развертывании пользовательских моделей см. в этом руководстве.

Пользовательские голосовые имена регулярных текстовых эксmaple

String textToPlay = "Welcome to Contoso"; 
 
// Provide VoiceName and CustomVoiceEndpointId to select custom voice. 
var playSource = new TextSource(textToPlay)
    {
        VoiceName = "YourCustomVoiceName",
        CustomVoiceEndpointId = "YourCustomEndpointId"
    };

Пример SSML пользовательских имен голосовых имен


var playSource = new SsmlSource(ssmlToPlay,"YourCustomEndpointId");

Когда вы решите, какой playSource вы хотите использовать для воспроизведения звука, вы можете выбрать, хотите ли вы воспроизвести его для определенного участника или для всех участников.

Воспроизведение звука для всех участников

В этом сценарии звук воспроизводится всем участникам звонка.

var playResponse = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayToAllAsync(playSource); 

Воспроизведение звука для определенного участника

В этом сценарии звук воспроизводится конкретному участнику.

var playTo = new List<CommunicationIdentifier> { targetParticipant }; 
var playResponse = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayAsync(playSource, playTo); 

Воспроизведение звука в цикле

Вы можете использовать параметр цикла для воспроизведения музыки, которая циклирует, пока приложение не будет готово принять вызывающий объект. Или выполните вызывающий объект на следующем логическом шаге на основе бизнес-логики приложений.

var playOptions = new PlayToAllOptions(playSource) 
{ 
    Loop = true 
}; 
var playResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayToAllAsync(playOptions); 

Улучшение воспроизведения с помощью кэширования аудиофайлов

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

Примечание.

Кэширование звуковых файлов не подходит для динамических запросов. При изменении URL-адреса, предоставленного на Службы коммуникации Azure, он не обновляет кэшированный URL-адрес сразу. Обновление будет происходить после истечения срока действия существующего кэша.

var playTo = new List<CommunicationIdentifier> { targetParticipant }; 
var playSource = new FileSource(new Uri(audioUri)) 
{ 
    PlaySourceCacheId = "<playSourceId>" 
}; 
var playResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .PlayAsync(playSource, playTo); 

Обработка обновлений событий действия воспроизведения

Приложение получает обновления событий жизненного цикла действий по URL-адресу обратного вызова, предоставленному службе автоматизации вызовов во время ответа на звонок. Пример успешного обновления события воспроизведения.

Пример десериализации события PlayCompleted :

if (acsEvent is PlayCompleted playCompleted) 
{ 
    logger.LogInformation("Play completed successfully, context={context}", playCompleted.OperationContext); 
} 

Пример десериализации события PlayFailed :

if (acsEvent is PlayFailed playFailed) 
{ 
    if (MediaEventReasonCode.PlayDownloadFailed.Equals(playFailed.ReasonCode)) 
    { 
        logger.LogInformation("Play failed: download failed, context={context}", playFailed.OperationContext); 
    } 
    else if (MediaEventReasonCode.PlayInvalidFileFormat.Equals(playFailed.ReasonCode)) 
    { 
        logger.LogInformation("Play failed: invalid file format, context={context}", playFailed.OperationContext); 
    } 
    else 
    { 
        logger.LogInformation("Play failed, result={result}, context={context}", playFailed.ResultInformation?.Message, playFailed.OperationContext); 
    } 
} 

Дополнительные сведения о других поддерживаемых событиях см. в документе обзора службы автоматизации вызовов.

Отмена действия воспроизведения

Отмена всех операций мультимедиа, все ожидающие операции мультимедиа отменяются. Это действие также отменяет другие действия воспроизведения в очереди.

var cancelResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .CancelAllMediaOperationsAsync(); 

Пример десериализации события PlayCanceled :

if (acsEvent is PlayCanceled playCanceled) 
{ 
    logger.LogInformation("Play canceled, context={context}", playCanceled.OperationContext); 
} 

Необходимые компоненты

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

Создание нового приложения Java

В окне терминала или командной строки перейдите в каталог, в котором вы хотите создать приложение Java. Выполните команду, показанную здесь, чтобы создать проект Java из шаблона maven-archetype-quickstart.

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

Предыдущая команда создает каталог с тем же именем, что artifactId и аргумент. В этом каталоге src/main/java каталог содержит исходный код проекта, src/test/java каталог содержит источник теста.

Вы заметите, что шаг "generate" создал каталог с таким же именем, как артефактId. В этом каталоге 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

пакет SDK службы автоматизации вызовов Службы коммуникации Azure извлекается из веб-канала разработки для Azure SDK.

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

(Необязательно) Подготовьте звуковой файл, если вы хотите использовать звуковые файлы для воспроизведения запросов

Создайте звуковой файл, если у вас еще нет его, чтобы использовать для воспроизведения запросов и сообщений участникам. Звуковой файл должен размещаться в расположении, доступном для Службы коммуникации Azure с поддержкой проверки подлинности. Сохраните копию URL-адреса, доступного для использования при запросе воспроизведения звукового файла. Службы коммуникации Azure поддерживает оба типа файловMP3-файлы с ID3V2TAG и WAV-файлами, моно 16-разрядная pcM с частотой выборки 16 КГц. .

Вы можете протестировать создание собственного звукового файла с помощью средства синтеза речи с помощью средства создания аудиоконтентов.

(Необязательно) Подключение Azure Cognitive Service в службу коммуникации Azure

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

Обновление App.java с помощью кода

В редакторе откройте файл App.java и обновите его с помощью кода, предоставленного в разделе обновления app.java с помощью раздела кода .

Установка вызова

К этому моменту вы должны ознакомиться с начальными звонками, если вам нужно узнать больше о вызове, следуйте нашему краткому руководству. Вы также можете использовать фрагмент кода, предоставленный здесь, чтобы понять, как ответить на вызов.

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(); 

Воспроизведение звука

После установки вызова существует несколько вариантов того, как вы можете воспроизвести звук. Вы можете воспроизводить звук для участника, присоединенного к вызову или воспроизведения звука всем участникам звонка.

Источник воспроизведения — звуковой файл

Чтобы воспроизвести звук для участников с помощью звуковых файлов, необходимо убедиться, что звуковой файл является WAV-файлом, моно и 16 КГц. Чтобы воспроизвести звуковые файлы, необходимо убедиться, что вы предоставляете Службы коммуникации Azure URI для файла, размещенного в расположении, где Службы коммуникации Azure может получить к нему доступ. Тип FileSource в нашем пакете SDK можно использовать для указания звуковых файлов для действия воспроизведения.

var playSource = new FileSource(new Uri(audioUri));

Источник воспроизведения — преобразование текста в речь

Чтобы воспроизвести звук с помощью служб ИИ Azure, необходимо указать текст, который вы хотите воспроизвести, а также SourceLocale и VoiceKind или VoiceName, которые вы хотите использовать. Мы поддерживаем все голосовые имена, поддерживаемые службами ИИ Azure, полный список здесь.

// Provide SourceLocale and VoiceKind to select an appropriate voice.
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setSourceLocale("en-US") 
    .setVoiceKind(VoiceKind.FEMALE); 
// Provide VoiceName to select a specific voice.
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setVoiceName("en-US-ElizabethNeural"); 

Источник воспроизведения — SSML для преобразования текста в речь

String ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello World!</voice></speak>"; 
var playSource = new SsmlSource() 
    .setSsmlText(ssmlToPlay);

Пользовательские модели голосовой связи

Если вы хотите улучшить запросы больше и включить пользовательские модели голосовой связи, то теперь действие воспроизведения "Текст в речь" теперь поддерживает эти пользовательские голоса. Это отличный вариант, если вы пытаетесь предоставить клиентам более локальный, персонализированный опыт или иметь ситуации, когда модели по умолчанию могут не охватывать слова и акценты, которые вы пытаетесь пропустить. Дополнительные сведения о создании и развертывании пользовательских моделей см. в этом руководстве.

Пользовательские голосовые имена регулярных текстовых эксmaple

// Provide VoiceName and  to select a specific voice.
var playSource = new TextSource() 
    .setText(textToPlay) 
    .setCustomVoiceName("YourCustomVoiceName")
    .setCustomVoiceEndpointId("YourCustomEndpointId");

Пример SSML пользовательских имен голосовых имен

String ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"YourCustomVoiceName\">Hello World!</voice></speak>"; 
var playSource = new SsmlSource() 
    .setSsmlText(ssmlToPlay)
    .setCustomVoiceEndpointId("YourCustomEndpointId");

Когда вы решите, какой playSource вы хотите использовать для воспроизведения звука, вы можете выбрать, хотите ли вы воспроизвести его для определенного участника или для всех участников.

Воспроизведение звука для всех участников

В этом сценарии звук воспроизводится всем участникам звонка.

var playOptions = new PlayToAllOptions(playSource); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playToAllWithResponse(playOptions) 
    .block(); 
log.info("Play result: " + playResponse.getStatusCode()); 

Воспроизведение звука для определенного участника

В этом сценарии звук воспроизводится конкретному участнику.

var playTo = Arrays.asList(targetParticipant); 
var playOptions = new PlayOptions(playSource, playTo); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playWithResponse(playOptions) 
    .block(); 

Воспроизведение звука в цикле

Вы можете использовать параметр цикла для воспроизведения музыки, которая циклирует, пока приложение не будет готово принять вызывающий объект. Или выполните вызывающий объект на следующем логическом шаге на основе бизнес-логики приложений.

var playOptions = new PlayToAllOptions(playSource) 
    .setLoop(true); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playToAllWithResponse(playOptions) 
    .block(); 

Улучшение воспроизведения с помощью кэширования аудиофайлов

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

Примечание.

Кэширование звуковых файлов не подходит для динамических запросов. При изменении URL-адреса, предоставленного на Службы коммуникации Azure, он не обновляет кэшированный URL-адрес сразу. Обновление будет происходить после истечения срока действия существующего кэша.

var playTo = Arrays.asList(targetParticipant); 
var playSource = new FileSource() 
    .setUrl(audioUri) \
    .setPlaySourceCacheId("<playSourceId>"); 
var playOptions = new PlayOptions(playSource, playTo); 
var playResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .playWithResponse(playOptions) 
    .block(); 

Обработка обновлений событий действия воспроизведения

Приложение получает обновления событий жизненного цикла действий по URL-адресу обратного вызова, предоставленному службе автоматизации вызовов во время ответа на звонок. Пример успешного обновления события воспроизведения.

Пример десериализации события PlayCompleted :

if (acsEvent instanceof PlayCompleted) { 
    PlayCompleted event = (PlayCompleted) acsEvent; 
    log.info("Play completed, context=" + event.getOperationContext()); 
} 

Пример десериализации события PlayFailed :

if (acsEvent instanceof PlayFailed) { 
    PlayFailed event = (PlayFailed) acsEvent; 
    if (ReasonCode.Play.DOWNLOAD_FAILED.equals(event.getReasonCode())) { 
        log.info("Play failed: download failed, context=" + event.getOperationContext()); 
    } else if (ReasonCode.Play.INVALID_FILE_FORMAT.equals(event.getReasonCode())) { 
        log.info("Play failed: invalid file format, context=" + event.getOperationContext()); 
    } else { 
        log.info("Play failed, result=" + event.getResultInformation().getMessage() + ", context=" + event.getOperationContext()); 
    } 
} 

Дополнительные сведения о других поддерживаемых событиях см. в документе обзора службы автоматизации вызовов.

Отмена действия воспроизведения

Отмена всех операций мультимедиа, все ожидающие операции мультимедиа отменяются. Это действие также отменяет другие действия воспроизведения в очереди.

var cancelResponse = callAutomationClient.getCallConnectionAsync(callConnectionId) 
    .getCallMediaAsync() 
    .cancelAllMediaOperationsWithResponse() 
    .block(); 
log.info("Cancel result: " + cancelResponse.getStatusCode()); 

Пример десериализации события PlayCanceled :

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

Необходимые компоненты

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

Создание приложения JavaScript

Создайте приложение JavaScript в каталоге проекта. Инициализировать новый проект Node.js с помощью следующей команды. При этом создается файл package.json для проекта, который используется для управления зависимостями проекта.

npm init -y

Установка пакета автоматизации вызовов Службы коммуникации Azure

npm install @azure/communication-call-automation

Создайте файл JavaScript в каталоге проекта, например присвойте ему имя app.js. Код JavaScript записывается в этот файл. Запустите приложение с помощью Node.js с помощью следующей команды. Этот код выполняет написанный код JavaScript.

node app.js

(Необязательно) Подготовьте звуковой файл, если вы хотите использовать звуковые файлы для воспроизведения запросов

Создайте звуковой файл, если у вас еще нет его, чтобы использовать для воспроизведения запросов и сообщений участникам. Звуковой файл должен размещаться в расположении, доступном для Службы коммуникации Azure с поддержкой проверки подлинности. Сохраните копию URL-адреса, доступного для использования при запросе воспроизведения звукового файла. Службы коммуникации Azure поддерживает оба типа файловMP3-файлы с ID3V2TAG и WAV-файлами, моно 16-разрядная pcM с частотой выборки 16 КГц.

Вы можете протестировать создание собственного звукового файла с помощью средства синтеза речи с помощью средства создания аудиоконтентов.

(Необязательно) Подключение Azure Cognitive Service в службу коммуникации Azure

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

Установка вызова

К этому моменту вы должны ознакомиться с начальными звонками, если вам нужно узнать больше о вызове, следуйте нашему краткому руководству. Вы также можете использовать фрагмент кода, предоставленный здесь, чтобы понять, как ответить на вызов.

const callIntelligenceOptions: CallIntelligenceOptions = { "<https://sample-callback-uri>" }; 
        const answerCallOptions: AnswerCallOptions = { callIntelligenceOptions: callIntelligenceOptions };
  
await acsClient.answerCall("<Incoming call context>", "<https://sample-callback-uri>", answerCallOptions); 

Воспроизведение звука

После установки вызова существует несколько вариантов того, как вы можете воспроизвести звук. Вы можете воспроизводить звук для участника, присоединенного к вызову или воспроизведения звука всем участникам звонка.

Источник воспроизведения — звуковой файл

Чтобы воспроизвести звук для участников с помощью звуковых файлов, необходимо убедиться, что звуковой файл является WAV-файлом, моно и 16 КГц. Чтобы воспроизвести звуковые файлы, необходимо убедиться, что вы предоставляете Службы коммуникации Azure URI для файла, размещенного в расположении, где Службы коммуникации Azure может получить к нему доступ. Тип FileSource в нашем пакете SDK можно использовать для указания звуковых файлов для действия воспроизведения.

const playSource: FileSource = { url: audioUri, kind: "fileSource" };

Источник воспроизведения — преобразование текста в речь

Чтобы воспроизвести звук с помощью служб ИИ Azure, необходимо указать текст, который вы хотите воспроизвести, а также SourceLocale и VoiceKind или VoiceName, которые вы хотите использовать. Мы поддерживаем все голосовые имена, поддерживаемые службами ИИ Azure, полный список здесь.

const textToPlay = "Welcome to Contoso"; 
// Provide SourceLocale and VoiceKind to select an appropriate voice. 
const playSource: TextSource = { text: textToPlay, sourceLocale: "en-US", voiceKind: VoiceKind.Female, kind: "textSource" }; 
const textToPlay = "Welcome to Contoso"; 
// Provide VoiceName to select a specific voice. 
const playSource: TextSource = { text: textToPlay, voiceName: "en-US-ElizabethNeural", kind: "textSource" }; 

Источник воспроизведения — преобразование текста в речь с помощью SSML

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

const ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello World!</voice></speak>"; 
const playSource: SsmlSource = { ssmlText: ssmlToPlay, kind: "ssmlSource" }; 

Пользовательские модели голосовой связи

Если вы хотите улучшить запросы больше и включить пользовательские модели голосовой связи, то теперь действие воспроизведения "Текст в речь" теперь поддерживает эти пользовательские голоса. Это отличный вариант, если вы пытаетесь предоставить клиентам более локальный, персонализированный опыт или иметь ситуации, когда модели по умолчанию могут не охватывать слова и акценты, которые вы пытаетесь пропустить. Дополнительные сведения о создании и развертывании пользовательских моделей см. в этом руководстве.

Пользовательские голосовые имена регулярных текстовых эксmaple

const textToPlay = "Welcome to Contoso";
// Provide VoiceName and CustomVoiceEndpointID to play your custom voice
const playSource: TextSource = { text: textToPlay, voiceName: "YourCustomVoiceName", customVoiceEndpointId: "YourCustomEndpointId"}

Пример SSML пользовательских имен голосовых имен

const ssmlToPlay = "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" xml:lang=\"en-US\"><voice name=\"YourCustomVoiceName\">Hello World!</voice></speak>"; 
const playSource: SsmlSource = { ssmlText: ssmlToPlay, kind: "ssmlSource", customVoiceEndpointId: "YourCustomEndpointId"}; 

Когда вы решите, какой playSource вы хотите использовать для воспроизведения звука, вы можете выбрать, хотите ли вы воспроизвести его для определенного участника или для всех участников.

Воспроизведение звука — все участники

В этом сценарии звук воспроизводится всем участникам звонка.

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .playToAll([ playSource ]);

Воспроизведение звука — конкретный участник

В этом сценарии звук воспроизводится конкретному участнику.

await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .play([ playSource ], [ targetParticipant ]); 

Воспроизведение звука в цикле

Вы можете использовать параметр цикла для воспроизведения музыки, которая циклирует, пока приложение не будет готово принять вызывающий объект. Или выполните вызывающий объект на следующем логическом шаге на основе бизнес-логики приложений.

const playOptions: PlayOptions = { loop: true }; 
await callAutomationClient.getCallConnection(callConnectionId) 
    .getCallMedia() 
    .playToAll([ playSource ], playOptions); 

Улучшение воспроизведения с помощью кэширования аудиофайлов

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

Примечание.

Кэширование звуковых файлов не подходит для динамических запросов. При изменении URL-адреса, предоставленного на Службы коммуникации Azure, он не обновляет кэшированный URL-адрес сразу. Обновление будет происходить после истечения срока действия существующего кэша.

const playSource: FileSource = { url: audioUri, playsourcacheid: "<playSourceId>", kind: "fileSource" }; 
await callAutomationClient.getCallConnection(callConnectionId) 
.getCallMedia() 
.play([ playSource ], [ targetParticipant ]); 

Обработка обновлений событий действия воспроизведения

Приложение получает обновления событий жизненного цикла действий по URL-адресу обратного вызова, предоставленному службе автоматизации вызовов во время ответа на звонок.

Пример десериализации события PlayCompleted :

if (event.type === "Microsoft.Communication.PlayCompleted") { 
    console.log("Play completed, context=%s", eventData.operationContext); 
} 

Пример десериализации события PlayFailed :

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

Дополнительные сведения о других поддерживаемых событиях см. в документе обзора службы автоматизации вызовов.

Отмена действия воспроизведения

Отмена всех операций мультимедиа, все ожидающие операции мультимедиа отменяются. Это действие также отменяет другие действия воспроизведения в очереди.

await callAutomationClient.getCallConnection(callConnectionId) 
.getCallMedia() 
.cancelAllOperations();

Пример десериализации события PlayCanceled :

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

Необходимые компоненты

  • Учетная запись Azure с активной подпиской см. в статье "Создание учетной записи бесплатно".
  • Службы коммуникации Azure ресурс. См. статью "Создание ресурса Службы коммуникации Azure". Сохраните строка подключения для этого ресурса.
  • Создайте новое приложение веб-службы с помощью пакета SDK службы автоматизации вызовов.
  • Установить Python можно с официального сайта.

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

Создание приложения 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

(Необязательно) Подготовьте звуковой файл, если вы хотите использовать звуковые файлы для воспроизведения запросов

Создайте звуковой файл, если у вас еще нет его, чтобы использовать для воспроизведения запросов и сообщений участникам. Звуковой файл должен размещаться в расположении, доступном для Службы коммуникации Azure с поддержкой проверки подлинности. Сохраните копию URL-адреса, доступного для использования при запросе воспроизведения звукового файла. Службы коммуникации Azure поддерживает оба типа файловMP3 и WAV-файлы, моно 16-разрядная pcM с частотой выборки 16 КГц. .

Вы можете протестировать создание собственного звукового файла с помощью средства синтеза речи с помощью средства создания аудиоконтентов.

(Необязательно) Подключение Azure Cognitive Service в службу коммуникации Azure

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

Установка вызова

К этому моменту вы должны ознакомиться с начальными звонками, если вам нужно узнать больше о вызове, следуйте нашему краткому руководству. Вы также можете использовать фрагмент кода, предоставленный здесь, чтобы понять, как ответить на вызов.

call_automation_client.answer_call(
    incoming_call_context="<Incoming call context>",
    callback_url="<https://sample-callback-uri>",
    cognitive_services_endpoint=COGNITIVE_SERVICE_ENDPOINT,
)

Воспроизведение звука

После установки вызова существует несколько вариантов того, как вы можете воспроизвести звук. Вы можете воспроизводить звук для участника, присоединенного к вызову или воспроизведения звука всем участникам звонка.

Источник воспроизведения — звуковой файл

Чтобы воспроизвести звук для участников с помощью звуковых файлов, необходимо убедиться, что звуковой файл является WAV-файлом, моно и 16 КГц. Чтобы воспроизвести звуковые файлы, необходимо убедиться, что вы предоставляете Службы коммуникации Azure URI для файла, размещенного в расположении, где Службы коммуникации Azure может получить к нему доступ. Тип FileSource в нашем пакете SDK можно использовать для указания звуковых файлов для действия воспроизведения.

play_source = FileSource(url=audioUri)

Источник воспроизведения — преобразование текста в речь

Чтобы воспроизвести звук с помощью служб ИИ Azure, необходимо указать текст, который вы хотите воспроизвести, а также SourceLocale и VoiceKind или VoiceName, которые вы хотите использовать. Мы поддерживаем все голосовые имена, поддерживаемые службами ИИ Azure, полный список здесь.

text_to_play = "Welcome to Contoso"

# Provide SourceLocale and VoiceKind to select an appropriate voice. 
play_source = TextSource(
    text=text_to_play, source_locale="en-US", voice_kind=VoiceKind.FEMALE
)
play_to = [target_participant]
call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
) 
text_to_play = "Welcome to Contoso"

# Provide VoiceName to select a specific voice. 
play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")
play_to = [target_participant]
call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Источник воспроизведения — преобразование текста в речь с помощью SSML

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

ssmlToPlay = '<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><voice name="en-US-JennyNeural">Hello World!</voice></speak>'

play_source = SsmlSource(ssml_text=ssmlToPlay)

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Пользовательские модели голосовой связи

Если вы хотите улучшить запросы больше и включить пользовательские модели голосовой связи, то теперь действие воспроизведения "Текст в речь" теперь поддерживает эти пользовательские голоса. Это отличный вариант, если вы пытаетесь предоставить клиентам более локальный, персонализированный опыт или иметь ситуации, когда модели по умолчанию могут не охватывать слова и акценты, которые вы пытаетесь пропустить. Дополнительные сведения о создании и развертывании пользовательских моделей см. в этом руководстве.

Пользовательские голосовые имена регулярных текстовых эксmaple

text_to_play = "Welcome to Contoso"

# Provide VoiceName to select a specific voice. 
play_source = TextSource(text=text_to_play, voice_name="YourCustomVoiceName", custom_voice_endpoint_id = "YourCustomEndpointId")
play_to = [target_participant]
call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Пример SSML пользовательских имен голосовых имен

ssmlToPlay = '<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><voice name="YourCustomVoiceName">Hello World!</voice></speak>'

play_source = SsmlSource(ssml_text=ssmlToPlay, custom_voice_endpoint_id="YourCustomEndpointId")

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Когда вы решите, какой playSource вы хотите использовать для воспроизведения звука, вы можете выбрать, хотите ли вы воспроизвести его для определенного участника или для всех участников.

Воспроизведение звука — все участники

Воспроизведение предварительно созданного аудиофайла для всех участников звонка.

text_to_play = "Welcome to Contoso"

play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source
)

Воспроизведение звука — конкретный участник

Воспроизведение предварительно созданного звукового файла для конкретного участника звонка.

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Воспроизведение звука в цикле

Вы можете использовать параметр цикла для воспроизведения музыки, которая циклирует, пока приложение не будет готово принять вызывающий объект. Или выполните вызывающий объект на следующем логическом шаге на основе бизнес-логики приложений.

text_to_play = "Welcome to Contoso"

play_source = TextSource(text=text_to_play, voice_name="en-US-ElizabethNeural")

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, loop=True
)

Улучшение воспроизведения с помощью кэширования аудиофайлов

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

Примечание.

Кэширование звуковых файлов не подходит для динамических запросов. При изменении URL-адреса, предоставленного на Службы коммуникации Azure, он не обновляет кэшированный URL-адрес сразу. Обновление будет происходить после истечения срока действия существующего кэша.

play_source = FileSource(url=audioUri, play_source_cache_id="<playSourceId>")

play_to = [target_participant]

call_automation_client.get_call_connection(call_connection_id).play_media(
    play_source=play_source, play_to=play_to
)

Обработка обновлений событий действия воспроизведения

Приложение получает обновления событий жизненного цикла действий по URL-адресу обратного вызова, предоставленному службе автоматизации вызовов во время ответа на звонок.

Пример десериализации события PlayCompleted :

if event.type == "Microsoft.Communication.PlayCompleted":

    app.logger.info("Play completed, context=%s", event.data.get("operationContext"))

Пример десериализации события PlayFailed :

if event.type == "Microsoft.Communication.PlayFailed":

    app.logger.info("Play failed: data=%s", event.data)

Дополнительные сведения о других поддерживаемых событиях см. в документе обзора службы автоматизации вызовов.

Отмена действия воспроизведения

Отмена всех операций мультимедиа, все ожидающие операции мультимедиа отменяются. Это действие также отменяет другие действия воспроизведения в очереди.

call_automation_client.get_call_connection(
    call_connection_id
).cancel_all_media_operations()

Пример десериализации события PlayCanceled :

if event.type == "Microsoft.Communication.PlayCanceled":

    app.logger.info("Play canceled, context=%s", event.data.get("operationContext"))

Коды событий

Состояние Код Subcode Сообщение
PlayCompleted 200 0 Действие выполнено успешно.
PlayCanceled 400 8508 Сбой действия, операция была отменена.
PlayFailed 400 8535 Сбой действия, недопустимый формат файла.
PlayFailed 400 8536 Не удалось скачать файл.
PlayFailed 400 8565 Сбой действия, неправильный запрос к службам ИИ Azure. Проверить входные параметры.
PlayFailed 401 8565 Сбой действия, ошибка проверки подлинности служб ИИ Azure.
PlayFailed 403 8565 Сбой действия, запрещенный запрос к службам ИИ Azure, бесплатная подписка, используемая запросом, закончилась квота.
PlayFailed 429 8565 Сбой действия, запросы превысили количество разрешенных одновременных запросов для подписки на службы искусственного интеллекта Azure.
PlayFailed 408 8565 Сбой действия, время ожидания запроса к службам ИИ Azure истекло.
PlayFailed 500 9999 Неизвестная внутренняя ошибка сервера
PlayFailed 500 8572 Сбой действия из-за завершения работы службы.

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

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

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

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

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