Введение
Как-то вечером бродя по просторам 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.