Usar gramáticas de voz externas

En el caso de las aplicaciones de respuesta interactiva de voz (IVR) y las tareas de reconocimiento de voz más amplias para las aplicaciones de voz, una lista restringida o un reconocimiento basado en gramática ofrece ventajas significativas. Supera con creces el reconocimiento de voz tradicional basado en la semántica que se usa en los motores modernos de IA de voz a texto (STT) en términos de precisión, rendimiento y coste. Este aumento del rendimiento se debe a que el reconocimiento basado en gramática puede restringir la salida del reconocimiento a un conjunto predefinido de reglas, lo que refuerza la precisión.

Las gramáticas se adhieren a la especificación de gramática de reconocimiento de voz (SRGS), como se detalla en la especificación W3C. Cuando una solicitud entra en el motor, convierte el audio hablado ("expresiones") en texto. A continuación, el motor compara el texto reconocido con la gramática y los artefactos asociados, como los léxicos de pronunciación. Este proceso proporciona una transcripción literal o una interpretación que la gramática limita conforme a la información establecida en la gramática. La lógica adicional, como ECMAScript integrada en la gramática, puede refinar aún más la interpretación.

El reconocimiento de voz restringido es ideal para:

  • Reconocimiento de listas restringidas, (direcciones, cotizaciones bursátiles, códigos postales, nombres de departamentos y similares).

  • Reconocimiento de cadenas alfanuméricas (números de seguimiento, números de cuenta, códigos de confirmación, etc.).

    • Incluye tener restricciones posicionales. Por ejemplo, los dos primeros caracteres del id. de miembro comienzan con AN, FD, NT. Otro ejemplo de restricciones posicionales es un número de identificación del vehículo.
  • Reconocimiento alfanumérico o de dígitos con sumas de comprobación o restricciones similares. Por ejemplo, números de tarjeta de crédito donde hay una suma de comprobación de Luhn.

  • Aplicaciones de diálogo dirigidas en las que se deben pronunciar palabras o frases específicas.

Creación de gramáticas de voz

Escriba gramáticas de voz restringidas mediante Grammar XML (GrXML). Al igual que cualquier documento XML, un archivo de gramática debe comenzar con un encabezado que especifique ciertas características de la gramática. El cuerpo principal de un archivo de gramática consta de reglas gramaticales que definen las palabras habladas reconocidas por la gramática y los valores de variable correspondientes que devuelven los elementos reconocidos.

Encabezado de archivo de gramática

El encabezado de un archivo de gramática consta de la declaración XML y el elemento <grammar> que especifica el lenguaje de documento, la raíz y el espacio de nombres.

<?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">

Tipo de declaración y codificación XML

El primer elemento del encabezado siempre es la declaración XML. Este elemento especifica la versión de XML usada en el documento (1.0 o 1.1). También especifica la codificación que se aplica al documento, que determina los idiomas que se pueden usar o no.

La versión y la codificación son atributos necesarios. Use cualquier codificación adecuada para sus preferencias (por ejemplo, la configuración del equipo, la aplicación de procesamiento de texto, etc.). Al motor de reconocimiento de voz restringido no le importa qué codificación se usa.

En la tabla siguiente se muestra una breve lista de codificaciones típicas para varios idiomas:

Encoding Description
ISO-8859-1 Latin-1. Se usa para inglés, francés, alemán y español.
UTF-8 Se usa para todos los idiomas.
UTF-16 Se usa para todos los idiomas.
Big5 Se usa para cantonés (ce-HK).
GB Se usa para mandarín (zh-TW).
Shift-JIS y EUC-JP Se usa para japonés.
KSC y EUC-KR Se usa para coreano.

La mayoría de los idiomas se pueden representar en más de una codificación.

En tiempo de ejecución, el sistema convierte automáticamente la codificación del archivo de gramática en formato UTF-16 mediante las bibliotecas Componentes internacionales para Unicode (ICU). El sitio web oficial del consorcio Unicode es http://site.icu-project.org/.

Idioma, espacio de nombres y formato de etiqueta semántica

El segundo elemento del encabezado es el elemento <grammar>, cuyos atributos especifican información predeterminada para el documento. Los atributos necesarios son:

  • xml:lang: especifica el identificador del idioma humano predeterminado que se va a usar, tal como se define en el documento Solicitud de comentarios (RFC) RFC 3066 en el sitio web de IETF.

  • Microsoft admite una amplia gama de idiomas. El idioma que elija debe ser compatible con el tipo de codificación gramatical.

  • version: especifica la versión de GrXML (1.0).

  • xmlns: designa el espacio de nombres de gramática. Para las gramáticas GrXML, esta designación siempre es http://www.w3.org./2001/06/grammar.

  • tag-format: define el formato usado para los scripts dentro de los elementos <tag> del cuerpo principal de la gramática para asignar valores.

El formato de etiqueta debe ser una de estas cadenas:

Importancia Formato de etiquetas semánticas
swi-semantics/1.0 Sintaxis de etiqueta (se usa si no se define el formato de etiqueta). Esta sintaxis se conoce como swi syntax (para SpeechWorks International).
semántica/1.0 Sintaxis de etiqueta de script W3C.
semántica/1.0-literales Sintaxis de etiqueta de literales de cadena W3C.

Nota:

  • En términos estrictos, el atributo de formato de etiqueta no es necesario si la gramática no usa el elemento <tag>. Sin embargo, la mayoría de las gramáticas usan <tag> para asignar valores, por lo que Microsoft recomienda encarecidamente especificar el formato de etiqueta.

  • Apunte siempre los atributos y elementos de GrXML, como xmlns, al espacio de nombres <http://voicexml.site.com/grammar>.

Dictionaries

En algunos casos, es posible que la gramática tenga que incluir palabras o frases que el motor de reconocimiento de voz restringido no puede analizar normalmente. Por ejemplo, un nombre podría decirse y escribirse de forma diferente, como la ciudad "Worcester", que podría ser pronunciada "wih-sta".

Use el <lexicon> elemento para importar diccionarios que asignan expresiones a texto coincidente en el archivo de gramática.

Cuerpo principal del archivo de gramática

La sección principal de un archivo de gramática contiene las reglas que definen realmente la gramática: las palabras habladas y frases que se van a reconocer y los valores que se van a devolver a la aplicación principal para cada elemento reconocido.

Reglas

El cuerpo principal de un archivo de gramática consta de reglas definidas mediante el elemento GrXML <rule> . Cada regla tiene un identificador único. Cada regla enumera las palabras y frases que reconoce como texto dentro de un elemento <item> o elemento <token>. Estos elementos pueden estar anidados dentro de otros elementos GrXML:

  • El <one-of> elemento presenta una lista de alternativas aceptables y solo se requiere una alternativa para activar la regla.

  • El elemento <ruleref> hace referencia a otra regla, como a una subrutina.

  • El <tag> elemento especifica las acciones que se van a llevar a cabo o a los valores que se van a asignar a una variable. Puede incluir un script escrito en el lenguaje de formato de etiqueta.

Cuando el usuario expresa una palabra o frase que cubre la regla, la regla ejecuta las acciones, las asignaciones de valor u otro código definido para esa expresión.

Regla raíz

La regla raíz es la primera regla del archivo, a menos que el encabezado especifique lo contrario. Actúa como regla de nivel de operación predeterminada. Cuando se hace referencia a la gramática sin especificar la regla que se va a buscar, esta regla raíz es la primera consultada.

Ámbito de regla

Asigne cada regla dentro del cuerpo principal de un archivo de gramática como ámbito. El ámbito indica si puede hacer referencia a la regla independientemente de los archivos externos (públicos) o solo por otra regla dentro de la misma gramática (privada). Todas las reglas son privadas de forma predeterminada, a menos que las defina como públicas.

Cuando la regla es pública, puede usar su atributo ID como un ancla para las referencias de otros documentos. Por ejemplo, suponga la siguiente sintaxis.

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

Al invocar este elemento de gramática, hace referencia directamente a la regla pública "YesNo" dentro del archivo universals.grxml , independientemente de si es la regla raíz del archivo.

Nota:

La regla raíz de un archivo de gramática puede ser privada. No se puede hacer referencia a esta regla de forma independiente. Sin embargo, se usa de forma predeterminada como punto de entrada a la gramática al invocar el propio archivo de gramática.

Extraer significado y devolver resultados

Nota:

La SWI_meaning clave debe contener la información devuelta al agente con capacidades de voz que opera dentro de Copilot Studio.

La clave SWI_meaning contiene el significado semántico de una frase reconocida. Solo puede establecerlo para la regla raíz. Esta clave se incluye en la swirec_extra_nbest_keys lista de forma predeterminada, por lo que aparece en el resultado XML si la gramática establece esta clave.

SWI_meaning filtra las respuestas redundantes para que las entradas de la lista de los n mejores sean verdaderamente distintas. La eliminación de la redundancia mejora las puntuaciones de confianza y la utilidad de la lista n-best.

Cuando una frase reconocida es similar a otra en la gramática, a menudo tiene una puntuación de confianza baja, ya que el motor de reconocimiento de voz restringido no está seguro de qué frase es correcta. Cuando se usa SWI_meaning correctamente, el motor de reconocimiento de voz con restricciones agrupa interpretaciones redundantes en el mismo espacio en la lista n-best. En el ejemplo siguiente, SWI_meaning se establece en "direct calls home" si la frase reconocida es "dirigir mis llamadas a casa" o "dirija mis llamadas a casa".

Sin SWI_meaning, la gramática puede producir la siguiente lista de n mejores:

N Mensaje de texto
1 dirigir mis llamadas al teléfono de mi coche
2 dirigir llamadas a mi coche
3 enviar llamadas a casa
4 envíe mis llamadas a la oficina
5 enviar mis llamadas a la oficina
6 dirigir llamadas a mi casa

Cuando se usa SWI_meaning, el motor de reconocimiento de voz restringido organiza la lista de los n mejores por el significado de la interpretación en lugar de la frase exacta pronunciada, para que las entradas de la lista sean verdaderamente distintas.

N Mensaje de texto Clave de SWI_meaning de nivel superior
1 dirigir mis llamadas al teléfono de mi coche dirigir llamadas al coche
dirigir llamadas a mi coche dirigir llamadas al coche
2 enviar llamadas a casa dirigir llamadas a casa
dirigir llamadas a mi casa dirigir llamadas a casa
3 envíe mis llamadas a la oficina trabajo de llamadas directas
enviar mis llamadas a la oficina trabajo de llamadas directas

El motor de reconocimiento de voz restringido establece SWI_meaning automáticamente, incluso si no lo establece explícitamente en un script dentro de la gramática.

Si no define explícitamente SWI_meaning en la raíz, se construye mediante la concatenación de todas las claves definidas en la raíz y sus valores. Sin embargo, esta construcción no se aplica a ninguna clave que comienzan con SWI_, como SWI_literal. Los pares clave-valor se ordenan alfabéticamente. El razonamiento es que, en lo que respecta a la aplicación, el conjunto de claves devuelta es el significado de la frase.

Si no hay claves, los resultados dependen de si usa la semántica de SISR o SWI. Con SISR, la clave SWI_meaning no se establece si no hay claves. En cambio, con la semántica de SWI, SWI_meaning se establece en lo siguiente:

{SWI_literal:<literal>}

Si SWI_meaning es un objeto , se convierte en una representación de cadena.

Aunque la aplicación puede acceder a SWI_meaning, a menudo usa otros pares clave-valor definidos específicamente para ella.

Gramáticas de voz de host a través de Azure Storage

Copilot Studio admite el reconocimiento de voz restringido a través de gramáticas de voz. Sin embargo, no admite la creación directa, las pruebas ni el hospedaje de estas gramáticas. Para hospedar gramáticas, use Microsoft Azure Storage para crear una conexión segura y de confianza entre el agente habilitado para voz y el almacenamiento gramatical.

Configurar una cuenta de almacenamiento de Azure

Cree una cuenta de almacenamiento de Azure. Asegúrese de que la suscripción, el grupo de recursos, la región y el nombre del recurso de la nueva cuenta de almacenamiento siguen las directivas de la organización. Use la configuración siguiente:

  • En Servicio principal, seleccione Azure Blob Storage o Azure Data Lake Storage Gen 2.

  • Seleccione Premium para el rendimiento.

Más información en Creación de una cuenta de Azure Storage.

Configurar el contenedor de almacenamiento

Use el sitio web estático como contenedor de almacenamiento para los archivos de gramática cargados. El contenedor de almacenamiento proporciona el punto de conexión principal y el punto de conexión secundario para el sitio web.

Después de cargar el archivo de gramática, seleccione el archivo del directorio para ver las propiedades y los detalles del archivo. Guarde la dirección URL del archivo, que debe tener el formato siguiente:

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

Más información en Creación de un contenedor.

Autenticar el motor de reconocimiento de voz restringido

Para que el reconocimiento de voz restringido funcione dentro de un agente habilitado para voz, el sistema debe autenticarse mediante la cuenta de almacenamiento creada en el paso anterior como una ubicación de confianza. Esta autenticación requiere el rol Lector de datos de Storage Blob .

Obtenga más información en Asignar roles de Azure mediante el portal de Azure.

Inicie sesión en el portal de Azure, abra una sesión de Azure Cloud Shell y ejecute el siguiente comando para crear una entidad de servicio del motor de reconocimiento de voz restringido en su inquilino.

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

Nota:

Al buscar el principal de servicio, verá que contiene "NRaaS" en el nombre.

Empleo de voz restringida en Copilot Studio

Crear una entidad externa

Puede pensar en una entidad dentro de Copilot Studio como una unidad de información que representa un determinado tipo de sujeto real. Los ejemplos incluyen un número de teléfono, un código postal, una ciudad o el nombre de una persona. Mediante el uso de entidades, un agente puede reconocer la información pertinente de una entrada de usuario y guardarla para su uso posterior. En este escenario, una gramática de voz restringida realiza el reconocimiento.

Use entidades externas para hacer referencias a gramáticas de voz. Para crear una entidad externa, abra el agente habilitado para voz y vaya a Configuración>Entidades>Agregar una entidad>Registrar una entidad externa.

Nota:

Al construir la entidad, use una variable global o de sistema , y no una variable de entorno . Si tiene que usar una variable de entorno, cree una variable global para asignarle el valor de la variable de entorno. A continuación, esta variable global se puede usar en la gramática ULR como referencia.

Escriba la siguiente información:

  • Nombre: dirección URL de gramática en forma de https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true

    Nota:

    La dirección URL distingue mayúsculas de minúsculas.

El modo de reconocimiento predeterminado es Solo voz. Para obtener configuraciones de gramática alternativas, consulte la tabla siguiente:

Tipo Parámetros de consulta Example
Solo voz Ninguno 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
Voz o DTMF
(Mismo archivo de gramática)
&mode=speechdtmf https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true&mode=speechdtmf
Voz o DTMF (archivos de gramática diferentes) &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}

Nota:

Las direcciones URL también pueden incluir nombres de variables directas en Copilot Studio.

Por ejemplo, supongamos que hay dos conjuntos idénticos de gramáticas, uno para inglés y otro para español, y cada uno se almacena en un subdirectorio diferente. El agente multilingüe debe ser capaz de usar las gramáticas en inglés al conversar en inglés y de igual manera en español. En este caso, la dirección URL de gramática sería: {Env.BaseURL}/common/**{System.User.Language}**/{grammarFileName}?

Donde System.User.Language sea en_US o es_US y se modifique cuando el idioma cambie en su agente.

  • Descripción: una descripción sencilla de la gramática, a la que el selector en el lienzo se refiere como nombre de entidad. Por ejemplo, "número de tarjeta de crédito".

  • Tipo de datos: elija el tipo de datos Registro y defina el esquema de las etiquetas esperadas en respuesta. Por ejemplo, si la gramática devuelve SWI_meaning y ciudad, el esquema Registro tiene el siguiente aspecto:

    kind: Record
    properties:
      city: String
      SWI_meaning: String
    

Después de seleccionar Guardar, la entidad aparece en la lista. En el lienzo de creación de bots, vaya a un nodo de pregunta. Al igual que con las entidades tradicionales, seleccione la entidad externa (adjunta a una gramática) que desea que el agente reconozca como resultado de la respuesta del usuario al mensaje.

Comportamiento en tiempo de ejecución

Cuando un agente habilitado para voz se ejecuta y encuentra la lógica que usa una gramática externa, el agente habilitado para voz llega a la cuenta de almacenamiento de Azure y recupera la gramática para la interpretación. A continuación, el agente coincide con lo que dijo el usuario en la restricción aplicada dentro de la gramática. Si una coincidencia se realiza correctamente, el sistema devuelve la respuesta en la variable Registro, según el esquema definido en la entidad externa.

Lógica de lienzo

El resultado guardado en la variable del nodo siempre es un tipo Record tal y como se define en el esquema de la entidad externa. Los autores pueden usar esta variable Record para acceder a las claves tal y como se define en el esquema, como variableName.SWI_meaning o variableName.city a través de la notación de puntos.

Depuración

Códigos de error

Error Definición
400 Solicitud incorrecta
401 No autenticado
403 Prohibido
404 Sin voz
408 Sin tiempo de espera de entrada
418 Tiempo de espera de la sesión
419 Sin recursos activos: falta una gramática
500 Error interno: informar a Microsoft en una incidencia de soporte técnico

SWI_Literal

Para muchas gramáticas que funcionan con el motor de reconocimiento de voz restringido, la SWI_Literal característica devuelve la instrucción literal que el usuario expresó, no el resultado interpretado. Registre este valor como uno de los resultados en Copilot Studio para facilitar la depuración.

Limitaciones conocidas

La solución tiene las siguientes limitaciones:

  • Tamaño máximo del archivo de gramática individual, que actualmente está limitado a 100 MB.
  • No se admite el paso de variables.
  • La cuenta de almacenamiento se debe encontrar dentro el mismo inquilino que el agente.
  • El tamaño de la dirección URL no puede superar los 500 caracteres.
  • Solo se permiten puntos de conexión de la cuenta de Azure Storage.
  • Las gramáticas secundarias solo se pueden hospedar en la misma cuenta de almacenamiento (con el mismo FPA para la autorización).
  • Analizador XML seguro (es decir, no se permite DTD y debe validarse con el esquema SRGS/SISR).
  • Solo se admite internamente el formato de salida NLSML.
  • El parámetro swirec_simple_result_key heredado no tiene ningún efecto y se devuelven todas las etiquetas.

El servicio Microsoft Dynamics procesa sistemas de reconocimiento de voz restringidos. Al usar esta experiencia, acepta los Términos de Dynamics.