Closed renault1669 closed 7 years ago
Aaah ca me rappelle une discussion que j'ai eu sur un autre ticket ou une personne voulait justement déclencher un ordre via ligne de commande mais répondre par la voix. Il y a bien sûr un conflit avec l'API car je ne peux pas savoir à l'avance si la réponse sera donné via la ligne de commande ou la voix.
Donc voici ce sur quoi nous nous sommes mis d'accord (et c'est ainsi que ca fonctionne):
Dans ton cas il te faudra donc déclencher l'ordre en ligne de commande. C'est facile si c'est sur le même raspberry pi. C'est possible depuis le réseau en lançant une commande via SSH.
API
$> ./jarvis.sh -jx "ca va?"
[{"snowboy":"Très bien et toi ça va?"},{"debug":"*OUI* *NON*"}]
$> # have to send answer as new command
non-API
$> ./jarvis.sh -x "ca va?"
Jarvis: très bien et toi ça va?
# *OUI* *NON*
Jarvis: Waiting to hear 'Jarvis' # BUG
Alex: # listening voice answer
Malheureusement j'ai l'impression qu'il y a un bug car il me demande de prononcer le hotword. Bon avant que je corrige, est-ce que cette solution te conviendrait? (si j'ai bien compris ce que tu essayes de faire).
Retour très intéressant, merci.
Une petite question avant de me positionner sur ta proposition : Il y a bien sûr un conflit avec l'API car je ne peux pas savoir à l'avance si la réponse sera donné via la ligne de commande ou la voix.
--> pourquoi le passage de l'information - canal de retour - en paramètre de l'API d'appel n'est pas une solution viable à ce problème de prédictibilité ?
En croisant différentes informations (celles de ce fil & celles du fil https://github.com/alexylem/jarvis/issues/335 sur les hooks), j'ai l'impression que c'est lié à la stratégie que tu as retenue pour la conception de l'API : lancement d'instances spécifiques de JARVIS au travers de requêtes HTTP, plutôt que l'appel de fonctions spécifiques d'une instance unique ... Si oui, est-ce pour cela que tu as adopté le fonctionnement binaire que tu me proposes ?
Mon retour sur ta proposition :
sur le plan fonctionnel, RAS. Ta proposition répond à mes besoins ; API pour le "TTS" ou des commandes complexes dans lesquelles j'interpréterai dynamique le JSON de retour pour poser la question suivante & non-API pour les cas d'interaction vocale complexe avec l'humain
sur le plan opérationnel, pas de problème pour invoquer le service depuis une autre machine ; au pire, je développe ma propre API entre une requête http et une commande système.
Le seul bémol que j'identifie (en attente de confirmation de ta part), c'est l'impossibilité de faire tourner sur une même machine 2 instances de JARVIS accédant toutes les deux à la même ressource physique 'micro'
une instance lancée en tache de fond, au lancement du système pour le traitement des requêtes humaines sur la base du triger 'snowboy' et le TTS via l'API
une seconde instance lancée dynamiquement depuis ma domotique, sur la base d'un triger domotique, en mode NON-API, pour traiter les échanges avec un humain, ?
Cordialement, Laurent.
Je me répond sur le dernier point : 2 instances de JARVIS en même temps --> impossible voir échange https://github.com/alexylem/jarvis/issues/321
Si oui, est-ce pour cela que tu as adopté le fonctionnement binaire que tu me proposes ?
Exactement, tu as tout compris. C'est aussi car lea Jarvis en codé en bash et je ne saurais pas comment faire réagir le script à des évènements externes. En python ca serait possible.
c'est l'impossibilité de faire tourner sur une même machine 2 instances de JARVIS accédant toutes les deux à la même ressource physique 'micro'
Je confirme... décidément tu as bien cerné le fonctionnement de Jarvis. Après on peut très bien imaginer une commande tordue qui killerait l'instance background de Jarvis avant d'utiliser le micro...
Donc GO pour corriger le bug?
Bonsoir Alexandre,
merci d'avoir pris le temps de me répondre.
Pas certains qu'une commande tordue apporte une valeur ajoutée à ton développement. A moi, de gérer cette contrainte en fonction de mon besoin particulier.
Donc GO pour la correction du bug.
Cordialement, Laurent;
Après analyse (et c'est pour ca que je ne l'ai pas vu avant), le bug n'arrive que lorsque le mode conversation est à false
dans Settings > General > Conversation Mode
Voila c'est corrigé. Mettez à jour:
$> ./jarvis.sh -u
Je suis en mode conversation ...
J'en profite même si hors sujet : y a t'il une commande spécifique pour sortir de ce mode avant les 3 tentatives ; par exemple, je dis "Merci" et l'on sort de la conversation ...
Merci pour la mise à jour.
alexylem/jarvis/issues/425
Merci. Pas assez assidu ces derniers jours. Cdlt, Laurent.
Dans le cadre de mon intégration de JARVIS avec mon écosystème domotique, je souhaite pouvoir déclencher une commande imbriquée directement à partir de l'API, via une requête HTTP - GET ad-hoc.
Exemple :
1- détection par la domotique d'un mouvement dans une pièce théoriquement inoccupée à cet instant
2- requête http de la domotique vers l'instance de JARVIS attachée à la pièce pour déclencher une commande "BONJOUR INCONNU" définie comme suit
3- échanges d'informations entre JARVIS et l'inconnu par le canal oral et remonté d'informations de JARVIS vers la domotique via des requêtes http ad-hoc
Suite à une lecture attentive du fil https://github.com/alexylem/jarvis-api/issues/2 , pas de soucis pour lancer une instance de JARVIS à partir de ma console, avec la bonne commande ...
Par contre, impossible de faire cohabiter cette exécution ponctuelle avec une autre instance de JARVIS ; les 2 instances accèdent à la même ressource micro ....
_rec FAIL formats: can't open input `default': snd_pcmopen error: Device or resource busy ERROR: rec command failed HELP: Verify your mic in Settings > Audio > Mic
Et en plus, pas idéal par rapport au mode de fonctionnement que je vise, à savoir disposer d'une seule instance par PI traitant à la fois :
des appels directs à une commande = commande activée à partir du micro via le hortword puis interactions vocale selon un scénario pré déterminé
des appels 'indirects' à cette même commande = commande activée via l'API donc sans hortword puis interactions vocales comme dans le premier cas
Question : est-ce faisable avec la version actuelle de l'API ? J'ai lu et relu plusieurs fois la documentation mais pas trouvé de réponse ...
Sinon, est-il possible de faire évoluer l'API dans ce sens ? Dans un premier temps, la seule information en retour dont j'ai besoin est le résultat du traitement / le code retour. Je n'ai pas identifié à date l'intérêt d'avoir le détail du scénario dans le JSON.
Par avance merci.
Cordialement, Laurent.