S.A.R.A.H: Une grammaire enrichie

API Microsoft Speech

La partie reconnaissance vocale de S.A.R.A.H. s’appuie entièrement sur les API Microsoft Speech (SAPI). L’objectif étant de s’intégrer finement avec le Kinect un Microphone Array de qualité.

Un microphone array est indispensable pour faire de la reconnaissance vocale dans une pièce car l’outil doit être capable d’isoler les bruits ambiants:

  • Parquet qui craque
  • TV en bruit de fond
  • Conversations

C’est la raison pour laquelle j’ai de gros doutes sur l’efficacité du projet Ubi.

Le principe de l’API Microsoft est simple:

  • Une grammaire décrit les combinaisons de mots/commandes à détecter
  • Quand une commande est détectée, elle est soumise à approbation avec un niveau de confidence (entre 0 et 1)
  • Si elle est approuvée, un résultat sémantique est retourné.

Une grammaire peut être construite en C# ou en XML. Voici un exemple de grammaire XML:

Le MSDN décrit la liste des tags ainsi qu’un cas concret de jeu de solitaire.

Grammaire Enrichie

Dans le contexte de S.A.R.A.H., j’ai normalisé la sémantique afin de passer des commandes depuis le XML.

L’objet Action encapsule toutes les actions à effectuer:

  • Les attributs de cet objet déclenchent des actions à effectuer
  • Tous les sous éléments de Action sont transformés en paramètre de requête HTTP
  • La réponse HTTP est ensuite vocalisée

La balise permet d’encapsuler du code JavaScript qui sera exécuté au moment où la grammaire est reconnue.

  • Le out.action.date ajoute un paramètre date dans l’URL
  • Le out.action._attributes.uri déclenche l’envoie d’un requête

Voici la sémantique renvoyée:

Ce code va entraîner une requête à http://127.0.0.1:8080/sarah/phantom/meteo?date=1. La réponse HTTP sera ensuite vocalisée.

Tips

Les caractères spéciaux comme ‘&’ doivent être encodés ‘&’ pour que le XML soit valide. Ensuite pour que la requête envoyé à NodeJS soit valide il faut aussi encoder le paramètre: out.action.param1=encodeURIComponent("Sam & Max")

Attributs de l’objet Action

Voici la liste des attributs que l’on peut mettre sur l’objet Action:

Name Description
uri Définit la requête à effectuer
tts Entraîne immédiatement un Text To Speech
notts Stop un Text To Speech
dictation Envoie l’audio à Google puis le Text via le param. dictation. (true ou préciser la langue en-US)
play Joue un MP3/WAV/WMA local ou stream
picture Upload une photo prise par le kinect
threashold Modifie le niveau de confidence requis
context Active une liste de grammaires séparées par ‘,’
listen Active/Désactive l’écoute
restart Recharge toute la mécanique

Contextes

Certaines grammaires ne doivent pas être chargées tout le temps car elles n’ont du sens que dans un certains contextes.

  • Par défaut toutes les grammaires sont chargées
  • WSRMacro peut démarrer avec « -context fichier.xml »
  • Les règles qui commencent par « lazy » ne sont pas activées
    • dans le nom de la règle ou du fichier
  • Une grammaire peut activer une autre avec l’attribut « context »:
    • out.action._attributes.context = « chatterbot.xml »
    • out.action._attributes.context = « default »
  • Il est aussi possible d’envoyer une requête HTTP à WSRMacro avec le paramètre « context »

Dictée et Wildcard

La version 2.2 fournit les briques pour faire de la reconnaissance wildcard !!

Besoin

Comment faire des phrases contenant des mots non prévus ?
– Sarah recherche {mot} sur wikipedia
– Sarah quand passe {mot} au ciné
– Sarah appel {mot} sur Skype
– Sarah joue {mot} sur Spotify

Problème

Ce n’est pas possible avec l’API Microsoft:

  • L’API « par design » ne sait pas reconnaître un mot
  • Le XML n’a pas prévu ce concept
  • La reconnaissance est très mauvaise

Solution

Il faut convertir l’audio via Google:

  • L’attribut « dictation » déclenche la conversion « audio to text »
  • Le tag GARBAGE indique des zones texte
  • La conversion est ensuite envoyée via ...?dictation=texte

 

20 pensées sur “S.A.R.A.H: Une grammaire enrichie

  • Ping : Raspberry | Pearltrees

  • 12 juillet 2013 à 11 h 55 min
    Permalink

    bonjour,

    je cherche a faire ceci : que sarah ouvre une page PHP sans rien faire d’autre ( pas de paramètres, aucun retour bref du basique

    « sarah, ouvre ca »

    et la sarah ouvre une page http://IP/ca.php

    Répondre
  • 12 juillet 2013 à 12 h 20 min
    Permalink

    @danogena, quand tu dis « ouvre ça » tu veux dire:
    – Lance une requête HTTP ? (Juste mettre le paramètre dans le XML cf. exemples)
    – Ouvre le navigateur avec cette adresse (Là il faut demander l’ouverture de Chrome avec un maramètre)

    Je crois que plusieurs personnes l’on fait sur la communauté G+

    Répondre
  • 12 juillet 2013 à 12 h 26 min
    Permalink

    je veut que sarah ouvre un page.php sans l’afficher (elle contient un code qui marche).
    j’ai essayé de regarder/modifier les pluging rommba/blink mais ça ne fonctionne pas.

    Répondre
  • 12 juillet 2013 à 15 h 02 min
    Permalink

    Regarde le plugin Vera qui envoie une bête requête HTTP pour allumer une lampe

    Répondre
  • 12 juillet 2013 à 17 h 10 min
    Permalink

    a partir du plugging vera, j’essaye mais j’y arrive pas.
    je pensai partir sur le demo 1:

    es tu laout.action._attributes.tts = « oui, je t’écoute »
    que je remplace par

    testout.action.open = « http://ip/test.php »
    mais comme tu t’en doute ça marche pas.

    Répondre
  • 12 juillet 2013 à 17 h 13 min
    Permalink

    humm petit soucis pour mon commentaire :p
    je veut remplacer
    « es tu laout.action._attributes.tts = « oui, je t’écoute » »
    par
    « testout.action.open = « http://ip/test.php » »

    Répondre
  • 12 juillet 2013 à 17 h 17 min
    Permalink

    Ah oui ça ne marche pas du tout comme ça 🙂

    Pour les gens qui n’utilisent que la partie cliente de SARAH et donc le XML mais pas NodeJS il faut positionner l’URL dans

    out.action._attributes.uri= »http://127.0.0.1:8080/sarah/phantom/meteo »;

    cf. Au dessus le cas du plugin Meteo. Et remplacer l’URL par l’adresse de ton php

    Répondre
  • 12 juillet 2013 à 17 h 40 min
    Permalink

    PARFAIT !!

    merci beaucoup ça fonctionne 🙂
    je doit trouver comment éviter a sarah de « dicter » mon fichier mais la commande passe bien

    Répondre
  • 12 juillet 2013 à 17 h 51 min
    Permalink

    Le comportement de SARAH est d’attaquer une URL et vocaliser la réponse.
    C’est la raison pour laquelle elle attaque un plugin NodeJS qui va faire des actions, requete , etc, … et répondre un texte à vocaliser

    Répondre
  • 12 juillet 2013 à 17 h 59 min
    Permalink

    c’est tout bon, merci encore du temps passer à me repondre

    Répondre
  • Ping : Installer et configurer un plugin avec S.A.R.A.H. « Abavala !!!

  • 27 janvier 2016 à 18 h 33 min
    Permalink

    Une question, quand je regarde le code du client je vois que tu stream le micro dans un .wav et tu le decrypte avec la dll windows de reconnaissance en parcourant les fichiers de grammaire.
    Pourquoi n’est il pas possible d’avoir un xml qui contient tout les mots de la langue francaise pour récupérer la commande exacte au lieu d’utiliser le google API quand il y a besoin des garbages ?
    Est ce le temps de traitement ?
    Ou j’ai pas compris un truc 😉

    Répondre
    • 27 janvier 2016 à 18 h 39 min
      Permalink

      Une grammaire est un arbre de décision. Il faudrait mettre tous les mots, mais aussi leur ordre, leur répétition, etc … la combinatoire est infinie comme la langue française

      Répondre
  • 27 janvier 2016 à 18 h 51 min
    Permalink

    Ca veut dire que la grammaire ne se fait pas mot à mot ? La comparaison du son est faite sur l’ensemble de la phrase dictée et on ne peut pas découper le fichier son ?

    Répondre
    • 27 janvier 2016 à 18 h 54 min
      Permalink

      Il match les premiers mots de la grammaire avec l’audio:
      – Salut
      – Bonjour

      Puis descend l’arbre
      – Comment
      – est ce que

      Etc ..
      – Ca va

      Ce que tu décris correspondrais a dire
      – Le premier mot c’est potentiellement : 1 parmis 400 000
      – Le second c’est 1 parmis 400 000
      – le suivant …

      Répondre
  • 27 janvier 2016 à 19 h 04 min
    Permalink

    et question bete, si on decoupait le fichier son en analysant les silences et en fractionnant en plusieurs .wav pour matcher par mot ?

    Répondre
    • 27 janvier 2016 à 19 h 05 min
      Permalink

      Tu réinvente la roue, la détection de silence n’est pas trivial.
      Autant attaquer un service comme Google ou Oxford qui font cela très bien

      Répondre
  • 27 janvier 2016 à 19 h 14 min
    Permalink

    Ok, je voulais voir si il y avait possibilité de bypasser google.io qui est limité à 50 requetes par jour je crois.
    Merci pour ces réponses

    Répondre
  • 16 mars 2017 à 18 h 58 min
    Permalink

    Jp bonjour, le xml est traité par SARAH, y a t’il un fichier ou tout les xml sont lister ?, un genre d’arbre par plugin ?
    merci

    Répondre

Laisser un commentaire

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