Le dernier exercice de la semaine lié à PAW consiste a programmer la fonctionnalité de reconnaissance vocale et de l’intégrer à un système domotique. Le principe est similaire aux autres scripts de la semaine. Le serveur domotique déclenche la reconnaissance vocale sur le téléphone Android. Nous parlons, le résultat est analysé par PAW puis communiqué éventuellement au système domotique – la box eedomus dans notre exemple. Voyons comment procéder.
Le script du jour apporte les spécificités suivantes:
- Pouvoir être appelé par une simple requête HTTP
- Annoncer par synthèse vocale que le système est prêt à écouter
- Écouter l’ordre
- Décoder l’ordre puis le communiquer au système domotique
Pour obtenir le service attendu encore une fois il suffit de placer le script sur le serveur PAW sur votre téléphone Android.
Voici le script que je vous propose comme base de travail. N’hésitez pas à le retravailler et à l’améliorer car il demande à être optimisé:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Reconnaissance vocale</title> <bsh> // pour la reconnaissance vocale import android.speech.RecognizerIntent; // pour l'appel d'url import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.*; import org.apache.http.client.methods.*; import org.apache.http.util.*; //on annonce que l'on est prêt speak ("Parlez. Je vous écoutes.", Locale.getDefault()); //on laisse le temps de parler Thread.sleep(2000); //lancement de la reconnaissance vocale if(isIntentAvailable(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)) { resultat = speechToText("Que puis-je pour vous?"); } else { resultat = "SpeechToText n'est pas possible sur cet appareil"; } reponse=""; getURL=""; // déterminataion de l'action à lancer if (resultat.equals("allume la lumière du salon")) { //identifiants pour l'API eedomus ainsi que le periph_id à remplacer par les vôtres getURL="http://api.eedomus.com/set?action=periph.value&api_user=XXXXX&api_secret=YYYYYYYYYYYYY&periph_id=123456&value=100"; retour = "la lumière du salon est allumée."; } if (resultat.equals("éteint la lumière du salon")) { //identifiants pour l'API eedomus ainsi que le periph_id à remplacer par les vôtres getURL="http://api.eedomus.com/set?action=periph.value&api_user=XXXXX&api_secret=YYYYYYYYYYYYY&periph_id=17791&value=0"; retour = "la lumière du salon est éteinte."; } //lancement de l'action if (getURL.equals("")) { speak ("désolé mais je n'ai pas compris", Locale.getDefault()); } else { client = new DefaultHttpClient(); get = new HttpGet(getURL); responseGet = client.execute(get); resEntityGet = responseGet.getEntity(); if (resEntityGet != null) { reponse = EntityUtils.toString(resEntityGet); speak (retour, Locale.getDefault()); } } </bsh> </head> <body> <h1>Reconnaissance vocale</h1> <h3>Paramètres :</h3> <p> Aucun!<br> </p> <h3>Fonctionnement :</h3> <p> Reprenant le principe du répondeur téléphonique qui vous incite à "parler après le bip sonore", vous allez être invités à parler afin de commander votre système domotique.<br> Enoncez alors votre ordre de manière claire et distincte.<br> </p> <h3>Paramètres :</h3> <p> Ce que j'ai compris : <bsh>$$.print(resultat); </bsh><br> Réponse de la eedomus: <bsh>$$.print(reponse); </bsh><br> url: <bsh>$$.print(getURL); </bsh><br> </p> </body> </hmtl>
L’installation se fait de la même manière que pour le script concernant la reconnaissance vocale. Le prérequis est bien entendu d’avoir installé au préalable le serveur PAW sur votre téléphone Android comme présenté dans le précédent article:
- Télécharger le code précédent et le sauvegarder le sur votre disque dur dans un fichier appelé : “speech_to_text.xhtml”
- Se connecter au serveur PAW.
- Accéder au gestionnaire de fichiers : Menu Media->File manager
- Dans le répertoire /sdcard/paw/html de votre téléphone créer le répertoire “actions” s’il n’existe pas encore
- Indiquer l’endroit de votre disque dur où se trouve le script à uploader sur le serveur PAW en cliquant sur “Parcourir”.
- Sélectionner le fichier “speech_to_text.xhtml” et cliquer sur “Open”.
- Effectuer l’upload en cliquant sur “Upload”.
- Le message suivant vous confirme le chargement du script sur le serveur.
Il ne vous reste plus qu’à renseigner l’URL adéquate dans un scénario pour une Zibase ou bien dans un périphérique HTTP sur un serveur eedomus.
L’URL à renseigner sera de la forme:
http://192.168.0.10:8080/actions/speech_to_text.xhtml
Pensez à modifier “192.168.0.10” par l’adresse IP de votre serveur PAW. Il n’y a pas de paramètres!
Afin de pouvoir le lancer j’ai créé un périphérique actionneur HTTP sur la box eedomus. N’ayant qu’une valeur il permet de lancer la reconnaissance vocale.
Comme le montre la vidéo ci dessous voici le résultat de l’association de PAW et d’une box domotique eedomus pour permettre l’utilisation de la synthèse vocale. Le tout est piloté par l’application dédiée de l’eedomus.
Cet article termine la semaine de présentation de ce serveur HTTP sous Android. N’hésiter pas à partager vos scripts ou idées de scripts dans les commentaires ou sur le forum.
Bonjour, super tuto !!!!
Par contre je rencontre un problème, j’ai suivi le tuto mais lorsque je rentre mes identifiants zibase, rien ne se passe ????
Auriez-vous une idée ?
Merci.
// déterminataion de l’action à lancer
if (resultat.equals(“allume la lumière du salon”)) {
//identifiants pour l’API eedomus ainsi que le periph_id à remplacer par les vôtres
getURL=”http://zibase.net/m/set_iphone.php?login=xxxxxx&password=xxxxxx&action=comfort&actionComfort=module&idModule=A1&actionModule=1
“;
retour = “la lumière du salon est allumée.”;
}
Bonsoir, et le jouer dans l’interpréteur de commandes (sous PAW: Developpent=>BeanShell Console). Le symptôme “rien ne se passe est tout à fait à relier à une erreur de syntaxe. Si il y a une erreur dans le code, le script ne s’exécute plus. Le fait de le jouer dans la “BeanShell Console” permet d’avoir un retour pour débugger.
Avez-vous essayé de prendre juste la partie située entre les balises
J’ai aussi essayé avec ça mais ça ne marche toujours pas…. ça coince après avoir dit allume la lumière du salon, rien ne se passe même pas le retour vocal ???
// détermination de l’action à lancer
if (resultat.equals(« allume la lumière du salon »)) {
//identifiants pour l’API eedomus ainsi que le periph_id à remplacer par les vôtres
getURL= »http://http://192.168.x.xx/cgi-bin/domo.cgi?cmd=ON%20A1
« ;
retour = « la lumière du salon est allumée. »;
}
Merci de votre réponse effectivement il y avaient des erreurs….
J’ai simplifié au maximum (trop apparemment…) car cela ne marche toujours pas après avoir répondu “oui” ou “non merci”. En fait cela n’exécute pas la commande d’allumer ou d’éteindre ???
import android.speech.RecognizerIntent;
import org.apache.http.impl.client.DefaultHttpClient.*;
import org.apache.http.*;
import org.apache.http.client.methods.*;
import org.apache.http.util;
speak (“Il commence a faire nuit, voulez-vous que j’allume une lampe ?”, Locale.getDefault());
Thread.sleep(2500);
if(isIntentAvailable(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)) {
resultat = speechToText(“Que puis-je pour vous ?”);
}
if (resultat.equals(“oui”)) {
getURL=”http://192.168.0.30/cgi-bin/domo.cgi?cmd=ON+A1″;
retour = “la lumière est allumée.”;
}
if (resultat.equals(“non merci”)) {
getURL=”http://192.168.0.30/cgi-bin/domo.cgi?cmd=OFF+A1″;
retour = “la lumière est éteinte.”;
}
Super, j’ai tout repris et ça fonctionne, c’est génial, il n’y a plus qu’à rajouter quelques phrases et le tour sera joué !!!!
Cool MERCI pour tout !!!!!!!!!!!
Par contre je n’ai pas le retour vocal (la lumière est éteinte ????)
J’ai modifié le script et c’est bon j’ai le retour vocal….. Super maintenant les possibilités être nombreuses (lancement de la musique, coupure et mise en route de l’alarme….)
Un grand merci pour ce tuto !!!!
Parfait! Je suis content que tu ai pu faire les adaptations souhaitées. Merci pour ton retour!