PAW : reconnaissance vocale sous Android et intégration domotique5 minute(s) de lecture

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.

8 Comments

  1. pikat said:

    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.”;
    }

    22 février 2013
    Reply
    • Avatar photo Hervé said:

      Bonsoir,
      Avez-vous essayé de prendre juste la partie située entre les balises 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.

      24 février 2013
      Reply
  2. pikat said:

    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. »;
    }

    22 février 2013
    Reply
  3. pikat said:

    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.”;
    }

    25 février 2013
    Reply
  4. pikat said:

    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 !!!!!!!!!!!

    26 février 2013
    Reply
  5. pikat said:

    Par contre je n’ai pas le retour vocal (la lumière est éteinte ????)

    26 février 2013
    Reply
  6. pikat said:

    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 !!!!

    26 février 2013
    Reply
    • Avatar photo Hervé said:

      Parfait! Je suis content que tu ai pu faire les adaptations souhaitées. Merci pour ton retour!

      28 février 2013
      Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain: * Time limit is exhausted. Please reload CAPTCHA.