Commit fc7aadcd authored by nextime's avatar nextime

UserGUI: initial speechrec with web API + new user options

parent 426ecaed
...@@ -193,6 +193,10 @@ ...@@ -193,6 +193,10 @@
border-radius: 4px; border-radius: 4px;
} }
/*
input::-webkit-input-speech-button {
opacity: 0;
}*/
.notifybutton { .notifybutton {
background-image: url(/resources/img/notification.jpg); background-image: url(/resources/img/notification.jpg);
background-repeat: no-repeat; background-repeat: no-repeat;
...@@ -211,6 +215,25 @@ ...@@ -211,6 +215,25 @@
.notifybutton:hover { .notifybutton:hover {
background-color: #fff; background-color: #fff;
} }
.speechbutton {
background-image: url(/resources/img/microphone-little.png);
background-repeat: no-repeat;
background-size: contain;
background-color: #fff;
width: 37px;
max-width: 50px;
height: 37px;
padding: 8px 8px;
border: 0px solid transparent;
position: absolute;
bottom:5px;
right: 410px;
display:none;
}
.speechbutton:hover {
background-color: #fff;
}
.homebutton { .homebutton {
background-image: url(/resources/img/home_small.jpg); background-image: url(/resources/img/home_small.jpg);
...@@ -257,7 +280,7 @@ ...@@ -257,7 +280,7 @@
} }
.footbar-form { .footbar-form {
position:absolute; position:absolute;
right: 110px; right: 105px;
width: 300px; width: 300px;
bottom: -2px; bottom: -2px;
} }
...@@ -265,7 +288,7 @@ ...@@ -265,7 +288,7 @@
.footbar-form-sm { .footbar-form-sm {
position:absolute; position:absolute;
left: 5px; left: 5px;
width: 100px; width: 80px;
bottom: -2px; bottom: -2px;
} }
...@@ -437,6 +460,15 @@ ...@@ -437,6 +460,15 @@
} }
@media (max-width: 768px) {
.speechbutton {
left: 88px;
right: auto;
}
}
@media (max-width: 992px) { @media (max-width: 992px) {
.panel-media-low { .panel-media-low {
height: auto !important; height: auto !important;
......
...@@ -9,17 +9,17 @@ var updateUser = function(r) { ...@@ -9,17 +9,17 @@ var updateUser = function(r) {
$("#email").val(r.data.email); $("#email").val(r.data.email);
$("#desktophome").val(r.data.desktop_homepath); $("#desktophome").val(r.data.desktop_homepath);
$("#mobilehome").val(r.data.mobile_homepath); $("#mobilehome").val(r.data.mobile_homepath);
$("#lang").val(r.data.language);
$("#webspeech").val(r.data.webspeech);
$("#speechlang").val(r.data.speechlang);
if(r.data.tts==1) if(r.data.tts==1)
$('#tts-switch').bootstrapSwitch('setState', true); //$("#tts").attr('checked', true); $('#tts-switch').bootstrapSwitch('setState', true); //$("#tts").attr('checked', true);
else else
$('#tts-switch').bootstrapSwitch('setState', false); //$("#tts").attr('checked', false); $('#tts-switch').bootstrapSwitch('setState', false); //$("#tts").attr('checked', false);
if(r.data.slide==1) if(r.data.slide==1)
$('#slide').bootstrapSwitch('setState', true); $('#slide-switch').bootstrapSwitch('setState', true);
else else
$('#slide').bootstrapSwitch('setState', false); $('#slide-switch').bootstrapSwitch('setState', false);
$("#lang").val(r.data.language);
$("#webspeech").val(r.data.webspeech);
$("#speechlang").val(r.data.speechlang);
$("#userform").show(); $("#userform").show();
}; };
......
<!DOCTYPE html> <!DOCTYPE html>
<?
/*
<html manifest="<?=$BASEGUIPATH?>/offline.appcache"> <html manifest="<?=$BASEGUIPATH?>/offline.appcache">
*/
?><html>
<head> <head>
<?=$PAGE_BUFFER['head']?> <?=$PAGE_BUFFER['head']?>
<?=$PAGE_ADDHEAD?> <?=$PAGE_ADDHEAD?>
......
CACHE MANIFEST CACHE MANIFEST
# rev 1388875361 # rev 1388875363
/resources/img/logo_icon.png /resources/img/logo_icon.png
NETWORK: NETWORK:
* *
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="lang" class="col-lg-2 control-label">Web Speech rec.:</label> <label for="webspeech" class="col-lg-2 control-label">Web Speech rec.:</label>
<div class="col-lg-3"> <div class="col-lg-3">
<select name="webspeech" id="webspeech" class="form-control"> <select name="webspeech" id="webspeech" class="form-control">
<option value="no">no</option> <option value="no">no</option>
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="lang" class="col-lg-2 control-label">Speech lang:</label> <label for="speechlang" class="col-lg-2 control-label">Speech lang:</label>
<div class="col-lg-3"> <div class="col-lg-3">
<select name="speechlang" id="speechlang" class="form-control"> <select name="speechlang" id="speechlang" class="form-control">
<option value="en-US">US English</option> <option value="en-US">US English</option>
......
...@@ -25,14 +25,43 @@ ...@@ -25,14 +25,43 @@
<script src="/resources/EventSource/eventsource.js"></script> <script src="/resources/EventSource/eventsource.js"></script>
*/ ?> */ ?>
<script src="<?=$BASEGUIPATH;?>/js/combined.min.js"></script> <script src="<?=$BASEGUIPATH;?>/js/combined.min.js"></script>
<!-- <script src="//cdnjs.cloudflare.com/ajax/libs/annyang/1.0.0/annyang.min.js"></script> --> <?
//if($_DOMOTIKA['webspeech']!="no")
if(FALSE)
{?>
<script src="/resources/speech/annyang.min.js"></script>
<?}?>
<script> <script>
//document.documentElement.requestFullscreen(); //document.documentElement.requestFullscreen();
var ttsEnabled=<?=$_DOMOTIKA['tts']?>; var ttsEnabled=<?=$_DOMOTIKA['tts']?>;
var slideEnabled=<?=$_DOMOTIKA['slide']?>;
var speechEnabled='<?=$_DOMOTIKA['webspeech']?>';
if(speechEnabled=='touch' && document.createElement('input').webkitSpeech==undefined)
{
testSpeech=window.webkitSpeechRecognition ||
window.mozSpeechRecognition ||
window.msSpeechRecognition ||
window.oSpeechRecognition ||
window.SpeechRecognition;
if(testSpeech)
{
$("#speechbutton").show(); // it isn't chrome with webkit-speech attribute, but it support WEB Speech API
}
else
{
$("#speechbutton").hide();
speechEnabled=='no';
}
} else {
speechEnabled='touch-chrome';
}
speechStartWord='*terms';
if(speechEnabled=='continuous')
speechStartWord='ok domotica *terms';
//var scroller = new AppScroll({ //var scroller = new AppScroll({
// toolbar: $('#topbar')[0], // toolbar: $('#topbar')[0],
// scroller: $('#content')[0] // scroller: $('#content')[0]
...@@ -86,7 +115,6 @@ ...@@ -86,7 +115,6 @@
$.post("/rest/v1.2/actions/speech_text/json", spobj.serialize(), speechResult ); $.post("/rest/v1.2/actions/speech_text/json", spobj.serialize(), speechResult );
} }
/*
// Test SpeechAPI // Test SpeechAPI
function setSpeechText(terms) function setSpeechText(terms)
{ {
...@@ -97,17 +125,23 @@ ...@@ -97,17 +125,23 @@
} }
var commands = { var commands = {
'domotica *terms': setSpeechText speechStartWord: setSpeechText
}; };
/*
if(speechEnabled=='touch' || speechEnabled=='continuous')
{
annyang.init(commands); annyang.init(commands);
annyang.setLanguage('it-IT') annyang.setLanguage('<?=$_DOMOTIKA['speechlang']?>');
}
if(speechEnabled=='continuous')
annyang.start(); annyang.start();
else if(speechEnabled=='touch')
annyang.recognition.continuous=false;
*/ */
var popupFader = function(ftype, title, message, timeout){ var popupFader = function(ftype, title, message, timeout){
if(typeof(timeout)==='undefined') timeout = 1500; if(typeof(timeout)==='undefined') timeout = 1500;
$("#alertTitle").text(title); $("#alertTitle").text(title);
$("#alertMessage").text(" "+message); r("#alertMessage").text(" "+message);
$("#alertPopup").removeClass(); $("#alertPopup").removeClass();
$("#alertPopup").addClass("alert alert-"+ftype); $("#alertPopup").addClass("alert alert-"+ftype);
$("#alertContainer").fadeIn(100); $("#alertContainer").fadeIn(100);
...@@ -124,7 +158,8 @@ ...@@ -124,7 +158,8 @@
//dragger: $('#content')[0], //dragger: $('#content')[0],
dragger: $('[data-domotika-dragger="true"]')[0], dragger: $('[data-domotika-dragger="true"]')[0],
minDragDistance: 20, minDragDistance: 20,
slideIntent: 30 slideIntent: 30,
//touchToDrag: slideEnabled
}); });
<? } ?> <? } ?>
......
<? @include_once("../includes/common.php"); ?> <? @include_once("../includes/common.php"); ?>
<?
$webspeech="";
if($_DOMOTIKA['webspeech']=='touch')
$webspeech='x-webkit-speech="x-webkit-speech"';
?>
<div class="navbar navbar-fixed-bottom"> <div class="navbar navbar-fixed-bottom">
<a class="navbar-brand" href="http://www.unixmedia.it" target=_blank>Domotika 1.0</a> <a class="navbar-brand" href="http://www.unixmedia.it" target=_blank>Domotika</a>
<p class="navbar-text hidden-sm"><a href="http://www.unixmedia.it" class="navbar-link" target=_blank>by Unixmedia</a></p> <p class="navbar-text hidden-sm"><a href="http://www.unixmedia.it" class="navbar-link" target=_blank>by Unixmedia</a></p>
<button id="speechbutton" type="button" class="btn btn-default navbar-btn pull-right speechbutton"></button>
<form id="speech" class="navbar-form footbar-form hidden-sm"> <form id="speech" class="navbar-form footbar-form hidden-sm">
<input type="text" name="text" value="" class="form-control" x-webkit-speech="x-webkit-speech" lang="it-IT" placeholder="Command"> <input type="text" id="speechinp" name="text" value="" class="form-control" <?=$webspeech?> lang="<?=$_DOMOTIKA['speechlang']?>" placeholder="Command">
</form> </form>
<form id="speechsm" class="navbar-form footbar-form-sm visible-sm"> <form id="speechsm" class="navbar-form footbar-form-sm visible-sm">
<input type="text" name="text" value="" class="form-control" x-webkit-speech="x-webkit-speech" lang="it-IT" placeholder="Command"> <input type="text" id="speechinp" name="text" value="" class="form-control" <?=$webspeech?> lang="<?=$_DOMOTIKA['speechlang']?>" placeholder="Command">
</form> </form>
<button id="notifybutton" type="button" id="notifybutton" class="btn btn-default navbar-btn pull-right notifybutton"> <button id="notifybutton" type="button" class="btn btn-default navbar-btn pull-right notifybutton">
<span id="notifybadge" class="badge">0</span> <span id="notifybadge" class="badge">0</span>
</button> </button>
<a class="btn btn-default navbar-btn pull-right homebutton" href="<?=$BASEGUIPATH;?>"></a> <a class="btn btn-default navbar-btn pull-right homebutton" href="<?=$BASEGUIPATH;?>"></a>
......
...@@ -748,7 +748,7 @@ def getUsersInGroup(group, activeonly=True): ...@@ -748,7 +748,7 @@ def getUsersInGroup(group, activeonly=True):
return UsersGroup.find(where=["group=?", group]) return UsersGroup.find(where=["group=?", group])
def updateUserData(username, pwd, email, dhome, mhome, tts=False, lang="it"): def updateUserData(username, pwd, email, dhome, mhome, tts=False, lang="it",slide=False, webspeech='touch', speechlang='it-IT'):
def onRes(res): def onRes(res):
if res>0: if res>0:
return defer.succeed(username+" correctly updated") return defer.succeed(username+" correctly updated")
...@@ -763,7 +763,14 @@ def updateUserData(username, pwd, email, dhome, mhome, tts=False, lang="it"): ...@@ -763,7 +763,14 @@ def updateUserData(username, pwd, email, dhome, mhome, tts=False, lang="it"):
qstring+=",tts=1" qstring+=",tts=1"
else: else:
qstring+=",tts=0" qstring+=",tts=0"
if slide:
qstring+=",slide=1"
else:
qstring+=",slide=0"
qstring+=",webspeech='%s'" % webspeech
qstring+=",speechlang='%s'" % speechlang
qstring+=" WHERE username='%s' AND active > 0" %(username) qstring+=" WHERE username='%s' AND active > 0" %(username)
log.debug(qstring)
return runOperation(qstring).addCallback(onRes) return runOperation(qstring).addCallback(onRes)
......
...@@ -2216,8 +2216,8 @@ class domotikaService(service.Service): ...@@ -2216,8 +2216,8 @@ class domotikaService(service.Service):
def web_on_getUserFromName(self, name): def web_on_getUserFromName(self, name):
return dmdb.Users.find(where=['username=?', name], limit=1) return dmdb.Users.find(where=['username=?', name], limit=1)
def web_on_updateUserData(self, username, pwd, email, dhome, mhome, tts, lang): def web_on_updateUserData(self, username, pwd, email, dhome, mhome, tts, lang, slide=False, webspeech='touch', speechlang='it-IT'):
return dmdb.updateUserData(username, pwd, email, dhome, mhome, tts, lang) return dmdb.updateUserData(username, pwd, email, dhome, mhome, tts, lang,slide, webspeech, speechlang)
def web_on_getMaxLocalTranscode(self): def web_on_getMaxLocalTranscode(self):
return int(self.config.get('media', 'localtranscode')) return int(self.config.get('media', 'localtranscode'))
......
...@@ -351,15 +351,24 @@ class UserRest(RestCore): ...@@ -351,15 +351,24 @@ class UserRest(RestCore):
pwd=False pwd=False
tts=False tts=False
lang="it" lang="it"
slide=False
webspeech="touch"
speechlang="it-IT"
if 'lang' in r.keys(): if 'lang' in r.keys():
lang=r['lang'] lang=r['lang']
if 'tts' in r.keys(): if 'tts' in r.keys():
tts=True tts=True
if 'passwd' in r.keys() and r['passwd'] != "": if 'passwd' in r.keys() and r['passwd'] != "":
pwd=r['passwd'] pwd=r['passwd']
if 'slide' in r.keys():
slide=True
if 'webspeech' in r.keys() and r['webspeech'] in ['no','touch','continuous']:
webspeech=r['webspeech']
if 'speechlang' in r.keys() and r['speechlang'] in ['it-IT','it-CH','en-US','en-GB']:
speechlang=r['speechlang']
if 'desktop_homepath' in r.keys() and 'mobile_homepath' in r.keys() and 'email' in r.keys(): if 'desktop_homepath' in r.keys() and 'mobile_homepath' in r.keys() and 'email' in r.keys():
return self.core.updateUserData(self.session.mind.perms.username, pwd, return self.core.updateUserData(self.session.mind.perms.username, pwd,
r['email'], r['desktop_homepath'], r['mobile_homepath'], tts, lang).addCallbacks(onOk, onError) r['email'], r['desktop_homepath'], r['mobile_homepath'], tts, lang, slide, webspeech, speechlang).addCallbacks(onOk, onError)
return ResponseConversion(request, code=400, entity="Bad request - error in parameters") return ResponseConversion(request, code=400, entity="Bad request - error in parameters")
#return self.callbackResponse(self.core.updateUserFromName(self.session.mind.perms.username), request) #return self.callbackResponse(self.core.updateUserFromName(self.session.mind.perms.username), request)
......
...@@ -215,7 +215,7 @@ class RootPage(rend.Page): ...@@ -215,7 +215,7 @@ class RootPage(rend.Page):
if headers.hasHeader("DMSESSION"): if headers.hasHeader("DMSESSION"):
headers.removeHeader("DMSESSION") headers.removeHeader("DMSESSION")
headervalue = str(session.uid) headervalue = str(session.uid)
cols=['username','passwd','id','homepath','email','tts','language'] cols=['username','passwd','id','homepath','email','tts','language','slide','webspeech','speechlang']
try: try:
headervalue = session.mind.perms.toHash(cols) headervalue = session.mind.perms.toHash(cols)
except: except:
...@@ -227,6 +227,9 @@ class RootPage(rend.Page): ...@@ -227,6 +227,9 @@ class RootPage(rend.Page):
headervalue['email'] = "" headervalue['email'] = ""
headervalue['tts']= 0 headervalue['tts']= 0
headervalue['language']="it" headervalue['language']="it"
headervalue['slide'] = 0
headervalue['webspeech'] = 'touch'
headervalue['speechlang'] = 'it-IT'
headervalue['sessionid'] = session.uid headervalue['sessionid'] = session.uid
headervalue['logged'] = self.logged headervalue['logged'] = self.logged
log.debug('DMSESSION SEND '+str(headervalue)) log.debug('DMSESSION SEND '+str(headervalue))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment