Kalliopé: votre propre Jarvis like assistant

Kalliope est un assistant vocal personnel, afin de vous la jouer à la Tony Startk… Enfin presque…

Il peut, par exemple, vous permettre de récupérer des données en ligne (wikipedia, météo, email, agenda, twitter, fb, rss, ou simplement en lisant une page web), de gérer une todolist, d’écouter de la musique (mpd / mopidy) ou encore de piloter votre installation domotique (Philips Hue, LoxSControl, Domoticz, ou simple request http(s)), le tout à la voix.
Un site est disponible avec des vidéo courtes de démo des différentes fonctionnalités (appelées neurones) disponibles (plus de 20 neurones dispo pour le moment): https://kalliope-project.github.io.

Kalliopé est très modulaire (choix du STT, du TTS, des modules actifs, de la langue, …). Vous pouvez bien entendu développer vos propres neurones pour enrichir votre assistant et les proposer à la communauté. L’installation s’effectue sur Linux (Ubuntu/Debian/Raspberry Pi).

Il est écrit en Python et est sous licence MIT. Le code est disponible sur GitHub ici: https://github.com/kalliope-project/kalliope.

Une démo en vidéo avec quelques modules.

Dans la mythologie grecque, Calliope (en grec ancien Καλλιόπη / Kalliópê, « belle voix ») était la Muse de la Poésie épique et de l’Éloquence.

L’idée est de composer le cerveau de votre bot à l’aide de synapses, qui sont composés d’une liste de neurones (plugins).

Un synapse est donc un couple composé  d’une entrée, que l’on appel un signal, et d’une liste de plugin à utiliser en sortie, que l’on appel neurone. Tout cela sous la forme d’une configuration dans un fichier YAML.

Prenons un exemple, vous voulez que Kalliopé vous dise « bonjour monsieur » quand vous lui dites vous même « bonjour ». Voici le synapse dans le fichier « brain » que vous allez alors utiliser:

 

 

15 thoughts on “Kalliopé: votre propre Jarvis like assistant”

  1. typh dit :

    bjr je n arrive pas a paramétré kalliope dans kali linux une fois que je le démarre des que je lance un commande il me retourne cette erreur.

    2017-02-07 02:20:46,382 :: INFO :: Keyword 1 detected at time: 2017-02-07 02:20:46
    Traceback (most recent call last):
    File « /usr/local/bin/kalliope », line 9, in
    load_entry_point(‘kalliope==0.4.2’, ‘console_scripts’, ‘kalliope’)()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/__init__.py », line 92, in main
    MainController(brain=brain)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 81, in __init__
    self.start_trigger()
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 251, in trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 638, in _process
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 276, in _trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 177, in execute
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 188, in _change_state
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 62, in enter
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 621, in _callback
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 92, in start_trigger_process
    self.next_state()
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 251, in trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 638, in _process
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 276, in _trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 177, in execute
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 188, in _change_state
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 62, in enter
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 621, in _callback
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 102, in unpausing_trigger_process
    self.next_state()
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 251, in trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 638, in _process
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 276, in _trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 177, in execute
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 188, in _change_state
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 62, in enter
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 621, in _callback
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 119, in play_ready_sound_process
    self.next_state()
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 251, in trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 638, in _process
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 276, in _trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 177, in execute
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 188, in _change_state
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 62, in enter
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 621, in _callback
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 129, in waiting_for_trigger_callback_thread
    self.next_state()
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 251, in trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 638, in _process
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 276, in _trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 177, in execute
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 188, in _change_state
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 62, in enter
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 621, in _callback
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 162, in start_order_listener_thread
    self.next_state()
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 251, in trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 638, in _process
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 276, in _trigger
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 177, in execute
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 188, in _change_state
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 62, in enter
    File « build/bdist.linux-x86_64/egg/transitions/core.py », line 621, in _callback
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/MainController.py », line 172, in play_wake_up_answer_thread
    Say(message=self.settings.random_wake_up_answers)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/neurons/say/say.py », line 11, in __init__
    self.say(self.message)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/NeuronModule.py », line 140, in say
    tts_module_instance.say(tts_message)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/tts/pico2wave/pico2wave.py », line 22, in say
    self.generate_and_play(words, self._generate_audio_file)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/core/TTS/TTSModule.py », line 100, in generate_and_play
    generate_audio_function_from_child()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.4.2-py2.7.egg/kalliope/tts/pico2wave/pico2wave.py », line 46, in _generate_audio_file
    subprocess.call(final_command, stderr=sys.stderr)
    File « /usr/lib/python2.7/subprocess.py », line 522, in call
    return Popen(*popenargs, **kwargs).wait()
    File « /usr/lib/python2.7/subprocess.py », line 710, in __init__
    errread, errwrite)
    File « /usr/lib/python2.7/subprocess.py », line 1335, in _execute_child
    raise child_exception
    OSError: [Errno 2] No such file or directory

    1. N.i.c.O dit :

      Kali ne fait tout simplement pas partie des distros supportées. Désolé. Apres vous pouvez également ouvrir une issue sur le Github. En cas de problème sur une distro supportées.

      1. Mario dit :

        Kali c’est debian donc c’et supporté

  2. Fred dit :

    sudo apt get mplayer devrait résoudre ton problème

  3. Spade dit :

    Bonjour,
    Est-il envisagé d’avoir une img a graver directement sur la carte du rpi?

    Je tourne sous RPI3 B avec un raspbian et j’avoue avoir eu du mal a l’installer, novice que je suis, et de bien parametrer.
    Par ailleur est-il possible de changer son nom Kalliope par un autre? Exemple: Jarvis a la place de Kalliope (je sais la voix est féminine mais ce n’est qu’un exemple)
    Question idiote… Normal que sphyx soit aussi lent?

    Je trouve ce projet bien plus complet que le reste qu’on peut trouver sur le net tel que gladys ou bien l’actuel jarvis-like qui n’est qu’en anglais et j’aimerais le voir grandir encore plus.

    Bravo a cette équipe qui bosse dessus,
    Cordialement,

    1. N.i.c.O dit :

      L’image est dispo sur le Github du projet.

  4. Aegnor dit :

    Bonsoir,
    je viens vers vous car je commence à devenir fou depuis plusieurs jours :
    j’ai d’abord essayé d’installer Kalliope 0.5.1, avec l’image, impossible, j’ai un kernel panic
    En manuel avec un raspbian fraichement installé, impossible d’installer le speech recognition
    je passe sur la version 0.5.0, tout s’exécute impec par l’image, mais lorsque je lance Kassiope, j’ai les erreurs que j’ai copiées à la fin du message.

    Pourriez-vous m’aider s’il vous plait ?

    je précise qu’en Raspberry je suis un complet newbie, à part un pi2 qui tourne en Recalbox et un PI3 en Ambilight sur la TV, j’ai plus l’habitude de programmer en Arduino et STM32, mais ce n’est pas du tout le même monde…

    Grand merci d’avance,

    Aegnor

    pi@Vocal_Assist:~ $ kalliope start
    Starting Kalliope
    Press Ctrl+C for stopping
    Starting order signal
    je suis prête
    Exception in thread Thread-1:
    Traceback (most recent call last):
    File « /usr/lib/python2.7/threading.py », line 810, in __bootstrap_inner
    self.run()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /signals/order/order.py », line 82, in run
    HookManager.on_start()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/HookManager.py », line 12, in on_start
    return cls.execute_synapses_in_hook_name(« on_start »)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/HookManager.py », line 71, in execute_synapses_in_hook_name
    return SynapseLauncher.start_synapse_by_name(list_synapse, new_lifo=True)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/SynapseLauncher.py », line 56, in start_synapse_by_name
    return lifo_buffer.execute(is_api_call=True)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Lifo/LIFOBuffer.py », line 115, in execute
    self._process_synapse_list(last_synapse_fifo_list)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Lifo/LIFOBuffer.py », line 145, in _process_synapse_list
    self._process_neuron_list(matched_synapse=matched_synapse)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Lifo/LIFOBuffer.py », line 181, in _process_neuron_list
    parameters_dict=matched_synapse.parameters)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/NeuronLauncher.py », line 59, in start_neuron
    instantiated_neuron = NeuronLauncher.launch_neuron(neuron)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/NeuronLauncher.py », line 41, in launch_neuron
    resources_dir=neuron_folder)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Utils/Utils.py », line 140, in get_dynamic_class_instantiation
    return klass(**parameters)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /neurons/say/say.py », line 11, in __init__
    self.say(self.message)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/NeuronModule.py », line 188, in say
    tts_module_instance.say(tts_message)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /tts/pico2wave/pico2wave.py », line 39, in say
    self.generate_and_play(words, self._generate_audio_file)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/TTS/TTSModule.py », line 106, in generate_and_play
    generate_audio_function_from_child()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /tts/pico2wave/pico2wave.py », line 67, in _generate_audio_file
    subprocess.call(final_command)
    File « /usr/lib/python2.7/subprocess.py », line 522, in call
    return Popen(*popenargs, **kwargs).wait()
    File « /usr/lib/python2.7/subprocess.py », line 710, in __init__
    errread, errwrite)
    File « /usr/lib/python2.7/subprocess.py », line 1335, in _execute_child
    raise child_exception
    TypeError: execv() arg 2 must contain only strings

    pi@Vocal_Assist:~ $ kalliope start
    Starting Kalliope
    Press Ctrl+C for stopping
    Starting order signal
    je suis prête
    Exception in thread Thread-1:
    Traceback (most recent call last):
    File « /usr/lib/python2.7/threading.py », line 810, in __bootstrap_inner
    self.run()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /signals/order/order.py », line 82, in run
    HookManager.on_start()
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/HookManager.py », line 12, in on_start
    return cls.execute_synapses_in_hook_name(« on_start »)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/HookManager.py », line 71, in execute_synapses_in_hook_name
    return SynapseLauncher.start_synapse_by_name(list_synapse, new_lifo=True)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/SynapseLauncher.py », line 56, in start_synapse_by_name
    return lifo_buffer.execute(is_api_call=True)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Lifo/LIFOBuffer.py », line 115, in execute
    self._process_synapse_list(last_synapse_fifo_list)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Lifo/LIFOBuffer.py », line 145, in _process_synapse_list
    self._process_neuron_list(matched_synapse=matched_synapse)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Lifo/LIFOBuffer.py », line 181, in _process_neuron_list
    parameters_dict=matched_synapse.parameters)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/NeuronLauncher.py », line 59, in start_neuron
    instantiated_neuron = NeuronLauncher.launch_neuron(neuron)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/NeuronLauncher.py », line 41, in launch_neuron
    resources_dir=neuron_folder)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /core/Utils/Utils.py », line 140, in get_dynamic_class_instantiation
    return klass(**parameters)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope /neurons/say/say.py », line 11, in __init__
    self.say(self.message)
    File « /usr/local/lib/python2.7/dist-packages/kalliope-0.5.0-py2.7.egg/kalliope

    1. N.i.c.O dit :

      Il semble que la dernière image soit corrompu. Je vous recommande une installation manuel en suivant les étapes de la documentation officielle. Vous trouverez également un lien sur la page GitHub vers le chat pour discuter directement avec la communauté.

      1. Aegnor dit :

        Re-bonsoir,
        Un tout grand merci pour la réponse rapide, j’ai essayé l’installation manuelle aussi, mais j’ai un soucis avec le Speech Recognition qui refuse de s’installer… je me doute que je dois me planter quelque part, mais je ne sais pas où…
        Petite question concernant la distri raspian, avant j’utilisais la Jessie, maintenant c’est la stretch, quelle est la meilleure distri pour utiliser Kalliope ?

        Et au passage, super boulot ! J’imagine déjà tout ce que je pourrais faire en combinant avec ma domotique 😉

        1. N.i.c.O dit :

          Passez sur le chat du projet pour obtenir de l’aide avec l’installation. Et sinon stretch est juste une version plus récente de raspbian. Les deux versions sont supportés mais si vous partez d’une installation fraîche je recommande de prendre la plus récente.

  5. Cococ dit :

    Salut je viens ici car la version 5.1 ne boot pas chez moi kernel panic, ducoup j’ai pris la version 5.0 mais quand je parle il ne se passe absolument rien

    1. N.i.c.O dit :

      Oui il y avais des problèmes de kernel au niveau de l’image Raspbian utilisée. Seuls les Rpi 3b+ semble impactés. C’est depuis corrigé, Kalliope v0.5.2 devrait sortir ce weekend et du coup la nouvelle image sera ok.
      En attendant tu peux installer via le script d’installation (dans le README du projet GITHUB) après avoir fraîchement installé Raspbian.

  6. Kunal Gosalia dit :

    Hi Nicolas,

    Great Job man.

    I have few queries. Can I use Kailliope without internet ?

    Can I customize the name ?

    Can I add skills ?

    Do let me know your feedback.

    Regards,
    Kunal Gosalia

    1. N.i.c.O dit :

      Yes and yes and yes. Read the official doc reachable from the GitHub repo.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *