Эта запись первоначально появилась в Блоге разработчиков Alexa.

Речь является элементарным и фундаментальным способом взаимодействия. Когда мы говорим с другими, и они отвечают, мы участвуем в диалоге. Более определенно, диалог — это обмен речью между двумя или более людьми. Диалог сам по себе имеет множество нюансов. Например, диалоги происходят в неписаном, но врожденном ритме — один человек говорит, есть пауза, затем говорит другой человек. Неинтересно, когда один человек монополизирует диалог, не позволяя говорить другому. Обратное, когда вы говорите, и никто не отвечает, одинаково расстраивает. Представьте, что вы пытаетесь вести увлекательную беседу с кирпичной стеной (если только кирпичная стена не поддерживает Alexa, и в этом случае я отвлекся). На самом деле, вы можете возразить, что ни один из этих двух сценариев вообще не является разговором!

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

Задержка и предполагаемая задержка с Live Services

Достаточно просто сделать HTTP-запрос из вашего навыка Alexa. Хотя одной из реальных проблем, возникающих при подключении к живым службам, является задержка конечной точки. Высказывание клиента, за которым следует молчание Alexa, может противоречить их ожиданиям естественного диалога. В конечном итоге это может повлиять как на восприятие, так и на принятие вашего навыка.

Проблема с задержкой становится особенно очевидной, когда вы пытаетесь получить тяжелые данные, такие как высококачественное изображение, видео, или если вы выполняете требовательный к вычислительным ресурсам запрос REST, выполнение которого может занять пару секунд (например, поиск в каталоге определенного записывать).

Вот почему информировать ваших клиентов о том, что им, возможно, придется немного подождать, пока ваши навыки вычисляют, является хорошей идеей. Представьте, что вы разговариваете со своим другом по телефону, и он задает вам вопрос. Если вам нужно найти ответ, вежливее всего будет попросить друга подождать или «подождите минутку». По этой же причине индикаторы выполнения, загрузочные экраны и вращающиеся колеса обычно используются в графических пользовательских интерфейсах, чтобы показать, что компьютер получил инструкцию и ему требуется некоторое время для вычислений.

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

Рецепт: уменьшение воспринимаемой задержки с помощью Progressive Response API

Чтобы добиться аналогичного эффекта с Alexa, мы можем использовать Progressive Response API. Вместо того, чтобы хранить молчание, пока ваш навык обрабатывает запрос, мы можем сообщить клиенту, что навык работает. По сути, это индикатор слуховой нагрузки.

Давайте упростим себе задачу, создав отдельную вспомогательную функцию для абстрагирования функциональности.

Первое, что нам нужно сделать, это создать экземпляр общей службы директив Alexa. Затем нам нужно извлечь requestId, apiEndpoint и apiAccessToken из объекта события Skill. RequestId — это уникальный идентификатор для конкретного запроса, отправленного Alexa на ваш навык. APIAccessToken предоставляется в объекте контекста, и этот токен также включается во все запросы, отправляемые на ваш навык. Наконец, apiEndpoint является конечной точкой для Progressive Response API. Это будет варьироваться в зависимости от географического положения вашего навыка. Мы можем увидеть это в действии в строках с 3 по 8 ниже.

1.  function callDirectiveService(handlerInput, progressiveResponse) {  

2.    // Call Alexa Directive Service.  

3.    const requestEnvelope = handlerInput.requestEnvelope;  

4.    const directiveServiceClient = handlerInput.serviceClientFactory.getDirectiveServiceClient();  

5.    

6.    const requestId = requestEnvelope.request.requestId;  

7.    const endpoint = requestEnvelope.context.System.apiEndpoint;  

8.    const token = requestEnvelope.context.System.apiAccessToken;  

9.    

10.   // build the progressive response directive  

11.   const directive = {  

12.     header: {  

13.       requestId,  

14.     },  

15.     directive: {  

16.       type: 'VoicePlayer.Speak',  

17.       speech: progressiveResponse,  

18.     },  

19.   };  

20.   

21.   // send directive  

22.   return directiveServiceClient.enqueue(directive, endpoint, token);  

23. }

Строки с 11 по 19 выше — настоящий волшебный соус для этого рецепта. Этот объект устанавливает указанную директиву для Alexa с промежуточным содержимым, которое будет произносить Alexa. Строка 17 — это место, где устанавливается этот промежуточный контент. Наконец, в строке 22 создается экземпляр Alexa Directive Service Client, и ключевые биты данных, полученные от объекта события, помещаются в очередь.

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

1.  const responseBuilder = handlerInput.responseBuilder;  

2.  const result = await getHttpRequest('http://some-endpoint-here.com');  

3.    

4.  let speechOutput = 'The result is: ' + data;  

5.    

6.  let progressiveResponse = 'Please hold while I look that up for you.'  

7.    

8.  await callDirectiveService(handlerInput, progressiveResponse);  

9.    

10. return responseBuilder  

11.     .speak(speechOutput)  

12.     .getResponse();

Взгляните на строку 8: мы должны убедиться, что директива с межстраничным содержимым или содержимым, которое мы представим во время ожидания, предоставлена ​​до того, будет сделан HTTP-запрос. Поскольку Node.js по своей сути асинхронен, мы можем обернуть наши вызовы API в обработчик промисов или использовать выражение async/await Javascript, чтобы заставить его работать синхронно. Если вам интересно узнать немного больше о promises или async/await, быстрый поиск в Интернете даст множество результатов. Вы также можете сослаться на один из наших предыдущих рецептов по созданию HTTP-запросов здесь.

Пока ваш пользователь ждет, вы можете предоставить ему короткие звуковые ресурсы (например, звуковые эффекты) или другой динамический контент, который сделает время ожидания более приятным. Хотя установка ожидания, что клиенту, возможно, придется немного подождать, — это одно, но это не может полностью компенсировать его разочарование. Существует стратегия, которую мы можем использовать для ускорения получения контента из API. И хотя это практика проектирования производительности, это быстрое, недорогое и простое в развертывании решение.

Чтобы узнать больше рецептов, посетите Alexa Skill Building Cookbook на GitHub.

Если у вас есть вопросы, покажите, что вы строите, или просто хотите поздороваться, я также есть в Твиттере @theOnlyAkersh!