Pull to refresh

Разговор с компьютером

Введение


Как-то вечером бродя по просторам youtube, смотря всякие интересные ролики. Я наткнулся на видео где какой-то программист разговаривает со своим компьютером. Мне стала интересна эта тема и я решил сделать что то своё. Результат работы и немного кода под катом.

Распознавание речи


Что бы не заморачиваться с распознаванием речи я решил использовать Web Speech API. Поддерживается пока только в браузере Google Chrome.

 /* создаем объект  */
 var recognition = new webkitSpeechRecognition();
 /* язык, который будет распознаваться  */
 recognition.lang = 'ru';
 /* завершаем распознавание после окончания речи.  */
 recognition.continuous = false;
 /* отключаем промежуточные результаты */
 recognition.interimResults = false; 

 /* Функция распознавания речи и вывода слов в текстовое поле */
recognition.onresult = function (event) {
    for (var i = event.resultIndex; i < event.results.length; ++i) {
        if (event.results[i].isFinal) {
          text.value=event.results[i][0].transcript;
		  req=event.results[i][0].transcript;
        }
    }
};

 /* Событие окончания распознавания */
recognition.onend = function() { 
if (req.length>0) {
xmlhttp.open('GET', 'http://artemka.me/speech/function.php?text='+req+'&cook='+cook, false);
xmlhttp.send(null);
send(xmlhttp.responseText)
}
recognition.start();
}


Синтез речи


Для синтеза речи сначала хотел использовать от google translate. Но у этого голоса была слишком плохая интонация. Поэтому было принято решение поискать другой сервис для синтеза речи. Поиски в интернете привели меня на сайт acapela-group. Было решено использовать именно его.
Для этого написал простой скрипт на php для отправки запроса с текстом на сервер.
Скрипт возвращает mp3 файл с синтезированной речью. Для воспроизведения этого файла в проекте используется плеер Uppod.

 $text = $_GET['text'];
  $url= "https://vaassl3.acapela-group.com/Services/Synthesizer";
  $ch = curl_init( $url );
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
  curl_setopt($ch, CURLOPT_TIMEOUT, 120);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded")); 
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, "prot_vers=2&req_voice=alyona22k&cl_env=FLASH_AS_3.0&req_text=%5Cvct%3D100%5C+%5Cspd%3D180%5C+$text&req_asw_type=STREAM&cl_vers=1-30&req_err_as_id3=yes&cl_login=ACAPELA_BOX&cl_app=PROD&cl_pwd=0g7znor2aa");
$content = curl_exec( $ch );
curl_close( $ch );
header('Content-type: audio/mpeg');
header('Content-Length: 99999999');
echo $content ;


Искусственный интеллект


С голосовыми технологиями разобрались. Теперь надо придумать где брать базу ответов для разговора с пользователем. Google подсказал мне очень хороший сервис который как раз подходил для меня. Это был сайт iii.ru предоставляющий виртуальных собеседников.
В сети был найден класс для работы с сервисом посредством PHP.

class ModIiiRu
{
    // IiiID можно взять из ссылки на бота из рейтинга
    const IiiID = 'cd3b0e81-3491-4d8a-a100-5e88581af39d';
    public function cmd($cmd)
    {
	global $cook;
        $data = json_encode(array($cook, $cmd));
        $data = self::sendMessage(self::xorKey($data, false));
        $data = json_decode($data);
        $text = $data->result->text->value;
        return $text;
        //$this->say($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);
    }
    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++;
        }
        return $decode ? base64_decode($result) : base64_encode($result);
    }
}
$mod = new ModIiiRu();
$title = $mod->cmd($text);

Используется так $mod->cmd('сообщение виртуальному собеседнику');

Результат


Результат можно посмотреть здесь https://artemka.me/speech Для активации голоса необходимо кликнуть по кнопку и разрешить доступ к микрофону.
Для того что бы каждый раз не разрешать доступ к микрофону был сгенерирован ssl сертификат для доступа к сайту по протоколу https.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.