Re: Управление Умным Домом с помощью голоса
Добавлено: 16 ноя 2013, 12:46
Спасибо. Вы подтолкнули начать писать пост
Код: Выделить всё
#!/usr/bin/php
<?php
$time_script = microtime(true);
$v = '';
for ($i = 0; $i < 1000; $i++) $v .= file_get_contents("http://192.168.0.14/sec/?pt=0&cmd=get")."\n";
$fp = fopen("rec.txt", 'w+');
fwrite($fp, $v);
fclose($fp);
echo "\n".microtime(true) - $time_script."\n";
Частота дискретизации нужна 8 кГц, меньше слишком тяжко распознавать хоть что-то. А так как за основу взят Мега девайс, то пока увы... (Если прошивка сейчас позволяет - тогда это прекрасно. Не слежу в последнее время за релизами... )Давно никаких новостей про распознование голоса на arm не было, может какие сложности возникли??
С активацией по ключевому слову в этой ветке уже было несколько решений. Через CVoiceControl, через php (Безумный велосипед, но работал), через Google. Можно и через Андроид (оффлайн - распознавание)... Вариантов куча.А кто ни будь с активацией по ключевому слову продвинулся куда ни будь?
Проблема в пункте номер два =)dragon rider писал(а):поддержу вопрос с активацией по ключевому слову.
Есть идеи как реализовать такую схему?
1. Записать ключевое слово, типа Алиса.
2.Когда система его распознает(без гугла) отправляет команду подтверждения типа "Слушаю"
3. И только после этого производить запись команды и отправка ее гуглу на распознание
Ну это я все читал, в указанных примерах нет решения для пункта 2ArtSamovar писал(а): Проблема в пункте номер два =)
Почитайте от сюда или отсюда. Первая это велосипед на php, вторая CVoiceControl.
Код: Выделить всё
<?php
define('ROOT', '/tmp/');
function ivonaTTS($message){
$filename=md5($message).'.mp3';
if (file_exists(ROOT.'cached/voice/'.$filename)) {
@touch(ROOT.'cached/voice/'.$filename);
return ROOT.'cached/voice/'.$filename;
}
$startUrl='http://www.ivona.com/us/';
$result = curlSet($startUrl);
if(!$result){
return $result;
}else{
file_put_contents(ROOT.'out.html',$result);
system("grep voicetest.php?rtr=1 ".ROOT."out.html > ".ROOT."out2.html");
$content=file_get_contents(ROOT.'out2.html');
$content = trim($content);
$content=parse_url($content);
$content=explode('&',$content['query']);
$content = str_replace('";', "", $content['4']);
if(file_exists(ROOT.'out.html')) unlink(ROOT.'out.html');
if(file_exists(ROOT.'out2.html')) unlink(ROOT.'out2.html');
$message=base64_encode($message);
$matrix=array('/' => '_', '+' => '-', '=' => '.',);
$message = strtr($message, $matrix);
$endUrl='http://www.ivona.com/voicetest.php?rtr=1&t2r='.$message.'&v2r=cnVfdGF0eWFuYQ..&lang=us&'.$content;
$result = curlSet($endUrl);
if ($result) {
if (!is_dir(ROOT.'cached/voice')) {
@mkdir(ROOT.'cached/voice', 0777);
}
file_put_contents(ROOT.'cached/voice/'.$filename, $result);
return ROOT.'cached/voice/'.$filename;
} else {
return false;
}
}
}
function curlSet($url){
$options = array(
//CURLOPT_HEADER=>1, //Расскоментировать если нужно увидеть ответ от сервера.
CURLOPT_COOKIE=>1,
//CURLOPT_VERBOSE=>0,
CURLOPT_URL=>trim($url),
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_FOLLOWLOCATION=>true, //Если происходит редирект, то переходим
CURLOPT_COOKIEJAR=>'cookie.txt', // Записываем cookies в файл, чтобы потом можно было их считать
CURLOPT_COOKIEFILE=>'cookie.txt', // Теперь читаем cookies с файла;
CURLOPT_USERAGENT=>'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/33.0.1750.152 Chrome/33.0.1750.152 Safari/537.36',
);
$curl = curl_init();
curl_setopt_array($curl, $options);
$result=curl_exec($curl);
if(curl_error($curl)){
return curl_error($curl);
}else{
return $result;
}
}
?>
Поясню: Google Speech API закрыли для широкой общественности.arbuzmaster писал(а):Для тех у кого перестал работать google speech api https://github.com/gillesdemey/google-speech-v2
Код: Выделить всё
exec("flac -f -s audio/current.wav -o audio/current.flac");
$json_array=exec("curl -X POST --data-binary @audio/current.flac -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36' -H 'Content-Type: audio/x-flac; rate=44100;' 'https://www.google.ru/speech-api/v2/recognize?output=json&lang=ru-RU&key=AIzaSyCnl6MRydhw_5fLXIdASxkLJzcJh5iX0M4'");
$array=json_decode($json_array, true);
echo "<br /><br />Распознанный текст: ".$array['result'][0]['alternative'][0]['transcript']."<br /><br />";
# Тут Фестиваль рассказывает распознанную фразу
exec("/usr/bin/festival -b \"(begin (voice_msu_ru_nsh_clunits) (SayText \\\"".$array['result'][0]['alternative'][0]['transcript']."\\\" nil))\"&");
unlink("audio/current.wav");
unlink("audio/current.flac");
Код: Выделить всё
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Умный Дом</title>
<script language="javascript" type="text/javascript">
/* Создание нового объекта XMLHttpRequest для общения с Web-сервером */
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
xmlHttp = false;
}
}
@end @*/
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
</script>
<meta charset="UTF-8" />
<style>
* {
font-family: Verdana, Arial, sans-serif;
font-size: 20px;
}
a:link {
color:#000;
text-decoration: none;
}
a:visited {
color:#000;
}
a:hover {
color:#33F;
}
body {
text-align: center;
}
.button {
background: -webkit-linear-gradient(top,#008dfd 0,#0370ea 100%);
border: 1px solid #076bd2;
border-radius: 3px;
color: #fff;
display: none;
font-size: 13px;
font-weight: bold;
line-height: 1.3;
padding: 8px 25px;
text-align: center;
text-shadow: 1px 1px 1px #076bd2;
letter-spacing: normal;
}
.final {
color: black;
padding-right: 3px;
}
.interim {
color: gray;
}
.info {
font-size: 14px;
text-align: center;
color: #777;
display: none;
}
.sidebyside {
display: inline-block;
width: 45%;
min-height: 40px;
text-align: left;
vertical-align: top;
}
#headline {
font-size: 40px;
font-weight: 300;
}
#info {
font-size: 20px;
text-align: center;
color: #777;
visibility: hidden;
}
#results {
font-size: 14px;
font-weight: bold;
border: 1px solid #ddd;
padding: 15px;
text-align: left;
min-height: 150px;
width: 500px;
margin: 0 auto;
}
#start_button {
border: 0;
padding: 0;
width: 50px;
height: 50px;
cursor: pointer;
vertical-align: top;
}
#info_speak_now,
#info_no_speech,
#info_no_microphone,
#info_upgrade {
display: none;
}
</style>
</head>
<body>
<div id="messages">
<input type="button" id="start_button" onclick="startButton(event)" />
<!-- сообщения на разные случаи -->
<p id="info_start">Кликни на микрофон чтобы начать раздавать команды.</p>
<p id="info_speak_now">Командуй!</p>
<p id="info_no_speech">Голос не обнаружен.</p>
<p id="info_no_microphone">Микрофон не найден.</p>
<p id="info_upgrade">Твой браузер не поддерживает Web Speech API.</p>
</div>
<div id="results">
<span id="final_span" class="final"></span>
</div>
<script>
var start_button = document.getElementById('start_button'),
recognizing = false, // флаг идет ли распознование
final_transcript = '';
// проверяем поддержку speach api
if (!('webkitSpeechRecognition' in window)) {
start_button.style.display = "none";
showInfo("info_upgrade");
} else { /* инициализируем api */
/* создаем объект */
var recognition = new webkitSpeechRecognition();
/* базовые настройки объекта */
recognition.lang = 'ru'; // язык, который будет распозноваться. Значение - lang code
recognition.continuous = true; // не хотим чтобы когда пользователь прикратил говорить, распознование закончилось
/* метод вызывается когда начинается распознование */
recognition.onstart = function() {
recognizing = true;
showInfo('info_speak_now'); // меняем инфо текст
};
/* обработчик ошибок */
recognition.onerror = function(event) {
if (event.error == 'no-speech') {
showInfo('info_no_speech');
}
if (event.error == 'audio-capture') {
showInfo('info_no_microphone');
}
};
/* метод вызывается когда распознавание закончено */
recognition.onend = function() {
recognizing = false;
recognition.start();
showInfo('info_start');
};
/*
метод вызывается после каждой сказанной фразы. Параметра event используем атрибуты:
- resultIndex - нижний индекс в результирующем массиве
- results - массив всех результатов в текущей сессии
*/
recognition.onresult = function(event) {
/*
обход результирующего массива
*/
for (var i = event.resultIndex; i < event.results.length; ++i) {
/* если фраза финальная (уже откорректированная) сохраняем в конечный результат */
if (event.results[i].isFinal) {
final_transcript += event.results[i][0].transcript.toLowerCase();
}
}
final_span.innerHTML = final_transcript;
var url = "/text.php?text=" + encodeURI(final_transcript);
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
final_transcript = ''; // очищаем распознанный текст
};
}
/* показ нужного сообщения */
function showInfo(id) {
var messages = document.querySelectorAll('p');
for(i=0; i<messages.length; i++) messages[i].style.display = 'none';
document.getElementById(id).style.display = 'block';
}
/* обработчик клика по микрофону */
function startButton(event) {
if (recognizing) { // если запись уже идет, тогда останавливаем
recognition.stop();
document.getElementById('final_span').innerHTML = '';
return;
}
recognition.start();
}
</script>
</body>
</html>