Skip to main content

Annoncer la météo avec NodeJS

Hello !

Voici un petit guide qui va vous montrer comment réaliser un script NodeJS qui va vous informer du temps qu’il fait :-). Nous aurons recours à deux API externes :

  • l’API de OpenWeatherMap : http://openweathermap.org/api
  • l’API (non officielle) de Google Text-to-speech : translate.google.com/translate_tts

Avant tout, cette étape m’a permise de tester le service TTS proposé par Google. Bien que je ne m’attendais pas à une voix aussi parfaite qu’un réel humain, j’avoue que j’ai un peu été déçu par la voix retournée par l’API de Google. Je m’attendais quand même à quelque chose de plus proche de la commande « say » de OSX qui, elle, est relativement fluide dans la parole.

L’idée est de faire dire – pour le moment manuellement – à cette douce voix une phrase du style : « Bulletin météo : *le temps qu’il fait*. Il fait actuellement *température* degrés. »

Voici ci-dessous le guide détaillé pour procéder. Créez un répertoire vide (je l’ai appelé « météo »), puis ouvrez un terminal pour vous rendre jusqu’à votre dossier.

Etape 1 – Installer les librairies nécessaires

Tout d’abord, nous allons installer le lecteur mpg321. Il s’agit d’un petit lecteur léger pouvant être utilisé en ligne de commande. Pour l’installer, rien de plus simple :

sudo apt-get install mpg321

Ensuite, nous allons installer le package NodeJS permettant de contrôler ce petit lecteur, ainsi que deux autres modules nécessaires.

sudo npm install mpg321
sudo npm install querystring
sudo npm install request

Notre environnement est maintenant prêt !

Etape 2 – Présentation des APIs

Les deux APIs que nous allons utiliser nécessitent d’être présentées pour mieux comprendre leur format de requête, mais aussi leur réponse. Nous allons commencer par le Webservice de OpenWeatherMap.

Le contexte est le suivant :

  • Nous voulons récupérer la météo d’une seule ville (dans mon cas, la belle petite ville de Amnéville)
  • Nous voulons que le résultat soit retourné en Français
  • Nous voulons utilisé le système métrique (pour la température du moins)
  • Etant donné que nous travaillons avec node, nous voulons du JSON.

Par chance, cet API retourne par défaut du JSON. Nous allons donc nous concentrer sur les trois autres paramètres : la localisation, la langue et les unités. En lisant la documentation de l’API, nous constaterons que nous devons utiliser la syntaxe suivante pour parvenir à notre résultat :

http://api.openweathermap.org/data/2.5/weather?q=<Localisation>&lang=<Code ISO alpha2 de la langue>&units=<système d’unités>

Ainsi, en remplaçant avec les valeurs correctes, nous obtenons la requête suivant : http://api.openweathermap.org/data/2.5/weather?q=Amnéville, France&lang=fr&units=metric qui renvoie la réponse ci-dessous :

{
  "coord": {
    "lon": 6.14,
    "lat": 49.26
  },
  "sys": {
    "type": 3,
    "id": 5270,
    "message": 0.0493,
    "country": "France",
    "sunrise": 1418541805,
    "sunset": 1418571428
  },
  "weather": [
    {
      "id": 803,
      "main": "Clouds",
      "description": "nuageux",
      "icon": "04d"
    }
  ],
  "base": "cmc stations",
  "main": {
    "temp": 4.11,
    "pressure": 1016,
    "humidity": 86,
    "temp_min": 3,
    "temp_max": 5
  },
  "wind": {
    "speed": 1,
    "deg": 0
  },
  "rain": {
    "3h": 0
  },
  "clouds": {
    "all": 75
  },
  "dt": 1418570230,
  "id": 0,
  "name": "Amnu00e9ville",
  "cod": 200
}

Dès lors, nous pourrons parcourir ce JSON pour en extraire les valeurs dont nous aurons besoins.

La seconde API est le service Text-To-Speech proposé par Google. Nous demanderons à ce Webservice de :

  • Réciter un texte que nous lui fournissons
  • Le réciter en Français

Ce service n’étant pas officiellement supporté par Google, aucune documentation n’est disponible. Cependant, en fouinant un peu sur Internet, on peut découvrir la syntaxe suivante : http://translate.google.com/translate_tts?q=<texte à réciter>&tl=<langue>&ie=<encondage>.

Aussi, il est facile de construire la requête. Pour tester, nous allons faire dire au robot « Bonjour Maître. Je suis votre nouvelle assistante » (et oui… le robot a une voix féminine ;)).

Une fois construite, la requête est : http://translate.google.com/translate_tts?q=Bonjour%20Ma%C3%AEtre.%20Je%20suis%20votre%20nouvelle%20assistante.&ie=UTF-8&tl=fr (Notez que le texte doit être URLEncodé). Le résultat sera le suivant :

Etape 3 – Rédaction du script pour NodeJS

Toujours dans notre dossier créé préalablement à ce guide (qui doit maintenant comporter un dossier « node_modules »), nous allons créer un fichier que nous appellerons main.js. Il va contenir le script suivant :

// Nous commencons par inclure les librairies que nous avons installées.
var querystring = require('querystring');
var mpg321      = require('mpg321');
var request     = require("request")

// Nous construisons ensuite la requête pour obtenir le temps actuel.
var openWeatherMapQuery = querystring.stringify({
  q: "Amnéville, France",
  lang: "fr",
  units: "metric"
});
var openWeatherMapURL = "http://api.openweathermap.org/data/2.5/weather?"+ openWeatherMapQuery;

// Nous procédons ensuite à la requête de l'API.
request({
  url: openWeatherMapURL,
  json: true // Nous recevrons un JSON
}, function (error, response, resp) {

  // Si tout s'est bien passé...
  if (!error && response.statusCode === 200) {

    // Nous construisons le texte à réciter.
    var text = "Bulletin météo : "

    // Le temps actuel se trouve dans la variable suivante:
    text += resp.weather[0].description

    // Ensuite, nous ajoutons la température pour conclure la phrase. Notez, que nous l'arrondissons.
    text += ". Il fait actuellement "+ Math.round(resp.main.temp) +" degrés."

    // Enfin, nous construisons la requête pour le service Text-To-Speech.
    var result = querystring.stringify({
      tl: "fr",
      q:  text,
      ie: "UTF-8"
    });

    // Dans la version de développement, nous pourrons l'afficher, même si cela n'a visiblement pas grand intêret en prod.
    console.log("Météo construite :");
    console.log(text);

    // On envoie tout ça au lecteur MP3.
    proc = mpg321()
    .loop(1) // On ne veut l'entendre qu'une fois.
    .file('http://translate.google.com/translate_tts?'+ result)
    .exec();
  } else {

    // Si une erreur s'est produite, on la note
    console.log("Une erreur est survenue.");
  }
})

Vous pouvez ensuite enregistrer le fichier, vous rendre à nouveau dans le terminal, puis lancer le script :

node main.js

Le script vous récitera la météo actuelle :-). En adaptant un peu, on pourrait par exemple réciter la météo du lendemain, ou bien à l’endroit de notre prochain rendez-vous.

2 thoughts to “Annoncer la météo avec NodeJS”

    1. Bonjour !

      Cette erreur est renvoyée lorsque la communication avec OpenWeatherMap ne s’est pas faite correctement. Il semblerait que leur API ait changé depuis la rédaction de l’article. Elle requiert à présent de disposer d’une API key pour fonctionner. Si cette key est absente, le call indiqué retourne un status code 401.

      Apparement, pour recevoir une API key, il suffit de s’enregistrer gratuitement sur leur site et de la créer via leur interface de gestion. Ensuite, simplement rajouter le paramètre « APPID={l’API key} » dans la requête et cela devrait fonctionner (source : http://openweathermap.org/appid).

      Si malgré tout cela ne devrait pas fonctionner, vous pouvez modifier le log :

      // Si une erreur s'est produite, on la note
      console.log("Une erreur est survenue.");

      en

      // Si une erreur s'est produite, on la note
      console.log("Une erreur est survenue. Status code : "+ response.statusCode +" / Erreur : "+ error.toString());

      pour afficher l’erreur précise.

      Je vais faire des tests de mon côté et modifierai l’article en conséquence 🙂

Laisser un commentaire

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