2013/11/25 - Поговорить с роботом
2013-11-26 15:13:56 (читать в оригинале)
Простенькая безделушка, но забавная — произносишь в микрофон слово, а компьютер тебе в ответ голосом сообщает информацию обо всем на свете, что ни спросишь:
Что используем?
— API Гугля — распознавание речи
— API Гугля — синтез речи
— lurkmore.to — вычленение первого абзаца статьи
— ну и элементарные консольные утилитки по обработке звука: rec, flac, ffmpeg, sox, lame
Все работает на трех консольных файликах (консольных! не надо php браузером лезть открывать :)
info.sh - основной скрипт
#!/bin/bashwhile : ; do
rm ./voice.flac ; rec -c 1 -r 16000 voice.wav silence 1 0.3 3% 1 0.3 3%
flac -f -s voice.wav -o voice.flac 2>&1 >/dev/null
php lurk.php `php google.php`
done
google.php - распознаём текст
#!/usr/bin/php<?php
$ch=curl_init(); curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,array('myfile'=>'@voice.flac'));
curl_setopt($ch,CURLOPT_URL,'https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU');
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type: audio/x-flac; rate=16000'));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $r=curl_exec($ch); curl_close($ch);
$json=json_decode($r,true);
if(empty($json['hypotheses'][0]['utterance'])) die('');
die($json['hypotheses'][0]['utterance']);
?>
lurk.php - ищем и зачитываем голосом информацию
#!/usr/bin/php<?php
if($argc<=1) die('error: arg'); $argv[0]=''; $q=trim(implode(' ',$argv));
passthru("rm speechout*.mp3");
$s=file_get_contents("http://lurkmore.to/".urlencode($q));
if($s=='') playz("не знаю"); else {
$a=explode("<p><b>",$s); $s=$a[1];
$s=preg_replace("/<\/p>\n.*$/si","",$s); $s=preg_replace("/\([^\)]+\)/s","",$s);
$s=strip_tags($s);$s=preg_replace("/\s+/s"," ",$s); $r=explode(" ",$s);
$get=0; $hore=0; $z=''; foreach($r as $l) { $z.=" ".$l; $hore+=(strlen($l)+1);
if(strstr($l,'.') && $hore >300 ) break;
if(strlen($z)>50 && (strstr($l,'.')||strstr($l,',')) ) $z=playz($z);
} playz($z);
}
$e=implode(" ",glob('speechout*')); passthru("play ".$e."");
if($e=='') exit;
passthru('lame voice.wav --resample 22050 voice.mp3 ; ffmpeg -i "concat:voice.mp3|'
.str_replace(' ','|',$e).'" -acodec copy "results/'.$q.'.mp3"');
function playz($z) { global $get; $z=trim($z); if($z=='') return '';
$g=passthru('wget -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"'
.' "http://translate.google.com/translate_tts?q='.urlencode($z).'&tl=ru" -O speechout'.($get).'_.mp3 '
.' ; sox --show-progress speechout'.($get).'_.mp3 speechout'.($get).'.mp3 speed 1.5 pitch -500'
.' ; rm speechout'.($get++).'_.mp3'
.' &');
return '';
}
?>
У кого Линукс, можете сами проверить. Я думаю, осталось только запихнуть этого оракула в маленькую малахитовую шкатулку с Raspberry Pi внутри, вписать более умный разбор строки (реакция лишь на те фразы, которые начинаются на «что такое» или «кто такой»), и уже можно ехать в Сколково демонстрировать искусственный интеллект высоким правительственным чиновникам Минсвязи и Минобразования.
Оригинал заметки находится по адресу http://lleo.me/dnevnik/2013/11/25.html, там можно оставить комментарии.