Демонстрация МДМ через Яндекс станцию мини

Объявления о поиске исполнителя для оказание услуг и/или создания продукта

Модератор: immortal

Ответить
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

Демонстрация МДМ через Яндекс станцию мини

Сообщение Djeday999 » Пт июн 04, 2021 7:30 am

Приветствую!
Необходимо научить Алису (через Яндекс станцию мини) проговаривать свои умения в умном доме. Раньше были DemoSay, но они почему-то я так понял отвалились. Задавались вопросы по этому поводу, но ответов никто не дал. Пробовал сам (программист из меня никудышный) что-то состряпать (через Say), но Алиса не проговаривает предложения до конца и сразу болтает следующую строку. Пробовал вставлять sleep - ей пофиг.
Мне хотя бы пару строк, чтоб сказала какая погода на улице и о том, что умеет включать лампочку в коридоре.
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение homester » Пт июн 04, 2021 10:50 am

Djeday999 писал(а):
Пт июн 04, 2021 7:30 am
Раньше были DemoSay, но они почему-то я так понял отвалились.
Примерно с полгода-год назад я занимался этим вопросом. Алиса "уходила в зацикливание" и повторяла первый 'DemoSay. Причину нашел в "sapi.js". Что я исправлял, уже и не помню, т.к. сервер у меня на Малинке, а ноут с Win был в резерве, в общем похерил я этот резерв :( но в архивах можно порыться.

п.с.
С колонкой, я думаю, другие проблемы будут.
Raspberry Pi3 B+, v4.44, внешняя з/к
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение Djeday999 » Пт июн 04, 2021 11:22 am

homester писал(а):
Пт июн 04, 2021 10:50 am
Djeday999 писал(а):
Пт июн 04, 2021 7:30 am
Раньше были DemoSay, но они почему-то я так понял отвалились.
Примерно с полгода-год назад я занимался этим вопросом. Алиса "уходила в зацикливание" и повторяла первый 'DemoSay. Причину нашел в "sapi.js". Что я исправлял, уже и не помню, т.к. сервер у меня на Малинке, а ноут с Win был в резерве, в общем похерил я этот резерв :( но в архивах можно порыться.

п.с.
С колонкой, я думаю, другие проблемы будут.
Поищите пожалуйста. Уж очень хочется перед гостями козырнуть.
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение homester » Пт июн 04, 2021 11:45 am

Уточняю: у меня Алиса на сервере, на Win надо установить "голос"
файл 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);
Повторюсь, с колонкой будут другие проблемы.

Гуру прошу не пинать, я не программист, просто решал свои проблемы ...
За это сообщение автора homester поблагодарил:
Djeday999 (Пт июн 04, 2021 1:10 pm)
Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение xor » Пт июн 04, 2021 8:01 pm

Я.колонка произносит фразы не длиннее 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%
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение Djeday999 » Ср июн 09, 2021 6:08 pm

Алиска в Я.Колонке мне кажется через чур умная. Через эту команду

Код: Выделить всё

callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Я знаю, какая температура и влажность сейчас на улице.'));
она говорит не это, а реальную погоду за бортом. При создании демонстрации много чего она еще не могла сказать точно. Например свое имя :shock: .
Аватара пользователя
xor
Сообщения: 2036
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 283 раза
Поблагодарили: 628 раз

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение xor » Ср июн 09, 2021 10:23 pm

Djeday999 писал(а):
Ср июн 09, 2021 6:08 pm
Алиска в Я.Колонке мне кажется через чур умная. Через эту команду

Код: Выделить всё

callAPI('/api/module/yadevices','GET',array('station'=>1,'say'=>'Я знаю, какая температура и влажность сейчас на улице.'));
она говорит не это, а реальную погоду за бортом. При создании демонстрации много чего она еще не могла сказать точно. Например свое имя :shock: .
не знаю, у меня четко различает и say, и command. Именно во втором случае она реальную погоду читает
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

Re: Демонстрация МДМ через Яндекс станцию мини

Сообщение Djeday999 » Вт янв 25, 2022 10:41 pm

Пришлось создать 10 сценариев и это не предел для демонстрации. Зато не заикается сейчас. Сценарии запускаются друг за другом в определенном порядке и по времени, рассчитанному методом научного тыка после экспериментальных действий. Может кому будет интересно

Код: Выделить всё

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');

Запускается через добавленное устройство в модуле Yandex Home.
За это сообщение автора Djeday999 поблагодарил:
Sergey.Chek (Пт янв 13, 2023 12:59 am)
Рейтинг: 1.16%
Ответить