Архитектура голосового модуля и голосовой чат iii.ru

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Архитектура голосового модуля и голосовой чат iii.ru

Сообщение ErmolenkoM » Ср сен 18, 2013 10:11 pm

Добрый день!
Давно мечтал, что бы компьютер со мной разговаривал, и вот сбылось - Алиса(MajorDoMo) говорит.
Настраивать все в методе commandReceived мне показалось уныло, так что для команд я создал объект voice_command и заполнил его нужными и не очень командами.
текст commandReceived теперь не меняется и выглядит так:

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

$command=$params['command'];

$short_command='';
$dt=recognizeTime($command,$short_command);

global $find;
$find='No';

//выход из режима Диалога - переход в командный режим
if  (!getGlobal("ThisComputer.voice_command")
    &&preg_match('/'.mb_strtolower("командный режим",'utf-8').'(.*)/is',mb_strtolower($command,'utf-8'),$m)){
  callMethod("командный режим".".action");
  return;
}

if (getGlobal("ThisComputer.voice_command")){
  $objects=getObjectsByClass("voice_command");
  foreach($objects as $obj) {
   if (preg_match('/'.mb_strtolower($obj['TITLE'],'utf-8').'(.*)/is',mb_strtolower($command,'utf-8'),$m)) {
    if ($dt>0) {
     addScheduledJob("command".$dt,"processCommand('".$short_command."');",$dt);
     say('Задача принята');
     return;
    }
     callMethod($obj['TITLE'].".action",array("command"=>$m[1]));
     $find='Yes';
   }
  }
  if ($find=='No'){
   say('Неизвестная команда: '.$command);
  }
}else{
  callMethod("Chat_request.action",array("command"=>$command));
}


исключение из общей обработки сделано для команды входа в режим команд.
Сами action у команд настроены по-разному. Примеры можно смотреть у меня в коннекте(msh555).

Теперь интеллектуальный чат.
Что бы не создавать самому с нуля я прикрутил хороший чат-бот iii.ru
Текст PHP украден здесь http://www.ab-log.ru/forum/viewtopic.php?f=1&t=475
У меня сходу не заработало, пришлось повозиться. Если будут вопросы - спрашивайте, помогу.
текст Chat_request.action (есть в коннекте)

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

class ModIiiRu
{
    const IiiID = '3aecd642-3f4c-431d-8124-123906a34882';
    public function cmd($cmd)
    {
        $data = json_encode(array(self::IiiID, $cmd));
        $data = self::xorKey($data, false); 
        $data = self::sendMessage($data);
        $data = json_decode($data);
        $text = $data->result->text->value;
        return $text;
    }

    private static function sendMessage($send){
        $url='http://iii.ru/api/2.0/json/Chat.request';
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 3);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $send);
        $res = curl_exec($ch);
        if (!$res)
            return false;
        curl_close($ch);
        return self::xorKey($res, true);
    }

    public static function xorKey($res, $decode)
    {
        $key = "some very-very long string without any non-latin characters due to different string representations inside of variable programming languages";
        $keylen = strlen($key);
        $res = $decode ? base64_decode($res) : base64_encode($res);
        $strlen = strlen($res);
        $i = 0;
        $result = '';
        while ($i<$strlen)
        {
            $buf = $res[$i] ^ $key[$i % $keylen];
            $result .= $buf;
            $i++;
        }
        $result= $decode ? base64_decode($result) : base64_encode($result);
        return $result;
    }
}
$command=$params['command'];
$mod = new ModIiiRu();
say($mod->cmd($command));
Удачных вам диалогов с Алисой!
Последний раз редактировалось ErmolenkoM Сб сен 21, 2013 9:43 am, всего редактировалось 1 раз.
За это сообщение автора ErmolenkoM поблагодарил:
AHgpeu (Сб апр 04, 2015 3:28 pm)
Рейтинг: 1.16%
aka msh555
Cubian на Cubietruck, Connect
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение Amarok » Чт сен 19, 2013 7:27 am

Объект voice_command создавать в корне?
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение ErmolenkoM » Чт сен 19, 2013 7:45 am

BlackWarrior писал(а):Объект voice_command создавать в корне?
Создаем КЛАСС voice_command. Обьекты этого класса называем именами команд, а в метод action помещаем необходимые действия.
Пример можно посмотреть у меня: http://connect.smartliving.ru/profile/57
aka msh555
Cubian на Cubietruck, Connect
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение ErmolenkoM » Чт сен 19, 2013 7:48 am

Немного причесал commandReceived. Теперь все что не распозналось как команда будет отправлено в чат

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

$command=$params['command'];
$short_command='';
$dt=recognizeTime($command,$short_command);
$objects=getObjectsByClass("voice_command");
foreach($objects as $obj){
  if (preg_match('/'.mb_strtolower($obj['TITLE'],'utf-8').'(.*)/is',mb_strtolower($command,'utf-8'),$m)) {
    if ($dt>0) {
      addScheduledJob("command".$dt,"processCommand('".$short_command."');",$dt);
      say('Задача принята');
      return;
    }
    callMethod($obj['TITLE'].".action",array("command"=>$m[1]));
    return;
  }
}
// если голосовых команд не найдено - отправим в чат
callMethod("Chat_request.action",array("command"=>$command));
aka msh555
Cubian на Cubietruck, Connect
Galakart
Сообщения: 66
Зарегистрирован: Вт авг 06, 2013 3:49 pm
Откуда: Новокузнецк
Благодарил (а): 0
Поблагодарили: 7 раз

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение Galakart » Чт сен 19, 2013 9:20 am

Ещё можно результат вот такого запроса:
SELECT TITLE, DESCRIPTION FROM objects WHERE CLASS_ID=26
(CLASS_ID подставить от класса voice_command)
вывести в виде html-таблички на одну из домашних страниц, и получится этакая памятка доступных команд
Linux, Raspberry pi
Мой профиль в CONNECT
MajorDroid
dark_avenger
Сообщения: 9
Зарегистрирован: Чт окт 17, 2013 2:09 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение dark_avenger » Чт окт 17, 2013 10:35 pm

Уважаемый msh555,
А ваш код еще рабочий?
Мне инф ничего не отвечает :( . Быть может алгоритм был изменен?
Кстати истоки информации пошли отсюда: http://forum.antichat.ru/thread209657.html
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение ErmolenkoM » Пт окт 18, 2013 7:34 am

dark_avenger писал(а):А ваш код еще рабочий?
Быть может алгоритм был изменен?
Код рабочий, у меня отлично работает.
Делаем вот что:
1. берем код здесь, тут он чуть другой.
http://connect.smartliving.ru/profile/57
метод Chat_request.
Если заработало - отлично.
Если нет, то нужно изменить идентификатор Инфа.
Делаем так: в хроме включаем отладку, заходим на iii.ru, болтаем с Инфом.
Смотрим что отправляется Инфу. Там зашифрованный идентификатор и отправляемый текст.
Подставляем шифрованный код в закоменченые строки моего метода - они расшифровываются. Меняем идентификатор на полученный.

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

$data1 ="JBYkV3oyBgg2ejNWPzoRBTYUBBA/ICNbNA15AyYzLVo7JxBSIS1DFCIpYBU7IDMCeicpCD4iLyULSzRhVDkPcQcbY1VZPy8MKjRTSQ:";
$data1 = $mod->xorKey($data1, true);
say($data1);
это для расшифровки.
aka msh555
Cubian на Cubietruck, Connect
dark_avenger
Сообщения: 9
Зарегистрирован: Чт окт 17, 2013 2:09 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение dark_avenger » Пт окт 18, 2013 8:35 am

Спасибо ) Этот способ проще )
А я уже исходники раскопал и выяснил, где он хранит этот УИД:
%AppData%\Local\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\WritableRoot\#SharedObjects\XPCYG958\iii.ru\static\Vishnu3.swf\Vishnu.sol
Структура файла примерно следующая:
Заголовок UUID CUID...UUID CUID
Нам нужен CUID нашего бота... без буквы I в начале.

И он генерируется при начале новой сессии. Если файл удалить, бот забудет тебя.
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение ErmolenkoM » Пт окт 18, 2013 8:52 am

Вау! Круто! Я тоже смотрел исходники, разобрался как расшифровать CUID, но не смог понять где он хранится.
Не понимаю, почему мой CUID не заработал у тебя? Или он как-то в IP привязан?
aka msh555
Cubian на Cubietruck, Connect
dark_avenger
Сообщения: 9
Зарегистрирован: Чт окт 17, 2013 2:09 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Архитектура голосового модуля и голосовой чат iii.ru

Сообщение dark_avenger » Пт окт 18, 2013 9:15 am

Дак я не использовал твой, я сначала выдрал именно UUID viu-piu
Ответить