{"id":1277,"date":"2012-08-16T11:19:44","date_gmt":"2012-08-16T10:19:44","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=1277"},"modified":"2012-08-16T11:19:44","modified_gmt":"2012-08-16T10:19:44","slug":"controler-votre-domotique-par-la-voix-avec-android","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/08\/16\/controler-votre-domotique-par-la-voix-avec-android\/","title":{"rendered":"Contr\u00f4ler votre domotique par la voix avec Android"},"content":{"rendered":"<p style=\"text-align: center;\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/voicecontrol.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1279\" title=\"voicecontrol\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/voicecontrol-300x232.png\" alt=\"\" width=\"300\" height=\"232\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/voicecontrol-300x232.png 300w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/voicecontrol.png 530w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: left;\">Le contr\u00f4le vocal est, vous le savez, un vieux r\u00eave qui nous taraude depuis que l&rsquo;on regarde des films de<del> <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Humiliation_%C3%A9rotique\" target=\"_blank\">filles soumises\u00a0<\/a><\/del> <a href=\"http:\/\/fr.wikipedia.org\/wiki\/2001,_l%27Odyss%C3%A9e_de_l%27espace\" target=\"_blank\">science-fiction<\/a>.<\/p>\n<p style=\"text-align: left;\">Heureusement pour nous, le concept et les logiciels ont bien \u00e9volu\u00e9s depuis ses derni\u00e8res ann\u00e9es et nous sommes bien loin d\u00e9sormais de nos lointains souvenirs o\u00f9 nous passions des heures avec notre microphone a r\u00e9citer des pages et des pages de phrases abjectes pour obtenir un r\u00e9sultat&#8230; d\u00e9sesp\u00e9rant (si toi aussi tu vois de quoi je parle et que tu souris en y repensant, tu ne me contrediras s\u00fbrement pas \ud83d\ude00 )<\/p>\n<p style=\"text-align: left;\">J&rsquo;avais depuis longtemps mis de c\u00f4t\u00e9 l&rsquo;id\u00e9e d&rsquo;utiliser ma voix pour contr\u00f4ler quoi que ce soit (et encore moins ma femme, cela marche un peu mieux avec les enfants), jusqu&rsquo;a ses derniers jours apr\u00e8s une lecture int\u00e9ressante sur un site web dont je vous reparlerais plus tard dans ce billet.<\/p>\n<p style=\"text-align: left;\">Le but de cet article est de vous d\u00e9crire comment, avec mon t\u00e9l\u00e9phone Android, je contr\u00f4le par la voix l&rsquo;extinction ou l&rsquo;allumage de mes lumi\u00e8res ou la fermeture de la porte du garage. Potentiellement, tout est contr\u00f4lable d\u00e9sormais, il faut juste prendre le temps de coder les r\u00e8gles.<\/p>\n<p style=\"text-align: left;\">Mais n&rsquo;anticipons pas, tout d&rsquo;abord de quoi avons nous besoin.<\/p>\n<ul>\n<li>Un Webservice pour notre serveur Domotique<\/li>\n<\/ul>\n<p>Si vous disposez d&rsquo;une box domotique, vous avez s\u00fbrement le moyen de contr\u00f4ler par une requ\u00eate http vos prises ou interrupteurs (je vous laisse \u00e0 la documentation de la dite box), mais si comme moi, vous contr\u00f4ler tout par des scripts, xPL et j&rsquo;en passe et des meilleurs, il va pouvoir devenir int\u00e9ressant de disposer d&rsquo;une API permettant par une URL de commander vos \u00e9quipements.<\/p>\n<p>Python (encore lui), est le candidat id\u00e9al pour cr\u00e9er ce WebService.<\/p>\n<p>L&rsquo;exemple de code que je vais vous donner n&rsquo;est peut-\u00eatre pas utilisable pour vous dans l&rsquo;imm\u00e9diat car il est fortement int\u00e9gr\u00e9 \u00e0 mon environnement domotique (xPL), mais il vous donnera s\u00fbrement des pistes pour r\u00e9aliser vous m\u00eame votre API.<\/p>\n<p>Vous trouverez les classes que j&rsquo;utilise dans mon projet <a title=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/05\/22\/projet-xpl-pyhal-un-cerveau-xpl-episode-2-alpha-release\/\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/05\/22\/projet-xpl-pyhal-un-cerveau-xpl-episode-2-alpha-release\/\" target=\"_blank\">xPL-PyHAL<\/a> (xPLmessage par exemple ou Daemon). Donc si vous utilisez mon centralisateur xPL, il y a donc de fortes chances que cela marche tout de suite \ud83d\ude09 (pub pub pub)<\/p>\n<pre lang=\"python\">#!\/usr\/bin\/env python\r\n\r\nimport web\r\nimport re,socket,sys,os\r\nfrom xPLmessage import xPLmessage\r\nimport threading\r\nfrom Daemon import Daemon\r\n\r\nmotdepasse = \"1234\"\r\n\r\n#exemple d appel http :\r\n#lynx \"http:\/\/localhost:8080\/x10?cle=1234&module=a1&command=on\"\r\n\r\nweb.config.debug = False                                                                                                      \r\n\r\nurls = (\r\n  '\/', 'index',\r\n  '\/x10', 'x10',\r\n  '\/ipx800', 'ipx800'\r\n)\r\n\r\nrender = web.template.render('templates\/', globals={'re':re})\r\napp = web.application(urls, globals())\r\n\r\nclass index:\r\n    def GET(self):\r\n         return web.HTTPError(403)\r\n\r\n    def POST(self):\r\n         return web.HTTPError(403)\r\n\r\nclass x10:\r\n    def GET(self):\r\n        sendmsg = xPLmessage()\r\n        key = web.input(cle='')\r\n        adress = web.input(module='')\r\n        command = web.input(command='')\r\n        if not key.cle:\r\n            raise web.HTTPError(403)\r\n        if not adress.module:\r\n            raise web.HTTPError(404)\r\n        if not command.command:\r\n            raise web.HTTPError(404)\r\n\r\n        if key.cle != motdepasse:\r\n            return 'access denied'\r\n        else :\r\n            commandx10 = command.command\r\n            devicex10 = adress.module\r\n            sendmsg.xplmsgcmndx10(commandx10,devicex10)\r\n            return 'accept'\r\n\r\nclass ipx800:\r\n    def GET(self):\r\n        sendmsg = xPLmessage()\r\n        key = web.input(cle='')\r\n        adress = web.input(module='')\r\n        command = web.input(command='')\r\n        if not key.cle:\r\n            raise web.HTTPError(403)\r\n        if not adress.module:\r\n            raise web.HTTPError(404)\r\n        if not command.command:\r\n            raise web.HTTPError(404)\r\n\r\n        if key.cle != motdepasse:\r\n            return 'access denied'\r\n        else :\r\n            commandipx800 = command.command\r\n            relayipx800 = adress.module\r\n            sendmsg.xplmsgcmndipx800(commandipx800,relayipx800)\r\n            return 'accept'\r\n\r\nclass MyDaemon(Daemon):\r\n        def run(self):\r\n          app.run()\r\n\r\nif __name__ == \"__main__\":\r\n\r\n        service = MyDaemon('\/tmp\/daemon.pid')\r\n        if len(sys.argv) == 2:\r\n                if 'start' == sys.argv[1]:\r\n                        sys.argv[1] =  '8080'\r\n                        service.start()\r\n                elif 'stop' == sys.argv[1]:\r\n                        service.stop()\r\n                elif 'restart' == sys.argv[1]:\r\n                        service.restart()\r\n                elif 'console' == sys.argv[1]:\r\n                        sys.argv[1] =  '8080'\r\n                        service.console()\r\n\r\n                else:\r\n                        print \"Unknown command\"\r\n                        sys.exit(2)\r\n                sys.exit(0)\r\n        else:\r\n                print \"usage: %s start|stop|restart|console\" % sys.argv[0]\r\n                sys.exit(2)<\/pre>\n<p>Comment ca marche ?<\/p>\n<p>Je le dis tout de suite, ce n&rsquo;est pas \u00ab\u00a0<a href=\"http:\/\/fr.wikipedia.org\/wiki\/Representational_State_Transfer\" target=\"_blank\">restful compliant<\/a>\u00a0\u00bb (je r\u00e9agis sur des GET http et pas des POST) mais pour l&rsquo;usage personnel que j&rsquo;en fais, c&rsquo;est largement suffisant (et je n&rsquo;ai pas vocation \u00e0 en faire un produit commercial).<\/p>\n<p>En appelant par votre navigateur (ou par <a href=\"http:\/\/curl.haxx.se\/\" target=\"_blank\">curl<\/a> ou par <a href=\"http:\/\/lynx.browser.org\/\" target=\"_blank\">lynx<\/a> (qui est pour moi le nec plus ultra du navigateur web (barbu inside))) l&rsquo;URL : \u00ab\u00a0http:\/\/monserveurdomotique:8080\/x10?cle=1234&amp;module=a1&amp;command=on\u00a0\u00bb vous allez demander au module A1 de s&rsquo;allumer.<\/p>\n<p>Je prend l&rsquo;exemple X10 uniquement pour la simplicit\u00e9 de compr\u00e9hension, cela pourrai \u00eatre IPX800 dans mon code ou n&rsquo;importe quelle techno domotique du moment qu&rsquo;elle est \u00ab\u00a0appelable\u00a0\u00bb par le webservice (xPL est encore et toujours votre ami pour centraliser tout cela).<\/p>\n<p>La \u00ab\u00a0cl\u00e9\u00a0\u00bb est le mot de passe pour executer une requ\u00e8te sur votre serveur domotique, alors \u00e9videmment la s\u00e9curit\u00e9 est tr\u00e8s minimaliste dans cet exemple, mais je vous laisse peaufiner a coup d&rsquo;https, de certificats, d&rsquo;iptables et j&rsquo;en passe.<\/p>\n<p>Le code est suffisamment simple pour que vous en compreniez le fonctionnement et que vous l&rsquo;adaptiez \u00e0 vos besoins (les tutos sur les webservice python sont nombreux sur le nain ternet).<\/p>\n<p>Maintenant que nous commes capable de donner des ordres a notre syst\u00e8me domotique par de simples requ\u00eates http, il nous reste \u00e0 pouvoir le faire de vive voix.<\/p>\n<ul>\n<li>Tasker, le \u00ab\u00a0must have\u00a0\u00bb d&rsquo;un t\u00e9l\u00e9phone Android<\/li>\n<\/ul>\n<p><a href=\"http:\/\/tasker.dinglisch.net\/\" target=\"_blank\">Tasker<\/a> est s\u00fbrement l&rsquo;un des meilleurs logiciels sous Android existant.<\/p>\n<p>Il vous permet de cr\u00e9er toutes sortes de sc\u00e9narios ou d&rsquo;\u00e9v\u00e8nements sur votre t\u00e9l\u00e9phone (si je met des \u00e9couteurs alors joue une musique, si je me trouve \u00e0 moins de 100m de chez moi, alors ouvre la porte du garage, etc..)<\/p>\n<p>Si sa complexit\u00e9 rebute un peu au premier abord, on en prend vite la main et rapidement, on en arrive \u00e0 coder des centaines de t\u00e2ches ou de contextes qui nous facilite la vie au quotidien.<\/p>\n<p>Le prix est d\u00e9risoire en comparaison de ses capacit\u00e9s et je ne peux que vous inviter chaudement \u00e0 l&rsquo;acheter.<\/p>\n<p>Cerise sur le g\u00e2teau (Note inint\u00e9ressante de l&rsquo;auteur : Je vous fait gr\u00e2ce des expressions que j&rsquo;ai voulu \u00e9crire ici et qui laisserait s\u00fbrement planer la honte sur ma famille durant des d\u00e9cennies), depuis quelques semaines, Tasker inclus d\u00e9sormais la possibilit\u00e9 d&rsquo;exporter vos \u00ab\u00a0sc\u00e9narios\u00a0\u00bb en tant qu&rsquo;application autonome Android !!! C&rsquo;est pas le top du summum de la geekerie ultime \u00e7a ??? (Note inint\u00e9r\u00e9ssante de l&rsquo;auteur (encore) : L\u00e0 vraiment, vous avez \u00e9chapp\u00e9 \u00e0 des expressions qui limite me vaudrait quelques ann\u00e9es de prisons &#8230;)<\/p>\n<p>Exemple, vous cr\u00e9ez un petit sc\u00e9nario qui fait que quand votre t\u00e9l\u00e9phone est en charge, vous activez le wifi, si vous le retournez, il coupe tout, et se met en mode silence, s&rsquo;il d\u00e9tecte votre oreillette bluetooth, il informe votre serveur domotique que vous \u00eates en mode priv\u00e9 et que les messages d&rsquo;alerte de votre installation peuvent \u00eatre envoy\u00e9 via <a href=\"https:\/\/notifrier.appspot.com\/\" target=\"_blank\">Notifry<\/a> en Audio (qui depuis une petite discussion avec Daniel, le d\u00e9veloppeur de Notifry, a gentiment accept\u00e9 d&rsquo;int\u00e9grer le <a href=\"http:\/\/code.google.com\/p\/notifry\/source\/detail?r=162\" target=\"_blank\">choix de la sortie audio des messages Notifry<\/a> \ud83d\ude42 Merci \u00e0 lui pour r\u00e9pondre rapidement \u00e0 mes demandes d&rsquo;\u00e9volutions, un d\u00e9veloppeur aussi proche de ses utilisateurs est assez rare pour le souligner.<br \/>\nEt d&rsquo;un clic, vous exportez votre propre application apk autonome.<\/p>\n<p>Il n&rsquo;y a quasiment pas de limite \u00e0 Tasker, a part votre propre imagination.<\/p>\n<p>Et dans toute ses imaginations possibles, je suis tomb\u00e9 sur un fou furieux de Tasker (dans le bon c\u00f4t\u00e9 du terme :p, ce type fait quand m\u00eame tourner 474 taches Tasker par jour oOO), <a href=\"http:\/\/twitter.com\/cptnodegard\">Andreas \u00d8deg\u00e5rd<\/a>.<br \/>\n(alors vu que c&rsquo;est un norv\u00e9gien, vous comprendrez les caract\u00e8res \u00e9sot\u00e9riques dans son nom \ud83d\ude00 ), qui est ausi un des r\u00e9dacteur associ\u00e9 pour l&rsquo;excellent site <a href=\"http:\/\/www.pocketables.com\/\" target=\"_blank\">Pocketables<\/a>.<\/p>\n<p>Ce geek comme je les aime, outre la qualit\u00e9 de ses billets, nous donne souvent des trucs et astuces pour Tasker et dans son lot de bidouilles, il a d\u00e9cider de cr\u00e9er <a href=\"http:\/\/www.pocketables.com\/2012\/05\/building-nelly-my-diy-voice-assistant-for-android.html\" target=\"_blank\">son propre assistant vocal sous Android avec Tasker<\/a>.<\/p>\n<p>A la lecture de son billet, j&rsquo;ai tout de suite accroch\u00e9 sur l&rsquo;id\u00e9e et bien sur, je me suis empress\u00e9 de le mettre en oeuvre pour mon propre usage et en hommage a l&rsquo;excellent travail d&rsquo;Andr\u00e9as, j&rsquo;ai d\u00e9cid\u00e9 de garder le m\u00eame nom pour mon assistante vocale, Nelly (pour la petite histoire du pourquoi du comment ce pr\u00e9nom, je vous invite a lire son billet, a moins que vous ne soyez d\u00e9j\u00e0 un lecteur assidu de <a href=\"http:\/\/en.wikipedia.org\/wiki\/Mike_Shepherd_(author)\" target=\"_blank\">Mike Shepherd<\/a> ).<\/p>\n<p>Pour r\u00e9aliser cet exploit, nous allons tout simplement utiliser la fonction \u00ab\u00a0<a href=\"http:\/\/tasker.dinglisch.net\/userguide\/fr\/help\/ah_index.html\" target=\"_blank\">Obtenir depuis depuis la voix<\/a>\u00a0\u00bb de Tasker. Cette fonction se base sur le moteur de reconnaissance vocale de Google (une connexion au nain ternet est donc n\u00e9cessaire)<\/p>\n<p>La phrase analys\u00e9e est contenue dans la variable %VOICE de Tasker, il ne reste plus qu&rsquo;a r\u00e9aliser une t\u00e2che s&rsquo;executant si la variable %VOICE contient tels mots.<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker1.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1288\" title=\"Screenshot_Nelly_Tasker1\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker1-180x300.png\" alt=\"\" width=\"180\" height=\"300\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker1-180x300.png 180w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker1.png 480w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker2.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1289\" title=\"Screenshot_Nelly_Tasker2\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker2-180x300.png\" alt=\"\" width=\"180\" height=\"300\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker2-180x300.png 180w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_Nelly_Tasker2.png 480w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a><\/p>\n<p>Pour appeler notre Webservice Python, nous allons utiliser la fonction \u00ab\u00a0Get HTTP\u00a0\u00bb en sp\u00e9cifiant les param\u00e8tres suivants :<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker1.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1290\" title=\"Screenshot_gethttp_tasker1\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker1-180x300.png\" alt=\"\" width=\"180\" height=\"300\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker1-180x300.png 180w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker1.png 480w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a><\/p>\n<p>Et pour l&rsquo;analyse des mots sur lesquels r\u00e9agir :<\/p>\n<p><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker2.png\"><img loading=\"lazy\" class=\"aligncenter size-medium wp-image-1291\" title=\"Screenshot_gethttp_tasker2\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker2-180x300.png\" alt=\"\" width=\"180\" height=\"300\" srcset=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker2-180x300.png 180w, http:\/\/blog.guiguiabloc.fr\/wp-content\/2012\/08\/Screenshot_gethttp_tasker2.png 480w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a><\/p>\n<p>L&rsquo;\u00e9toile \u00e9tant bien sur un caract\u00e8re joker, ce que l&rsquo;on dit \u00ab\u00a0autour\u00a0\u00bb n&rsquo;est pas pris en compte (\u00e7a vous permet de laisser libre cours a votre imagination devant votre entourage : \u00ab\u00a0Nelly, mon petit, dans ta grande mans\u00e9utude, si tu \u00e9teins le salon que je puisse dragouiller la demoiselle que j&rsquo;ai invit\u00e9 chez moi pour un soi-disant repas en toute amiti\u00e9, je t&rsquo;en serais reconnaissant.\u00a0\u00bb)<br \/>\nAttention quand m\u00eame, par d\u00e9faut vous n&rsquo;avez que 30 secondes&#8230; (euh pour donner l&rsquo;ordre vocal hein, pas pour la demoiselle&#8230;)<\/p>\n<p>Pour vous montrer de visu de quoi Tasker est capable avec \u00ab\u00a0Nelly\u00a0\u00bb, je vous propose une petite vid\u00e9o faite a l&rsquo;arrache (je l&rsquo;avoue) mais qui vous donnera les capacit\u00e9s du syst\u00e8me.<\/p>\n<p>&nbsp;<br \/>\n<iframe frameborder=\"0\" width=\"480\" height=\"360\" src=\"http:\/\/www.dailymotion.com\/embed\/video\/xsurld\"><\/iframe><br \/><a href=\"http:\/\/www.dailymotion.com\/video\/xsurld_demonstration-de-controle-vocal-avec-tasker_tech\" target=\"_blank\">D&eacute;monstration de contr&ocirc;le vocal avec Tasker<\/a> <i>par <a href=\"http:\/\/www.dailymotion.com\/Guiguiabloc\" target=\"_blank\">Guiguiabloc<\/a><\/i><\/p>\n<p>Avouez tout de m\u00eame que cela en jette pas mal (en plus d&rsquo;\u00eatre diaboliquement g\u00e9nial \ud83d\ude42 )<\/p>\n<p>Merci donc \u00e0 Andr\u00e9as pour son id\u00e9e, \u00e0 Lee Wilmot pour son excellente application Tasker et \u00e0 Olivier Sannier pour la traduction en fran\u00e7ais de Tasker \ud83d\ude09<\/p>\n<p>Amusez vous bien \ud83d\ude00<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le contr\u00f4le vocal est, vous le savez, un vieux r\u00eave qui nous taraude depuis que l&rsquo;on regarde des films de filles soumises\u00a0 science-fiction. Heureusement pour nous, le concept et les logiciels ont bien \u00e9volu\u00e9s depuis ses derni\u00e8res ann\u00e9es et nous &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/08\/16\/controler-votre-domotique-par-la-voix-avec-android\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[137],"tags":[189,188,187],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1277"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1277"}],"version-history":[{"count":21,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1277\/revisions"}],"predecessor-version":[{"id":1304,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/1277\/revisions\/1304"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=1277"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=1277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}