NEWS
Голосовое управление
-
на мобильном работает распознавание, но скрипту похоже не передается
да , на компе в хроме тоже работает распознование `
if (voice == 'включить+свет'){ пропиши без + 'включить свет' -
на мобильном работает распознавание, но скрипту похоже не передается
да , на компе в хроме тоже работает распознование
if (voice == 'включить+свет'){ пропиши без + 'включить свет'
Это ничего не изменит, так как уже добавлено:var voice = obj.newState.val.toLowerCase().toString().replace(/\ /g, "+");
И с компа у мня работает этот скрипт, а вот на телефоне ни в одном браузере нет, даже не просит сказать фразу, вообще не реагирует на кнопку.
-
на мобильном работает распознавание, но скрипту похоже не передается
да , на компе в хроме тоже работает распознование
if (voice == 'включить+свет'){ пропиши без + 'включить свет'
Это ничего не изменит, так как уже добавлено:var voice = obj.newState.val.toLowerCase().toString().replace(/\ /g, "+");
И с компа у мня работает этот скрипт, а вот на телефоне ни в одном браузере нет, даже не просит сказать фразу, вообще не реагирует на кнопку. `
У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+"Даже пикает как окей гугл.
-
У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+" `
Это потому что таскер отдает с + вместо пробела, добавь строчку как я написал выше -
У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+"
Это потому что таскер отдает с + вместо пробела, добавь строчку как я написал выше
Строчку добавлю, спасибо. У тебя заработал в хроме?P.S добавил строчку работает с "+".
-
У меня на телефоне всё работает в хроме, а вот твой скрипт начал выполнять действия когда убрал "+"
Это потому что таскер отдает с + вместо пробела, добавь строчку как я написал выше
Строчку добавлю, спасибо. У тебя заработал в хроме? `
Я же говорю что на телефоне вообще не реагирует на кнопку, на компе работает. С телефона я пользуюсь таскером, и в браузере на телефоне мне эта функция не нужна. -
if (voice == 'включить+свет'){ пропиши без + 'включить свет' `
как по мне так лучше не сравнивать на полное совпадение по фразе, а искать вхождения подстроки в строке тогда можно построить более гибкую логику распознавания команд, под брокер пока не делал а в охабе у меня так:if (command.contains("вет") && command.contains("спал") && command.contains("вкл")) {
sendCommand(Light_FF_Bed_Ceiling, "ON")
say(command)
}
-
if (voice == 'включить+свет'){ пропиши без + 'включить свет' `
как по мне так лучше не сравнивать на полное совпадение по фразе, а искать вхождения подстроки в строке тогда можно построить более гибкую логику распознавания команд, под брокер пока не делал а в охабе у меня так:if (command.contains("вет") && command.contains("спал") && command.contains("вкл")) {
sendCommand(Light_FF_Bed_Ceiling, "ON")
say(command)
} `
Я думал над этим, и хочу полностью переписать свой скрипт, думаю как сделать обучаемую систему, чтобы при новых командах можно было назначить действие… Хотя это уже нужен не скрипт а драйвер, чтобы было что то на подобии таблицы команд("синонимов") и действий.А вообще в идеале прикрутить нейронку
-
А вообще в идеале прикрутить нейронку `
да не слишком жирноя вижу такую реализацию, массив многомерный:
команды голосом–
место- устройство-свойства-параметр-действие
зал++++свет+++ яркость+++50%
зал++++свет++++++++++++++++вкл
зал++++свет++++++++++++++++выкл
зал++++телек++громкость++30%
функция проходит по таблице и возвращает вхождения по столбцам строкам в виде чисел, а на числа ставим уже обработчик...
-
Скрипт разросся, решил немного переписать и унифицировать.
Часть моего скрипта второй итерации:
! ````
/////////////Голосовое управление/////////////////////////////
on({id: 'javascript.0.Voice.Command', change: 'any'}, function (obj) {
var voice = obj.newState.val.toLowerCase();
VoiceCommands (voice);
});
! function VoiceCommands (voice){var SceneKodi = getState('javascript.0.Scenes.Kodi').val; var SceneTV = getState('javascript.0.Scenes.TV').val; var tempKitchen = getState('mqtt.0.myhome.Kitchen.Temp_room').val; var tempBedroom = getState('mqtt.0.myhome.Bedroom.Temp_room').val; var tempBathroom = getState('mqtt.0.myhome.Bathroom.Temp_room').val; var tempin = getState('mqtt.0.myhome.Bedroom.Temp_in').val; var Volume = parseInt(getState('onkyo.0.master-volume').val, 10); var ttsVolume = parseInt(getState('sayit.0.tts.volume').val, 10); var voiceArr = voice.split('+'); log('Вся переменная - ' + voice); log('Массив - '+ voiceArr);
! function found (cmd){
cmd = String(cmd);
if (~voice.indexOf(cmd)){
return true;
} else {
return false;
}
}var FoundNum = function(voice){
var num =parseInt(voice.replace(/\D+/, ''), 10);
if (num !== isNaN){
return num;
} else {
return false;
}
};
/***************Регулировка громкости/////////////
if ((found('тише') || found('тиши') || found('убавь') || found('кеша') || found('сделайте+же') || found('ты+же')) && !found('говор') && !found('оповещ') && !found('помещ')){
if (FoundNum(voice) && found('на')){
setState('onkyo.0.master-volume', Volume - FoundNum(voice));
}
else if (FoundNum(voice) && !found('на')){
setState('onkyo.0.master-volume', FoundNum(voice));
}
else if (!FoundNum(voice)){
setState('onkyo.0.master-volume', Volume - 3);
}
}if ((found('громче') || found('прибавь') || found('громк')) && !found('говор') && !found('оповещ') && !found('помещ')){ if (FoundNum(voice) && found('на')){ setState('onkyo.0.master-volume', Volume + FoundNum(voice)); } else if (FoundNum(voice) && !found('на')){ setState('onkyo.0.master-volume', FoundNum(voice)); } else if (!FoundNum(voice)){ setState('onkyo.0.master-volume', Volume + 3); } }
/Управление громкостью Sayit**/
if (found('говор') || (found('оповещ') || found('помещ'))){ //помещения оповещени
if (FoundNum(voice)){
setState('sayit.0.tts.volume', FoundNum(voice));
ttsVolume = getState('sayit.0.tts.volume').val;
setState('sayit.0.tts.text', 'Громкость оповещения установлена на ' + ttsVolume+'.');
}
else {
if (found('гром')){
setState('sayit.0.tts.volume', ttsVolume+10);
ttsVolume = getState('sayit.0.tts.volume').val;
setState('sayit.0.tts.text', 'Громкость оповещения установлена на ' + ttsVolume+'.');
}
if (found('тише')){
setState('sayit.0.tts.volume', ttsVolume-10);
ttsVolume = getState('sayit.0.tts.volume').val;
setState('sayit.0.tts.text', 'Громкость оповещения установлена на ' + ttsVolume+'.');
}
}
}
/Аквасторож************************/
if (found('воду') || found('вода') || found('году') || found('лада')){
if (found('закр') || found('выкл') || found('пере')){
setState('mqtt.0.myhome.NRF.AquaStoroj.ButtonClose', '1');
setState('sayit.0.tts.text', 'Вода перекрыта');
}
if (found('откр')){
setState('mqtt.0.myhome.NRF.AquaStoroj.ButtonOpen', '1');
setState('sayit.0.tts.text', 'Вода открыта');
}
}
/Приточка*************/
if (found('приточ') || found('проточ') || found('вентил')){
var BedRoomMin = 70;
var BedRoomMax = 131;
var GuestRoomMin = 94;
var GuestRoomMax = 163;
if (found('спал')){
if (FoundNum(voice) && FoundNum(voice) >= 0 && FoundNum(voice) <= 100){
setState('mqtt.0.myhome.Bedroom.Servo', ((BedRoomMax - BedRoomMin) / 100) * FoundNum(voice) + BedRoomMin); //70+(*0.61)
}
if (found('откр')){
setState('mqtt.0.myhome.Bedroom.Servo', BedRoomMax);
}
if (found('закр')){
setState('mqtt.0.myhome.Bedroom.Servo', BedRoomMin);
}
}
if (found('зал')){
if (FoundNum(voice) && FoundNum(voice) >= 0 && FoundNum(voice) <= 100){
setState('mqtt.0.myhome.Guestroom.Servo', ((GuestRoomMax - GuestRoomMin) / 100) * FoundNum(voice) + GuestRoomMin);
}
if (found('откр')){
setState('mqtt.0.myhome.Guestroom.Servo', GuestRoomMax);
}
if (found('закр')){
setState('mqtt.0.myhome.Guestroom.Servo', GuestRoomMin);
}
}
}
/*****************Освещение///////////////
function Invert (id){
if (!found('вкл') && !found('выкл')){
IdVal = getState(id).val;
if (IdVal === 1 || IdVal === '1'){
setState(id, '0');
} else {
setState(id, '1');
}
} else {
if (found('вкл')){
setState(id, '1');
}
if (found('выкл')){
setState(id, '0');
}
}
}if (found('свет') || found('глазк')){ if (found('спал')){ if (found('глаз')){ Invert ('mqtt.0.myhome.Lighting.BedRoom_Additional'); } else { Invert ('mqtt.0.myhome.Lighting.BedRoom_Main'); } } if (found('зал')){ if (found('весь')){ Invert ('mqtt.0.myhome.Lighting.GuestRoom_Additional'); Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main'); Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main2'); } if (found('глаз')){ Invert ('mqtt.0.myhome.Lighting.GuestRoom_Additional'); } else { Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main2'); Invert ('mqtt.0.myhome.Lighting.GuestRoom_Main'); Invert ('mqtt.0.myhome.Lighting.GuestRoom_Additional'); } } if (found('кухн')){ if (found('глаз')){ Invert ('mqtt.0.myhome.Lighting.Kitchen_Additional'); } else { Invert ('mqtt.0.myhome.Lighting.Kitchen_Main'); } } if (found('ванн')){ if (found('зерк')){ Invert ('mqtt.0.myhome.Lighting.BathRoom_Additional'); } else { Invert ('mqtt.0.myhome.Lighting.BathRoom_Main'); } } if (found('кор') || found('при')){ Invert ('mqtt.0.myhome.Lighting.Hall_Main'); } }
/******************************************************************/
if ( found('домоф') || found('двер') ){
var DomofonRing = getState('mqtt.0.myhome.Mother.DomofonRing').val;
if ((DomofonRing === '1' || DomofonRing === 1)){
setState('mqtt.0.myhome.Mother.DomofonOpen', '1');
} else {
setState('sayit.0.tts.text', 'Режим автооткрытия домофОна активирован! ');
setState('javascript.0.Scenes.DomofonAutoOpen', '1');
}
if (found('откл') || found('выкл')){
setState('sayit.0.tts.text', 'Режим автооткрытия домофОна отключен!');
setState('javascript.0.Scenes.DomofonAutoOpen', '0');
}
}
}Добавлено: Скрипт получился удобный, можно давать несколько команд УД в одном предложении.