Страница 6 из 42

Re: Контексты в шаблонах поведения

Добавлено: Вт дек 30, 2014 1:45 am
sergejey
triada13 писал(а):Обновление сделал час назад.
Это получается она сама себя слышит?
Да и обрабатывает собственную фразу перед тем, как выйти из контекста. Такое было, но я думал, что поправил. Перепроверю.

Re: Контексты в шаблонах поведения

Добавлено: Пт янв 09, 2015 12:44 am
Bagir
Ну вот и я добрался до Шаблонов, и как обычно куча вопросов. Для начала я сделал простенькую схему

Общий контекст (9000)
забудь (0)
помощь (0)

(включи|выключи) (8000)
  • свет (0)
    • в холле (0)
      у подъезда (0)
СкринSPOILER_SHOW
Изображение

И добавил немного кода:

Общий контекст (9000) использовать как контекст - ДА
  • забудь (0)

    Код: Выделить всё

    say('Контекст забыт.'); 
    помощь (0)

    Код: Выделить всё

    $actions=$this->getAvailableActions();
    $total=count($actions);
    for($i=0;$i<$total;$i++) {
     say($actions[$i]);
    } 
(включи|выключи) (8000) использовать как контекст - ДА
Выполнять при совпадении:

Код: Выделить всё

say('Что именно '.$matches[1].'ть?');

По истечении времени выполнить:

Код: Выделить всё

say('Дальнейших команд нет.');
  • свет (0) использовать как контекст - ДА
    Выполнять при совпадении:

    Код: Выделить всё

    say('Где?');

    По истечении времени выполнить:

    Код: Выделить всё

    say('Дальнейших команд нет.');
    • в холле (0)
      Выполнять при совпадении:

      Код: Выделить всё

      switch ($matches[??????]) {
        case "включи":
        say('Включаю свет у подъезда');
        break;
        
        case "выключи":
        say('Выключаю свет у подъезда');
        break;
      } 

      у подъезда (0)
      Выполнять при совпадении:

      Код: Выделить всё

      switch ($matches[?????]) {
        case "включи":
        say('Включаю свет у подъезда');
        break;
        
        case "выключи":
        say('Выключаю свет у подъезда');
        break;
      } 
Получилось немного громоздкое оформление, но без него трудно понять смысл дальнейших слов. Во первых, почему у меня первый пункт (включи|выключи)? Мне не хочется делать одинаковые пункты на включение и отключение. Вместо этого хочу попробовать принимать решение на основе $matches[] сравнивая его со словами включи или выключи.

Дальше вот такой диалог тоже будет успешный:
00:15 User1: у подъезда
00:15 Alice: Где?
00:14 User1: свет
00:14 Alice: Что именно включить?
00:14 User1: включи

А вот команда "включи свет", или сразу все "включи свет у подъезда" не работает. При этом Алиса входит только в первый контекст (включи|выключи). После команды "включи", Алиса спросит "Что именно?", а после команды "свет", спросит "Где?". Очень бы хотелось при этом, чтобы команда "включи свет" задействовала сразу два контекста, но Алиса при этом спросила только "Где", т.к. ответ на первый вопрос "Что именно?" уже дан в продолжении команды.
Ну а после полной команды "включи свет у подъезда" вообще не прозвучало вопросов "Что именно?" и "Где".
То есть нужно иметь возможность отменять код при совпадении шаблона, если после этого шаблона сразу сработал следующий шаблон, который входит в его контекст.

Еще одна тема - команда "забудь" в общем контексте. Добавил ее, чтобы вывести Алису из темы разговора. В Set context when matched: ничего не выбрано, однако Алиса все равно продолжает оставаться в контексте. Тут наверное что то не так. Есть вариант

Код: Выделить всё

SQLExec("UPDATE users SET ACTIVE_CONTEXT_ID=0 WHERE 1");
но наверное Алиса и так должна забыть контекст.

Вопрос по $matches[]. Можно ли в этом массиве видеть всю историю слов? По моему примеру обязательно нужно помнить первое совпадение (включи|выключи), когда мы доберемся непосредственно до действия.

И напоследок, подскажите, как передать команду в чат с Алисой из программы распознавания речи, чтобы она была напечатала в истории сообщений от имени нужного нам пользователя
_http://localhost/command.php?qry=Привет
По имени пользователя я хочу понимать из какой комнаты мы разговариваем с Алисой. В имени пользователя в этом случае будет имя комнаты. Соответственно туда, и только туда, нужно направлять звуковые сообщения. Я читал, и вижу в таблице `users`, что Шаблоны поведения различают разных пользователей и могут вести разные контексты у разных пользователей одновременно. Следовательно в коде контекстов нам нужно видеть имя текущего пользователя, с которым она разговаривает, чтобы именно в эту комнату отправить звук. Кто подскажет, как получить это имя текущего пользователя?

Re: Контексты в шаблонах поведения

Добавлено: Сб янв 10, 2015 9:30 pm
Bagir
Друзья, sergejey сотворил очередное чудо!
После сегодняшнего обновления, в коде шаблонов поведения доступна $original Сейчас расскажу как ее использовать. Но сначала давайте посмотрим на результат!
Можно давать команды по одной, и после каждой Алиса будет уточнять, что хотела бы услышать в продолжении диалога. А можно сказать все сразу!
Изображение
Более того, даже не важно в какой последовательности
Изображение
И делает все это вот такие при простых шаблона
Изображение

Теперь обо всем этом более подробно. Создадим, и настроим шаблоны так:
Изображение

Код: Выделить всё

say('Что именно?');
А можно добавить ранее услышанное слово

Код: Выделить всё

say('Что именно '.$original.'ть?');
Изображение

Тут, видя первый ответ в переменной $original, принимаем решение о включении или выключении.
Изображение

Код: Выделить всё

if (preg_match('/включи/is',$original)) {
  say('Включаю свет в коридоре');
} elseif (preg_match('/выключи/is',$original)) {
  say('Выключаю свет в коридоре');
} else {
  say('Непонятно что со светом в коридоре: '.$original);
} 
Вот и все! Теперь остается только добавить свои комнаты и устройства. В дополнение скажу, что эта новая доработка еще и отлично совмещается с голосовым вводом.

Re: Контексты в шаблонах поведения

Добавлено: Пн янв 12, 2015 11:42 pm
Bagir
sergejey рассказал еще об одной интересной функции context_clear(); С новыми шаблонами общаться с Алисой стало намного интересней и полезней. Но бывает так, что нужно вывести Алису из текущего контекста. Например мы говорим о погоде, а надо сменить тему и перейти в контекст включи|выключи или какой либо другой. Для этого можно добавить глобальную команду, и назвать ее, к примеру, Забудь
Она позволяет сбросить текущий контекст у текущего пользователя.
Для удаления таймера события при не ответе, можно сделать так: clearTimeOut('user_'.context_getuser().'_contexttimeout'); Тут тоже есть интересная штуковина, а именно context_getuser(), которая по всей видимости возвращает id текущего пользователя. А если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:

Код: Выделить всё

context_clear();
clearTimeOut('user_'.context_getuser().'_contexttimeout');
say('Контекст забыт.'); 
СкринSPOILER_SHOW
Изображение

Re: Контексты в шаблонах поведения

Добавлено: Вт янв 13, 2015 5:40 am
Amarok
Совсем запутался((

Re: Контексты в шаблонах поведения

Добавлено: Вт янв 13, 2015 8:56 am
Bagir
Посмотрите у меня в коннекте. Там в самом начале находится глобальный контекст и в нем есть эта команда Забудь и ранее предложенная sergejey команда Помощь

Re: Контексты в шаблонах поведения

Добавлено: Ср янв 14, 2015 3:40 pm
Bagir
sergejey писал(а):
BlackWarrior писал(а):кстати, оно регистрозависимо оказывается(((((((((
Там стоит опция регистро-независимости, но, возможно, для русского языка оно некорректно работает, надо будет попробовать разобраться. Но вообще я использую всегда нижний регистр и программы распознавания, на сколько я знаю, всегда в нижнем регистре передают.
А вот и славно! Фразы, которые говорит Алиса, начинаются с заглавной буквы. И у них нет шансов вызвать ложное совпадение с командами пользователя.

Re: Контексты в шаблонах поведения

Добавлено: Чт янв 15, 2015 7:51 am
Amarok
Предлагаю Забудь прировнять к Ой всё :D

Re: Контексты в шаблонах поведения

Добавлено: Чт янв 15, 2015 8:01 am
triada13
BlackWarrior писал(а):Предлагаю Забудь прировнять к Ой всё :D
Или к: "а, ладно, проехали"

Re: Контексты в шаблонах поведения

Добавлено: Чт янв 15, 2015 8:21 am
Ivan
Или "*дура*" :)
У меня когда не срабатывает на 4 раз, я пользуюсь шаблоном: "повтори. Я дура!"

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

Особо в прошлом году всем понравилась ёлочка. Детям просто прикольно. Для взрослых "Раз Два Три. Дура ёлочка гори"

PS. По моему у меня это слово должно включать контекст. "Сам такую сделал" :)