Utiliser la reconnaissance vocale de Google

18/05/2013

Et si on se faisait une petit application de reconnaissance vocale maison qui marche sur le desktop ? Je recherche depuis des mois, voir des années, une solution sous Linux qui me permettrait de faire correctement de la reconnaissance vocale proprement. Mais mes recherches n’ont jamais été fructueuses, que ce soit du coté de CMU Sphinx ou je ne sais quel “Perlbox”… Mais voilà, Google propose sur Android, et depuis peu (quelques mois en fait) une api sur Chromium/Chrome qui fonctionne vraiment bien.

Alors avant toutes choses: très important, utiliser l’api de Google hors Android et hors navigateur semble ne pas être autorisé. Si vous utilisez mes exemples, vous êtes responsables de vos actes en cas de souci avec la loi. Je ne vous propose cet article qu’à des fins de recherche.

Relisez bien ce que je viens de taper… qu’on soit bien clair, ce que je vous propose est utile à des fins de tests jusqu’à ce que Google nous autorise un jour (on y croit…) à faire mumuse sans restriction avec leur API… ou (rêvons un peu) qu’il rende tout ça publique.

On passe à la suite. Comment ça fonctionne ?

Si vous visitez http://translate.google.com vous remarquerez une icone de micro en bas du textarea de texte à traduire. C’est une nouvelle implémentation qui permet de proposer de dicter le texte via le micro plutôt que de taper à la main le texte. Ceci est possible depuis l’introduction d’un attribut “x-speech” dans les inputs et textareas. Une très bonne explication se trouve sur la page: http://tilap.net/champs-de-saisie-vocale-en-html5-x-webkit-speech/

Lorsque vous pressez le bouton, le navigateur enregistre votre voix. L’encodage est FLAC (voilà une idée géniale) à 16kHz. Puis il le poste sur la page:

https://www.google.com/speech-api/v1/recognize

Ne cherchez pas à ouvrir la page depuis votre navigateur, cette adresse n’accèpte pas les requêtes GET. Bref, cette adresse prend aussi des arguments, comme la langue source, le nombre de résultats attendus, etc…

Pour préparer notre petit programme de reconnaissance, on va utiliser:

  • Gstreamer pour capturer votre voix
  • curl pour poster tout ça à Google

Gstreamer n’est pas plus simple, mais il a le mérite de ne pas me prendre la tête pour le choix de la source d’enregistrement.

Pour le pipe Gstreamer, on va utiliser:

  • autoaudiosrc pour laisser pulse nous donner la source (donc vérifiez vos paramètres pour vérifier que votre micro fonctionne)
  • audioresample pour rééchantillonner le fichier proprement
  • utiliser la capacité audio/x-raw-int pour demander un “rate” de 16kHz (16000 hz)
  • pour le moment: envoyer ça dans un fichier .flac

C’est parti, dans un terminal:

gst-launch autoaudiosrc ! audioresample ! audio/x-raw-int,rate=16000 ! \
flacenc ! filesink location=/tmp/voice.flac

Dites quelques mots, pas trop long, puis presssez CTRL+C. Vérifiez votre fichier en l’écoutant avec mplayer, vlc, ou la commande “play” pour vous assurer que vous êtes audible et qu’il n’y a pas trop de bruit.

Maintenant, on va l’envoyer à Google pour voir si il reconnait correctement la voix.

L’idée c’est qu’il faut envoyer les informations nécessaires pour construire une requête POST bien propre. A savoir donc:

  • le Content-Type qui est un audio/x-flac; rate=16000
  • les données binaires (le fichier de son)
  • un argument pour lui dire qui est le client, je vais mettre chromium
  • un argument pour lui dire que je veux au pire 10 résultats de reconnaissance

Donc la commande “curl” est la suivante:

curl -X POST --data-binary @/tmp/voice.flac \
--header 'Content-type: audio/x-flac; rate=16000' \
'https://www.google.com/speech-api/v1/recognize?client=chromium&lang=fr-FR&maxresults=10'

Cela me retourne (j’ai reformaté pour plus de lisibilité):

{
"status": 0,
"id": "cf3c79ce01920853aedc0825f33ac0ea-1",
"hypotheses": [
    {
        "utterance": "bonjour et bienvenue",
        "confidence": 0.7474387
    },
    {
        "utterance": "bonjour et bienvenu"
    },
    {
        "utterance": "bonjour bienvenue"
    },
    {
        "utterance": "bonjour et bienvenue à"
    },
    {
        "utterance": "bonjour et bienvenue chez"
    },
    {
        "utterance": "bonjour et bienvenue au"
    }
    ]
}

C’est donc au format JSON que la réponse est faite (plutôt pratique). Vous remarquez que ce sont les “hypothèses” de reconnaissance qui vont nous intéresser et que nous avons quelques possibilité avec des points (confidence) qui oscillent de 0.0 à 1.0. Si vous tentiez sans le “maxresults”, vous n’auriez en réponse que l’hypothèse la plus haute:

curl -X POST --data-binary @/tmp/voice.flac \
--header 'Content-Type: audio/x-flac; rate=16000;' \
'https://www.google.com/speech-api/v1/recognize?client=chromium&lang=fr-FR'

{
"status": 0,
"id": "06eee2607513b6f23081891d051736bc-1",
"hypotheses": [
    {
        "utterance": "bonjour et bienvenue",
        "confidence": 0.7474387
    }
    ]
}

Bon me reste une ou deux choses à faire, notamment faire en sorte que l’enregistrement de ma voix s’arrête quand je ne parle plus… ha ça c’est un truc que j’ai gratté un moment, mais j’ai fini par trouver !

Il existe un pad gstreamer nommé “vader”. Ce pad est magique, il déclenche la lecture du pipeline gstreamer quand le niveau d’enregistrement monte, puis il met en pause quand vous ne parlez plus. Pour tester, voici ce que vous pouvez faire:

gst-launch autoaudiosrc ! vader auto_threshold=true ! audioconvert ! \
audioresample ! audio/x-raw-int,rate=16000 ! \
flacenc ! filesink location=/tmp/tmpaudio.flac

Alors, attendez… pour couper le pipeline vous allez devoir presser CTRL+C… sauf que vader va peut-être l’entendre donc faites doucement.

Commencez à parler, dites “un deux trois” par exemple. Attendez une dizaine de secondes puis dites “quatre cinq”. Pesses calmement CTRL+C et écoutez le fichier /tmp/tmpaudio.flac. Vous allez vous rendre compte que la dizaine de secondes de pause a disparue. C’est tout le but, l’encodage ne s’est fait que lorque vous parliez.

Voilà, on approche du but:

  • on sait enregistrer des phrases au moment où on parle
  • on sait envoyer un fichier à Google qui peut être utilisé pour de la reconnaissance

Hé, dites… ça vous dirait de faire un petit programme qui écrit ce que vous dites ? Python est un petit bijou pour ça.

Je vous explique pas à pas.

On va utiliser le module “gst” qui est le module gstreamer de python. Ce module a une méthode bien pratique qui permet de donner le pipeline à la manière de gst-launch plutôt que de s’entêter à faire les pad un à un et de les raccorder.

Petit rappel, les pads, ainsi que le pipeline gstreamer, envoit des évènements. On regarde ce que donne le pad “vader”:

gst-inspect vader
...
Element Signals:
   "vader-start" :  void user_function (GstElement* object,
                                   guint64 arg0,
                                   gpointer user_data);
   "vader-stop" :  void user_function (GstElement* object,
                                  guint64 arg0,
                                  gpointer user_data);

Deux évènements à retenir: vader-start et vader-stop… inutile de vous dire à quoi il servent.

Ensuite, en ce qui concerne python et gst, on peut mettre en pause ou en état de démarrage le pipeline via la méthode set_state() en lui donnant en argument gst.STATE_PAUSED ou gst.STATE_PLAYING

On va utiliser urllib2 pour envoyer les données à Google.

Et enfin, pour que le programme écoute en continue sans couper le script, on va utiliser le module gtk pour utiliser la boucle itérative “gtk.main()”

L’algo est le suivant:

on crée le pipeline en nommant le pad vader "vad" (afin de le récupérer)
on écoute les évènement du pad vader
quand vader stop son écoute:
    on met en pause tout le pipeline pour ne pas relancer l'écoute tout de suite
    on copie le fichier flac en mémoire
    on vide le fichier flac pour ne pas cumuler nos phrases
    on remet le pipeline en écoute
    on envoit la requête à Google
    si ça a marché, on affiche la meilleures hypothèse de reconnaissance

Voilà… et bien lisez un peu le source:

import gst
import gtk
import urllib2
import json
import logging
import os

# file where we record our voice (removed at end)
FLACFILE='/tmp/tmpvoice.flac'

#to be clean on logs
logging.getLogger().setLevel(logging.DEBUG)

def on_vader_start(ob, message):
    """ Just to be sure that vader has reconnized that you're speaking
    we set a trace """
    logging.debug("Listening...")

def on_vader_stop(ob, message):
    """ This function is launched when vader stopped to listen
    That happend when you stop to talk """

    logging.debug("Processing...")

    # pause pipeline to not break our file
    pipe.set_state(gst.STATE_PAUSED)

    # get content of the file
    flacfile = open(FLACFILE, 'r').read()

    # empty file, to not reprocess
    # next time
    open(FLACFILE, 'w').write('')

    #file is empty, continue to listen
    pipe.set_state(gst.STATE_PLAYING)

    try:
        # hey, Google ! what did I said ?
        req = urllib2.Request('https://www.google.com/speech-api/v1/'
                              'recognize?client=chromium&lang=fr-FR&maxresults=10',
                flacfile, {'Content-Type': 'audio/x-flac; rate=16000'})
        res = urllib2.urlopen(req)
        # thanks google...
        resp = res.read()
        resp = json.loads(resp)
        print resp['hypotheses'][0]['utterance']
    except:
        logging.error("An error occured...")



#the main pipeline
pipe = gst.parse_launch('autoaudiosrc ! vader auto_threshold=true name=vad '
                        '! audioconvert ! audioresample ! '
                        'audio/x-raw-int,rate=16000 ! flacenc ! '
                        'filesink location=%s' % FLACFILE)

bus = pipe.get_bus()
bus.add_signal_watch()

vader = pipe.get_by_name('vad')
vader.connect('vader-start', on_vader_start)
vader.connect('vader-stop', on_vader_stop)

try:
    # start the pipeline now
    pipe.set_state(gst.STATE_PLAYING)
    logging.info("Press CTRL+C to stop")
    gtk.main()

except KeyboardInterrupt:
    # stop pipeline 
    pipe.set_state(gst.STATE_NULL)
    # remove our flac file
    os.remove(FLACFILE)

Voici un exemple de choses que j’ai put voir en lançant mon script python:

$ python voice.py 
** Message: pygobject_register_sinkfunc is deprecated (GstObject)
INFO:root:Press CTRL+C to stop
DEBUG:root:Listening...
DEBUG:root:Processing...
ceci est un exemple de reconnaissance vocale
DEBUG:root:Listening...
DEBUG:root:Processing...
comme vous pouvez voir cela fonctionne plutôt pas mal

Bon il est clair qu’il faudra certainement régler le niveau du micro pour pas tout enregistrer tout le temps, voir créer un raccourcis qui lance cette reconnaissance one shot… et puis pourquoi pas se faire des jeux de commandes qui peuvent executer des actions…

En gros, tout est possible, mais encore une fois: Google n’a pas donné explicitement son accord pour utiliser leur outil de reconnaissance vocale comme ça… alors allez-y molo avec ce jouet - c’est purement un exemple à titre de recherche !

Petite parenthèse: j’ai pas mal testé pocketsphinx, y’a bien un moment où je vais réussir à en tirer un truc plus propre… mais rien n’a égalé ce que j’ai réussi à faire via Google…

Ça peut vous intéresser aussi


Serveur RSTP avec gstreamer et python

Avec mon petit raspberry-pi je me suis lancé le défit ...


Gstreamer la suite

Toujours envie de faire du gstreamer ? Et si on ...


Didacticiel GStreamer

Gstreamer est un framework extrêmement puissant, bien pensé et vraiment utile ...


Reconnaissance vocale sous Linux et Vista

Je cherchais des logiciels pour linux qui me permettrait de ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Erwin - 11/05/2017

Bonjour, en fait, petite erreur sur mon post précédent : la reco ne fonctionne évidemment pas en local. Et pour répondre à Eloi : oui, c’est rapide. J’ai une connexion adsl à 5Megabits et c’est fluide. Dernière info : il existe aussi le moteur de reco WAMI du MIT : voir http://ajaxian.com/archives/wami-lets-you-add-speech-recognition-to-any-web-page Fonctionne très bien aussi. Pour l’instant, pas le temps de développer un truc pour l’appeler en dehors d’un navigateur. Mais c’est prévu. Erwin :

Eloi - 21/04/2017

Bonjour, je suis très interessé pour realiser ceci, mais je me pose une question, le temps que le fichier flac soir traité, envoyé a google reconnut par google et que google nous re-envoie le fichier JSON avec ce que nous avont dit, est-ce très court, relativement rapide ou assez long ?

Erwin - 05/02/2017

Bonjour, Après quelques essais, j’ai pu lancer la reconnaissance vocale avec chromium en local (c’est-à-dire avec un serveur http local). La reconnaissance fonctionne plutôt bien, à ma grande surprise, avec le micro de la webcam. 3 petits fichiers sont nécéssaires : la page index.html, la feuille de style et le script javascript. Comment les faire passer ici ? Au passage : petire bizarrerie : en principe il faut fournir au moteur une liste de mots à reconnaître, mais je me suis aperçu de l’inutilité de cette liste. Le moteur reconnait beaucoup de mots (même le mot anticonstitutionnellement !). Cordialement Erwin

Metal3d - 30/01/2017

@Erwin effectivement, je viens de regarder, ça utiliser la reconnaissance intégré des navigateurs, voir https://shapeshed.com/html5-speech-recognition-api/ => chose que j’ai justement étudié pour créer mon ticket de blog. En gros, c’est la même base. Ce que j’ai du mal à comprendre c’est le fait de pouvoir utiliser un autre endpoint d’API de reconnaissance.

Bon de mon coté j’ai aussi bossé sur SphinxCMU, rien à faire j’atteind pas le niveau voulu…

Erwin - 30/01/2017

Je viens de réessayer (avec chromium) sur https://bl.ocks.org/jhermsmeier/3bc995d37f3acc0b0364 il faut cliquer sur le bouton open à droite. on tombe sur la page https://bl.ocks.org/jhermsmeier/raw/3bc995d37f3acc0b0364/ si ça ne marche du 1er coup, se positionner sur la barre d’adresse et faire un retour-chariot. J’oubliais : là : c’est en anglais. Pour l’avoir en français, il faut changer la langue dans speech.js (this.recog.lang = ‘fr’) Erwin ps : après je ne sais pas s’il est possible d’appeler l’api hors navigateur… je fouille un peu de ce côté.

Metal3d - 30/01/2017

@attila46 j’avais pas vu ton message qui est passé en spam… pour installer gstreamer tu passes par les paquets de ta distrib (apt-get, dnf, yum, etc…)

@erwin heu perso chez moi ça ne marche pas des masses ton script. Ou alors je ne saps pas m’en servir :p Pourquoi ça tape sur http://wami.csail.mit.edu/ (qui d’ailleurs ne répond pas) ?

Erwin - 29/01/2017

Bonjour, J’ai peut-être trouvé une autre solution de reconnaissance voace. pour l’instant, ça ne fonctionne que sous Chrome mais cela fonctionne bien. C’est ici : https://bl.ocks.org/jhermsmeier/3bc995d37f3acc0b0364 J’ai adapté le script pour le français (pas bien compliqué) et tout mis dans une page sur mon mini httpd. Fonctionne bien en français. Cordialement Erwin

van ward - 24/12/2016

Merci ! Tu pourras me prévenir quand tu auras trouver stp

Metal3d - 23/12/2016

À ce que je sais, Google demande désormais une clef d’Api pour la reconnaissance vocale hors navigateur et Android. Donc pour le coup je sais pas… Va falloir que je me repenche sur la question.

van ward - 23/12/2016

Salut ! J’ai utilisé ce code pour utiliser l’api de google :

import speech_recognition as sr

r = sr.Recognizer()

with sr.Microphone() as source: print(“Je vous écoute”) audio = r.listen(source)

try: print(“Vous avez dites: “ + r.recognize_google(audio)) except sr.UnknownValueError: print(“Google Speech Recognition could not understand audio”) except sr.RequestError as e: print(“Could not request results from Google Speech Recognition service; {0}”.format(e))

Est ce que tu connais un moyen que l’api reconnaisse le francais ?

Metal3d - 17/12/2016

Bonjour,

Python fonctionne sur windows et gstreamer doit aussi fonctionner. Mais le soucis c’est que Google a modifié son interface de reconnaissance vocale. Il faut désormais utiliser une clef d’Api et/ou payer pour avoir un accès illimité.

Je vais d’ailleurs modifier le billet pour prévenir de cette modification.

programme - 17/12/2016

Bonjour, Je cherche une alternative pour utiliser une reconnaissance vocale sous windows J’aimerai faire un programme qui retranscrit ma parole en texte dans un fichier txt Je suis programmmeur en batch et je ne m’y connais pas en python Serait-il possible que je me débrouille avec votre tutoriel sur Windows ?

Bien à vous,

Programme.

tom - 16/11/2016

Salut ! je sais que cet article commencce a prendre la poussiere et je m’escuse de t’y ajouter un commentaire. Mais comment fonctionne le module speech_recognition sur python 3.5 stp

attila46 - 23/10/2016

comment on fait pour install Gstreamer

Metal3d - 03/10/2016

En ce qui concerne “vader”, il te faut gst-launch-0.10 et non la 1.0. Apparement le plugin n’existe pas (ou alors il a changé de nom) - je tenterai de fouiller quand j’aurais un moment. Mais en l’état il faut installer gstreameer-tools-0.10

Metal3d - 03/10/2016

@fred.de.reims je n’ai pas retesté mais il semble que curl demande l’option --http2 si j’en crois l’erreur (donc Google a tout passé en HTTP2) - et de par le fait, il va falloir que j’adapte le script python pour qu’il utilise aussi le protocole http2.

Si déjà en curl ça passe avec cette option, on a la solution qui tombe. Si tu arrives à tester avant moi, préviens moi :)

fred.de.reims - 01/10/2016

Bonjour, je n’y arrive pas : ni en manuel ni avec python : pouvez vous m’aider ?

gst-launch autoaudiosrc ! audioresample ! audio/x-raw-int,rate=16000 ! flacenc ! filesink location=./voice.flac Définition du pipeline à PAUSED… Le pipeline est actif et n’a pas besoin de phase PREROLL… Passage du pipeline à la phase PLAYING… New clock: GstAudioSrcClock ^CCaught interrupt – handling interrupt. Interruption : arrêt du pipeline…

(gst-launch-0.10:7603): GLib-CRITICAL **: Source ID 34 was not found when attempting to remove it Execution ended after 3755623274 ns. Définition du pipeline à PAUSED… Définition du pipeline à READY (prêt)… Définition du pipeline à NULL… Libération du pipeline…

curl -X POST –data-binary @./voice.flac –header ‘Content-type: audio/x-flac; rate=16000’ ‘https://www.google.com/speech-api/v1/recognize?client=chromium&lang=fr-FR&maxresults=10'

curl: (16) HTTP/2 stream 1 was not closed cleanly: error_code = 1

python ./reco_vocal.py ** Message: pygobject_register_sinkfunc is deprecated (GstObject) Traceback (most recent call last): File “./reco_vocal.py”, line 57, in ‘filesink location=%s’ % FLACFILE) glib.GError: pas d’élément « vader »

gst-inspect vader Aucun élément ou greffon « vader »

dnf list gstreamer* Vérification de l’expiration des métadonnées effectuée il y a 2:36:26 sur Sat Oct 1 17:23:43 2016. Paquets installés gstreamer.x86_64 0.10.36-14.fc24 @fedora
gstreamer-ffmpeg.x86_64 0.10.13-15.fc24 @rpmfusion-free
gstreamer-plugins-bad.x86_64 0.10.23-7.fc24 @rpmfusion-free
gstreamer-plugins-bad-free.x86_64 0.10.23-32.fc24 @fedora
gstreamer-plugins-bad-nonfree.x86_64 0.10.23-3.fc24 @rpmfusion-nonfree
gstreamer-plugins-base.x86_64 0.10.36-14.fc24 @fedora
gstreamer-plugins-espeak.x86_64 0.4.0-9.fc24 @fedora
gstreamer-plugins-fc.x86_64 0.2-12.fc24 @fedora
gstreamer-plugins-good.x86_64 0.10.31-16.fc24 @fedora
gstreamer-plugins-ugly.x86_64 0.10.19-19.fc24 @rpmfusion-free
gstreamer-python.x86_64 0.10.22-10.fc24 @fedora
gstreamer-rtsp.x86_64 0.10.8-11.fc24 @fedora
gstreamer-tools.x86_64 0.10.36-14.fc24 @fedora
gstreamer1.i686 1.8.3-1.fc24 @updates
gstreamer1.x86_64 1.8.3-1.fc24 @updates
gstreamer1-libav.x86_64 1:1.8.3-1.fc24 @fedora-HandBrake
gstreamer1-plugins-bad.x86_64 1:1.8.3-1.fc24 @fedora-HandBrake
gstreamer1-plugins-base.i686 1.8.3-1.fc24 @updates
gstreamer1-plugins-base.x86_64 1.8.3-1.fc24 @updates
gstreamer1-plugins-good.x86_64 1.8.3-1.fc24 @updates
gstreamer1-plugins-ugly.x86_64 1:1.8.3-1.fc24 @fedora-HandBrake

Metal3d - 22/08/2016

@Eyneck :) oui et non. Effectivement cet article est un peu “poussé” car il parle du framework Gstreamer (dont j’ai fait des articles explicatifs) et de Python (dont il faut connaitre la base) + Gtk/Gdk - tout ce beau monde demande un peu d’expérience mais rien d’insurmontable. Par contre, si tu débutes, je ne pense pas qu’il faille que tu commences par ce genre de travail. Ce ticket parle tout de même de format audio, d’entêtes HTTP, d’API sans documentation, d’évènements Gstreamer… Mais tu me donnes une idée :) je pense que je vais mettre un “niveau” sur mes articles afin que les lecteurs sachent à quoi s’attendre en terme de complexité. Mais soit-dit en passant, j’accepte volontier les questions et remarques à propos des articles que je tape. Si tu as besoin d’un peu de détails, je serai vraiment content d’y répondre. Et je te remercie aussi pour le commentaire, c’est toujours plaisant d’en avoir (que ce soit positif ou négatif) car ça prouve l’intérêt que je peux apporter.

Eyneck - 22/08/2016

Je commence le developpement et je suis tomber sur ton article, j’ai rien compris x) Je pense que ton blog est plutôt pour les gens expérimenté

Metal3d - 18/02/2016

@un testeur avide apparement ça marche encore, et non… Google ne propose pas de méthode pour le moment hors navigateur. Encore une fois, j’ai trouvé cette méthode en bidouillant, Google ne communique pas sur la techno et je ne sais pas si on a le droit de faire ce que je fais dans ce ticket

un testeur avide - 08/01/2016

Salut, C’était juste pour savoir si la technique marchait toujours et si il n’y avait pas maintenant un moyen offert par google pour le faire sans bidouiler ?

Metal3d - 05/09/2014

Merci pour vos commentaires, ça me fait plaisirs.

Sachez que dans l’exemple que j’ai proposé, on peut alléger la boucle itérative en n’utilisant pas gtk mais g_object

Je corrigerai le ticket rapidement.

Et en passant, j’ai testé cette méthode en Go, les temps de réponse sont un peu meilleures. Je me suis amusé à me créer une base de commandes vocales, “ouvre un terminal”, “quelle heure est-il”, etc…

J’ai couplé ça à mbrola, ça a été un enfer… mais le pc répond de vive voix :) c’est toujours marrant…

vincentime2000 - 04/09/2014

Merci beaucoup d’avoir partagé ça ! C’est génial ! Cela m’ouvre beaucoup de portes !

Merci encore pour ce travail !

goggling - 03/05/2014

Très intéressant pour le coup je vous invite a tester ce que j’ai construit !

A tester sous chrome avec un micro pour des resultats optimaux(j’ai besoin d’un geek pour corriger les ecceuils !! merci de votre aide)

A ce jours les réponse sont plus performante qu’avec SIRI !!!

Thxer - 28/07/2013

Super piste ! Merci pour le partage ;)

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.