Création d'App snips impossible

#1

Bonjour
Comme beaucoup j’ai essayé de créer ma propre application snips à partir d’une application existante. Dans mon cas je suis parti de l’application heure de Joseph.
Voici mon premier code :

#!/usr/bin/env python2
from hermes_python.hermes import Hermes
from datetime import datetime
from pytz import timezone

MQTT_IP_ADDR = "localhost"
MQTT_PORT = 1883
MQTT_ADDR = "{}:{}".format(MQTT_IP_ADDR, str(MQTT_PORT))


def verbalise_hour(i):
	if i == 0:
		return "minuit"
	elif i == 1:
		return "une heure"
	elif i == 12:
		return "midi"
	elif i == 21:
		return "vingt et une heures"
	else:
		return "{0} heures".format(str(i)) 

def verbalise_minute(i):
	if i == 0:
		return ""
	elif i == 1:
		return "une"
	elif i == 21:
		return "vingt et une"
	elif i == 31:
		return "trente et une"
	elif i == 41:
		return "quarante et une"
	elif i == 51:
		return "cinquante et une"
	else:
		return "{0}".format(str(i)) 


def intent_received(hermes, intent_message):

	print()
	print(intent_message.intent.intent_name)
	print ()

	slots = intent_message.slots

	print(slots.assistant_name)
	print(len(slots.assistant_name))
	print(intent_message.intent.probability)

	if intent_message.intent.intent_name == 'mathieusayag:askTime' and len(slots.assistant_name) > 0 and intent_message.intent.probability>0.9:

		sentence = 'Il est actuellement '
		print(intent_message.intent.intent_name)

		now = datetime.now(timezone('Europe/Paris'))

		#sentence += verbalise_hour(now.hour) + " " + verbalise_minute(now.minute)
		print(sentence)

		# hermes.publish_continue_session(intent_message.session_id, sentence, ["mathieusayag:greetings"])
		hermes.publish_end_session(intent_message.session_id, sentence)

	elif intent_message.intent.intent_name == 'mathieusayag:greetings':

		hermes.publish_end_session(intent_message.session_id, "De rien!")
		
	elif intent_message.intent.intent_name == 'mathieusayag:AskHello' and len(slots.assistant_name) > 0 and intent_message.intent.probability>0.9:

		sentence = 'Hello you speak english very well !'
		print(intent_message.intent.intent_name)
	
		print(sentence)
		hermes.publish_end_session(intent_message.session_id, sentence)
	elif intent_message.intent.intent_name == 'mathieusayag:AskBonjour' and len(slots.assistant_name) > 0 and intent_message.intent.probability>0.9:

		sentence = 'Bonjour '
		print(intent_message.intent.intent_name)
		if (now.hour >= 17)
		    sentence = 'A ce moment de la journée il faut dire Bonsoir '
		print(sentence)
		hermes.publish_end_session(intent_message.session_id, sentence)
	elif intent_message.intent.intent_name == 'mathieusayag:AskBonsoir' and len(slots.assistant_name) > 0 and intent_message.intent.probability>0.9:

		sentence = 'Bonsoir '
		print(intent_message.intent.intent_name)
		if (now.hour <= 17)
		    sentence = 'A ce moment de la journée c\'est plûtot Bonjour '
		print(sentence)
		hermes.publish_end_session(intent_message.session_id, sentence)

with Hermes(MQTT_ADDR) as h:
	h.subscribe_intents(intent_received).start()

Je me retrouve avec l’erreur que tous le monde a pu avoir au moins une fois…

The session was ended because one of the component didn’t respond in a timely manner

Donc ma question qu’est ce que je fais de mal ou qu’est ce que je ne fais pas plutôt !

Merci de votre aide

#2

Bonjour Mathieu,

Que retournent les logs?

Pour visualiser les logs:

sam service log snips-skill-server
et
sam watch

#3
pi@raspberrypi:~ $ sam watch
[19:19:44] Watching on localhost:1883 (MQTT)
[19:19:45] [AudioServer] finished playing wav with id '7fe9283a-84cb-46d8-9779-cd95181ca985'
[19:19:45] [Asr] was asked to listen on site default
[19:19:48] [Asr] captured text "bonjour" in 3.0s
[19:19:48] [Asr] was asked to stop listening on site default
[19:19:48] [AudioServer] was asked to play a wav of 93.1 kB with id 'bfdb958f-9394-4e16-a99f-21ea8c1ca6fd' on site default
[19:19:50] [AudioServer] finished playing wav with id 'bfdb958f-9394-4e16-a99f-21ea8c1ca6fd'
[19:19:50] [Nlu] was asked to parse input "bonjour"
[19:19:50] [Nlu] detected intent mathieusayag:AskBonjour with confidence score 0.951 for input "bonjour"
[19:19:50] [Dialogue] New intent detected mathieusayag:AskBonjour with confidence 0.951
[19:19:55] [Dialogue] session with id '10e78062-64c2-437d-b6b1-a4aa71b3403e' was ended on site default. The session was ended because one of the component didn't respond in a timely manner
[19:19:55] [Asr] was asked to stop listening on site default
[19:19:55] [Hotword] was asked to toggle itself 'on' on site default

-- Logs begin at Thu 2016-11-03 18:16:42 CET. --
mars 17 19:31:00 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : [spotifywebapi][out] Get the cached token: OK
mars 17 19:31:00 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : [spotifywebapi][out] [Error] No cached token find ! Gen the token with:
mars 17 19:31:00 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : [spotifywebapi][out] python token-generator.py
mars 17 19:31:00 raspberrypi snips-skill-server[3492]: WARN:snips_skill_server_lib::handler::nosandbox: child spotifywebapi has stopped with status `exit code: 3`
mars 17 19:31:00 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : restarting action spotifywebapi (restart_fails: 2)
mars 17 19:31:01 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : [spotifywebapi][out] Get the cached token: OK
mars 17 19:31:01 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : [spotifywebapi][out] [Error] No cached token find ! Gen the token with:
mars 17 19:31:01 raspberrypi snips-skill-server[3492]: INFO:snips_skill_server_lib::runner            : [spotifywebapi][out] python token-generator.py
mars 17 19:31:01 raspberrypi snips-skill-server[3492]: WARN:snips_skill_server_lib::handler::nosandbox: child spotifywebapi has stopped with status `exit code: 3`
mars 17 19:31:01 raspberrypi snips-skill-server[3492]: ERROR:snips_skill_server_lib::runner            : action spotifywebapi failed 3 times in the last 10 seconds, disabling it

Je n’avais pas vu le log mais à priori beaucoup d’erreur avec l’app spotify, le problèmpe serait du à cette application ?

MODIFICATION : Je viens d’enlever toutes les appli sauf la mienne, toujours même chose dans sam watch et rien dans le log log snips-skill-server.

#4

D’après la log de snips-skill-server, il semblerait que ton action.xxx.py ne tourne pas!
Snips détecte bien l’intent mathieusayag:AskBonjour, mais celui-ci n’est traité par aucune action.

Il faudrait vérifier si l’action est bien présente dans le répertoire /var/lib/snips/skills

Voici un lien sur la documentation qui montre comment ‘degugger’ une action. https://docs.snips.ai/articles/console/actions/actions/code-your-action/debug-your-actions

Le mieux pour commencer à tester une action, est de lancer l’exécution directement et ne pas utiliser snips-skill-server

python action..py

Voilà, si cela peut aider

#5

bonjour

Merci de votre aide effectivement j’avais plusieurs erreurs que j’ai résolu, par contre voici une erreur que je ne sais pas comment résoudre

from hermes_python.hermes import Hermes
ImportError: No module named hermes_python.hermes

Merci de votre aide

#6

Le module “hermes_python” n’est pas disponible, il faut le télécharger:

pip install hermes_python

#7

Bonjour,

j’ai installé hermes_python, ce qui me parraissait bizzare d’ailleurs car jusque là l’application heure fonctionnait.
Voici le log après installation et toujours pareil

pi@raspberrypi:~ $ sam service log snips-skill-server
-- Logs begin at Thu 2016-11-03 18:16:42 CET. --
mars 18 21:00:17 raspberrypi systemd[1]: Started Snips Skill Server.
mars 18 21:00:18 raspberrypi snips-skill-server[438]: INFO:snips_skill_server_lib::runner: searching dir for actions: /var/lib/snips/skills/.cache
mars 18 21:00:18 raspberrypi snips-skill-server[438]: INFO:snips_skill_server_lib::runner: searching dir for actions: /var/lib/snips/skills/Bidule
mars 18 21:00:18 raspberrypi snips-skill-server[438]: INFO:snips_skill_server_lib::runner: found action "/var/lib/snips/skills/Bidule/action-bidule.py"
mars 18 21:01:37 raspberrypi systemd[1]: Stopping Snips Skill Server...
mars 18 21:01:37 raspberrypi systemd[1]: Stopped Snips Skill Server.

log watch

pi@raspberrypi:~ $ sam watch
[21:07:27] Watching on localhost:1883 (MQTT)
[21:07:35] [Hotword] detected on site default, for model bidule
[21:07:35] [Asr] was asked to stop listening on site default
[21:07:35] [Hotword] was asked to toggle itself 'off' on site default
[21:07:35] [Dialogue] session with id 'b1bc16cb-1cea-4441-a2fb-b9124c35d327' was started on site default
[21:07:35] [AudioServer] was asked to play a wav of 41.1 kB with id '49367d77-7997-4bc9-83bd-62369c134bd0' on site default
[21:07:36] [AudioServer] finished playing wav with id '49367d77-7997-4bc9-83bd-62369c134bd0'
[21:07:36] [Asr] was asked to listen on site default
[21:07:38] [Asr] captured text "quelle heure est il" in 2.0s
[21:07:38] [Asr] was asked to stop listening on site default
[21:07:38] [AudioServer] was asked to play a wav of 93.1 kB with id 'c33466aa-0188-4a8e-a9f9-5ea9ff0e0aa9' on site default
[21:07:40] [AudioServer] finished playing wav with id 'c33466aa-0188-4a8e-a9f9-5ea9ff0e0aa9'
[21:07:40] [Nlu] was asked to parse input "quelle heure est il"
[21:07:40] [Nlu] detected intent mathieusayag:askTime with confidence score 1.000 for input "quelle heure est il"
[21:07:40] [Dialogue] New intent detected mathieusayag:askTime with confidence 1.000
[21:07:45] [Dialogue] session with id 'b1bc16cb-1cea-4441-a2fb-b9124c35d327' was ended on site default. The session was ended because one of the component didn't respond in a timely manner
[21:07:45] [Asr] was asked to stop listening on site default
[21:07:45] [Hotword] was asked to toggle itself 'on' on site default

Si vous avez d’autres idée je suis preneur

Merci

#8

Le plus simple et direct à ma connaissance pour débuguer les actions est de lancer soi-même snips-skills-server depuis le répertoire /var/lib/snips/skills:

sudo systemctl stop snips-skills-server
snips-skills-server -vvv

Les actions tourneront avec l’utilisateur pi, donc tu auras des erreurs de permission, notamment avec l’application Spotifty qui ne pourra pas écrire le token. Tu peux les ignorer le temps de faire ce debug.

Je ne sais pas si la version que tu as postée était à jour mais je vois des erreurs de syntaxe à la relecture. Il manque des : derrière des if.

Un truc tout bête mais je me suis déjà fait avoir, le fichier d’action doit être nommé action-xxx.py, pas action.py tout court ou action.xxx.py, sinon snips-skills-server ne le verra pas.

Pour ce qui concerne spécifiquement ton application d’heure. Je pense que tu t’embêtes pour rien, comme moi avant. Le module TTS est déjà capable de prononcer les heures et d’autres formats. Je t’invite à consulter http://dafpolo.free.fr/telecharger/svoxpico/SVOX_Pico_Manual.pdf à partir de la page 70. C’est sur ce même forum qu’on m’a donné ce lien. Je ne sais pas si c’est la dernière version à jour.

Et si ton Raspberry est correctement configuré (indépendamment de la surcouche Snips), tu ne devrais pas avoir à faire de changement de timezone. L’heure système devrait déjà être à l’heure de Paris. C’est l’utilitaire raspi-config (à lancer en utilisateur root avec sudo) qui s’occupe de ça, ainsi que de la locale à mettre en français. Snips devrait mettre en avant ce genre de choses dans sa documentation.

Une fois ces deux réglages faits, l’action de donner l’heure devient triviale. Je t’invite à lire la description de mon application Heure et date: https://console.snips.ai/store/fr/skill_eAX3QaN7kP puis de l’éditer (ce qui va la forker). Tout le code tient dans un snippet directement éditable dans la console web.

En ce qui concerne ton code, en l’état tu auras probablement des erreurs du type UnicodeDecodeError. Tu peux les réduire en rajoutant la ligne # -*- coding: utf-8 -*- en deuxième mais pas les faire disparaître. Je te conseille d’utiliser Python 3 plutôt que Python 2 qui est en fin de vie. Ton code a l’air compatible sans changement. Étant je pense le seul utilisateur de ton application, tu n’as pas à te soucier de la transition. Tu n’as qu’à éditer setup.sh pour qu’il crée un venv python3 à la place et refaire l’installation.