Introduction

Nous allons ici voir comment commander Spotify vocalement à l’aide de la reconnaissance de SnowBoy. En ce qui concerne l’installation de celui-ci je vous invite à regarder mon article précédent qui traite de ce sujet.

Pour pouvoir suivre cet article jusqu’au bout, vous allez avoir besoin :

  • D’une Raspberry sur laquelle vous pouvez lancer des scripts Python avec la librairie SnowBoy
  • D’un micro
  • D’une enceinte
  • D’un compte Spotify premium

 

Installer Mopidy

Malheureusement Spotify n’est pas disponible pour les processeurs ARM tels que ceux des Raspberry, on va donc devoir trouver une alternative.

Il existe un émulateur de code Intel X86 sur ARM qui se nomme ExaGear. Malheureusement celui-ci n’est pas gratuit… On passe 🙂

Après avoir passer quelques heures à chercher un client fonctionnel, j’ai enfin trouvé la solution idéale !

Mais avant, je tenais à vous présenter un outil appelé Raspotify qui permet de streamer Spotify depuis vos appareils, ce qui signifie que depuis l’application Spotify de votre téléphone par exemple, vous pouvez “envoyer” des musiques à Raspotify qui va les lire. Le problème étant que l’on veut pouvoir lancer de la musique avec la voix, or Raspotify stream depuis nos appareils et non pas depuis les serveurs de Spotify directement. Une alternative un peu lourde (mais c’est la seule fonctionnelle à l’heure où j’écris l’article) consiste à utiliser Modipy comme serveur audio. La seule raison pour laquelle on utiliser ce truc, c’est pour Spotify, ca a également plein d’autres fonctionnalités que je vous laisse découvrir si vous le souhaitez.

Commencez par ajouter leur clé GPG :

wget -q -O - https://apt.mopidy.com/mopidy.gpg | sudo apt-key add -

Ajoutez leur repo :

sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/jessie.list

Et installez le :

sudo apt update
sudo apt install mopidy

Installez l’extension Spotify :

sudo apt install mopidy-spotify

Nous allons configurer Mopidy afin qu’il soit en mesure d’utiliser notre compte Spotify, pour faire cela, éditez le fichier /etc/mopidy/mopidy.conf et ajoutez tout à la fin ce qui suit :

[spotify]
enabled = true
username = votre_email_spotify@domain.com
password = votre_mot_de_passe
bitrate = 320
client_id =
client_secret =

Afin de compléter le client_id et le client_secret, rendez vous sur ce site et authentifiez vous avec Spotify. vous verrez apparaître juste en dessous les clés permettant de terminer la configuration.

On va maintenant configurer Mopidy afin d’en faire un service qui démarra au lancement du système :

sudo dpkg-reconfigure mopidy

(Choisir "Yes")

Contrôler Spotify

Installez l’outil mpc qui nous permettra de communiquer avec le service Mopidy et de jouer les musiques/playlists/etc de Spotify :

sudo apt install mpc

Afin de tester que tout fonctionne correctement, essayez de lancer une musique :

mpc add spotify:user:11124149576:playlist:6x7ZlnU6HfGYY4mldYJoM7
mpc play

Le meilleur moyen que j’ai trouvé pour récupérer l’URI Spotify (le spotify:user:etc…) c’est d’utiliser la version desktop de Spotify sur un PC où il est installé et de faire un clic droit sur la playlist ou musique que vous voulez :

Si vous arrivez à jouer une musique sur votre RPi, le tour est joué, on peut continuer !

Afin de contrôler Spotify vocalement, il va falloir créer quelques mots sur le site de Snowboy. Par exemple pour ma playlist de Rap US, j’ai tout simplement créé un mot “Rap US”.

 

Finalisation

Je vous propose un script extrêmement similaire à celui de mon article précédent. Afin d’informer la RPi que l’on veut contrôler Spotify, j’ai rajouté au script la détection de “Hey Spotify”, ensuite le script va attendre une commande vocale supplémentaire permettant de lancer la playlist/musique voulue.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import snowboydecoder
import sys
import signal
import os

interrupted = False   # Variable permettant de gérer l'extinction du programme proprement (multithreading)
spotify = False       # Variable permettant de gérer le trigger "Hey Spotify" pour commander la musique
model_dir = "models/" # Chemin relatif vers le dossier qui contient tous les modèles

# Capture le CTRL+C dans le terminal afin de stopper le programme proprement (multithreading)
def signal_handler(signal, frame):
    print("Au revoir !")
    global interrupted
    interrupted = True

# Permet de gérer l'extinction du programme proprement (multithreading)
def interrupt_callback():
    global interrupted
    return interrupted

#Bonus pour faire dire quelque chose à votre Raspberry (sudo apt install pico2wave)
def say(msg):
    os.system("pico2wave -l fr-FR -w /tmp/out.wav \"" + msg + "\"")
    os.system("aplay /tmp/out.wav && rm /tmp/out.wav")

def detect_spotify():
    global spotify
    spotify = True
    say("Que voulez vous mettre ?")

def spotify_rapus():
    global spotify
    if spotify:
        os.system("mpc add spotify:user:11124149576:playlist:6x7ZlnU6HfGYY4mldYJoM7 && mpc play")
        spotify = False

# Capture Ctrl+C
signal.signal(signal.SIGINT, signal_handler)
print('Listening... Press Ctrl+C to exit')

# Fichiers téléchargés sur le site permettant la reconnaissance vocale d'un mot ou expression
detect_files = [model_dir + "Hey_Spotify.pmdl",
                model_dir + "Rap_US.pmdl"]

# Fonctions correspondantes appelées. Doit être dans le même ordre que le tableau "detect_files".
callbacks = [detect_spotify,
             spotify_rapus]

# SnowBoy
detector = snowboydecoder.HotwordDetector(detect_files, sensitivity=[0.5]*len(detect_files))
detector.start(detected_callback=callbacks,
           interrupt_check=interrupt_callback,
           sleep_time=0.03)
detector.terminate()

 

Une piste d’amélioration serait de créer un mot pour stopper la musique, le problème étant qu’avec la musique allumée, la reconnaissance vocale risque de ne pas forcément très bien fonctionner…