логин: 
<< предыдущая заметкаследующая заметка >>
25 ноября 2013
Поговорить с роботом

Простенькая безделушка, но забавная — произносишь в микрофон слово, а компьютер тебе в ответ голосом сообщает информацию обо всем на свете, что ни спросишь:

линукс
пушкин
путин
каганов

Что используем?
— API Гугля — распознавание речи
— API Гугля — синтез речи
— lurkmore.to — вычленение первого абзаца статьи
— ну и элементарные консольные утилитки по обработке звука: sox (в нем же rec), flac, ffmpeg, lame (если sox выдает ошибку отсутствия библиотек libasound, то еще alsa-lib) Все работает на трех консольных файликах (консольных! не надо php браузером лезть открывать :)

info.sh - основной скрипт

#!/bin/bash
while : ; 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 внутри, вписать более умный разбор строки (реакция лишь на те фразы, которые начинаются на «что такое» или «кто такой»), и уже можно ехать в Сколково демонстрировать искусственный интеллект высоким правительственным чиновникам Минсвязи и Минобразования.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
Страницы, которые привлекли мое внимание за последние дни, рекомендую:
2017-11-22 В июне 1982
архив ссылок
Оставить комментарий