Распознавание нескольких людей на одном устройстве Echo

Amazon недавно выпустила персонализацию навыков Alexa, как описано в этом сообщении в блоге. Эта функция позволяет разработчикам использовать голосовые профили, чтобы определить, кто разговаривает с устройством. Раньше разработчики могли различать пользователей только по владельцу учетной записи (userId). Теперь новое поле personId может идентифицировать разных людей, использующих одно и то же физическое устройство.

В своем сообщении в блоге Amazon подробно описывает несколько различных вариантов использования этой функции. Uber может связывать учетные записи с человеком, отправляющим запрос, а не с владельцем учетной записи Amazon. Или вы можете отслеживать результаты игры и прогресс для каждого человека. Я решил попробовать что-нибудь немного другое с Party Craps.

Крэпс - популярная игра в кости в казино. Игроки пытаются либо выбросить 7 или 11 при первом броске, либо повторно бросить число из своего первого броска («точка») перед тем, как выбросить 7. Игра является совместной, живой игрой, поскольку все игроки делают ставки на одно и то же. бросок кости. Действие происходит быстро, когда игроки выбрасывают свои фишки и выкрикивают свои ставки одному из многих дилеров. Но именно это и делает его таким увлекательным, и именно тот случайный, быстрый темп, который я хотел запечатлеть в Craps Party. Я использовал персонализацию навыков, чтобы сопоставить голос с банкроллом, создав многопользовательскую игру, в которой людям не нужно играть последовательно.

Сбор информации об игроке

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

В Craps Party я начинаю с переклички игроков. Когда каждый игрок сообщает свое имя, я проверяю, есть ли personId. Если так, я сохраняю это как связанное с их именем. Если нет, я сохраняю неперсонализированное имя игрока. По ходу игры, если я получаю запрос на ставку с personId, я могу посмотреть, какой игрок сделал ставку. Если нет, я запрашиваю у пользователя его имя («Извините, я не уверен, кто делает эту ставку. Кто говорит?»), А затем делаю ставку. Есть некоторая логика, чтобы сделать это немного более плавным, чем может показаться. Например, если только один игрок не сделал ставки, я делаю эту ставку без подсказки.

Вот фрагмент кода для добавления игроков в начале игры:

const event = handlerInput.requestEnvelope;
const attributes = handlerInput.attributesManager
                               .getSessionAttributes();
const name = event.request.intent.slots.Name.value;
if (event.context.System.person &&
    event.context.System.person.personId) {
  // First make sure we haven't heard this person before
  const personId = event.context.System.person.personId;
  const idx = attributes.players
    .map((p) => p.personId)
    .indexOf(personId);
        
  if (idx > -1) {          
    return handlerInput.responseBuilder
      .speak('This sounds like {Name}. Please have a different person speak up'.replace('{Name}', attributes.players[idx].name)
      .reprompt('Please have a different player speak up')
      .getResponse();
  }
  // Add this player
  attributes.players.push({name, personId});
} else {
  // Add this player without a personId
  attributes.players.push({name});
}

Когда есть входящая ставка, я могу проверить массив attributes.players, чтобы узнать, кто делает ставку. Если personId нет, я запрашиваю имя игрока. Как только я получу имя игрока, я могу сделать ставку на подходящего человека:

const event = handlerInput.requestEnvelope;
if (event.context.System.person && 
    event.context.System.person.personId) {
  const personId = event.context.System.person.personId;
  const idx = attributes.players
    .map((p) => p.personId)
    .indexOf(personId);
  if (idx > -1) {
    ... manage adding bet ...
    return handlerInput.responseBuilder
      .speak('Thanks for the bet {Name}. Who wants to place the next bet?'.replace('{Name}', attributes.players[idx].name)
      .reprompt('Who wants to place the next bet?')
      .getResponse();
  } else {
    // Prompt to see who this is
    return handlerInput.responseBuilder
      .speak('Sorry, I\'m not sure who this is. Who is speaking?')
      .reprompt('Who is speaking?')
      .getResponse();
  }
}

Аналитика

Я хотел понять, как голосовые профили использовались с моими навыками. Сколько сеансов было персонализировано? Для тех, кто это сделал, как часто Алекса не могла распознать человека и не сдать personId? Были ли игроки с голосовыми профилями более или менее вероятно, что они вернутся к моему навыку или будут играть более длительные сессии?

Я использовал платформу VoiceHero для настройки пользовательских событий, которые могли просматривать мои сеансы, чтобы определить, сколько пользователей попало в эти категории. Затем я мог бы наблюдать за этими сегментами пользователей с течением времени, фильтровать и сравнивать сеансы, чтобы ответить на эти вопросы. Пока что менее 10% сеансов имеют персонализированные запросы, но я ожидаю, что это число будет расти по мере роста популярности функции.

Заключение

Воспользоваться преимуществами персонализации навыков относительно просто и повысить качество обслуживания клиентов для навыков, которые ее реализуют. Потребителям потребуется некоторое время, чтобы принять эту функцию, поскольку эта функция требует настройки голосовых профилей для всех членов семьи и предоставления вам разрешения на получение доступа к personId. Хотя сегодня я наблюдаю менее 10% сеансов с персонализацией, я ожидаю, что этот показатель будет расти по мере того, как на рынке появится больше навыков, использующих эту функцию, и Amazon продвигает голосовые профили клиентам. Стоит быть одним из первых пользователей и искать способы добавить эту функциональность к своим навыкам.