arret du code sur boucle de reconnaissance vocale

309 views
Skip to first unread message

Bruno

unread,
Jun 5, 2012, 5:21:08 PM6/5/12
to KarotzDev
bonsoir,

je suis actuellement en cours de mise au point d'un code permettant de
faire de la reconnaissance vocal.
Afin de commencer, il faut interpeller le lapin par son nom.
la commande ASR fonctionne donc en boucle.
j'ai mis au point le dev au travers de la vm, jusqu'a là, pas trop de
problèmes...
Mais ils arrivent quand j'ai mis en place le code dans le lapin.
ma boucle fonctionne exactement 30 fois , puis le code s'arrete sans
messages, soit moins de 4 minutes.
j'ai utilisé divers methodes pour la boucle, toujours le même
problème, au trentième passage.
Puisque je me suis arraché tous les cheveux, je viens, en desespoire
de cause, vous demander de l'aide.
merci pour votre expertise.

pour info, voici la partie du code :

include("util.js");
var karotz_ip="192.168.0.33";
//var karotz_ip = "127.0.0.1";
var version = "2.1.4";
var NumAttente;
var Voix="fr";
var reponse=0;
var PosOreille;
var BLACK = "000000";
var BLUE = "0000FF";
var CYAN = "00FF9F";
var GREEN = "00FF00";
var ORANGE = "FFA500";
var PINK = "FFCFAF";
var PURPLE = "9F00FF";
var RED = "FF0000";
var YELLOW = "75FF00";
var WHITE = "4FFF68";
var SITE_Domo = "http://192.168.0.50:10080/WebService.php";
var SITE_LOG = "http://192.168.0.50:10080/LogKarotz.php";
var compteur=0;

var Keep_Alive = function(event) {
log("Passage dans Keep_Alive");
if (karotz_ip=='127.0.0.1'){
karotz.ping();
}
else
{
ping();
}
return true;
}
DomoCmd = function(text){
DebugLog("Passage dans DomoCmd");
http.get(SITE_Domo + "?log=" + escape(text));
}
var DebugLog = function (string) {
var D= new Date();
var HH = D.getHours();
var MM = D.getMinutes();
var SS=D.getSeconds();
if (HH <10) { HH = "0" + HH;}
if (MM <10) { MM = "0" + MM;}
if (SS<10) { SS = "0" + SS;}
HH= HH + ":" + MM + ":" + SS + " => ";
if (karotz_ip == '127.0.0.1') {
//http.get(SITE_LOG + "?log=" + escape(string + '\r\n'));
karotz.serial.write(HH + string + '\n\r');}
else
log(HH + string);
//http.get(SITE_LOG + "?log=" + escape(string + '\r\n'));
return true
}
var exitFunction = function(event) {
DebugLog("**************** Application ENDED (v" + version +
")******************");
exit();
return true;
}
var Main = function(event) {
compteur=compteur+1;
DebugLog("Execution du module Main (" + compteur + ")");
NumAttente=0;
if (PosOreille==1) {karotz.ears.reset();}
DebugLog("En attente d'une reponse");
karotz.asr.string("karotine | arret produit", "fr-
FR",function(asrResult) {
var jai_entendu = asrResult.text;
if ((jai_entendu == "<error_server_timeout>") || (jai_entendu==
"<nomatch>")){
DebugLog ("Timeout sur l'ASR");
PosOreille=0;
DebugLog ("Changement de couleur de la LED");
karotz.led.light(PURPLE);
DebugLog ("**** Fin de l'execution du module Main ****");
setTimeout(500, Main);
}
else if (jai_entendu == "arret produit"){
exitFunction();
}
else if (jai_entendu == "karotine"){
DebugLog ("Changement de couleur de la LED");
karotz.led.light(BLUE);
DebugLog ("Mouvement des oreilles");
karotz.ears.move(-3,-3);
PosOreille=1;
DebugLog("Analyse de la reponse et niveau de comprehention : " +
asrResult.confident)
karotz.tts.start("Oui, je vous ai coute", Voix, function(event) {
if ((event == "CANCELLED") || (event == "TERMINATED")) {
compteur=0;
DebugLog ("Suite de l'appli");
exitFunction();
}
});
}
});
}
var onKarotzConnect = function(data) {
if (karotz_ip == '127.0.0.1') {
karotz.serial.open("/dev/ttyGS0", 9600);
}
DebugLog("**************** Application STARTED (v" + version +
")****************");
setTimeout(60000, function(){Keep_Alive(); reponse=0; return
true; });
karotz.ears.reset();
karotz.tts.start("Lancement de lapplication de reconnaissance vocal
version " + version, Voix, function(event) {
if ((event == "CANCELLED") || (event == "TERMINATED")) { Main() }
});
}
karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});

KarMen

unread,
Jun 6, 2012, 1:37:48 PM6/6/12
to karo...@googlegroups.com
Hello,
 
Peux-tu nous envoyer le contenu du debug ?
Au moins on cernera un peu plus l'étape qui plante.
 
Pour info il est possible d'utiliser mon appli debug log afin de débugger en ligne sans publier:
 
@+,
 
Xavier

alain bregeon

unread,
Jun 6, 2012, 5:15:09 PM6/6/12
to karo...@googlegroups.com
Et, j'ai du mal à écrire cela puisque je suis à l'origine du débuglog serial, mais nul n'est parfait, il semblerait que le port série lorsqu'il est utilisé (par le débuglog) en mode connecté finisse par perturber le lapin avec des comportement étranges

Donc l'utiliser pour la mise au point, oui, le laisser dans le lapin par la suite : non.

Bruno

unread,
Jun 6, 2012, 5:24:51 PM6/6/12
to KarotzDev
bonjour,

merci pour le coup de main...
voici le log, comme demandé:

22:48:33 => **************** Application STARTED
(v2.1.4)****************
22:48:39 => Execution du module Main (1)
22:48:39 => En attente d'une reponse
22:48:42 => Timeout sur l'ASR
22:48:42 => Changement de couleur de la LED
22:48:43 => **** Fin de l'execution du module Main ****
22:48:43 => Execution du module Main (2)
22:48:43 => En attente d'une reponse
22:48:50 => Timeout sur l'ASR
22:48:50 => Changement de couleur de la LED
22:48:50 => **** Fin de l'execution du module Main ****
22:48:50 => Execution du module Main (3)
22:48:50 => En attente d'une reponse
22:48:57 => Timeout sur l'ASR
22:48:57 => Changement de couleur de la LED
22:48:57 => **** Fin de l'execution du module Main ****
22:48:58 => Execution du module Main (4)
22:48:58 => En attente d'une reponse
22:49:04 => Timeout sur l'ASR
22:49:04 => Changement de couleur de la LED
22:49:05 => **** Fin de l'execution du module Main ****
22:49:05 => Execution du module Main (5)
22:49:05 => En attente d'une reponse
22:49:12 => Timeout sur l'ASR
22:49:12 => Changement de couleur de la LED
22:49:12 => **** Fin de l'execution du module Main ****
22:49:13 => Execution du module Main (6)
22:49:13 => En attente d'une reponse
22:49:20 => Timeout sur l'ASR
22:49:20 => Changement de couleur de la LED
22:49:20 => **** Fin de l'execution du module Main ****
22:49:20 => Execution du module Main (7)
22:49:20 => En attente d'une reponse
22:49:29 => Timeout sur l'ASR
22:49:29 => Changement de couleur de la LED
22:49:29 => **** Fin de l'execution du module Main ****
22:49:30 => Execution du module Main (8)
22:49:30 => En attente d'une reponse
22:49:37 => Timeout sur l'ASR
22:49:37 => Changement de couleur de la LED
22:49:37 => **** Fin de l'execution du module Main ****
22:49:37 => Execution du module Main (9)
22:49:37 => En attente d'une reponse
22:49:44 => Timeout sur l'ASR
22:49:44 => Changement de couleur de la LED
22:49:44 => **** Fin de l'execution du module Main ****
22:49:45 => Execution du module Main (10)
22:49:45 => En attente d'une reponse
22:49:52 => Timeout sur l'ASR
22:49:52 => Changement de couleur de la LED
22:49:52 => **** Fin de l'execution du module Main ****
22:49:52 => Execution du module Main (11)
22:49:52 => En attente d'une reponse
22:49:59 => Timeout sur l'ASR
22:49:59 => Changement de couleur de la LED
22:49:59 => **** Fin de l'execution du module Main ****
22:50:00 => Execution du module Main (12)
22:50:00 => En attente d'une reponse
22:50:07 => Timeout sur l'ASR
22:50:07 => Changement de couleur de la LED
22:50:07 => **** Fin de l'execution du module Main ****
22:50:07 => Execution du module Main (13)
22:50:07 => En attente d'une reponse
22:50:14 => Timeout sur l'ASR
22:50:14 => Changement de couleur de la LED
22:50:14 => **** Fin de l'execution du module Main ****
22:50:15 => Execution du module Main (14)
22:50:15 => En attente d'une reponse
22:50:21 => Timeout sur l'ASR
22:50:21 => Changement de couleur de la LED
22:50:21 => **** Fin de l'execution du module Main ****
22:50:21 => Execution du module Main (15)
22:50:21 => En attente d'une reponse
22:50:28 => Timeout sur l'ASR
22:50:28 => Changement de couleur de la LED
22:50:28 => **** Fin de l'execution du module Main ****
22:50:28 => Execution du module Main (16)
22:50:28 => En attente d'une reponse
22:50:35 => Timeout sur l'ASR
22:50:35 => Changement de couleur de la LED
22:50:35 => **** Fin de l'execution du module Main ****
22:50:36 => Execution du module Main (17)
22:50:36 => En attente d'une reponse
22:50:41 => Timeout sur l'ASR
22:50:41 => Changement de couleur de la LED
22:50:42 => **** Fin de l'execution du module Main ****
22:50:42 => Execution du module Main (18)
22:50:42 => En attente d'une reponse
22:50:49 => Timeout sur l'ASR
22:50:49 => Changement de couleur de la LED
22:50:49 => **** Fin de l'execution du module Main ****
22:50:49 => Execution du module Main (19)
22:50:49 => En attente d'une reponse
22:50:56 => Timeout sur l'ASR
22:50:56 => Changement de couleur de la LED
22:50:56 => **** Fin de l'execution du module Main ****
22:50:56 => Execution du module Main (20)
22:50:56 => En attente d'une reponse
22:51:03 => Timeout sur l'ASR
22:51:03 => Changement de couleur de la LED
22:51:03 => **** Fin de l'execution du module Main ****
22:51:03 => Execution du module Main (21)
22:51:03 => En attente d'une reponse
22:51:10 => Timeout sur l'ASR
22:51:10 => Changement de couleur de la LED
22:51:10 => **** Fin de l'execution du module Main ****
22:51:10 => Execution du module Main (22)
22:51:10 => En attente d'une reponse
22:51:17 => Timeout sur l'ASR
22:51:17 => Changement de couleur de la LED
22:51:17 => **** Fin de l'execution du module Main ****
22:51:18 => Execution du module Main (23)
22:51:18 => En attente d'une reponse
22:51:24 => Timeout sur l'ASR
22:51:24 => Changement de couleur de la LED
22:51:24 => **** Fin de l'execution du module Main ****
22:51:25 => Execution du module Main (24)
22:51:25 => En attente d'une reponse
22:51:31 => Timeout sur l'ASR
22:51:31 => Changement de couleur de la LED
22:51:31 => **** Fin de l'execution du module Main ****
22:51:32 => Execution du module Main (25)
22:51:32 => En attente d'une reponse
22:51:38 => Timeout sur l'ASR
22:51:38 => Changement de couleur de la LED
22:51:38 => **** Fin de l'execution du module Main ****
22:51:38 => Execution du module Main (26)
22:51:38 => En attente d'une reponse
22:51:44 => Timeout sur l'ASR
22:51:44 => Changement de couleur de la LED
22:51:44 => **** Fin de l'execution du module Main ****
22:51:45 => Execution du module Main (27)
22:51:45 => En attente d'une reponse
22:51:51 => Timeout sur l'ASR
22:51:51 => Changement de couleur de la LED
22:51:51 => **** Fin de l'execution du module Main ****
22:51:52 => Execution du module Main (28)
22:51:52 => En attente d'une reponse
22:51:58 => Timeout sur l'ASR
22:51:58 => Changement de couleur de la LED
22:51:58 => **** Fin de l'execution du module Main ****
22:51:59 => Execution du module Main (29)
22:51:59 => En attente d'une reponse
22:52:05 => Timeout sur l'ASR
22:52:05 => Changement de couleur de la LED
22:52:05 => **** Fin de l'execution du module Main ****
22:52:06 => Execution du module Main (30)
22:52:06 => En attente d'une reponse
22:52:13 => Timeout sur l'ASR
22:52:13 => Changement de couleur de la LED
22:52:13 => **** Fin de l'execution du module Main ****
22:52:13 => Execution du module Main (31)
22:52:13 => En attente d'une reponse
23:06:38 => **************** Application STARTED
(v2.1.4)****************
23:06:45 => Execution du module Main (1)
23:06:45 => En attente d'une reponse
23:06:50 => Timeout sur l'ASR
23:06:50 => Changement de couleur de la LED
23:06:50 => **** Fin de l'execution du module Main ****
23:06:51 => Execution du module Main (2)
23:06:51 => En attente d'une reponse
23:06:57 => Timeout sur l'ASR
23:06:57 => Changement de couleur de la LED
23:06:57 => **** Fin de l'execution du module Main ****
23:06:58 => Execution du module Main (3)
23:06:58 => En attente d'une reponse
23:07:05 => Timeout sur l'ASR
23:07:05 => Changement de couleur de la LED
23:07:05 => **** Fin de l'execution du module Main ****
23:07:05 => Execution du module Main (4)
23:07:05 => En attente d'une reponse
23:07:12 => Timeout sur l'ASR
23:07:12 => Changement de couleur de la LED
23:07:12 => **** Fin de l'execution du module Main ****
23:07:12 => Execution du module Main (5)
23:07:12 => En attente d'une reponse
23:07:19 => Timeout sur l'ASR
23:07:19 => Changement de couleur de la LED
23:07:19 => **** Fin de l'execution du module Main ****
23:07:20 => Execution du module Main (6)
23:07:20 => En attente d'une reponse
23:07:27 => Timeout sur l'ASR
23:07:27 => Changement de couleur de la LED
23:07:27 => **** Fin de l'execution du module Main ****
23:07:27 => Execution du module Main (7)
23:07:27 => En attente d'une reponse
23:07:34 => Timeout sur l'ASR
23:07:34 => Changement de couleur de la LED
23:07:34 => **** Fin de l'execution du module Main ****
23:07:35 => Execution du module Main (8)
23:07:35 => En attente d'une reponse
23:07:41 => Timeout sur l'ASR
23:07:41 => Changement de couleur de la LED
23:07:41 => **** Fin de l'execution du module Main ****
23:07:42 => Execution du module Main (9)
23:07:42 => En attente d'une reponse
23:07:49 => Timeout sur l'ASR
23:07:49 => Changement de couleur de la LED
23:07:49 => **** Fin de l'execution du module Main ****
23:07:49 => Execution du module Main (10)
23:07:49 => En attente d'une reponse
23:07:55 => Timeout sur l'ASR
23:07:55 => Changement de couleur de la LED
23:07:55 => **** Fin de l'execution du module Main ****
23:07:56 => Execution du module Main (11)
23:07:56 => En attente d'une reponse
23:08:03 => Timeout sur l'ASR
23:08:03 => Changement de couleur de la LED
23:08:03 => **** Fin de l'execution du module Main ****
23:08:04 => Execution du module Main (12)
23:08:04 => En attente d'une reponse
23:08:10 => Timeout sur l'ASR
23:08:10 => Changement de couleur de la LED
23:08:11 => **** Fin de l'execution du module Main ****
23:08:11 => Execution du module Main (13)
23:08:11 => En attente d'une reponse
23:08:18 => Timeout sur l'ASR
23:08:18 => Changement de couleur de la LED
23:08:18 => **** Fin de l'execution du module Main ****
23:08:19 => Execution du module Main (14)
23:08:19 => En attente d'une reponse
23:08:26 => Timeout sur l'ASR
23:08:26 => Changement de couleur de la LED
23:08:26 => **** Fin de l'execution du module Main ****
23:08:26 => Execution du module Main (15)
23:08:26 => En attente d'une reponse
23:08:33 => Timeout sur l'ASR
23:08:33 => Changement de couleur de la LED
23:08:33 => **** Fin de l'execution du module Main ****
23:08:34 => Execution du module Main (16)
23:08:34 => En attente d'une reponse
23:08:41 => Timeout sur l'ASR
23:08:41 => Changement de couleur de la LED
23:08:41 => **** Fin de l'execution du module Main ****
23:08:41 => Execution du module Main (17)
23:08:41 => En attente d'une reponse
23:08:48 => Timeout sur l'ASR
23:08:48 => Changement de couleur de la LED
23:08:48 => **** Fin de l'execution du module Main ****
23:08:49 => Execution du module Main (18)
23:08:49 => En attente d'une reponse
23:08:56 => Timeout sur l'ASR
23:08:56 => Changement de couleur de la LED
23:08:56 => **** Fin de l'execution du module Main ****
23:08:56 => Execution du module Main (19)
23:08:56 => En attente d'une reponse
23:09:03 => Timeout sur l'ASR
23:09:03 => Changement de couleur de la LED
23:09:03 => **** Fin de l'execution du module Main ****
23:09:04 => Execution du module Main (20)
23:09:04 => En attente d'une reponse
23:09:10 => Timeout sur l'ASR
23:09:10 => Changement de couleur de la LED
23:09:10 => **** Fin de l'execution du module Main ****
23:09:11 => Execution du module Main (21)
23:09:11 => En attente d'une reponse
23:09:17 => Timeout sur l'ASR
23:09:17 => Changement de couleur de la LED
23:09:18 => **** Fin de l'execution du module Main ****
23:09:18 => Execution du module Main (22)
23:09:18 => En attente d'une reponse
23:09:25 => Timeout sur l'ASR
23:09:25 => Changement de couleur de la LED
23:09:25 => **** Fin de l'execution du module Main ****
23:09:25 => Execution du module Main (23)
23:09:26 => En attente d'une reponse
23:09:33 => Timeout sur l'ASR
23:09:33 => Changement de couleur de la LED
23:09:33 => **** Fin de l'execution du module Main ****
23:09:34 => Execution du module Main (24)
23:09:34 => En attente d'une reponse
23:09:40 => Timeout sur l'ASR
23:09:40 => Changement de couleur de la LED
23:09:40 => **** Fin de l'execution du module Main ****
23:09:41 => Execution du module Main (25)
23:09:41 => En attente d'une reponse
23:09:48 => Timeout sur l'ASR
23:09:48 => Changement de couleur de la LED
23:09:48 => **** Fin de l'execution du module Main ****
23:09:48 => Execution du module Main (26)
23:09:48 => En attente d'une reponse
23:09:56 => Timeout sur l'ASR
23:09:56 => Changement de couleur de la LED
23:09:56 => **** Fin de l'execution du module Main ****
23:09:57 => Execution du module Main (27)
23:09:57 => En attente d'une reponse
23:10:03 => Timeout sur l'ASR
23:10:03 => Changement de couleur de la LED
23:10:03 => **** Fin de l'execution du module Main ****
23:10:04 => Execution du module Main (28)
23:10:04 => En attente d'une reponse
23:10:10 => Timeout sur l'ASR
23:10:10 => Changement de couleur de la LED
23:10:10 => **** Fin de l'execution du module Main ****
23:10:10 => Execution du module Main (29)
23:10:10 => En attente d'une reponse
23:10:18 => Timeout sur l'ASR
23:10:18 => Changement de couleur de la LED
23:10:18 => **** Fin de l'execution du module Main ****
23:10:19 => Execution du module Main (30)
23:10:19 => En attente d'une reponse
23:10:25 => Timeout sur l'ASR
23:10:25 => Changement de couleur de la LED
23:10:25 => **** Fin de l'execution du module Main ****
23:10:26 => Execution du module Main (31)
23:10:26 => En attente d'une reponse

comme le compteur commence à 0, il compte 31 occurences...
encore merci pour le coup de main.
> > karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});- Masquer le texte des messages précédents -
>
> - Afficher le texte des messages précédents -

Bruno

unread,
Jun 6, 2012, 5:41:05 PM6/6/12
to KarotzDev
bonjour Alain,

tout d'abord bravo pour la qualité des tutos avec, en plus une pointe
d'humour...
j' ai refais un test sans le mode debug, même problème
en // Xavier c'est proposer d'étudier le log.
merci pour l'info, mais j'ai l'impression que c'est plutôt un problème
de pile que se remplie et ne se vide pas.

KarMen

unread,
Jun 7, 2012, 6:28:53 AM6/7/12
to karo...@googlegroups.com
Bonjour,

Je n'ai pas eu le temps de mettre en place l'appli mais il me semble qu'il manque aux fonctions le return, ce qui est à priori importatnt.
Je laisse Alain compléter.

@+

Xavier

KarMen

unread,
Jun 7, 2012, 7:00:08 AM6/7/12
to karo...@googlegroups.com
Exemple pour la reco vocale sur le Wiki:

alain bregeon

unread,
Jun 7, 2012, 8:17:22 AM6/7/12
to karo...@googlegroups.com
il serait également intéressant de mettre un log juste après l'instruction
           var jai_entendu = asrResult.text;
     

Car comme tu le verras dans nouveau SDK Java on écrit :

En cas d'erreur avec l'ASR il y a 3 erreurs possibles :

asrResult.text = "<nomatch>"; => l'ASR n'a trouvé aucune correspondance dans grammar

asrResult.text = "No result before the no-input timeout"; => l'ASR n'a rien entendu

asrResult.text = "<error_server_timeout>"; => le serveur ASR n'a pas répondu dans le temps imparti


Et du coup il y a peut-être un retour que tu ne testes pas qui te ferait sortir de la boucle (ce qui rejoint éventuellement la remarque de Xavier)

Mes derniers ASR ressemblent à ça
var jetecoute = function() {


            karotz.asr.string(grammar, "fr-FR", function(asrResult) {
                jai_entendu = asrResult.text;
                debuglog("voici ce que j'ai entendu : " + asrResult.text);
                if ((jai_entendu == "<nomatch>") || (jai_entendu == "") || (jai_entendu == "No result before the no-input timeout") || (jai_entendu == "<error_server_timeout>"))
                    setTimeout(1000, function() { jetecoute() });

                else {
                    if (jai_entendu == "Karotine") {



Le jeudi 7 juin 2012 12:28:53 UTC+2, KarMen a écrit :

alain bregeon

unread,
Jun 7, 2012, 8:25:42 AM6/7/12
to karo...@googlegroups.com
En fait quand tu n'attends que 2 réponses tu gagnes ton temps à d'abord tester les 2 réponses (ici "karotine" ou "arrêt produit") et le dernier ELSE gère d'un seul coup tous les autres cas de figure

if asrResult == "karotine" alors fait cela
         else if asrResult == "arrêt produit" alors je sors
                       else je boucle

Le mieux étant même d'utiliser le" swich case" qui, depuis les explication de Xavier, fonctionne parfaitement

comme ici https://groups.google.com/forum/#!searchin/karotzdev/case/karotzdev/67c8fDahwuo/WjwkACdBmesJ

KarMen

unread,
Jun 7, 2012, 1:44:41 PM6/7/12
to karo...@googlegroups.com
Whaou !! J'ai rallié Alain au switch case !!

Bruno

unread,
Jun 7, 2012, 2:19:08 PM6/7/12
to KarotzDev
bonjour,

je viens de mettre en place les modifs dans le code tel que vous le
conseillé, a savoir:
- mise en place du log permettant de connaitre le retour de la
commande ASR : il renvoi toujours <nomatch>
- mise en place du switch case à la place du if else then
- separtion du code principal et de la reponse de la commande ASR.

j'ai fait un test, toujours même problème; je vous joint la nouvelle
version du code...
en //, cette après-midi, ce nouveau code à fonctionner dans la VM et à
réalisé 2500 la boucle sans problème...
c 'est à ni rien comprendre...
je me demande s'il ne faut pas re_flasher le lapin???

nouveau code :

include("util.js");
var karotz_ip="192.168.0.33";
//var karotz_ip = "127.0.0.1";
var version = "2.1.9";
DebugLog("**** Execution du module Main (" + compteur + ") ****");
NumAttente=0;
if (PosOreille==1) {karotz.ears.reset();}
DebugLog("En attente d'une reponse");
karotz.asr.string("karotine | arret produit", "fr-FR",ASRListener)
DebugLog ("**** Fin de l'execution du module Main ****");
}
var ASRListener=function (asrResult){
DebugLog("**** Execution du module ASRListener ****");
DebugLog(" REPONSE : " + asrResult.text);
if ((asrResult.text=="") || (asrResult.text=="No result before the no-
input timeout") || (asrResult.text == "<error_server_timeout>") ||
(asrResult.text== "<nomatch>")){
DebugLog ("Timeout sur l'ASR");
PosOreille=0;
DebugLog ("Changement de couleur de la LED");
karotz.led.light(PURPLE);
setTimeout(500, Main);
DebugLog ("**** Fin de l'execution du module ASRListener ****");
return true;
}
else
{
switch(asrResult.text+"")
{
case "arret produit":
exitFunction();
return true;
break;
case "karotine" :
DebugLog ("Changement de couleur de la LED");
karotz.led.light(BLUE);
DebugLog ("Mouvement des oreilles");
karotz.ears.move(-3,-3);
PosOreille=1;
DebugLog("Analyse de la reponse et niveau de comprehention : " +
asrResult.confident)
karotz.tts.start("Oui, je vous ai coute", Voix, function(event) {
if ((event == "CANCELLED") || (event == "TERMINATED")) {
compteur=0;
DebugLog ("Suite de l'appli");
exitFunction();
return true;
}
});
break;
}
}
}
var onKarotzConnect = function(data) {
if (karotz_ip == '127.0.0.1') {
karotz.serial.open("/dev/ttyGS0", 9600);
}
DebugLog("**************** Application STARTED (v" + version +
")****************");
setTimeout(60000, function(){Keep_Alive(); reponse=0; return
true; });
karotz.ears.reset();
karotz.tts.start("Lancement de lapplication de reconnaissance vocal
version " + version, Voix, function(event) {
if ((event == "CANCELLED") || (event == "TERMINATED")) { Main() }
});
}

karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});


On 7 juin, 19:44, KarMen <xavier.dan...@gmail.com> wrote:
> Whaou !! J'ai rallié Alain au switch case !!
>
> Le jeudi 7 juin 2012 14:25:42 UTC+2, alain bregeon a écrit :
>
>
>
>
>
> > En fait quand tu n'attends que 2 réponses tu gagnes ton temps à d'abord
> > tester les 2 réponses (ici "karotine" ou "arrêt produit") et le dernier
> > ELSE gère d'un seul coup tous les autres cas de figure
>
> > if asrResult == "karotine" alors fait cela
> >          else if asrResult == "arrêt produit" alors je sors
> >                        else je boucle
>
> > Le mieux étant même d'utiliser le" swich case" qui, depuis les explication
> > de Xavier, fonctionne parfaitement
>
> > comme ici
> >https://groups.google.com/forum/#!searchin/karotzdev/case/karotzdev/6...
>
> > Le jeudi 7 juin 2012 14:17:22 UTC+2, alain bregeon a écrit :
>
> >> il serait également intéressant de mettre un log juste après l'instruction
> >>            var jai_entendu = asrResult.text;
>
> >> Car comme tu le verras dans nouveau SDK Java on écrit :
>
> >> En cas d'erreur avec l'ASR il y a 3 erreurs possibles :
>
> >> *asrResult.text* = "<nomatch>"; => l'ASR n'a trouvé aucune
> >> correspondance dans grammar
>
> >> *asrResult.text* = "No result before the no-input timeout"; => l'ASR n'a
> >> rien entendu
>
> >> *asrResult.text* = "<error_server_timeout>"; => le serveur ASR n'a pas
> ...
>
> plus de détails »- Masquer le texte des messages précédents -

Bruno

unread,
Jun 7, 2012, 5:04:42 PM6/7/12
to KarotzDev
a partir du lien fourni par Xavier (merci), j'ai fait le bout de code
suivant.
Et même problème 30 passages puis bam, fin du code, rideau...
je penche de plus en plus pour un problème de pile dans le moteur du
lapin que l'on ne retrouve pas dans la VM...
avez-vous un avis la dessus?


include("util.js");
var karotz_ip="192.168.0.33";
//var karotz_ip = "127.0.0.1";
var version = "2.1.9";
var Voix="fr";
var BLUE = "0000FF";
var GREEN = "00FF00";
var RED = "FF0000";
var grammar_language="fr-FR";
var compteur=0;

var ttsListener=function(event) {
if (event=="TERMINATED"){
karotz.led.light(BLUE);
grammar="oui|non";
karotz.asr.string(grammar, grammar_language, ASRListener);
}
return true;
}
var ASRListener = function(asrResult) {
log(asrResult.text);
switch(asrResult.text+"")
{
case "oui":
karotz.led.light(GREEN);
setTimeout(500, main);
break;
case "non":
karotz.led.light(RED);
setTimeout(500, main);
break;
case "<nomatch>":
karotz.led.light(BLUE);
setTimeout(500, main);
break;
}
}
var main=function(event){
log (compteur);
compteur=compteur+1;
karotz.tts.start("occurence numero " + compteur,"FR",ttsListener);
}
var onKarotzConnect = function(data) {
karotz.ears.reset();
main();
}
karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});


On 7 juin, 19:44, KarMen <xavier.dan...@gmail.com> wrote:
> Whaou !! J'ai rallié Alain au switch case !!
>
> Le jeudi 7 juin 2012 14:25:42 UTC+2, alain bregeon a écrit :
>
>
>
>
>
> > En fait quand tu n'attends que 2 réponses tu gagnes ton temps à d'abord
> > tester les 2 réponses (ici "karotine" ou "arrêt produit") et le dernier
> > ELSE gère d'un seul coup tous les autres cas de figure
>
> > if asrResult == "karotine" alors fait cela
> >          else if asrResult == "arrêt produit" alors je sors
> >                        else je boucle
>
> > Le mieux étant même d'utiliser le" swich case" qui, depuis les explication
> > de Xavier, fonctionne parfaitement
>
> > comme ici
> >https://groups.google.com/forum/#!searchin/karotzdev/case/karotzdev/6...
>
> > Le jeudi 7 juin 2012 14:17:22 UTC+2, alain bregeon a écrit :
>
> >> il serait également intéressant de mettre un log juste après l'instruction
> >>            var jai_entendu = asrResult.text;
>
> >> Car comme tu le verras dans nouveau SDK Java on écrit :
>
> >> En cas d'erreur avec l'ASR il y a 3 erreurs possibles :
>
> >> *asrResult.text* = "<nomatch>"; => l'ASR n'a trouvé aucune
> >> correspondance dans grammar
>
> >> *asrResult.text* = "No result before the no-input timeout"; => l'ASR n'a
> >> rien entendu
>
> >> *asrResult.text* = "<error_server_timeout>"; => le serveur ASR n'a pas
> ...
>
> plus de détails »- Masquer le texte des messages précédents -

Bruno

unread,
Jun 7, 2012, 5:52:19 PM6/7/12
to KarotzDev
comme je suis têtu, je viens de faire un nouvel essai:
j'ai chargé l'appli "minuteur fun".
En mettant le temp par defaut à 0, dans la conf, le lapin demande sans
arret de donner un temps.
Et là, au bout de 30 fois, le code s'arrete tout seul...
ça me rassure pas vraiment car ou nous faisons la même erreur, ou le
lapin a vraiment un problème.
quelqu'un peut il faire ce test?
je souhaite savoir si celà vient de mon lapin ou si c'est general.

d'avance merci.

On 7 juin, 19:44, KarMen <xavier.dan...@gmail.com> wrote:
> Whaou !! J'ai rallié Alain au switch case !!
>
> Le jeudi 7 juin 2012 14:25:42 UTC+2, alain bregeon a écrit :
>
>
>
>
>
> > En fait quand tu n'attends que 2 réponses tu gagnes ton temps à d'abord
> > tester les 2 réponses (ici "karotine" ou "arrêt produit") et le dernier
> > ELSE gère d'un seul coup tous les autres cas de figure
>
> > if asrResult == "karotine" alors fait cela
> >          else if asrResult == "arrêt produit" alors je sors
> >                        else je boucle
>
> > Le mieux étant même d'utiliser le" swich case" qui, depuis les explication
> > de Xavier, fonctionne parfaitement
>
> > comme ici
> >https://groups.google.com/forum/#!searchin/karotzdev/case/karotzdev/6...
>
> > Le jeudi 7 juin 2012 14:17:22 UTC+2, alain bregeon a écrit :
>
> >> il serait également intéressant de mettre un log juste après l'instruction
> >>            var jai_entendu = asrResult.text;
>
> >> Car comme tu le verras dans nouveau SDK Java on écrit :
>
> >> En cas d'erreur avec l'ASR il y a 3 erreurs possibles :
>
> >> *asrResult.text* = "<nomatch>"; => l'ASR n'a trouvé aucune
> >> correspondance dans grammar
>
> >> *asrResult.text* = "No result before the no-input timeout"; => l'ASR n'a
> >> rien entendu
>
> >> *asrResult.text* = "<error_server_timeout>"; => le serveur ASR n'a pas
> ...
>
> plus de détails »- Masquer le texte des messages précédents -

alain bregeon

unread,
Jun 7, 2012, 6:07:02 PM6/7/12
to karo...@googlegroups.com
il faut être têtu, c'est une qualité en programmation ;)

Je ne peux ps beaucoup t'aider car je suis en déplacement mais le test avec le minuteur fun est intéressant.

Je veux bien que tu fasses un dernier essai avec addition / multiplication, au début il te demande si tu veux faire des additions ou des multiplications si tu ne réponds rien il repose la question inlassablement (en théorie)

S'il y a le même problème des 30 je poserai la question aux développeurs Violet dès lundi.

De toute façon je ferai quelques essais dès demain soir je pense, car je suis curieux de constater cela.

Par contre il n'est pas impossible qu'on fasse la même erreur vu que le code est le même

var onKarotzConnect = function(data) {
if (karotz_ip == 'localhost') {
    karotz.serial.open("/dev/ttyGS0", 9600);
    debuglog("**************** demarrage de l'application ***********");
    debuglog(' appli lancee par ' + launchType.name);
    debuglog(' identifiant du lapin : ' + params[instanceName].uuid);
}

    karotz.button.addListener(buttonListener);
    karotz.ears.addListener(earsListener);
    if (defaut == 0) {
        karotz.tts.start("Indiquez votre durée en minute ( de une à 120 ) ou donner un mot clé comme : oeuf à la coque ou lavage dent par exemple.", "fr", function(event) {

            if ((event == "CANCELLED") || (event == "TERMINATED")) {
                karotz.asr.string(grammar, "fr-FR", function(asrResult) {
                    jai_entendu = asrResult.text;
                    debuglog("voic ce que j'ai entendu : " + asrResult.text);
                    if (jai_entendu == "<nomatch>")
                        setTimeout(1000, function() { onKarotzConnect() });

LORENZI Bruno

unread,
Jun 7, 2012, 6:22:01 PM6/7/12
to karo...@googlegroups.com
Bonsoir Alain,

Merci pour ce retour malgré l'heure tardive.
Je trouve l'appli addition/multiplication sur le store?

 
De : alain bregeon [mailto:alainb...@gmail.com]
Envoyé : Friday, June 08, 2012 12:07 AM
À : karo...@googlegroups.com <karo...@googlegroups.com>
Objet : [karotzdev] Re: arret du code sur boucle de reconnaissance vocale
 

LORENZI Bruno

unread,
Jun 7, 2012, 6:35:05 PM6/7/12
to karo...@googlegroups.com
Bon c'était sur le store...
J'ai fait le test et le pb est le même (30 occurences puis bam), sur mon lapin du moins.
Bonne nuit.

 
De : alain bregeon [mailto:alainb...@gmail.com]
Envoyé : Friday, June 08, 2012 12:07 AM
À : karo...@googlegroups.com <karo...@googlegroups.com>
Objet : [karotzdev] Re: arret du code sur boucle de reconnaissance vocale
 

alain bregeon

unread,
Jun 8, 2012, 6:27:03 AM6/8/12
to karo...@googlegroups.com
Si tu as l'occasion de tester cela avant moi (qui ne puorra le faire que tard ce soir)

au lieu de faire
  karotz.asr.string("

karotine | arret produit", "fr-

FR",function(asrResult){le contenu de ma fonction ...}

remplacer par

  karotz.asr.string("

karotine | arret produit", "fr-

FR",fonctionCbAsr}


ma fonctionCbAsr = function(asrResult){le contenu de ma fonction ...}

(suggestion faite par un développeur Violet) car il pense effectivement aussi à un problème de pile (mais où sont donc les bons vieux "stack overflow" d'antan :) , tout fout le camp ma pauv'dame)

LORENZI Bruno

unread,
Jun 8, 2012, 8:50:22 AM6/8/12
to karo...@googlegroups.com

J’ai déjà suivie cette piste hier soir, avec le code ci-dessous, sans résultat.

 

include("util.js");

var karotz_ip="192.168.0.33";

//var karotz_ip = "127.0.0.1";

var version = "2.1.9"; 

var grammar_language="fr-FR";

var compteur=1;

 

var ttsListener=function(event) {

                if (event=="TERMINATED"){

                karotz.led.light("0000FF");

                grammar="oui|non";

                karotz.asr.string(grammar, grammar_language, ASRListener);

                }

return true;

}

var ASRListener = function(asrResult) {

                log(asrResult.text);

                karotz.led.light("FF0000");

                main();

}

var main=function(event){

                log (compteur);

                compteur=compteur+1;

                karotz.tts.start(" occurence numero " + compteur,"FR",ttsListener);

}

var onKarotzConnect = function(data) {

                karotz.ears.reset();

                main();

}

karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});

 

 

 

Bruno Lorenzi

Direction Technique Distribution

 

http://t0.gstatic.com/images?q=tbn:ANd9GcTHRI1q-Kk8BLjF6gCJBbNvjERu1X5MIvXJxBga6hlgZlnlLaCBjav_1OhK

Centre de Diffusion Numérique

Canal+/Canalsat

276 rue Louis Blériot

92641 Boulogne Billancourt cedex

-  bruno....@canal-plus.com

'  01.71.35.49.28

( 06.13.37.05.15

P Avant d'imprimer, pensez à l'environnement

De : karo...@googlegroups.com [mailto:karo...@googlegroups.com] De la part de alain bregeon
Envoyé : vendredi 8 juin 2012 12:27
À : karo...@googlegroups.com
Objet : Re: [karotzdev] Re: arret du code sur boucle de reconnaissance vocale

LORENZI Bruno

unread,
Jun 8, 2012, 11:03:51 AM6/8/12
to karo...@googlegroups.com
Ce qui me choque dans ce code, si on suit la piste du stack overflow, c'est la constitution de la boucle.
En effet on re rentre dans le code simplement en l'appelant de nouveau; ça me paraît pas tres conforme, car celui-ci doit s'empilé.
Je me demande s'il le problème ne viendrait pas d'un "return" mal placé. Si tu veux faire un test de ton cote, prends le code que j'ai envoyé dans le mail précédent, on ne peux pas faire plus simple.

 
De : LORENZI Bruno [mailto:Bruno....@canal-plus.com]
Envoyé : Friday, June 08, 2012 02:50 PM
À : karo...@googlegroups.com <karo...@googlegroups.com>
Objet : RE: [karotzdev] Re: arret du code sur boucle de reconnaissance vocale
 

KarMen

unread,
Jun 8, 2012, 12:29:58 PM6/8/12
to karo...@googlegroups.com
Je regarde ce soir ...


Le vendredi 8 juin 2012 17:03:51 UTC+2, Bruno a écrit :
Ce qui me choque dans ce code, si on suit la piste du stack overflow, c'est la constitution de la boucle.
En effet on re rentre dans le code simplement en l'appelant de nouveau; ça me paraît pas tres conforme, car celui-ci doit s'empilé.
Je me demande s'il le problème ne viendrait pas d'un "return" mal placé. Si tu veux faire un test de ton cote, prends le code que j'ai envoyé dans le mail précédent, on ne peux pas faire plus simple.

 
De : LORENZI Bruno [mailto:Bruno.LORENZI@canal-plus.com]

De : karo...@googlegroups.com [mailto:karotzdev@googlegroups.com] De la part de alain bregeon

KarMen

unread,
Jun 9, 2012, 6:26:52 AM6/9/12
to karo...@googlegroups.com
J'ai essayé de travailler juste avec les événements, mais sans plus de succès.
Au bout de 30 ça plante.

@+

Xavier

LORENZI Bruno

unread,
Jun 9, 2012, 9:37:33 AM6/9/12
to karo...@googlegroups.com
Bon ça me rassure, pendant quelques minutes, je pensais que ça venait de moi :)
Quand pense tu de l'empilement du code quand il se re appel ? Est ce qu'il sort correctement après chaque appel?

 
De : KarMen [mailto:xavier...@gmail.com]
Envoyé : Saturday, June 09, 2012 12:26 PM
À : karo...@googlegroups.com <karo...@googlegroups.com>
Objet : Re: [karotzdev] Re: arret du code sur boucle de reconnaissance vocale
 

alain bregeon

unread,
Jun 9, 2012, 11:49:32 AM6/9/12
to karo...@googlegroups.com
je voulais faire des essais mais rien ne veut fonctionner, aucun de mes lapins ne veut fonctionner en local (impossible de se connecter)

L'idée que j'avais était celle-ci, si tu peux essayer?

include("util.js");
//var karotz_ip = "localhost"//ici votre adresse IP
var karotz_ip = "192.168.1.29"//ici votre adresse IP
//var karotz_ip = "10.0.252.180"//ici votre adresse IP
var compteur = 1;
var asrEncours = false;
var buttonListener = function(event) {
    if (event == "DOUBLE") {
    karotz.tts.stop();
    exit();
    }
    return true;
}

var attendre = function(event)
{//on teste à intervalle régulier l'ASR
    if (asrEncours) attendre();
    karotz.asr.string("oui|non", "fr", ASRListener);
    setTimeout(1000, function() { attendre(); return true; });
}

var ASRListener = function(asrResult)
{
    asrEncours = true;
    log("IN ASRListener" + asrResult.text);
    switch (asrResult.text + "") {
        case "oui":
            karotz.led.light(GREEN);
            karotz.tts.start("tu as dit oui ", "fr", function(event)

            {
                if ((event == "CANCELLED") || (event == "TERMINATED")) {
                    asrEncours = false;
                    return true;
                }
            });
            break;
        case "non":
            karotz.led.light(RED);
            karotz.tts.start("tu as dit non ", "fr", function(event)

            {
                if ((event == "CANCELLED") || (event == "TERMINATED")) {
                    asrEncours = false;
                    return true;
                }
            });
            break;
        default:
            karotz.led.light(PURPLE);
            karotz.tts.start(compteur + " fois ", "fr", function(event)

            {
                if ((event == "CANCELLED") || (event == "TERMINATED")) {
                    asrEncours = false;
                    compteur += 1;

                    return true;
                }
            });
            break;

    }
}
var onKarotzConnect = function(data)
{
    log("je commence");
    karotz.button.addListener(buttonListener);
    attendre();
}
karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});

Voir si les return sont utiles dans le case vu qu'il y a break

En même temps je me demandais pourquoi tu voulais faire cela. L'ASR du lapin étant ce qu'il est, même si tu es en écoute permanente avec ton lapin il faut que tu sois prêt de lui pour parler alors pourquoi ne pas appuyer sur le bouton pour lui dicter ce que tu veux? Ce qui éviterait d'appeler l'ASR en boucle

Dans le jeu qui est-ce afin de laisser le temps de la réflexion au jour je rentre dans une boucle d'attente (infinie) et dès que le joueur est prêt il appuie sur la tête et dicte sa question

La boucle c'est ça
var attente = function(ma_string) {
    if (!attendre) return;
    debuglog("***** attente *********** " + ma_string);

    karotz.multimedia.play(chemin_music + ma_musique_attente, function(event) {

        if ((event == "CANCELLED") || (event == "TERMINATED")) {
            attente("on rejoue la musique");
        }
    });

}

Pour qu'on sache qu'il boucle je joue une musique d'attente et au passage tu notes que j'ai amélioré mon debug log, le souci étant dans mon cas de savoir d'ou je (re) viens quand je suis dans cette boucle d'attente (c'est le lapin qui a joué, c'est le joueur) don ma_string contient le nom de la fonction qui m'amène ici comme cela le debug log me fait savoir que je suis dans attente mais que je viens de ma_string



Le samedi 9 juin 2012 15:37:33 UTC+2, Bruno a écrit :
Bon ça me rassure, pendant quelques minutes, je pensais que ça venait de moi :)
Quand pense tu de l'empilement du code quand il se re appel ? Est ce qu'il sort correctement après chaque appel?

 
De : KarMen [mailto:xavier.danest@gmail.com]

LORENZI Bruno

unread,
Jun 9, 2012, 1:32:12 PM6/9/12
to karo...@googlegroups.com
Ok, je fais le test asap et reviens vers toi.
 
De : alain bregeon [mailto:alainb...@gmail.com]
Envoyé : Saturday, June 09, 2012 05:49 PM

LORENZI Bruno

unread,
Jun 9, 2012, 2:04:43 PM6/9/12
to karo...@googlegroups.com
Concernant tes questions sur pourquoi ce mode de fonctionnement:
J'ai une domotique a la maison, que j'ai développe moi même ( hard + soft). La domotique parle depuis des années avec un interface sur ecran tactile. Mais depuis longtemps, je cherchais un moyen de donner des ordres vocaux. J'ai pense a mettre des micros, mais bon, pas tres glop, il faut trop de matos pour un résultat pas très satisfaisant. J'ai donc acheter un lapin pour son aspect fun et surtout sa reconnaissance vocal.
Après quelques essais, a environ 3-4 metres il est possible que le lapin reconnaisse parfaite une commande.
Donc je me suis lance dans le dev d'une appli permettant de commander la maison. La condition, c'est bien de ne rien faire d'autre que d'annoncer une commande (sans appuyer sur aucun bouton). C'est pour cela que dans mon code, il faut commencer par appeler le lapin, par son nom et, ensuite, annoncer la commande, ceci afin d'eviter de prendre un mot dans une conversation qui ne lui est pas adresse. C'est pour cela qu'il est toujours en écoute.
Donc tout le dev repose sur cette fonction, qui si elle ne fonctionne pas ou mal, va mettre le lapin dans une placard ou l'expédier sur le bon coin et ça, ce serai vraiment dommage, car j'ai un autre projet dans mes carton, c'est fabriquer un robot a partir d'un lapin et d'une carte ardunio.
Voilà, j'espère avoir répondu a ta question et j'espere aussi que nous allons trouver une solution a mon problème.

 
De : alain bregeon [mailto:alainb...@gmail.com]
Envoyé : Saturday, June 09, 2012 05:49 PM

alain bregeon

unread,
Jun 9, 2012, 2:34:38 PM6/9/12
to karo...@googlegroups.com
Merci pour ces explications et puisque tu en parles connais-tu ce lien?
http://www.youtube.com/watch?v=O2AVOeZVE8s

LORENZI Bruno

unread,
Jun 9, 2012, 2:59:51 PM6/9/12
to karo...@googlegroups.com
Oui, je connais, d'ailleurs, en re voyant la video, je me dit que lors de ces tests, les personnes ont du passer la barre des 30 occurences, car j'imagine qu'ils ont du bien jouer avec le robot...
Qu'en penses tu?
D'autre part, j'ai essaye le code que tu m'as envoye, il ne tourne pas dans la VM, a vrai dire j'ai pas le temps de le debugger ce soir (on a des amis a la maison et ma femme me fait les gros yeux... On n'a pas les mêmes centre d'intérêts :)...
Je regarde tout ça des demain.
En tout cas merci pour ton aide et celui de Xavier.

 
De : alain bregeon [mailto:alainb...@gmail.com]
Envoyé : Saturday, June 09, 2012 08:34 PM

Genís Guàrdia Verdié

unread,
Jun 9, 2012, 3:01:41 PM6/9/12
to karo...@googlegroups.com
SILANCEEEEEEEEEEEEEEEEEEEEEEEE

2012/6/9 LORENZI Bruno <Bruno....@canal-plus.com>

LORENZI Bruno

unread,
Jun 10, 2012, 11:21:19 AM6/10/12
to karo...@googlegroups.com
Bonjour,

Je suis désolé mais je n'arrive pas a mettre au point le code que tu m'as fourni, la vm me renvoi un message que je n'arrive pas a intercepter. Même en routant le .bat dans un txt...

 
De : alain bregeon [mailto:alainb...@gmail.com]
Envoyé : Saturday, June 09, 2012 05:49 PM

alain bregeon

unread,
Jun 10, 2012, 1:14:50 PM6/10/12
to karo...@googlegroups.com
Bon pas mieux de mon côté.

Le code que je voulais tester et testable ici s'arrête lui aussi au bout de 30 fois en embarqué et qui a fonctionné beaucoup plus avec la VM

Voici malgré tout le code

include("util.js");

var karotz_ip = "localhost"//ici votre adresse IP
//var karotz_ip = "192.168.1.46"//ici votre adresse IP

//var karotz_ip = "10.0.252.180"//ici votre adresse IP
var BLACK = "000000";
var BLUE = "0000FF";
var CYAN = "00FF9F";
var GREEN = "00FF00";
var ORANGE = "FFA500";
var PINK = "FFCFAF";
var PURPLE = "9F00FF";
var RED = "FF0000";
var YELLOW = "75FF00";
var WHITE = "4FFF68";
var compteur = 1;


var buttonListener = function(event) {
    if (event == "DOUBLE") {
    karotz.tts.stop();
    exit();
    }
    return true;
}

var attendre = function()

{//on teste à intervalle régulier l'ASR
setTimeout(10000, function() { monASR();  });
}

var monASR = function()
{

    karotz.asr.string("oui|non", "fr", ASRListener);
    attendre();


}

var ASRListener = function(asrResult)
{
    asrEncours = true;
    log("IN ASRListener" + asrResult.text);
    switch (asrResult.text + "") {
        case "oui":
            karotz.led.light(GREEN);
            karotz.tts.start("tu as dit oui ", "fr", function(event)
            {
                if ((event == "CANCELLED") || (event == "TERMINATED")) {
                     return true;
                }
            });
            break;
        case "non":
            karotz.led.light(RED);
            karotz.tts.start("tu as dit non ", "fr", function(event)
            {
                if ((event == "CANCELLED") || (event == "TERMINATED")) {
                    return true;
                }
            });
            break;
        default:
            karotz.led.light(PURPLE);
            karotz.tts.start(compteur + " fois ", "fr", function(event)
            {
                if ((event == "CANCELLED") || (event == "TERMINATED")) {
                    compteur += 1;
                    return true;
                }
            });
            break;

    }
}
var onKarotzConnect = function(data)
{
    log("je commence");
    karotz.button.addListener(buttonListener);
    attendre();
}
karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});

alain bregeon

unread,
Jun 11, 2012, 4:21:15 AM6/11/12
to karo...@googlegroups.com
Bruno, Xavier (et tout le monde)

Comme indiqué dans un message précédent, j'ai branché les équipes Violet sur le problème, problème qui a été constaté et qui donc va  être corrigé très rapidement (probablement cette semaine). Une mise à jour étant prévu par ailleurs.

LORENZI Bruno

unread,
Jun 11, 2012, 6:01:06 AM6/11/12
to karo...@googlegroups.com

Merci Alain pour ces excellentes nouvelles et merci à Xavier pour le temps passé pour l’expertise.

 

Bruno Lorenzi

Direction Technique Distribution

 

http://t0.gstatic.com/images?q=tbn:ANd9GcTHRI1q-Kk8BLjF6gCJBbNvjERu1X5MIvXJxBga6hlgZlnlLaCBjav_1OhK

Centre de Diffusion Numérique

Canal+/Canalsat

276 rue Louis Blériot

92641 Boulogne Billancourt cedex

-  bruno....@canal-plus.com

'  01.71.35.49.28

( 06.13.37.05.15

P Avant d'imprimer, pensez à l'environnement

De : karo...@googlegroups.com [mailto:karo...@googlegroups.com] De la part de alain bregeon
Envoyé : lundi 11 juin 2012 10:21


À : karo...@googlegroups.com
Objet : Re: [karotzdev] Re: arret du code sur boucle de reconnaissance vocale

 

Bruno, Xavier (et tout le monde)

De : KarMen [mailto:xavier...@gmail.com]

Envoyé : Saturday, June 09, 2012 12:26 PM
À : karo...@googlegroups.com <karo...@googlegroups.com>
Objet : Re: [karotzdev] Re: arret du code sur boucle de reconnaissance vocale

J'ai essayé de travailler juste avec les événements, mais sans plus de succès.

Au bout de 30 ça plante.

 

@+

 

Xavier



Le vendredi 8 juin 2012 18:29:58 UTC+2, KarMen a écrit :

Je regarde ce soir ...

Le vendredi 8 juin 2012 17:03:51 UTC+2, Bruno a écrit :

Ce qui me choque dans ce code, si on suit la piste du stack overflow, c'est la constitution de la boucle.
En effet on re rentre dans le code simplement en l'appelant de nouveau; ça me paraît pas tres conforme, car celui-ci doit s'empilé.
Je me demande s'il le problème ne viendrait pas d'un "return" mal placé. Si tu veux faire un test de ton cote, prends le code que j'ai envoyé dans le mail précédent, on ne peux pas faire plus simple.

 

De : LORENZI Bruno [mailto:Bruno....@canal-plus.com]

Centre de Diffusion Numérique

Canal+/Canalsat

276 rue Louis Blériot

92641 Boulogne Billancourt cedex

-  bruno....@canal-plus.com

'  01.71.35.49.28

( 06.13.37.05.15

P Avant d'imprimer, pensez à l'environnement

De : karo...@googlegroups.com [mailto:karo...@googlegroups.com] De la part de alain bregeon

KarMen

unread,
Jun 11, 2012, 7:17:41 PM6/11/12
to karo...@googlegroups.com
Super,

J'espère que nous aurons droit à un changelog, histoire de savoir ce qui est corrigé, ajouté.

@+

Xavier

nb: suite à une modif de conf wifi, impossible de reconnecter mes petits lapins. Reset complet en cours (la procédure par clé USB n'a pas fonctionné).

alexoueb

unread,
Sep 18, 2012, 7:08:12 AM9/18/12
to karo...@googlegroups.com
Bonjour Bruno,

Heureux possesseur d'un Karotz, je souhaite me lancer dans la programmation d'applications pour ce dernier, et je voulais savoir si depuis le problème "des 30 fois" avait été corrigé ?

Merci.

Alex

Bruno

unread,
Sep 19, 2012, 9:55:17 AM9/19/12
to karo...@googlegroups.com

Bonjour Alexoueb

 

Ce bug qui date maintenant de 3 mois n'est toujours pas résolu.

J'ai relancé les équipes Violet qui n'ont pas pris la peine de me répondre.

j'ai réactivé le topic, il y a 2 semaines, pas de réponses.

j'ai rempli le Wiki, pas de réponses.

Il y a pourtant eu 2 mise à jour pendant l'été, une qui ajoutait de la music lors du boot du lapin, la seconde qui l'a supprimé.

Mais pas de nouvelles sur ce bug.

C'est dommage car j'avais pleins d'idées pour ce lapin, autre que lui faire dire la météo ou jouer de la music.

Maintenant, aux vues de la réactivité des équipes de dev et du support, le lapin va terminer sa vie sur le bon coin à la rubrique gadget inutile car pas fini.

Ce qui est reprochable, ce n'est pas le bug en lui-même, mais plutôt le silence de l'éditeur à ce sujet.

Heureusement, et je sais de quoi je parle, que tous les fournisseurs de service n'ont pas le même respect de leurs clients ou abonnées.

Donc, et pour finir, puisque le support ne veux pas résoudre ce bug, et si tu veux parler à ton lapin, tu fais comme les autres tu appuis sur le bouton, ce qui parait naturel pour tout le monde, plutôt que de t'adresser directement à lui.

On n’a juste pas la même notion de l’automatisme et de la domotique.

 

Cordialement,

alexoueb

unread,
Sep 19, 2012, 2:27:51 PM9/19/12
to karo...@googlegroups.com
Bonjour Bruno,

En effet c'est très ennuyeux cette histoire, car j'aimerai également développer des applications où nous pourrions nous passer d'appuyer sur un bouton, car dans ce cas là autant utiliser un téléphone ou un ordinateur... Après peut-être que cette limitation est voulue, car j'imagine que la transformation du son en texte passe par un serveur, et que cela à un coût, mais dans ce cas là il suffirait simplement qu'ils nous en informent.

Je leur ai tout de même envoyé un mail, donc la réponse est ci-dessous, seulement, aucune réponse du pôle développement à l'heure actuelle... Je n'abandonne ma démarche, quitte à les relancer chaque semaine, car au fond, nous demandons simplement une réponse, quant à l'origine de ce problème et à sa possible résolution ou non.

Bonjour,

Nous vous confirmons malheureusement la persistance de ce souci qui n'a pas encore trouvé de résolution à l'heure actuelle.
Nous transmettons votre message à notre pôle développement (l...@karotz.com), afin qu'il puisse directement vous renseigner au mieux sur l'état de ce problème.
Vous présentant toutes nos excuses quant à la gêne occasionnée par cette situation,

Très cordialement,
Karotz Community

KarMen

unread,
Sep 19, 2012, 4:23:59 PM9/19/12
to karo...@googlegroups.com
Hello,

Dans l'absolu ce que l'on souhaite ce n'est pas boucler.
C'est qu'il existe une méthode 
ex: karotz.asr.auto(grammar, grammar_language, ASRListener);
qui écoute et qui renvoie sur ASRListener à chaque fois qu'une parole est récupérée.

Je suis d'accord que cela changerait du tout au tout le rapport que l'on aurait avec le karotz !

Le mieux serait peut-être si tu es parisien de passer les voir un de ces jours (de Lille c'est trop d'orga vu mes dispos).
Je pense qu'ils sont capables d'accorder deux heures à un client pour faire le point sur les bugs (je te confie alors les clés du wiki).

Xavier


Le mercredi 19 septembre 2012 15:55:17 UTC+2, Bruno a écrit :

Bruno

unread,
Sep 19, 2012, 4:26:57 PM9/19/12
to karo...@googlegroups.com
merci de te joindre à ma croisade, mais tel le Don Quichotte, qui se bat contre des moulins ou la soeur Anne, nous ne voyons rien venir.
Concernant la limitation, la maquette a été remontée chez Violet, ils ont constaté le problème et confirmé le bug.
Maintenant, je ne connais pas l'ampleur du correctif, mais si le pb ne viens pas de la conception, celà reste du code.
Il suffit d'avoir la volonté.
De plus, nous sommes en face d'un fonction dont le service n'est pas rendu sur un produit qui est facturé entre 80 et 100 €
Donc, défaut de conformité.
Peut être qu'Alain Bergeron, s'il lit le forum, aura quelques informations supplémentaire à nous donner.
Si tu as des nouvelles de ton côté, n'hésite pas à m'en faire profiter.
bonne soirée.

Bruno

unread,
Sep 19, 2012, 4:43:04 PM9/19/12
to karo...@googlegroups.com
bonsoir Karmen,
 
je suis d'accord avec toi sur le fait que la boucle n'est pas une fin en soit.
s'il existe un contournement, meme en remagnant le code, celà me convient.
 
Je note qu'en une soirée nous avons triplée nos effectifs concernant cette croisade...
j'y crois a peine :)
 
je travaille en effet sur Paris à Boulogne plus exactement, à quelques maisons de l'ancienne adresse du Lapin.
Je vais voir comment m'organiser pour leur rendre visite, je n'y avais pas pensé jusqu'alors.

KarMen

unread,
Sep 19, 2012, 5:08:03 PM9/19/12
to karo...@googlegroups.com
Pour tout te dire suite à ton message de relance j'ai repris le code histoire de voir s'il n'y avait pas une autre façon de procéder, mais sans succès.
(attention, usine à gaz ...)

include("util.js");
var karotz_ip ="192.168.1.12";
var version = "2.1.9";
var grammar_language="fr-FR";
var compteur=1;
var launchmain=1;

var ttsListener=function(event) {
  if (event=="TERMINATED"){
        karotz.led.light("0000FF");
        grammar="oui|non";
        karotz.asr.string(grammar, grammar_language, ASRListener);
      }
   return true; 
  } 

var ASRListener = function(asrResult) {
   log(asrResult.text);
   karotz.led.light("FF0000");
   launchmain=1;
   return true;

var main=function(event){
  log (compteur);
  compteur=compteur+1;
  karotz.tts.start(" occurence numero " + compteur,"FR",ttsListener);
  return true;

var onKarotzConnect = function(data) {
  karotz.ears.reset();
  setTimeout(20, function(){ 
   if (launchmain==1){
       log("launching main function");
       launchmain=0;
       main();
     } 
   return true; 
   });
}

karotz.connectAndStart(karotz_ip, 9123, onKarotzConnect, {});

Johnny Baillargeaux

unread,
Sep 20, 2012, 2:37:16 AM9/20/12
to karo...@googlegroups.com
Bonjour,

Je me permet d'intervenir pour poser une question sur le comportement globale d'une application comme celle ci. Est-ce à dire que vous démarrez l'application via la reco vocal ou un rfid mais dans les 2 cas, vous devez vous tenir à proximité du lapin, puis, l'application tourne sans interruption (ok il y a ce bug) ? J'ai bien vue qu'il y a un ping à intervalle régulier afin d'éviter de sortir mais dans ce cas, votre karotz est bloqué exclusivement pour cette application tout le temps? Est-ce bien cela?

Une autre solution dans ce cas est d'utiliser un Kinect. Certe il faut encore investir et un PC proxy est nécessaire mais sa technologie permet de discuter à distance. L'interaction est possible via l'api rest du karotz (voir http://encausse.wordpress.com/s-a-r-a-h/ par exemple).

J'ai moi même crée une application embarquée qui utilise l'api de reco vocale google et je cherche à voir comment je peu encore améliorer l'expérience utilisateur.

Merci,

Bruno

unread,
Sep 20, 2012, 3:49:38 PM9/20/12
to karo...@googlegroups.com
Bonsoir,
 
Merci pour ces excelents conseils ainsi que le lien qui contribut à me donner des idées pour d'autres projets, mais chaque cas est unique.
En effet, lors de l'achat du lapin, je comptais en faire une objet a part entiere et dédié de la domotique de la maison. Toujours à l'écoute de commande, sans pour celà y toucher, ni le renlancer, il devait se fondre dans la déco.
Sur le papier ça parraissait séduisant. Mais pour ça, il faut un code solide.
Pour aller plus loin, je suis actuellement en cours de création d'un droïde, a base d'Arduino. Là, encore, pleins de débouchées et en plus, ça fonctionne.
Le lapin, une fois desabiller, devait être l'interface vocale adaptée, du fait de son faible encombremant et de l'alimentation.
Les deux projets sont tombés à l'eau, d'ou mon amertume.
A noter que Violet ne s'est toujours pas manifesté, je pensais naïvemant que la discution étant relancée, ceux-ci se seraient sentis obligés de communiquer, mais ils doivent être occupés à changer la musique lors du boot du lapin pour la prochaine version du firmware.

KarMen

unread,
Sep 21, 2012, 4:09:54 PM9/21/12
to karo...@googlegroups.com
Bonjour Bruno,

J'ai peut-être la solution !!
Je pense que tu a vu mon proof of concept sur Arduino.
Celui ne peut fonctionner uniquement si l'ecoute sur le port serie du Karotz est désactivée, ce qui est rendu possible je pense suite aux modifs de Wizz.

Dans ce cas il faut programmer l'Arduino pour détecter du son et envoyer alors un signal sur le port série.
(par exemple on tape dans les mains).
Le karotz se met alors en mode écoute (voir s'il faut utiliser la reconnaissance vocale maison ou envoyer à une autre en Http).

Une fois la réponse reçue, l'action est lancée, avec un retour possible sur l'Arduino par le port série.

A tes outils !

Xavier

Bruno

unread,
Sep 24, 2012, 7:44:27 AM9/24/12
to karo...@googlegroups.com
Bonjour Karmen,
 

Merci pour cette piste que je n'avais pas encore exploré, dans le cas du droïde.

Je vais faire quelques recherches...

Juste pour être sûr d'avoir compris, l'acquisition du son se fait à partir d'un micro branché sur l'arduino ? Car ce qui est intéressant sur le lapin, c'est qu'il n'y a pas d'apprentissage, donc tout le monde peut lui parler.

Sur Arduino, il existe des cartes d'acquisition mais il faut impérativement faire de l'apprentissage et il ne dispose que de quelques mots, d'où la pauvreté de ce module.


Emmanuel Orain

unread,
Sep 26, 2012, 6:13:32 AM9/26/12
to karo...@googlegroups.com
Bonjour,

nous voulons apporter quelques précisions sur l'utilisation de la reconnaissance vocale dans les applications Karotz, en lien avec une discussion qui a lieu en ce moment ici. 
La reconnaissance vocale elle-même (c'est-à-dire la transormation d'un son en un texte) n'est pas réalisée pâr le logiciel embarqu" du Karotz, mais sur des serveurs faisant partie de notre plateforme Internet; cela signifie qu'à chaque fois qu'une reconnaissance vocale est demandée (que ce soit par le système embarqué dans le Karotz ou par une application), un aller et retour a lieu avec nos serveurs. 
Cette approche permet de bénéficier d'une bien meilleure reconnaissance vocale que si c'était le Karotz lui-même qui effectuait ce travail ... mais n'est pas du tout adaptée à une reconnaissance vocale "en continu" : nous avons dès le début orienté la conception du Karotz vers une utilisation "ponctuelle" de la reconnaissance vocale, plutôt que comme un moyen d'interaction "général", et c'est pourquoi la création d'applications à base de reconnaissance vocale "continue" est vouée à rencontrer des problèmes "structurels". 

En espérant que cela clarifie quelques points... 

Emmanuel Orain
Software Manager

KarMen

unread,
Sep 26, 2012, 1:11:20 PM9/26/12
to karo...@googlegroups.com
Bonjour Emmanuel,

Merci pour ta réponse qui montre que vous êtes toujours vivants !
Je pense que la plupart des membres du groupe comprennent bien le mode de fonctionnement de la reconnaissance vocale.

Je remet ici une  partie de mon post précédent:
Dans l'absolu ce que l'on souhaite ce n'est pas boucler.
C'est qu'il existe une méthode 
ex: karotz.asr.auto(grammar, grammar_language, ASRListener);
qui écoute et qui renvoie sur ASRListener à chaque fois qu'une parole est récupérée.
Je suis d'accord que cela changerait du tout au tout le rapport que l'on aurait avec le karotz !

L'idée est que si le niveau sonore atteint un certain niveau (ou si l'on tape dans les mains) le Karotz se mette en mode écoute.

Cependant la demande initiale est la résolution du bug de reconnaissance vocale au bout de 30 tentatives (qui n'échoue pas avec la VM).
Est-il envisageable d'avoir un lien plus formel entre les développeurs bénévoles que nous sommes, qui souhaitons le succès de Karotz, et Aldébaran ?

La proposition faite il y a quelques temps était de formaliser les bugs via le wiki et d'avoir des réponses la possibilité et sur les temps de résolution.

A ta dispo,

Xavier

Emmanuel Orain

unread,
Oct 11, 2012, 8:39:42 AM10/11/12
to karo...@googlegroups.com
Bonjour,

je voudrais ici apporter quelques nouvelles précisions à propos de ce problème "des 30 ASR", qui voit l'exécution d'une application embarquée dans le Karotz s'arrêter après 30 appels à la méthode de reconnaissance vocale. 
Comme il a été noté dans un message précédent, ce problème n'apparait pas lors de l'utilisation de la VM Java "externe", mais uniquement lors de l'utilsation de la VM embarquée dans le Karotz. Lorsque ce problème nous a été remonté, nous avons pu le reproduire systématiquement. Nous avons réalisé un certain nombre de tests et d'investigations pour en déterminer la cause.
La VM embarquée dans le Karotz n'est pas la même que la VM "externe" qui est mise à la disposition des développeurs pour la création et le débuggage des applications; il s'agit même d'une VM totalement différente, provenant d'une source différente (entre autres, elle en C++ et compilée pour le système embarqué du Karotz, à la différence de la VM "externe", qui est en Java et conçue pour être portable). Jusque là, nous n'avons pas détecté de différence de comportement dans l'exécution des applications, lorsqu'elle sont exécutées par ces deux VM, et c'est ce qui nous permet de mettre cette VM "externe" à disposition des développeurs ... et de nous en servir nous même pour développer nos propres applications et de les tester avant de les embarquer entièrement dans le Karotz.
Cependant, nos tests récent montrent effectivement que la manière dont l'ASR est gérée dans le Karotz consomme beaucoup de ressources aurpès de la VM embarquée, et qu'après un certain nombre d'appels (typiquement 30), cela ne fonctionne plus. 
Nous n'avions pas rencontré ce problème auparavant, car, même si nous savions que les tâches liées à l'ASR consommaient une quantité non négligeable de ressources à chaque appel, l'utilisation "habituelle" de l'ASR par les applications que nous avons développées ne faisaient que peu utilisation de l'ASR (au sein du foncionnement de l'application elle-même) ... et  de fait, nous n'avions simplement jamais atteint cette limite. Comme je le décrivais dans mon message précédent, le modèle même d'interaction avec le Karotz que nous avons envisagé dès le départ ne prévoyait qu'un petit nombre d'utilisations de la reconnaissance vocale au cours de l'exécution d'une application... ce qui est d'ailleurs le modèle suivi par l'ensemble des applications mises à disposition sur notre site (dans la section Appz), et que les possesseurs de Karotz utilisent très régulièrement.

Les raisons pour lesquelles les tâches d'ASR consomment d'importantes ressources auprès de la VM embarquée sont liées à la fois à la manière dont le code embarqué dans le Karotz interagit avec nos serveurs d'ASR, et à la gestion de ses ressources par la VM embarquée elle-même. Ces raisons sont assez "profondes", et une correction de ce problème nécessiterait de remettre en cause une importante partie de nos développements, liés principalement à l'interaction avec nos serveurs (et qui ne posent un probème de ressources qu'en relation avec la reconnaissance vocale).

Ainsi, notre décision actuelle est de ne pas modifier - à court ou moyen terme - la manière dont les ressources et la reconnaissance vocale sont gérées actuellement dans le logiciel embarqué sur le Karotz, afin de ne pas impacter le fonctionnement de l'immense majorité des applications existantes auxquels la majorité de nos utilisateurs sont habitués, ainsi que la charge potentiellement beaucoup plus lourde que nos serveurs de reconnaissance vocale devraient alors supporter.

Nous sommes tout à fait conscients que cela impose une "limite dure" pour le type d'applications que vous essayez de créer, qui reposent sur un grand nombre d'interaction vocales avec le Karotz lors de leur exécution. 
Nous aurions évidemment préféré pouvoir vous proposer une solution où l'utilisation d'une reconnaissance vocale "illimitée" aurait été possible simplement et immédiatement (... ainsi que de manière économiquement "légère"), mais ce n'est malheureusement pas le cas aujourd'hui. 

Emmanuel Orain
eor...@karotz.com

Sylvain Desbarbieux

unread,
Jun 23, 2014, 12:49:37 PM6/23/14
to karo...@googlegroups.com
Bonjour,
je déterre un vieux sujet mais je vient d'avoir mon karotz (oui oui je suis fou ;p)
il n'y a pas moyen en utilisant l'api rest + callback d'avoir l'effet escompté ?
requête rest -> callback timeout ou ASR -> requête rest -> callback timeout ou ASR...
c'est bourrin mais en théorie ça marche.

J'en profite quelqu'un aurai encore un dump de wiki.karotz.com qui est down et qui semble contenir de nombreuse choses intéressante (oui oui je sais je suis vraiment en retard de 2 ans ...)
Merci

KarMen

unread,
Jul 7, 2014, 3:58:51 PM7/7/14
to karo...@googlegroups.com
Salut Sylvain,

J'avais administré à l'époque le wiki. A défaut tu peux utiliser les tutos d'Alain Bregeon (à chercher dans ce groupe).
Si tu as des questions j'essaierais d'y répondre.

@+

Xavier

Sylvain Desbarbieux

unread,
Jul 19, 2014, 5:17:14 PM7/19/14
to karo...@googlegroups.com
Salut Xavier,
je viens de voir seulement maintenant ta réponse :(

Alors oui j'ai des questions si tu as quelques minutes à m’accorder :)
j'ai vu que le karotz utilise protobuf pour les messages aurai tu encore la dernière version des codes ?(j'ai trouvé une version sur pastbin mais je ne suis pas sur qu'elle soit bonne et/ou complète)

j'utilise l'api rest tout fonctionne bien ... sauf l'asr sait tu si quelqu'un a réussi à le faire fonctionner ? j'ai fait une demande au support mais je n'ai eu aucune réponse.
je suis quasi sur qu'il y a un bug, le karotz passe bien en écoute (mais uniquement quelques seconde) et envoie bien les info au serveur d'asr qui lui réponds bien par contre je ne reçoit aucun callback.
il faudra que je regarde si la communication entre le process voice et controller se passe bien (tout est ok sur le process voice).
c'est dommage car il ne manque quasi plus que ça à mon Rabitz Now (équivalent de google now).

y a t-il moyen de mettre le lapin "en veille" comme le fait les serveur de viollet ?

et enfin dernière question  y a t-il un moyen pour générer les fichier de conf de application ?

Merci (et si tu n'a pas le temps je comprendrai aussi :) )
Sylvain
Reply all
Reply to author
Forward
0 new messages