Да и обрабатывает собственную фразу перед тем, как выйти из контекста. Такое было, но я думал, что поправил. Перепроверю.triada13 писал(а):Обновление сделал час назад.
Это получается она сама себя слышит?
Контексты в шаблонах поведения
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Контексты в шаблонах поведения
- Рейтинг: 1.16%
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Ну вот и я добрался до Шаблонов, и как обычно куча вопросов. Для начала я сделал простенькую схему
Общий контекст (9000)
забудь (0)
помощь (0)
(включи|выключи) (8000)
И добавил немного кода:
Общий контекст (9000) использовать как контекст - ДА
Выполнять при совпадении:
По истечении времени выполнить:
Дальше вот такой диалог тоже будет успешный:
00:15 User1: у подъезда
00:15 Alice: Где?
00:14 User1: свет
00:14 Alice: Что именно включить?
00:14 User1: включи
А вот команда "включи свет", или сразу все "включи свет у подъезда" не работает. При этом Алиса входит только в первый контекст (включи|выключи). После команды "включи", Алиса спросит "Что именно?", а после команды "свет", спросит "Где?". Очень бы хотелось при этом, чтобы команда "включи свет" задействовала сразу два контекста, но Алиса при этом спросила только "Где", т.к. ответ на первый вопрос "Что именно?" уже дан в продолжении команды.
Ну а после полной команды "включи свет у подъезда" вообще не прозвучало вопросов "Что именно?" и "Где".
То есть нужно иметь возможность отменять код при совпадении шаблона, если после этого шаблона сразу сработал следующий шаблон, который входит в его контекст.
Еще одна тема - команда "забудь" в общем контексте. Добавил ее, чтобы вывести Алису из темы разговора. В Set context when matched: ничего не выбрано, однако Алиса все равно продолжает оставаться в контексте. Тут наверное что то не так. Есть вариант но наверное Алиса и так должна забыть контекст.
Вопрос по $matches[]. Можно ли в этом массиве видеть всю историю слов? По моему примеру обязательно нужно помнить первое совпадение (включи|выключи), когда мы доберемся непосредственно до действия.
И напоследок, подскажите, как передать команду в чат с Алисой из программы распознавания речи, чтобы она была напечатала в истории сообщений от имени нужного нам пользователя
_http://localhost/command.php?qry=Привет
По имени пользователя я хочу понимать из какой комнаты мы разговариваем с Алисой. В имени пользователя в этом случае будет имя комнаты. Соответственно туда, и только туда, нужно направлять звуковые сообщения. Я читал, и вижу в таблице `users`, что Шаблоны поведения различают разных пользователей и могут вести разные контексты у разных пользователей одновременно. Следовательно в коде контекстов нам нужно видеть имя текущего пользователя, с которым она разговаривает, чтобы именно в эту комнату отправить звук. Кто подскажет, как получить это имя текущего пользователя?
Общий контекст (9000)
забудь (0)
помощь (0)
(включи|выключи) (8000)
- свет (0)
- в холле (0)
у подъезда (0)
- в холле (0)
СкринПоказать

И добавил немного кода:
Общий контекст (9000) использовать как контекст - ДА
- забудь (0) помощь (0)
Код: Выделить всё
say('Контекст забыт.');
Код: Выделить всё
$actions=$this->getAvailableActions(); $total=count($actions); for($i=0;$i<$total;$i++) { say($actions[$i]); }
Выполнять при совпадении:
Код: Выделить всё
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; }
- в холле (0)
Дальше вот такой диалог тоже будет успешный:
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`, что Шаблоны поведения различают разных пользователей и могут вести разные контексты у разных пользователей одновременно. Следовательно в коде контекстов нам нужно видеть имя текущего пользователя, с которым она разговаривает, чтобы именно в эту комнату отправить звук. Кто подскажет, как получить это имя текущего пользователя?
- Рейтинг: 2.33%
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Друзья, sergejey сотворил очередное чудо!
После сегодняшнего обновления, в коде шаблонов поведения доступна $original Сейчас расскажу как ее использовать. Но сначала давайте посмотрим на результат!
Можно давать команды по одной, и после каждой Алиса будет уточнять, что хотела бы услышать в продолжении диалога. А можно сказать все сразу!

Более того, даже не важно в какой последовательности

И делает все это вот такие при простых шаблона

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

Тут, видя первый ответ в переменной $original, принимаем решение о включении или выключении.
Вот и все! Теперь остается только добавить свои комнаты и устройства. В дополнение скажу, что эта новая доработка еще и отлично совмещается с голосовым вводом.
После сегодняшнего обновления, в коде шаблонов поведения доступна $original Сейчас расскажу как ее использовать. Но сначала давайте посмотрим на результат!
Можно давать команды по одной, и после каждой Алиса будет уточнять, что хотела бы услышать в продолжении диалога. А можно сказать все сразу!

Более того, даже не важно в какой последовательности

И делает все это вот такие при простых шаблона

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

Код: Выделить всё
say('Что именно?');
Код: Выделить всё
say('Что именно '.$original.'ть?');

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

Код: Выделить всё
if (preg_match('/включи/is',$original)) {
say('Включаю свет в коридоре');
} elseif (preg_match('/выключи/is',$original)) {
say('Выключаю свет в коридоре');
} else {
say('Непонятно что со светом в коридоре: '.$original);
}
- Рейтинг: 3.49%
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
sergejey рассказал еще об одной интересной функции context_clear(); С новыми шаблонами общаться с Алисой стало намного интересней и полезней. Но бывает так, что нужно вывести Алису из текущего контекста. Например мы говорим о погоде, а надо сменить тему и перейти в контекст включи|выключи или какой либо другой. Для этого можно добавить глобальную команду, и назвать ее, к примеру, Забудь
Она позволяет сбросить текущий контекст у текущего пользователя.
Для удаления таймера события при не ответе, можно сделать так: clearTimeOut('user_'.context_getuser().'_contexttimeout'); Тут тоже есть интересная штуковина, а именно context_getuser(), которая по всей видимости возвращает id текущего пользователя. А если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:

Она позволяет сбросить текущий контекст у текущего пользователя.
Для удаления таймера события при не ответе, можно сделать так: clearTimeOut('user_'.context_getuser().'_contexttimeout'); Тут тоже есть интересная штуковина, а именно context_getuser(), которая по всей видимости возвращает id текущего пользователя. А если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:
Код: Выделить всё
context_clear();
clearTimeOut('user_'.context_getuser().'_contexttimeout');
say('Контекст забыт.');
СкринПоказать

- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
Посмотрите у меня в коннекте. Там в самом начале находится глобальный контекст и в нем есть эта команда Забудь и ранее предложенная sergejey команда Помощь
- Bagir
- Сообщения: 1615
- Зарегистрирован: Вт сен 17, 2013 6:46 pm
- Откуда: Ярославская область город Углич
- Благодарил (а): 212 раз
- Поблагодарили: 375 раз
Re: Контексты в шаблонах поведения
А вот и славно! Фразы, которые говорит Алиса, начинаются с заглавной буквы. И у них нет шансов вызвать ложное совпадение с командами пользователя.sergejey писал(а):Там стоит опция регистро-независимости, но, возможно, для русского языка оно некорректно работает, надо будет попробовать разобраться. Но вообще я использую всегда нижний регистр и программы распознавания, на сколько я знаю, всегда в нижнем регистре передают.BlackWarrior писал(а):кстати, оно регистрозависимо оказывается(((((((((
- Amarok
- Сообщения: 1427
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
- Благодарил (а): 460 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Контексты в шаблонах поведения
Предлагаю Забудь прировнять к Ой всё 

Моя Алиска живёт на Proxmox в Debian 12
-
- Сообщения: 1473
- Зарегистрирован: Сб окт 12, 2013 11:03 pm
- Благодарил (а): 49 раз
- Поблагодарили: 327 раз
Re: Контексты в шаблонах поведения
Или "*дура*" 
У меня когда не срабатывает на 4 раз, я пользуюсь шаблоном: "повтори. Я дура!"
Конечно глупо издеваться над бездушными алгоритмами, но подымает настроение.
Особо в прошлом году всем понравилась ёлочка. Детям просто прикольно. Для взрослых "Раз Два Три. Дура ёлочка гори"
PS. По моему у меня это слово должно включать контекст. "Сам такую сделал"

У меня когда не срабатывает на 4 раз, я пользуюсь шаблоном: "повтори. Я дура!"
Конечно глупо издеваться над бездушными алгоритмами, но подымает настроение.
Особо в прошлом году всем понравилась ёлочка. Детям просто прикольно. Для взрослых "Раз Два Три. Дура ёлочка гори"
PS. По моему у меня это слово должно включать контекст. "Сам такую сделал"

- Рейтинг: 1.16%
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4