Создание простого навыка для голосового помощника Алиса на PHP

Введение

В 2018 году компания Яндекс представила общественности свое новое устройство – умную колонку Яндекс.Станция со встроенным голосовым помощником Алиса. В дальнейшем данный голосовой помощник был внедрен в остальные продукты компании: браузер, приложение для iOS и Android.

Таким образом, голосовой помощник Алиса стал доступен на всех устройствах: умные колонки, смартфоны, ноутбуки, планшеты, стационарные компьютеры, смарт-телевизоры. Чуть позже, компания Яндекс открыла доступ свой платформы голосового помощника для разработчиков. Это означает, что теперь можно разрабатывать собственные навыки (боты), которыми можно управлять голосом и будут доступны на всех вышеперечисленных устройствах. Сам навык может быть из любой сферы, все зависит от вашей фантазии: игры, новостные, навык для определенной компании или фирмы.

Сам навык можно разрабатывать на любом удобном для вас языке программирования, главное, чтобы он отвечал формату согласно документации и был доступен по https-протоколу. Вы можете разработать навык на Node.js, Python, PHP и др.

В сети уже полно информации по созданию собственных навыков для голосового помощника Алиса. Имеются даже уже готовые библиотеки, которые упростят создание навыков в несколько раз. Также доступны платформы-конструкторы для создания навыков, но они подойдут для тех, кто совсем не разбирается в программировании и не захочет платить деньги другим разработчикам. На таких платформах можно создавать только простые навыки, которые отвечают на определенные запросы (команды). Если же вы в своем навыке хотите использовать API других сервисов, управлять своим умным домом, то без программирования здесь не обойтись.

Как я сказал ранее, у Яндекса имеется отдельный раздел с документацией по работе с навыками: как правильно создать навык, примеры на Python и Node.js, как разместить навык на Яндекс.Облаке.

Имеется также школа по разработке навыков от компании Яндекс, телеграмм-каналы, где вы можете задать вопрос и вам же мгновенно на него ответят.

Кстати, все навыки публикуются в каталоге, это что-то наподобие Google Play или App Store. В данном каталоге можно найти определённый навык с описанием, оценками и отзывами и при необходимости запустить его. Все навыки запускаются при помощи активационный фразы.

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

Регистрация навыка в Яндекс.Диалогах

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

В личном кабинете диалогов, нажимаем на кнопку Создать диалог, после чего в появившемся окне выбрать Навык в Алисе:

Создание навыка в Яндекс.Диалогах
Создание навыка в Яндекс.Диалогах

Далее, на новой странице необходимо указать основные настройки нашего будущего навыка. Необходимо указать название навыка, активационное имя – это имя навыка, при помощи которого пользователь сможет его активировать (запустить), описание, данные разработчика и иконку. Что касается Webhook URL, то его мы укажем позже, так как наш навык еще нигде не размещен.

Также можно выбрать голос навыка, которым будет говорить Алиса. Еще необходимо указать устройства, на которых будет работать навык, категорию навыка в каталоге, если он не является приватным. Что касается основных настроек, то там должно быть все понятно и просто, обязательные поля для заполнения отмечены символом:

Настройки навыка в Яндекс.Диалогах
Настройки навыка в Яндекс.Диалогах

Вы можете указать несколько запросов, при помощи которых можно будет запустить ваш навык. Все эти запросы будут отображены в каталоге. После того как вы ввели все необходимые данные, необходимо внизу страницы нажать на кнопку Сохранить.

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

Созданный навык в Яндекс.Диалогах
Созданный навык в Яндекс.Диалогах

После того как навык создан на платформе Яндекс.Диалогах, можно приступать непосредственно к программированию самого навыка.

Разработка навыка для Алисы на PHP

На самом деле здесь нет ничего сложного. Мы будем работать с получением ответов от Алисы и отправке ей запросов в формате JSON. Ниже я приведу пример небольшого навыка, который мы постепенно с вами его разберем:

<?php
 
$dataRow = file_get_contents('php://input');
header('Content-Type: application/json');
 
$response = '';
 
$mySkillName = 'айтибэйс';
 
try{
    if (!empty($dataRow)) {
 
        file_put_contents('alisalog.txt', date('Y-m-d H:i:s') . PHP_EOL . $dataRow . PHP_EOL, FILE_APPEND);
 
        $data = json_decode($dataRow, true);
 
 
        if (!isset($data['request'], $data['request']['command'], $data['session'], $data['session']['session_id'], $data['session']['message_id'], $data['session']['user_id'])) {
 
            $result = json_encode([]);
        } else {
 
            $text = $data['request']['command'];
 
            $textToCheck = strtolower($text);
            if ((strpos(mb_strtolower($text), mb_strtolower($mySkillName)) !== false) || ($text == '')) {
                $response = json_encode([
                    'version' => '1.0',
                    'session' => [
                        'session_id' => $data['session']['session_id'],
                        'message_id' => $data['session']['message_id'],
                        'user_id' => $data['session']['user_id']
                    ],
                    'response' => [
                        'text' => 'Здравствуйте! Это приватный навык сайта ITBases',
 
                        'tts' => '',
                        'buttons' => [
                                        array(
                                                'title' => 'Помощь',
                                                'hide' => 'true',
                                            ),
                			   array(
						    'title' => 'Статьи',
						    'hide' => 'false',
						),
            array(
                'title' => 'Открыть сайт',
                'url' =>'https://itbases.ru',
            )]
                    ]
                ]);
            } elseif( (strpos(mb_strtolower($text),mb_strtolower('что умеешь'))) !== false or mb_strtolower($text) == mb_strtolower ('Помощь') ) {
                $response = json_encode([
                    'version' => '1.0',
                    'session' => [
                        'session_id' => $data['session']['session_id'],
                        'message_id' => $data['session']['message_id'],
                        'user_id' => $data['session']['user_id']
                    ],
                    'response' => [
                        'text' => 'Для получения списка разделов скажите Разделы\n\nДля получения списка программа скажите Программы\n\nДля получения новостей скажите Новости',
                        'tts' => '',
                        'buttons' => [
						array(
							'title' => 'Разделы',
							'hide' => 'true',
						),
						array(
							'title' => 'Программы',
							'hide' => 'true',
						),
						array(
							'title' => 'Новости',
							'hide' => 'true',
							)
					]
                    ]
                ]);
            } 
 
        }
        else
        {
            $response = json_encode([
                    'version' => '1.0',
                    'session' => [
                        'session_id' => $data['session']['session_id'],
                        'message_id' => $data['session']['message_id'],
                        'user_id' => $data['session']['user_id']
                    ],
                    'response' => [
                        'text' => 'Извините, я не совсем поняла ваш запрос, воспользуйтесь помощью для дальнейшей работы',
                        'tts' => '',
                        'buttons' => [
                                        array(
                                                'title' => 'Помощь',
                                                'hide' => 'true',
                                            )
                            ],
                        'end_session' => false
                    ]
                ]); 
        }
 
        }
 
    } else {
        $response = json_encode([
            'version' => '1.0',
            'session' => 'Error',
            'response' => [
                'text' => 'Отсутствуют данные',
                'tts' =>  'Отсутствуют данные',
            ]
        ]);
    }
 
    echo $response;
 
} catch(\Exception $e){
    echo '["Error occured"]';
}
?>

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

Проверяем, чтобы в ответе были все необходимые параметры, если они присутствуют, то выдаем пользователю приветственное сообщение, в котором имеются кнопки (подсказки). Обратите внимание, что если у кнопки параметр hide равен true, то кнопка имеет дизайн и после нажатия она исчезнет, если же этот параметр равен false, то кнопка отображается в стиле ссылки:

Кнопки в навыках Яндекс.Диалогов
Кнопки в навыках Яндекс.Диалогов

Далее в нашем навыке необходимо написать логику обработки запросов от пользователя. То есть, если пользователь ввел какое-то сообщение (или сказал), то мы должны на него ответить. Так как навык у нас простой, то мы просто проверяем какую команду ввел (сказал) пользователь. Если же вы более опытный программист и хотите сделать навык более универсальным, то вам необходимо тогда использовать как минимум регулярные выражения для разбора запроса от пользователя. Если вы немного понимаете в программировании, то листинг навыка на PHP для вас будет более, чем понятный.

После того как наш навык сделан, необходимо его разместить на сервере. Не забывайте, что навык должен быть доступен по https-протоколу. Самый простой способ разместить PHP-навык для Алисы – это воспользоваться обычным хостингом с SSL-сертификатом.

Это может быть, как бесплатный, так и платный хостинг. Также для размещения своего навыка можно воспользоваться Яндекс.Облаком. Я остановился на обычном бесплатном хостинге (он может быть любой, главное иметь поддержку https-протокола). В корневую папку записываем файл index.php, в котором содержится код нашего навыка (написан выше). Все, навык разработан, нам остается лишь скопировать URL, по которому доступен навык.

Тестирование и публикация навыка

Последним этапом разработки навыка является его тестирование и публикация в каталоге, если он не является приватным. Для этого заходим в Яндекс.Диалоги и выбираем в черновиках наш навык, далее заходим на страницу Настройки и в поле Webhook URL указываем адрес нашего навыка, по которому он доступен (обычная ссылка на сайт, если он размещен на хостинге и называется index.php):

Указание Webhook URL для навыка Яндекс.Диалогов
Указание Webhook URL для навыка Яндекс.Диалогов

Внизу страницы нажимаем на кнопку Сохранить. Яндекс отправит на этот адрес тестовый запрос, если ответ будет получен, то сохранения настроек должно пройти успешно, в противном случае будет сообщено о том, что данный URL не отвечает на запросы.

После того как настройки сохранены, переходим на страницу Тестирование:

Тестирование навыка в Яндекс.Диалогах
Тестирование навыка в Яндекс.Диалогах

Минус в платформе тестирования от Яндекса заключается в том, что вы не сможете послушать ответы вашего голосового навыка, имеется возможность только общаться с ним при помощи клавиатуры и получать текстовые сообщения. Тестирование состоит из двух частей: слева отображается результат запроса (текст, картинки, кнопки, ссылки), а справа последний запрос в формате JSON:

Результаты тестирования навыка в Яндекс.Диалогах
Результаты тестирования навыка в Яндекс.Диалогах

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

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

Заключение

Разработка навыков сейчас является довольно интересной, популярной и перспективной. Но пока что не хватает большей экосистемы, чтобы разрабатывать навыки под любые задачи. Если же вы хотите в своем навыки использовать API каких-то сервисов, то не забывайте, что ответ от навыка должен приходить пользователю в течение 1,5 секунды, иначе Алиса будет сообщать пользователю, что по каким-то причинам навык не отвечает.

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

Для многих также еще непонятно, как можно монетизировать навыки. На данный момент разработчики могут получать денежное вознаграждение, если победят в ежемесячной премии Алисы. Также они разрабатывают навыки под заказ: сайтам, компаниям и пользователям.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Была ли эта статья полезна?

Оставить комментарий

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