Utiliser des grammaires vocales externes

Pour les applications de réponse vocale interactive (IVR) et les tâches de reconnaissance vocale plus larges pour les applications vocales, une liste limitée ou une reconnaissance « grammaticale » offre des avantages significatifs. Cela surpasse largement la reconnaissance vocale sémantique traditionnelle utilisée dans les moteurs d'IA modernes de conversion de la parole en texte (STT) en termes de précision, de performances et de coût. Cette amélioration des performances s'explique par le fait que la reconnaissance basée sur la grammaire permet de limiter les résultats de la reconnaissance à un ensemble de règles prédéfinies, ce qui renforce la précision.

Les grammaires adhèrent à la spécification de grammaire de reconnaissance vocale (SRGS), comme indiqué dans la spécification W3C. Lorsqu’une requête entre dans le moteur, elle convertit l’audio parlé (« énoncés ») en texte. Le moteur compare ensuite le texte reconnu à la grammaire et à tous les artefacts associés, tels que les lexiques de prononciation. Ce processus fournit soit une transcription littérale, soit une interprétation limitée par la grammaire aux informations disponibles. Une logique supplémentaire, telle qu’ECMAScript intégrée à la grammaire, peut affiner davantage l’interprétation.

La reconnaissance vocale contrainte est idéale pour :

  • La reconnaissance des listes restreintes (telles que les adresses, les symboles boursiers, les codes postaux et les noms de service, etc.).

  • La reconnaissance de chaîne alphanumérique (numéros de suivi, numéros de compte, codes de confirmation, etc.).

    • Y compris les contraintes de position. Par exemple, les deux premiers caractères de l’ID de membre commencent par AN, FD, NT. Un autre exemple de contraintes de position est le numéro d'identification d'un véhicule.
  • Reconnaissance alphanumérique ou numérique avec des sommes de contrôle ou des contraintes similaires. Par exemple, les numéros de carte de crédit où il y a une somme de contrôle Luhn.

  • Applications de boîte de dialogue dirigées dans lesquelles des mots ou expressions spécifiques doivent être énoncés.

Création de grammaires vocales

Écrire des grammaires vocales contraintes à l’aide de Grammar XML (GrXML). Comme n’importe quel document XML, un fichier de grammaire doit commencer par un en-tête qui spécifie certaines caractéristiques de la grammaire. Le corps principal d’un fichier de grammaire se compose de règles de grammaire qui définissent les mots parlés reconnus par la grammaire et les valeurs de variables correspondantes retournées par les éléments reconnus.

En-tête de fichier de grammaire

L’en-tête d’un fichier de grammaire se compose de la déclaration XML et de l’élément <grammar> spécifiant la langue du document, la racine et l’espace de noms.

<?xml version="1.0" encoding="UTF-8" ?>

<grammar xmlns="http://www.w3.org/2001/06/grammar"

version="1.0" xml:lang="en-US" root="YesNo"

tag-format="swi-semantics/1.0">

Déclaration XML et type d’encodage

Le premier élément de l’en-tête est toujours la déclaration XML. Cet élément spécifie la version de XML utilisée dans le document (1.0 ou 1.1). Il spécifie également l’encodage qui s’applique au document, qui détermine les langues qui peuvent ou ne peuvent pas être utilisées.

La version et l’encodage sont des attributs obligatoires. Utilisez tout encodage approprié à vos préférences (par exemple, configuration de votre ordinateur, application de traitement de texte, etc.). Le moteur de reconnaissance vocale contrainte ne se soucie pas de l’encodage que vous utilisez.

Une courte liste d’encodages classiques pour différentes langues est indiquée dans le tableau suivant :

Codage Description
ISO-8859-1 Latin-1. Utilisé pour l’anglais, le français, l’allemand et l’espagnol.
UTF-8 Utilisé pour toutes les langues.
UTF-16 Utilisé pour toutes les langues.
Big5 Utilisé pour cantonais (ce-HK).
GB Utilisé pour le mandarin (zh-TW).
Shift-JIS et EUC-JP Utilisé pour le japonais.
KSC et EUC-KR Utilisé pour coréen.

La plupart des langues peuvent être représentées dans plusieurs encodages.

Au moment de l’exécution, le système convertit automatiquement l’encodage du fichier de grammaire au format UTF-16 à l’aide des bibliothèques International Components for Unicode (ICU). Le site officiel du consortium Unicode est http://site.icu-project.org/.

Langue, espace de noms et format d’étiquette sémantique

Le deuxième élément de l’en-tête est l’élément <grammar>, dont les attributs spécifient les informations par défaut pour le document. Les attributs requis sont les suivants :

  • xml:lang: spécifie l’identificateur du langage humain par défaut à utiliser, tel que défini dans le document RFC (Request For Comments) RFC 3066 sur le site web IETF.

  • Microsoft prend en charge un large éventail de langues. La langue que vous choisissez doit être compatible avec le type d’encodage de grammaire.

  • version: spécifie la version de GrXML (1.0).

  • xmlns: désigne l’espace de noms de grammaire. Pour les grammaires GrXML, cette désignation est toujours http://www.w3.org./2001/06/grammar.

  • tag-format: définit le format utilisé pour les scripts au sein d’éléments <tag> dans le corps principal de la grammaire pour attribuer des valeurs.

Le format de balise doit être l’une des chaînes suivantes :

Valeur Format des balises sémantiques
swi-semantics/1.0 Syntaxe de balise (utilisée si le format de balise n’est pas défini). Cette syntaxe est appelée swi syntax (pour SpeechWorks International).
semantics/1.0 Syntaxe de balise de script W3C.
semantics/1.0-literals Syntaxe des balises des littéraux de chaîne W3C.

Note

  • Strictement parlant, l’attribut de format de balise n’est pas obligatoire si votre grammaire n’utilise pas l’élément <tag>. Toutefois, la plupart des grammaires utilisent <tag> pour attribuer des valeurs. Microsoft vous recommande donc vivement de spécifier le format de balise.

  • Pointez toujours les attributs et les éléments GrXML, tels que xmlns, vers l’espace de noms <http://voicexml.site.com/grammar>.

Dictionaries

Dans certains cas, la grammaire peut avoir besoin d’inclure des mots ou des expressions que le moteur de reconnaissance vocale contrainte ne peut pas analyser normalement. Par exemple, un nom peut être dit et orthographié différemment, comme la ville « Worcester », qui peut être prononcé « wih-sta ».

Utilisez l’élément <lexicon> pour importer des dictionnaires qui mappent des énoncés à du texte correspondant dans le fichier de grammaire.

Corps principal du fichier de grammaire

La section principale d’un fichier de grammaire contient les règles qui définissent réellement la grammaire : les mots et expressions parlés à reconnaître, ainsi que les valeurs à revenir à l’application principale pour chaque élément reconnu.

Règles

Le corps principal d’un fichier de grammaire se compose de règles définies à l’aide de l’élément GrXML <rule> . Chaque règle a un identificateur unique. Chaque règle répertorie les mots et expressions qu’elle reconnaît en tant que texte dans un élément ou <item> un élément <token>. Ces éléments peuvent être imbriqués dans d’autres éléments GrXML :

  • L’élément <one-of> présente une liste d’alternatives acceptables, et une seule alternative est nécessaire pour activer la règle.

  • L’élément <ruleref> fait référence à une autre règle, comme à une sous-routine.

  • L’élément <tag> spécifie des actions à effectuer ou à affecter à une variable. Il peut inclure un script écrit dans le langage de format de balise.

Lorsque l’utilisateur prononce un mot ou une expression que la règle couvre, la règle exécute les actions, les affectations de valeur ou tout autre code défini pour cet énoncé.

Règle racine

La règle racine est la première règle dans le fichier, sauf indication contraire de l’en-tête. Elle sert de règle op-level par défaut. Lorsque la grammaire est référencée sans spécifier la règle à rechercher, cette règle racine est la première consultée.

Étendue de la règle

Affectez chaque règle dans le corps principal d’un fichier de grammaire comme une étendue. L’étendue indique si vous pouvez référencer la règle indépendamment des fichiers externes (publics) ou uniquement par une autre règle au sein de la même grammaire (privée). Toutes les règles sont privées par défaut, sauf si vous les définissez comme publiques.

Lorsque la règle est publique, vous pouvez utiliser son attribut ID comme ancre pour les références à partir d’autres documents. Par exemple, prenez la syntaxe suivante :

<grammar src="../grammars/universals.grxml#YesNo"/>

Lorsque vous invoquez cet élément de grammaire, il se réfère directement à la règle publique « YesNo » dans le fichier universals.grxml, que cela soit la règle racine du fichier ou non.

Note

La règle racine d’un fichier de grammaire peut être privée. Cette règle ne peut pas être référencée indépendamment. Toutefois, elle est utilisée par défaut comme point d’entrée de la grammaire lorsque vous appelez le fichier de grammaire lui-même.

Extraire la signification et retourner les résultats

Note

La SWI_meaning clé doit contenir les informations retournées à l’agent compatible avec la voix qui fonctionne dans Copilot Studio.

La clé SWI_meaning contient la signification sémantique d’une expression reconnue. Vous ne pouvez le définir que pour la règle racine. Cette clé est incluse dans la swirec_extra_nbest_keys liste par défaut. Elle apparaît donc dans le résultat XML si votre grammaire définit cette clé.

SWI_meaning filtre les réponses redondantes afin que les entrées de la liste n-best soient vraiment distinctes. L’élimination de la redondance améliore les scores de confiance et l’utilité de la liste n-best.

Lorsqu'une phrase reconnue est similaire à une autre sur le plan grammatical, son score de confiance est souvent faible, car le moteur de reconnaissance vocale contraint ne sait pas quelle phrase est correcte. Lorsque vous utilisez SWI_meaning correctement, le moteur de reconnaissance vocale à contraintes regroupe les interprétations redondantes dans le même emplacement sur la liste n-best. Dans l’exemple suivant, SWI_meaning est défini sur « direct calls home » si l’expression reconnue est « direct my calls home » ou « please direct my calls home ».

Sans SWI_meaning, la grammaire peut produire la liste n-best suivante :

N Texte
1 transférer mes appels vers mon téléphone de voiture
2 transférer les appels à ma voiture
3 transférer les appels au domicile
4 transférer mes appels au bureau
5 transférer mes appels au bureau
6 transférer les appels à mon domicile

Lorsque vous utilisez SWI_meaning, le moteur de reconnaissance vocale contrainte organise la liste n-best par la signification de l’interprétation plutôt que par l’expression exacte parlée, afin que les entrées de la liste n-best soient vraiment distinctes :

N Texte Clé de SWI_meaning de niveau supérieur
1 transférer mes appels vers mon téléphone de voiture transfert d'appels voiture
transférer les appels à ma voiture transfert d'appels voiture
2 transférer les appels au domicile transfert d'appel domicile
transférer les appels à mon domicile transfert d'appel domicile
3 transférer mes appels au bureau transfert d'appel travail
transférer mes appels au bureau transfert d'appel travail

Le moteur de reconnaissance vocale contrainte définit SWI_meaning automatiquement, même si vous ne le définissez pas explicitement dans un script dans la grammaire.

Si vous ne définissez SWI_meaning pas explicitement sur la racine, il est construit en concaténant toutes les clés définies dans la racine et leurs valeurs. Toutefois, cette construction ne s’applique pas à aucune clé commençant par SWI_, comme SWI_literal. Les paires clé/valeur sont triées par ordre alphabétique. Le raisonnement est que, en ce qui concerne l’application, l’ensemble de clés retournées est la signification de la phrase.

S’il n’existe aucune clé, les résultats dépendent de l’utilisation de la sémantique SISR ou SWI. Avec SISR, la clé SWI_meaning n’est pas définie s’il n’y a pas de clés. En revanche, avec la sémantique SWI, SWI_meaning est définie sur ce qui suit :

{SWI_literal:<literal>}

Si SWI_meaning est un objet, il est converti en représentation sous forme de chaîne.

Bien que l’application puisse accéder SWI_meaning, elle utilise plus souvent d’autres paires clé/valeur définies spécifiquement pour elle.

Grammaires vocales de l’hôte via Stockage Azure

Copilot Studio prend en charge la reconnaissance vocale contrainte par le biais de grammaires vocales. Toutefois, il ne prend pas en charge directement la création, le test ou l’hébergement de ces grammaires. Pour l’hébergement de grammaires, utilisez Microsoft stockage Azure pour créer une connexion approuvée et sécurisée entre l’agent à commande vocale et le stockage des grammaires.

Configurer un compte de stockage Azure

Création d’un compte de stockage Azure. Vérifiez que l’abonnement, le groupe de ressources, la région et le nom de la ressource du nouveau compte de stockage suivent les stratégies de votre organisation. Utilisez les paramètres suivants :

  • Pour le service principal, sélectionnez Stockage Blob Azure ou Azure Data Lake Storage Gen2.

  • Sélectionnez Premium pour les performances.

Pour en savoir plus, consultez Créer un compte de stockage Azure.

Configurer le conteneur de stockage

Utilisez le site web statique comme conteneur de stockage pour vos fichiers de grammaire chargés. Le conteneur de stockage fournit le point de terminaison principal et le point de terminaison secondaire du site web.

Après avoir chargé votre fichier de grammaire, sélectionnez le fichier dans le répertoire pour afficher les propriétés et les détails du fichier. Enregistrez l’URL du fichier, qui doit être au format suivant :

https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}

En savoir plus dans Créer un conteneur.

Authentifier le moteur de reconnaissance vocale contrainte

Pour que la reconnaissance vocale contrainte fonctionne dans un agent compatible avec la voix, le système doit s’authentifier à l’aide du compte de stockage créé à l’étape précédente en tant qu’emplacement approuvé. Cette authentification nécessite le rôle Lecteur de données de Blob de stockage.

Pour plus d’informations, consultez Assigner des rôles Azure à l’aide du portail Azure.

Connectez-vous au portail Azure, ouvrez une session Azure Cloud Shell et exécutez la commande suivante pour créer un principal de service pour un moteur de reconnaissance vocale limitée dans votre client.

az ad sp create --id e0e7bef0-777c-40ef-86aa-79d83ba643c7

Note

Lorsque vous recherchez le principal de service, vous voyez qu’il contient « NRaaS » dans le nom.

Utiliser la parole contrainte dans Copilot Studio

Créer une entité externe

Vous pouvez considérer une entité dans Copilot Studio comme une unité d’informations qui représente un certain type de sujet réel. Par exemple, un numéro de téléphone, un code postal, une ville ou même le nom d’une personne. En utilisant des entités, un agent peut reconnaître les informations pertinentes d’une entrée utilisateur et l’enregistrer pour une utilisation ultérieure. Dans ce scénario, une grammaire vocale contrainte effectue la reconnaissance.

Utilisez des entités externes pour référencer des grammaires vocales. Pour créer une entité externe, ouvrez votre agent compatible avec la voix et accédez à Paramètres>Entités>Ajouter une entité> externe.

Note

Lors de la construction de votre entité, utilisez une variable globale ou système , et non une variable d’environnement . Si vous devez utiliser une variable d’environnement, créez une variable globale lui attribuer la valeur de la variable d’environnement. Ensuite, cette variable globale peut être utilisée dans l’ULR de grammaire pour référence.

Saisissez les informations suivantes :

  • Nom : URL de grammaire sous la forme de https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true

    Note

    L’URL est sensible à la casse.

Le mode de reconnaissance par défaut est Speech Only. Pour obtenir d’autres configurations de grammaire, consultez le tableau suivant :

Type Paramètre de requête. Example
Reconnaissance vocale uniquement None https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true
DTMF &mode=dtmf https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true&mode=dtmf
Reconnaissance vocale ou DTMF
(Même fichier de grammaire)
&mode=speechdtmf https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true&mode=speechdtmf
Speech ou DTMF (différents fichiers de grammaire) &mode=speechdtmf&dtmfgrammar={grammarURL} https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true&mode=speechftmf&dtmfgrammar=https://{resourceName}.blob.core.windows.net/\$web/{DTMFgrammarFileName}

Note

Les URL peuvent également inclure des noms de variables directes dans Copilot Studio.

Par exemple, supposons qu’il existe deux ensembles identiques de grammaires, un pour l’anglais et un pour l’espagnol, et chacun est stocké dans un sous-répertoire différent. L’agent multilingue doit pouvoir utiliser les grammaires anglaises lors de la communication en anglais et de la même façon en espagnol. Dans ce cas, l’URL de grammaire serait : {Env.BaseURL}/common/**{System.User.Language}**/{grammarFileName}?

System.User.Language est en_US ou es_US, et change lorsque la langue bascule dans votre agent.

  • Description : description simple de la grammaire, que le sélecteur sur le canevas référence comme nom d’entité. Par exemple, « numéro de carte de crédit ».

  • Type de données : choisissez le type de données Enregistrement et définissez le schéma des balises attendues en réponse. Par exemple, si la grammaire retourne SWI_meaning et la ville, le schéma Enregistrement ressemble à ceci :

    kind: Record
    properties:
    city: String
    SWI_meaning: String
    

Une fois que vous avez sélectionné Enregistrer, l’entité apparaît dans la liste. Dans le canevas de création accédez à Nœud de question. Tout comme avec les entités traditionnelles, sélectionnez l’entité externe (attachée à une grammaire) que vous souhaitez que l’assistant reconnaisse à la suite de la réponse de l’utilisateur à l’invite.

Comportement à l’exécution

Lorsqu’un agent prenant en charge la voix s’exécute et rencontre la logique qui utilise une grammaire externe, l’agent prenant en charge la voix accède au compte de stockage Azure et récupère la grammaire à des fins d’interprétation. L'assistant compare ensuite ce que l'utilisateur a dit avec les contraintes appliquées dans la grammaire. Si une correspondance réussit, le système retourne la réponse dans la variable Enregistrement, en fonction du schéma défini dans l’entité externe.

Logique de canevas

Le résultat enregistré dans la variable du nœud est toujours un type d’enregistrement tel que défini dans le schéma de l’entité externe. Les auteurs peuvent utiliser cette variable d’enregistrement pour accéder aux clés définies dans le schéma, comme variableName.SWI_meaning ou variableName.city via la notation par points.

Débogage

Codes d’erreur

Error Definition
400 Demande incorrecte
401 Non authentifié
403 Interdit
404 Aucune parole
408 Aucun délai d’expiration d’entrée
418 Expiration de session
419 Aucune ressource active : il manque une grammaire
500 Erreur interne : signaler à Microsoft dans un ticket de support

SWI_Literal

Pour de nombreuses grammaires qui fonctionnent avec le moteur de reconnaissance vocale contrainte, la SWI_Literal fonctionnalité retourne l’instruction littérale que l’utilisateur a énoncé, et non le résultat interprété. Consignez cette valeur en tant qu'une des sorties dans Copilot Studio pour faciliter le débogage.

Limitations connues

La solution présente les limitations suivantes :

  • Taille maximale du fichier de grammaire individuel, actuellement limitée à 100 Mo.
  • La transmission de variables n’est pas prise en charge.
  • Le compte de stockage doit être situé dans le même client que l'assistant.
  • La taille de l’URL ne peut pas dépasser 500 caractères.
  • Seuls les points de terminaison de compte de stockage Azure sont autorisés.
  • Les sous-grammaires ne peuvent être hébergées que dans le même compte de stockage (en utilisant le même FPA pour l'autorisation).
  • Analyseur XML sécurisé (autrement dit, DTD n’est pas autorisé et doit être validé par rapport au schéma SRGS/SISR).
  • Seul le format de sortie NLSML est pris en charge en interne.
  • Le paramètre hérité swirec_simple_result_key n’a aucun effet et toutes les balises sont retournées.

Le service Microsoft Dynamics traite les systèmes de reconnaissance vocale contrainte. En utilisant cette expérience, vous acceptez les conditions de Dynamics.