AVATAR Forum
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -29%
PC portable – MEDION 15,6″ FHD Intel i7 ...
Voir le deal
499.99 €

aide rawsentence

2 participants

Aller en bas

aide rawsentence Empty aide rawsentence

Message par halim Dim 27 Aoû - 23:28

bonsoir stephane, un aide pour spliter la rewsentence s'il te plait
voila j'ai un peu avancer , jai pris exemple sur tes plugins et plus precisement le fichier action j'ai fait copie coller du code pour la sentence mais AVATAR me repond aussi en anglais la phrase que j'ai dicter
tu peux me dire ce que je doit modifier stp, merci d'avance
fichier prop
"rules": {
"disbonjour": ["say hello"],
"disbonsoir": ["say good evening","say good night"]
}

fichier action
'use strict';

// Ce module vérifie prépare l'objet data envoyé au plugin

Object.defineProperty(exports, "__esModule", {
 value: true
});

let _helpers = require('../../node_modules/ava-ia/lib/helpers');

// Ignor� une fois dans TERM
var TERM = ['à', 'a', 'mes', 'la', 'aux', 'ma', 'mon', 'aux', 'le', 'les'];
// Toujours ignor� dans NOTERM
var NOTERM = ['�', 'la'];
// Non ignor� si un term est d�j� pris, ex: la d�fintion de la revue du cin�ma
var IGNORETERM = ['aux','a', 'à', 'mes', 'mon', 'ma'];


exports.default = function (state) {

return new Promise(function (resolve, reject) {

for (var rule in Config.modules.DisBonjourBonsoir.rules) {
var match = (0, _helpers.syntax)(state.sentence, Config.modules.DisBonjourBonsoir.rules[rule]);
if (match) break;
}


var TAKEN = [];
       for (var i in TERM) {
           TAKEN.push(0);
       }

       var sentence = '';
       var indexDisBonjourBonsoir, pos, take;
       var terms = state.rawSentence.split(' ');
       terms.map(function (term, index) {

           if (!indexDisBonjourBonsoir && term.toLowerCase() === 'DisBonjourBonsoir') indexDisBonjourBonsoir = true;

           if (indexDisBonjourBonsoir) {
               take = false;
               pos = _.indexOf(TERM, term.toLowerCase());
               if (pos != -1) {
                   if (TAKEN[pos] == 0) {
                       if (sentence && sentence.length > 0 && _.indexOf(IGNORETERM, term.toLowerCase()) != -1) {
                           take = true;
                       } else {
                           TAKEN[pos] = 1;
                       }
                   } else {
                       if (_.indexOf(NOTERM, term.toLowerCase()) == -1)
                           take = true;
                   }
               } else {
                   take = true;
               }
               if (take) {
                   sentence += term;
                   if (terms[index + 1]) sentence += ' ';
               }
           }
       });

       // test si on a r�cup�r� quelque chose
       if (sentence) {
           sentence = sentence.replace('l\'', '');
           sentence = sentence.sansAccent();
           sentence = sentence.replace(sentence[0], sentence[0].toUpperCase());

// Renvoie le client qui a exécuté la règle ou une pièce dans la règle ou une pièce mappée ou par défaut...
}
else{
let room = Avatar.ia.clientFromRule (state.rawSentence, state.client);
setTimeout(function(){
if (state.debug) info('Action DisBonjourBonsoir');

state.action = {
module: 'DisBonjourBonsoir',
command: rule,
room: room,
sentence: sentence,
sentence: state.sentence,
rawSentence: state.rawSentence
};
resolve(state);
},
((Config.waitAction && Config.waitAction.time) ? Config.waitAction.time : 100));
}
});
};

String.prototype.sansAccent = function () {
   var accent = [
       /[\300-\306]/g, /[\340-\346]/g, // A, a
       /[\310-\313]/g, /[\350-\353]/g, // E, e
       /[\314-\317]/g, /[\354-\357]/g, // I, i
       /[\322-\330]/g, /[\362-\370]/g, // O, o
       /[\331-\334]/g, /[\371-\374]/g, // U, u
       /[\321]/g, /[\361]/g, // N, n
       /[\307]/g, /[\347]/g, // C, c
   ];
   var noaccent = ['A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', 'N', 'n', 'C', 'c'];

   var str = this;
   for (var i = 0; i < accent.length; i++) {
       str = str.replace(accent[i], noaccent[i]);
   }
   return str;
};

fichier js
exports.action = function(data, callback){

var tblCommand = {

disbonjour : function() {
answer = data.action.sentence;
Avatar.speak(`bonjour ${answer}`, data.client, function(){
Avatar.Speech.end(data.client);
});
},

disbonsoir : function() {
answer = data.action.sentence;
Avatar.speak(`bonsoir ${answer}`, data.client, function(){
Avatar.Speech.end(data.client);
});
}
};

let client = setClient(data);
info("DisBonjourBonsoir:", data.action.command, "From:", data.client, "To:", client);
tblCommand[data.action.command]();
callback();
}


function setClient (data) {
let client = data.client;
if (data.action.room)
client = (data.action.room != 'current') ? data.action.room : (Avatar.currentRoom) ? Avatar.currentRoom : Config.default.client;
   if (data.action.setRoom)
client = data.action.setRoom;
return client;
}
halim
halim

Messages : 89
Date d'inscription : 19/11/2022

Revenir en haut Aller en bas

aide rawsentence Empty Re: aide rawsentence

Message par Avatar Lun 28 Aoû - 13:48

Slt,

De ce que je vois:
if (!indexDisBonjourBonsoir && term.toLowerCase() === 'DisBonjourBonsoir') indexDisBonjourBonsoir = true;

le test [ term.toLowerCase() === 'DisBonjourBonsoir' ] me parait pas bon.
déjà le toLowerCase change en minuscules donc tu ne peux pas avoir de majuscules dans ton test.
Ensuite, tester 'DisBonjourBonsoir' est bizarre; A moins que tu dises ce mot dans la phrase... non, ca me parait impossible de dire ca ou alors avec des espaces genre "dis bonjour bonsoir".

Donc par conséquent, la variable "indexDisBonjourBonsoir" n'est jamais true et le if (indexDisBonjourBonsoir) n'est jamais exécuté.

Mai bon, si tu fais un console.log pour voir si tu passes dans le test ou la valeur de cette variable, tu vas vite le voir.

autre chose, tu as 2 objets state.action.sentence dans l'action. Pas bon.

A moins que j'ai survolé un peu vite ce que tu as fait... possible aussi  Wink
A+
Avatar
Avatar

Messages : 79
Date d'inscription : 01/09/2020
Age : 58
Localisation : Toulouse

Revenir en haut Aller en bas

aide rawsentence Empty Re: aide rawsentence

Message par halim Sam 16 Mar - 14:40

rebonjour stephane;
j'ai certain plugins avec rawSentence, l'assistant vocal AVATAR ne reconnais pas la phrase à dicter aprés spliter;
toujour le nom du film en dernier dans la régle: les horaires du film le seigneur des anneaux

ici dans cette exemple plugin allociné pour avoir les horaires du film

const movieName = data.action.rawSentence.toLowerCase().replace(/les|des|heures|horaires|du film/g, "").trim();
if (!movieName) {
 Avatar.speak("Le nom du film n'a pas été trouvé. Veuillez réessayer.", data.client, () => {
Avatar.Speech.end(data.client);
 });
 return;
}
 
if (movieName.length > 0) {
Avatar.speak("Voici les horaires du film " + movieName, data.client, () => {
 Avatar.Speech.end(data.client);
});
return;
 }

une solution? merci d'avance

avec la fonction askme ca fonctionne mieux reconnais toute dans la phrase // en sortie le nom du film : le seigneur des anneaux
Avatar.askme("Tu veux les horaires de quel film ?", data.client, {
"*": "generic",
"terminer": "done"
}, 0,
function (answer, end) {
if (answer.toLowerCase().indexOf('generic') !== -1) {
end(client)
answer = answer.split(':')[1].toLowerCase();
if (answer.indexOf(answer) !== -1) {
answer = answer.replace("les", "").replace("horaires", "").replace("heures", "").replace("du", "").replace("de", "").replace("film", "").trim();
Avatar.speak("Voici les horaires du film " + answer, data.client, function () {
Avatar.Speech.end(data.client);
});
return;
} else {
Avatar.speak("Le nom du film n'a pas été trouvé. Veuillez réessayer.", data.client, () => {
Avatar.Speech.end(data.client);
});
}
}
});
halim
halim

Messages : 89
Date d'inscription : 19/11/2022

Revenir en haut Aller en bas

aide rawsentence Empty Re: aide rawsentence

Message par Avatar Sam 16 Mar - 18:53

Je suis désolé mais le copier/coller de ce que tu as fait est insuffisant.
J'aurais préféré au minimum un copier/coller de la console. Au moins on aurait vu ce que tu as dis comme règle et le résultat. Ton code n'apporte rien.
On ne sait même pas ce que ton replace donne comme résultat.

Pour info, tu as la sentence en anglais dejà spliter dans les objets state.tokens et state.tags que tu peux passer dans l'objet state envoyé au module du plugin (dans le module.action.js) c'est dans la doc de dev.
Il faut généralement que ces 2 objets est la même longueur.
Dans ton cas, tu as:
state.tokens = ["the", "schedule", "of", "the", "film", "the", "lord", "of", "the, "ring"]
state.tags = ["Determiner", "noun", "Preposition", "Determiner", "Verb", "Determiner", "Noun", "Preposition", "Determiner", "noun"]

Perso, je ferais quelque chose de plus élégant qui te permettrait de ne pas utiliser de replace vraiment pas beau. comme par exemple:
- Donne moi les horaires de film
- Quel film ?
- Le seigneur des anneaux
- voici les horaires pour le film....
- tu veux autre choses ?
- répète
- voici les horaires pour le film....
- tu veux autre choses ?
- Envoie le moi sur mon tél
- envoyé
- merci terminé

Pas de replace, pas de split. Propre. Fonctionnel.











Avatar
Avatar

Messages : 79
Date d'inscription : 01/09/2020
Age : 58
Localisation : Toulouse

Revenir en haut Aller en bas

aide rawsentence Empty Re: aide rawsentence

Message par halim Dim 17 Mar - 1:51

excuse moi stephane, j'ai pas met tout le code du plugin allocine, en faite je veux developper le plugin sans les askme pour la fonction pour les horaires du film,
que la regle soit: exemple: les horaires du film le seigneur des anneaux

pour la fonction les film a l'affiche le plugin c'est bon donne tout les film en salle
ici j'utilise l'api en json pour les film a l'affiche, j'ai déja developper le plugin on scrapant le site allociné , les film à l'affiche et les sortie de la semaine, je pense c'est mieux que l'api allociné en json


"rules": {
"allocine": ["allociné","movy in the cinema","cinema","film * display"],
"filmHoraires": ["movie schedule","film schedule","hours * film","movie * hour"]
}

exports.action = function(data, callback){

let tblCommand = {
allocine : function() {alloCine (data, client);
},
filmHoraires : function() {filmHoraires (data, client);
}
};

let client = setClient(data);
info("AlloCine:", data.action.command, "From:", data.client, "To:", client);
tblCommand[data.action.command]();
callback();
}

function alloCine(data, client) {

   const numSalle = Config.modules.AlloCine.numSalle;

   if (!numSalle) {
       Avatar.speak("L'ID de la salle de cinéma n'est pas renseigné. Veuillez le renseigner sur le fichier propriétés.", data.client, () => {
           Avatar.Speech.end(data.client);
       });
       return;
   }

   async function main(data, client) {
       try {
           const locationResponse = await fetch('http://ip-api.com/json/');
           const locationResult = await locationResponse.json();
           const ville = locationResult.city;

           const url = `https://www.allocine.fr/_/showtimes/theater-${numSalle}/`; // B0114
           const response = await fetch(url);

           if (response.status !== 200) {
               throw new Error(`Code erreur: ${response.status}`);
           }

           const response2 = await response.json();
           const movies = response2.results.map(result => result.movie.title).join('. ');

const showtimes = response2.results[0].showtimes.local;
const formattedShowtimes = showtimes.map(showtime => ` - ${showtime.startsAt}`).join('\n');


if(movies) {
           Avatar.speak(`Voici les films à ${ville}: ${movies}.`, data.client, () => {
               Avatar.Speech.end(data.client);
           });
return;
}

       } catch (error) {
           Avatar.speak(`Je n'arrive pas à accéder au site allociné. Erreur: ${error.message}`, data.client, () => {
               Avatar.Speech.end(data.client);
           });
       }
   }

   main(data, client);
}

(j'ai pas encore créér une variable pour les horaires du film pour le moment je veux déja avoir en sortie le titre du film)

ici avec les askme j'ai toujour en sortie le nom du film reconnais tout le titre du film

function filmHoraires(data, client) {

Avatar.askme("De quel film souhaitez-vous connaître les horaires ?", data.client, {
"*": "generic",
"terminer": "done"
}, 0, function (answer, end) {

if (!answer) {
end(client);
return Avatar.speak("Je n'ai pas compris. Veuillez réessayer.", data.client, () => {
filmHoraires (data, client);
});
}
if (answer.toLowerCase().indexOf('generic') != -1) {
end(client);
answer = answer.split(':')[1].toLowerCase();
if (answer.toLowerCase().indexOf(answer) !== -1) {
answer = answer.replace("les", "").replace("horaires", "").replace("heures", "").replace("du", "").replace("le", "").replace("film", "").trim();
Avatar.speak("Voici les horaires du film " + answer, data.client, () => {
/*
// if(movieName in movies) {}
http://Avatar.speak(`à ${time.join(', ').toLocaleString()} heures.`, data.client, () => {
//  main(data, client, formattedShowtimes)
*/
Avatar.Speech.end(data.client);
return;
});
//});
}
}
switch(answer) {
case "done":
default:
Avatar.speak("Terminé, à bientot sur allociné", data.client, () => {
end(data.client, true);
});
}

});

}

je vais le refaire comme tu me la conseiller on scrapant le site allociné c'est mieux que l'api en json
merci stephane ; à +
halim
halim

Messages : 89
Date d'inscription : 19/11/2022

Revenir en haut Aller en bas

aide rawsentence Empty Re: aide rawsentence

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum