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:
[crayon]
[/crayon]
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
[crayon]
[/crayon]
La balise
- 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:
[crayon]
[/crayon]
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:
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
Ping : Raspberry | Pearltrees
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
@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+
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.
Regarde le plugin Vera qui envoie une bête requête HTTP pour allumer une lampe
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.
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 » »
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
PARFAIT !!
merci beaucoup ça fonctionne 🙂
je doit trouver comment éviter a sarah de « dicter » mon fichier mais la commande passe bien
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
c’est tout bon, merci encore du temps passer à me repondre
Ping : Installer et configurer un plugin avec S.A.R.A.H. « Abavala !!!
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 😉
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
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 ?
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 …
et question bete, si on decoupait le fichier son en analysant les silences et en fractionnant en plusieurs .wav pour matcher par mot ?
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
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
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