Trying to move spotify skill to padatious and looks promising (test.py)

This commit is contained in:
Mathieu B 2021-07-29 14:57:55 +02:00
parent 892e1c8cfe
commit fe76f2bad3
8 changed files with 127 additions and 29 deletions

3
.gitignore vendored
View File

@ -10,6 +10,9 @@ __pycache__/
# C extensions
*.so
intent_cache/*
**/intent_cache/**
# Distribution / packaging
.Python

View File

@ -44,7 +44,6 @@ if __name__ == '__main__':
# intent_manager.recognise("cherche sur wikipedia Elon Musk")
# intent_manager.recognise("raconte moi une blague")
intent_manager.recognise("joue le morceau crazy crazy nights de KISS sur spotify")
intent_manager.recognise("joue le morceau crazy crazy nights de KISS sur spotify")
intent_manager.recognise("joue crazy crazy nights")
# start the flask server

View File

@ -42,17 +42,20 @@ class Skill:
for line in infile.readlines():
intent_manager.register_regex(line.replace('\n', ''), self.name)
def speak(self, message):
print(message)
class SkillRegistering(type):
def __init__(cls, name, bases, attrs):
for key, val in attrs.items():
if type(val) is types.FunctionType and not str(val).__contains__("__"):
properties = getattr(val, "_register", None)
type = getattr(val, "_type", None)
if properties is not None:
intent = properties[0]
intent_name = intent.name
intent_manager.intents_handlers[f"{intent_name}"] = [getattr(cls, key), name]
if type is not None:
properties = getattr(val, "_data", None)
if properties is not None:
if type is 'adapt':
intent = properties[0]
intent_name = intent.name
intent_manager.intents_handlers_adapt[f"{intent_name}"] = [getattr(cls, key), name]
elif type is 'padatious':
intent_file = properties[0]

View File

@ -5,7 +5,22 @@ def intent_handler(*args):
"""
def decorator(f):
f._register = args
f._type = "adapt"
f._data = args
return f
return decorator
return decorator
def intent_file_handler(*args):
"""
Creates an attribute on the method, so it can
be discovered by the metaclass
"""
def decorator(f):
f._type = "padatious"
f._data = args
return f
return decorator

View File

@ -1,17 +1,11 @@
from adapt.intent import IntentBuilder
from jarvis.skills import Skill, SkillRegistering
from jarvis.skills.decorators import intent_handler
from jarvis.skills.decorators import intent_file_handler
class SpotifySkill(Skill, metaclass=SkillRegistering):
def __init__(self):
super().__init__("SpotifySkill")
@intent_handler(IntentBuilder("PlaySongOnlyTitle").require("Play").optionally("Spotify").optionally("SongNameOnly"))
def handle_play_song_only_title(self, data):
print("")
@intent_handler(IntentBuilder("PlaySongTitleAndSinger").require("Play").optionally("Spotify").require("From").optionally("SongName").optionally("Singer"))
def handle_play_song_title_and_singer(self, data):
print("")
@intent_file_handler("play_a_song.intent")
def handle_play_a_song(self, data):
print("Play song")

View File

@ -0,0 +1,25 @@
Joue {song} sur spotify
Joue {song}
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Mets le titre {song}
Mets le titre {song} sur spotify
Mets le morceau {song}
Mets le morceau {song} sur spotify
Joue le morceau {song}
Joue le morceau {song} sur spotify
Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Mets voir {song}
Mets voir {song} sur spotify
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify
Fait moi écouter {song}
Fait moi écouter {song} sur spotify
Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}
Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify

View File

@ -1,10 +1,9 @@
import json
from adapt.engine import DomainIntentDeterminationEngine
engine = DomainIntentDeterminationEngine()
intents_handlers = dict()
intents_handlers_adapt = dict()
intents_handlers_padatious = dict()
def register_entity(entity_value, entity_type, domain):
@ -23,17 +22,20 @@ def register_intent(intent, domain):
def process_handlers():
for handler in intents_handlers:
function_handler = intents_handlers.get(handler)
for handler in intents_handlers_adapt:
function_handler = intents_handlers_adapt.get(handler)
intent_builder = getattr(function_handler[0], "_register", [])[0]
skill_name = function_handler[1]
register_intent(intent_builder.build(), domain=skill_name)
for handler in intents_handlers_padatious:
# TODO : register file intents
print("")
def handle(intent_name):
if intent_name in intents_handlers:
method = intents_handlers.get(intent_name)[0]
if intent_name in intents_handlers_adapt:
method = intents_handlers_adapt.get(intent_name)[0]
method(None, [])

57
jarvis/utils/test.py Normal file
View File

@ -0,0 +1,57 @@
from padatious import IntentContainer
container = IntentContainer('intent_cache')
container.add_intent('spotify',
["Joue {song} sur spotify",
"Joue {song}",
"Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}",
"Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}",
"Mets la chanson {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify",
"Mets le titre {song}",
"Mets le titre {song} sur spotify",
"Mets le morceau {song}",
"Mets le morceau {song} sur spotify",
"Joue le morceau {song}",
"Joue le morceau {song} sur spotify",
"Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}",
"Mets le titre {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify",
"Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify",
"Joue {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}",
"Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}"
"Joue le morceau {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify"
"Mets voir {song}",
"Mets voir {song} sur spotify",
"Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}",
"Mets voir {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify",
"Fait moi écouter {song}"
"Fait moi écouter {song} sur spotify"
"Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer}"
"Fait moi écouter {song} (de|des|du groupe|du chanteur|de la chanteuse) {singer} sur spotify"
])
container.train()
tests = ["joue time after time sur spotify",
"mets le morceau fortunate son sur spotify",
"joue le morceau crazy crazy nights",
"mets voir crazy crazy nights",
"mets la chanson crazy crazy nights de KISS",
"fait moi écouter bye bye miss american pie",
"joue le morceau bye bye miss american pie",
"joue le morceau bye bye miss american pie du groupe billy cassidy",
"joue hooked on a feeling sur spotify",
"joue le morceau fortunate son de Willy and the Boys sur spotify"]
for test in tests:
print("Sentence : " + test)
result = container.calc_intent(test)
if 'song' in result.matches:
print("Song : " + result.matches.get('song'))
if 'singer' in result.matches:
print("Singer/Group : " + result.matches.get('singer'))
print("")
print("")