ym88659208ym87991671
Настраиваем голосовое управление | Документация для разработчиков
Skip to main content

Настраиваем голосовое управление

Обновлено 13 сентября 2022

Если вы хотите, чтобы пользователь мог взаимодействовать со смартапом голосом, настройте поддержку голосового управления. Встроенная технология синтеза и распознавания речи позволяет озвучивать тексты голосами виртуальных ассистентов — Сбера, Афины и Джой, а также распознавать запросы пользователя.

В этом разделе на примере демонстрационного Native App вы узнаете, как поддержать голосовое управление в своем смартапе.

Чтобы запустить демонстрационный Native App, скажите ассистенту на умном устройстве Sber: «Открой демо новый зеленый». В этом смартапе на вкладке Assistant вы можете отдавать голосовые команды — надевать вещи на андроида и снимать их.

Схема работы голосового управления

Голосовое управление смартапом можно представить в виде обмена данными между компонентами:

Схема голосового управления
  1. Пользователь говорит: «Надень шапку».
  2. Фронтенд с помощью библиотеки AppState отправляет ассистенту информацию о текущем состоянии смартапа — перечень вещей, надетых на андроида.
  3. Ассистент распознает интент пользователя — Надеть (шапка) — и передает его в бэкенд.
  4. Бэкенд с помощью библиотеки Messaging отправляет на фронтенд команду, которую нужно выполнить: { "wear_this": "шапка" }.
  5. Бэкенд отправляет ассистенту ответ, который нужно озвучить пользователю: «Шапка надета на андроида».

В результате пользователю отображается андроид в шапке, а ассистент сообщает: «Шапка надета на андроида».

note

Библиотеки AppState и Messaging поставляются в составе Native-App SDK. Подробнее читайте в разделах Подключаем библиотеки и Настраиваем обмен данными.

Передача состояний смартапа

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

Для передачи состояний смартапа в бэкенд используются следующие объекты:

  • appState – это объект, содержащий информацию о текущем состоянии приложения. appState может содержать любые сериализуемые поля.
  • appStateHolder – системное хранилище для объекта appState. Может содержать только одно состояние смартапа.
note

Объект appState обрабатывается, только когда приложение запущено на экране пользователя.

При получении реплики пользователя, система проверяет хранилище appStateHolder и дописывает его содержимое в сообщение, которое передается в бэкенд. Состояние передается в поле payload.meta.current_app.state.<имя_состояния_из_системного_хранилища>.

Также фронтенд может в любой момент обновить системное хранилище с помощью метода setState(), который возвращает объект appState.

Примеры состояний:

appStateHolder.setState(
Json.encodeToString(
MyCurrentScreenAppState(currentScreen = Screen.Main) // отображается главный экран смартапа
)
)
appStateHolder.setState(
Json.encodeToString(
MyHealthAppState(health = 53) // уровень здоровья персонажа — 53
)
)
appStateHolder.setState(
Json.encodeToString(
MyAppState("На андроиде ${currentClothes.joinToString(transform = { it.clothes })}") // на андроиде надета шапка
)
)

Настройка интентов

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

Настроить интенты можно в сценарии смартапа. Подробнее читайте в разделе Создание интента.

Голосовой запуск приложения

При голосовом запуске ассистент передает в сценарий команду /start. В демонстрационном Native App бэкенд определяет команду стейте runApp с помощью тега q! (вкладка Сценарии, файл main.sc):

# cтейт нужен для запуска Native App на устройстве
# команда старта приходит в тег q, а в теге script передается команда smart_app_data
# которая приводит к запуску Native App на устройстве
# поле smart_app_data может содержать произвольный JSON-объект
state: runApp
event!: runApp
q!: * *start
script:
$response.replies = $response.replies || [];
$response.replies.push({
type: 'raw',
body: {
items: [
{
command: {
type: "smart_app_data",
smart_app_data: {
type: "app_action",
message: "запустиприложение"
},
},
# необязательный параметр, при получении которого ассистент в течение нескольких секунд будет ожидать ответа пользователя
auto_listening: true
},
],
},
});

Бэкенд реагирует на получение команды с помощью тега script. Затем с помощью системной переменной $response, передает на фронтенд команду smart_app_data, которая запускает фронтенд смартапа на устройстве. При этом содержимое команды может быть любым.

note

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

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней