Демонстрация МДМ через Яндекс станцию мини
Модератор: immortal
- Djeday999
- Сообщения: 45
- Зарегистрирован: Сб май 29, 2021 3:04 pm
- Откуда: Екатеринбург
- Благодарил (а): 6 раз
- Поблагодарили: 9 раз
Демонстрация МДМ через Яндекс станцию мини
Приветствую!
Необходимо научить Алису (через Яндекс станцию мини) проговаривать свои умения в умном доме. Раньше были DemoSay, но они почему-то я так понял отвалились. Задавались вопросы по этому поводу, но ответов никто не дал. Пробовал сам (программист из меня никудышный) что-то состряпать (через Say), но Алиса не проговаривает предложения до конца и сразу болтает следующую строку. Пробовал вставлять sleep - ей пофиг.
Мне хотя бы пару строк, чтоб сказала какая погода на улице и о том, что умеет включать лампочку в коридоре.
Необходимо научить Алису (через Яндекс станцию мини) проговаривать свои умения в умном доме. Раньше были DemoSay, но они почему-то я так понял отвалились. Задавались вопросы по этому поводу, но ответов никто не дал. Пробовал сам (программист из меня никудышный) что-то состряпать (через Say), но Алиса не проговаривает предложения до конца и сразу болтает следующую строку. Пробовал вставлять sleep - ей пофиг.
Мне хотя бы пару строк, чтоб сказала какая погода на улице и о том, что умеет включать лампочку в коридоре.
-
- Сообщения: 197
- Зарегистрирован: Вт дек 24, 2019 2:09 pm
- Благодарил (а): 117 раз
- Поблагодарили: 34 раза
Re: Демонстрация МДМ через Яндекс станцию мини
Примерно с полгода-год назад я занимался этим вопросом. Алиса "уходила в зацикливание" и повторяла первый 'DemoSay. Причину нашел в "sapi.js". Что я исправлял, уже и не помню, т.к. сервер у меня на Малинке, а ноут с Win был в резерве, в общем похерил я этот резерв но в архивах можно порыться.
п.с.
С колонкой, я думаю, другие проблемы будут.
Raspberry Pi3 B+, v4.44, внешняя з/к
- Djeday999
- Сообщения: 45
- Зарегистрирован: Сб май 29, 2021 3:04 pm
- Откуда: Екатеринбург
- Благодарил (а): 6 раз
- Поблагодарили: 9 раз
Re: Демонстрация МДМ через Яндекс станцию мини
Поищите пожалуйста. Уж очень хочется перед гостями козырнуть.homester писал(а): ↑Пт июн 04, 2021 10:50 amПримерно с полгода-год назад я занимался этим вопросом. Алиса "уходила в зацикливание" и повторяла первый 'DemoSay. Причину нашел в "sapi.js". Что я исправлял, уже и не помню, т.к. сервер у меня на Малинке, а ноут с Win был в резерве, в общем похерил я этот резерв но в архивах можно порыться.
п.с.
С колонкой, я думаю, другие проблемы будут.
-
- Сообщения: 197
- Зарегистрирован: Вт дек 24, 2019 2:09 pm
- Благодарил (а): 117 раз
- Поблагодарили: 34 раза
Re: Демонстрация МДМ через Яндекс станцию мини
Уточняю: у меня Алиса на сервере, на Win надо установить "голос"
файл sapi.js сохранить.
Код заменить на этот:
Повторюсь, с колонкой будут другие проблемы.
Гуру прошу не пинать, я не программист, просто решал свои проблемы ...
файл sapi.js сохранить.
Код заменить на этот:
Код: Выделить всё
if (WScript.Arguments.length == 0) {
WScript.Quit();
}
var fnMD5 = '';
if (WScript.Arguments.Named.Exists("md5"))
fnMD5 = WScript.Arguments.Named("md5");
var text = new Array();
for (var i=0; i<WScript.Arguments.Unnamed.Count; i++)
text.push(WScript.Arguments.Unnamed(i));
var fso = new ActiveXObject("Scripting.FileSystemObject");
var scriptPath = fso.GetFile(WScript.ScriptFullName).ParentFolder;
strWavFileName = scriptPath+'/../cms/cached/voice/sapi_'+fnMD5+'.wav';
strMp3FileName = scriptPath+'/../cms/cached/voice/sapi_'+fnMD5+'.mp3';
var wShell = WScript.CreateObject("Wscript.Shell");
//if (!fso.FileExists(strMp3FileName)) {//no cached file
var sv = WScript.CreateObject("SAPI.SpVoice");
var oFilestream = WScript.CreateObject("SAPI.SpFileStream");
sv.WaitUntilDone(-1); // Don't be loud
//save to wav
oFilestream.Open(strWavFileName, 3, false);
sv.AudioOutputStream = oFilestream;
sv.speak(text.join(' '),0);
oFilestream.close();
//convert wav to mp3
var strCommand = scriptPath+"/lame.exe -V0 "+strWavFileName+" "+strMp3FileName;
wShell.run(strCommand, 0, true); //WaitUntilDone
//delete wav
if(fso.FileExists(strWavFileName)){
fso.DeleteFile(strWavFileName,true);
}
//}
//play mp3
var strCommand = scriptPath+"/madplay.exe \"" + strMp3FileName+"\"";
wShell.run(strCommand, 0, true);
Гуру прошу не пинать, я не программист, просто решал свои проблемы ...
- Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
- xor
- Сообщения: 2045
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 289 раз
- Поблагодарили: 632 раза
Re: Демонстрация МДМ через Яндекс станцию мини
Я.колонка произносит фразы не длиннее 100 символов. от этого и пляшите. это ограничение, вроде, уже встроено в я.девайсы, а я раньше функцию написал, которая режет фразу на предложения. но и там надо было с паузами между предложениями играть
Код: Выделить всё
//Скажем через Ирбис с учётом ограничения в 100 символов
function say_irbis($phrase)
{
if($phrase == '') return 0;
$phrase = str_replace(array('(', ')'), ' ', $phrase);
$phrase = preg_replace('/<.+?>/u', '', $phrase);
$phrase = preg_replace('/\s+/u', ' ', $phrase);
if(mb_strlen($phrase,'UTF-8')>=100){ //если фраза > 100 букв, поделим на предложения
$phs = explode('.',$phrase);
foreach($phs as $ph){ //переберем предложения
if(mb_strlen($ph,'UTF-8')<100){
//debmes($ph);
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>$ph));
}else{
$ph = mb_strimwidth($ph, 0,96, "..."); //не получилось( обрежем
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>$ph));
}
sleep(4);// на всякий случай
}
}else{ //скажем, как есть
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>$phrase));
}
return 1;
}
- За это сообщение автора xor поблагодарили (всего 2):
- SmoKE_xDDD (Пт июн 04, 2021 9:35 pm) • Djeday999 (Сб июн 05, 2021 12:59 pm)
- Рейтинг: 2.33%
win10 connect https://connect.smartliving.ru/profile/303
- Djeday999
- Сообщения: 45
- Зарегистрирован: Сб май 29, 2021 3:04 pm
- Откуда: Екатеринбург
- Благодарил (а): 6 раз
- Поблагодарили: 9 раз
Re: Демонстрация МДМ через Яндекс станцию мини
Алиска в Я.Колонке мне кажется через чур умная. Через эту команду она говорит не это, а реальную погоду за бортом. При создании демонстрации много чего она еще не могла сказать точно. Например свое имя .
Код: Выделить всё
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Я знаю, какая температура и влажность сейчас на улице.'));
- xor
- Сообщения: 2045
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 289 раз
- Поблагодарили: 632 раза
Re: Демонстрация МДМ через Яндекс станцию мини
не знаю, у меня четко различает и say, и command. Именно во втором случае она реальную погоду читаетDjeday999 писал(а): ↑Ср июн 09, 2021 6:08 pmАлиска в Я.Колонке мне кажется через чур умная. Через эту командуона говорит не это, а реальную погоду за бортом. При создании демонстрации много чего она еще не могла сказать точно. Например свое имя .Код: Выделить всё
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Я знаю, какая температура и влажность сейчас на улице.'));
win10 connect https://connect.smartliving.ru/profile/303
- Djeday999
- Сообщения: 45
- Зарегистрирован: Сб май 29, 2021 3:04 pm
- Откуда: Екатеринбург
- Благодарил (а): 6 раз
- Поблагодарили: 9 раз
Re: Демонстрация МДМ через Яндекс станцию мини
Пришлось создать 10 сценариев и это не предел для демонстрации. Зато не заикается сейчас. Сценарии запускаются друг за другом в определенном порядке и по времени, рассчитанному методом научного тыка после экспериментальных действий. Может кому будет интересно
Запускается через добавленное устройство в модуле Yandex Home.
Код: Выделить всё
Demo01
callAPI('/api/module/yadevices','GET',array('station'=>1,'command'=>'setVolume','volume'=>10));
sleep(3);
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Здравствуйте!'));
setTimeOut('DemoTimer',"runScript('Demo02');",2);
Demo02
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Меня зовут Алиса. Я помощница в этом доме и сейчас расскажу о том, что я знаю и умею.'));
setTimeOut('DemoTimer',"runScript('Demo03');",7);
Demo03
//Температура
$tempw=round(gg("Sensor_temp02.value"));
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Во-первых, я в курсе того, какая температура в разных комнатах. К примеру сейчас на кухне температура составляет '.round(gg("Sensor_temp02.value")).' '.GetNumberWord($tempw,array('градус','градуса','градусов')).' цельсия',2));
setTimeOut('DemoTimer',"runScript('Demo04');",11);
Demo04
//Температура
$tempw=round(gg("Sensor_temp01.value"));
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'А в ванной '.round(gg("Sensor_temp01.value")).' '.GetNumberWord($tempw,array('градус','градуса','градусов')).' '));
setTimeOut('DemoTimer',"runScript('Demo05');",5);
Demo05
//Температура
$tempw=round(gg("ow_fact.temperature"));
//влажность
$tempcels=round(gg("ow_fact.humidity"));
//давление
$pressure=(float)gg("ow_fact.pressure_mmhg");
if ($pressure<728) {
$stp=" Атмосферное давление пониженное. ";
} elseif ($pressure>768) {
$stp=" Атмосферное давление повышенное. ";
} else {
$stp=" Атмосферное давление нормальное. ";
}
//ветер
$WindSpeed=(float)gg("ow_fact.wind_speed");
if ($WindSpeed<1) {
$stw.=" Ветра нет.";
} elseif ($WindSpeed<3) {
$stw.=" Ветер слабый.";
} elseif ($WindSpeed<6) {
$stw.=" Ветер сильный.";
} elseif ($WindSpeed<9) {
$stw.=" Ветер очень сильный.";
} else {
$stw.=" Ожидается ураган ";
}
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Так же я знаю, что на улице сейчас '.gg("ow_fact.weather_type").'. '.round(gg("ow_fact.temperature")).' '.GetNumberWord($tempw,array('градус','градуса','градусов')).' цельсия. "." Относительная влажность: '.round(gg("ow_fact.humidity")).' '.GetNumberWord($tempcels,array('процент','процента','процентов')).'. '.$stp.$stw.';'));
setTimeOut('DemoTimer',"runScript('Demo06');",12);
Demo06
//проверяем кто дома
$user=getObjectsByClass("Users");
$total=count($user);
for($i=0;$i<$total;$i++) {
$user[$i]['presence']=getGlobal($user[$i]['TITLE'].'.presence');
$user[$i]['user']=getGlobal($user[$i]['TITLE'].'.fullName');
if ($user[$i]['presence']) {
$res_user[]=$user[$i]['user'];
}
}
if ($res_user){
$isHomeText="Сейчас дома: ".implode(", ",$res_user);
}else{
$isHomeText="Если сейчас дома кто-то есть, то я его не знаю.";
}
//склонения проценты
$proc=round(gg("Lena.BattLevel"));
$proc1=round(gg("Nastya.BattLevel"));
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'В мои обязанности входит наблюдение за тем, где находятся мои хозяева. '.$isHomeText.' Уровень заряда телефона Лены сейчас '.gg('Lena.BattLevel').' '.GetNumberWord($proc,array('процент','процента','процентов')).', а у Насти '.gg('Nastya.BattLevel').' '.GetNumberWord($proc1,array('процент','процента','процентов')).'. Если телефон у кого-нибудь будет разряжен, то я об этом предупрежу.'));
setTimeOut('DemoTimer',"runScript('Demo07');",18);
Demo07
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Я могу управлять освещением в зависимости от присутствия, восхода и заката солнца. Сейчас поиграю освещением на кухне.'));
setTimeOut('DemoTimer',"runScript('Demo08');",11);
Demo08
sg('Relay04.status', '1'); sleep (1);
sg('Relay05.status', '1'); sleep (3);
sg('Relay05.status', '0'); sleep (1);
sg('Relay04.status', '0'); sleep (1);
if (gg("DarknessMode.active")){
sg('Relay04.status', '1'); sleep (1);
sg('Relay05.status', '1'); sleep (1);
}else{
sg('Relay04.status', '0'); sleep (1);
sg('Relay05.status', '0'); sleep (1);
}
setTimeOut('DemoTimer',"runScript('Demo09');",5);
Demo09
callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Кроме управления освещением, я могу помочь и с развлечением. Например сейчас включу на телевизоре канал карусель для Алексея.'));
setTimeOut('DemoTimer',"runScript('Demo10');",8);
Demo10
TuyaIR('bf935764d7d65cc3d3ipqh', '8');
- За это сообщение автора Djeday999 поблагодарил:
- Sergey.Chek (Пт янв 13, 2023 12:59 am)
- Рейтинг: 1.16%