J’aime beaucoup Sonos, et le fait d’avoir un assistant vocal dans son enceinte est un plus indéniable. Seulement, Sonos a « un peu » fermé son écosystème pour ne pouvoir dire ok google joue cette musique qu’avec les grands acteurs du marché (deezer, spotify…). Mais en bon développeur, j’ai développé ma solution, la voici dans les grandes lignes.
Avant propos:
Sonos permet de gérer 2 assistants vocaux (Google et Amazon), mais devrait à mon avis en dévoiler bientôt un troisième. Ils ont rachetés Snips fin 2019. Celui-ci est ou plutôt était un assistant respectueux de la vie privée. On peut donc imaginer que bientôt les commandes type « ok google » ne seront plus envoyées sur le cloud, mais intégrées directement depuis l’enceinte. Idéal pour ceux qui ne veulent pas de la surveillance des GAFA à la maison.
Prérequis:
Un serveur web PHP + une enceinte Sonos avec assistant (ou un téléphone Android) + un shell linux ou vous pouvez installer des paquets.
IFTT:
Le site IFTT a pour but de récupérer les ordres vocaux transmis depuis Google Assistant, et de les transmettre au serveur web. Il vous faut donc créer une applet comme ceci. Personnellement, j’ai 2 enceintes (une dans la cuisine, et une dans le salon), j’ai donc dupliqué l’applet, et j’ai rajouté un paramètre « salle » dans l’url appelée tout en bas.
Le Serveur WEB PHP:
Votre site doit répondre sur l’url indiquée ci-dessus.
Pour un appel de « Cuisine joue Menteur de Cali », vous recevrez la requête iftt=cali%20menteur&salle=cuisine.
A vous ensuite d’appeler le bon code pour envoyer tout ça dans votre Sonos.
Personnellement, j’ai choisi d’utiliser la librairie de DjMomo. Celle-ci est plus simple et en plus elle fonctionnait alors qu’avec les autres, j’avais des erreurs.
Ici, je récupère donc le paramètre « Menteur de Cali », et je cherche un dossier du même nom. N’ayant qu’un dossier Cali, il ne trouve pas de réponse. Si je n’avais pas spécifié menteur, il m’aurait joué le contenu du répertoire Cali. Bref, ici pas de réponse, il faut donc chercher le mp3 correspondant.
Recherche depuis Youtube:
En appelant l’url: $json_yt = json_decode(file_get_contents(« https://www.googleapis.com/youtube/v3/search?part=snippet&q= ».urlencode($_GET[« iftt »]). »&maxResults=5&key= ».YOUTUBE_API),true);
vous récupérerez les vidéos concernant « Menteur de cali » formaté en Json. Ensuite à vous de découper le flux pour identifier l’id de la première vidéo et le titre. L’api Youtube est une clé que vous devez créer dans la console de développement Google.
Téléchargement depuis Youtube:
Youtube-dl est un outil en ligne de commande capable de convertir une vidéo en mp3. Vous pouvez l’installer via ce tutorial.
Ici, vous pouvez appeler l’ordre suivant en PHP en passant la variable:
$cmd= ‘youtube-dl –extract-audio -o « /repertoire/tmp.%(ext)s » –audio-format mp3 https://www.youtube.com/watch?v=’.$_GET[« youtube_id »];
shell_exec($cmd);
Cela vous génèrera un fichier mp3 qui correspond à votre recherche. Personnellement, je les renomme en videoId-Titre.mp3
Renvoi vers Sonos:
Sonos ne peut lire que des fichiers déjà indexés. C ‘est pourquoi j’écrase toujours un fichier tmp.mp3 et c’est lui que je joue. Comme ça, il est déjà existant et indexé. Peu importe ce qu’il y a dedans. Voici les quelques lignes pour supprimer la playlist, et jouer notre chanson.
$sonos->RemoveAllTracksFromQueue();
$sonos->AddURIToQueue("x-file-cifs:".NAS_MUSIC_FOLDER."/".$triFolder."/tmp.mp3");
$sonos->Stop();
$sonos->Play();
Conclusion:
Oui, cela fait beaucoup d’étapes, mais à la différence de ma version à base de dialogflow où il fallait dire « ok google, lance l’application Machin », puis Sonos Lance telle chanson; cette version est nativement intégrée à google home. IFTT permet de ne plus avoir besoin de lancer une application intermédiaire pour gérer la communication: un simple ordre « Sonos joue cali » fonctionne. Le point négatif si il y en a un, c’est que IFTT ne gère pas le retour, c’est à dire que le téléchargement du fichier soit un succès, ou un échec, la réponse sera la même. Mais bon, si cela permet de gérer le vocal, d’avoir une bibliothèque infinie, et tout ça gratuitement, pourquoi se priver. Pour finir voici mon code source qui permet également d’envoyer des messages via Text to speech, d’interroger dans combien de temps arrive le bus, de désactiver une alarme, de lancer des films via Kodi…