Utilizar gramáticas de voz externas

Para aplicações de Resposta Interativa de Voz (IVR) e tarefas mais amplas de reconhecimento de voz para aplicações de voz, um reconhecimento baseado em listas restritas ou "gramática" oferece vantagens significativas. Supera em muito o reconhecimento de voz tradicional baseado em semântica usado em modernos motores de IA de conversão de voz em texto (STT) em termos de precisão, desempenho e custo. Este aumento de desempenho ocorre porque o reconhecimento baseado em gramática pode restringir a saída do reconhecimento a um conjunto predefinido de regras, o que reforça a precisão.

As gramáticas aderem à Especificação Gramatical de Reconhecimento de Voz (SRGS), conforme detalhado na Especificação W3C. Quando um pedido entra no motor, este converte áudio falado ("expressões") em texto. Em seguida, o motor compara o texto reconhecido com a gramática e quaisquer artefactos associados, como léxicos de pronúncia. Este processo fornece uma transcrição literal ou uma interpretação que a gramática restringe à informação fornecida na gramática. A lógica adicional, como ECMAScript incorporada na gramática, pode refinar ainda mais a interpretação.

O reconhecimento de voz restrito é ideal para:

  • Reconhecer listas restritas (endereços, tickers de ações, códigos postais, nomes de departamentos, entre outros).

  • Reconhecimento de cadeia alfanumérica (números de monitorização, números de conta, códigos de confirmação, entre outros).

    • Incluindo ter restrições de posição. Por exemplo, os dois primeiros carateres do ID de membro começam por AN, FD, NT. Outro exemplo de restrições de posição é um número de identificação do veículo.
  • Reconhecimento alfanumérico ou de dígitos com somas de verificação ou restrições semelhantes. Por exemplo, números de cartão de crédito onde há uma soma de verificação Luhn.

  • Aplicações de diálogo dirigido em que palavras ou frases específicas devem ser expressas.

Criação de gramáticas de voz

Escreva gramáticas de fala restritas usando Grammar XML (GrXML). Como qualquer documento XML, um ficheiro de gramática tem de começar com um cabeçalho que especifica certas caraterísticas da gramática. O corpo principal de um ficheiro gramatical consiste em regras gramaticais que definem as palavras faladas reconhecidas pela gramática e os valores das variáveis correspondentes que os itens reconhecidos devolvem.

Cabeçalho do ficheiro de gramática

O cabeçalho num ficheiro de gramática consiste na declaração XML e no elemento <grammar> que especifica o idioma do documento, a raiz e o espaço de nomes.

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

Declaração XML e tipo de codificação

O primeiro elemento no cabeçalho é sempre a declaração XML. Este elemento especifica a versão de XML usada no documento (1.0 ou 1.1). Também especifica a codificação que se aplica ao documento, que determina os idiomas que podem ou não ser usados.

A versão e a codificação são atributos obrigatórios. Use qualquer codificação apropriada de acordo com as suas preferências (por exemplo, a configuração do computador, a aplicação de processamento de texto, e assim por diante). O motor de reconhecimento de voz restrito não se importa com a codificação que usa.

Uma pequena lista de codificações típicas para vários idiomas é mostrada na tabela a seguir:

Codificação Description
ISO-8859-1 Latin-1. Usado para inglês, francês, alemão e espanhol.
UTF-8 Utilizado para todos os idiomas.
UTF-16 Utilizado para todos os idiomas.
Big5 Usado para cantonês (ce-HK).
GB Usado para mandarim (zh-TW).
Shift-JIS e EUC-JP Usado para japonês.
KSC e EUC-KR Usado para coreano.

A maioria dos idiomas pode ser representado em mais do que uma codificação.

Em tempo de execução, o sistema converte automaticamente a codificação do ficheiro gramatical para o formato UTF-16, utilizando as bibliotecas International Components for Unicode (ICU). O site oficial do consórcio Unicode é http://site.icu-project.org/.

Idioma, espaço de nomes e formato de etiqueta semântica

O segundo elemento no cabeçalho é o elemento <grammar>, cujos atributos especificam informações predefinidas para o documento. Os atributos obrigatórios são:

  • xml:lang: Especifica o identificador para a linguagem humana padrão a utilizar, conforme definido no documento Request For Comments ( RFC) RFC 3066 no site do IETF.

  • A Microsoft suporta uma ampla variedade de idiomas. A linguagem que escolher deve ser compatível com o tipo de codificação gramatical.

  • version: especifica a versão do GrXML (1.0).

  • xmlns: designa o espaço de nomes gramatical. Para gramáticas GrXML, esta designação é sempre http://www.w3.org./2001/06/grammar.

  • tag-format: define o formato usado para scripts dentro de elementos <tag> no corpo principal da gramática para atribuir valores.

O formato da etiqueta deve ser uma destas cadeias de caracteres:

Value Formato de etiquetas semânticas
swi-semantics/1.0 Sintaxe da etiqueta (usada se o formato da etiqueta não estiver definido). Esta sintaxe é conhecida como swi syntax (de SpeechWorks International).
semantics/1.0 Sintaxe da etiqueta de script W3C.
semantics/1.0-literals Sintaxe da etiqueta de literais de cadeia do W3C.

Observação

  • Estritamente falando, o atributo de formato da etiqueta não é necessário se a sua gramática não usar o elemento <tag>. No entanto, a maioria das gramáticas usa <tag> a atribuição de valores, por isso a Microsoft recomenda fortemente que especifique o formato da etiqueta.

  • Aponte sempre atributos e elementos GrXML, como xmlns, para o espaço de nomes <http://voicexml.site.com/grammar>.

Dictionaries

Em alguns casos, a gramática poderá precisar de incluir palavras ou frases que o motor de reconhecimento de voz restrito não consegue analisar normalmente. Por exemplo, um nome pode ser dito e escrito de forma diferente, como a cidade "Worcester", que pode ser pronunciada "wih-sta."

Use o elemento <lexicon> para importar dicionários que mapeiam expressões para o texto correspondente no ficheiro gramatical.

Corpo principal do ficheiro de gramática

A secção principal de um ficheiro gramatical contém as regras que realmente definem a gramática: as palavras e frases faladas a reconhecer, e os valores a devolver à aplicação principal para cada item reconhecido.

Regras

O corpo principal de um ficheiro gramatical consiste em regras definidas usando o elemento GrXML <rule> . Cada regra tem um identificador exclusivo. Cada regra lista as palavras e frases que reconhece como texto dentro de um elemento <item> ou elemento <token>. Estes elementos podem estar aninhados dentro de outros elementos GrXML:

  • O <one-of> elemento apresenta uma lista de alternativas aceitáveis, sendo necessária apenas uma alternativa para ativar a regra.

  • O elemento <ruleref> refere-se a outra regra, como a uma sub-rotina.

  • O <tag> elemento especifica ações a realizar ou valores a atribuir a uma variável. Pode incluir um script escrito na linguagem de formato de etiquetas.

Quando o utilizador pronuncia uma palavra ou frase que a regra cobre, a regra executa as ações, atribuições de valores ou outro código definido para essa enunciação.

Regra raiz

A regra raiz é a primeira regra do ficheiro, a menos que o cabeçalho especifique o contrário. Serve como a regra de nível operacional predefinida. Quando a gramática é referenciada sem especificar a regra a ser procurada, esta regra raiz é a primeira consultada.

Âmbito de regra

Atribui a cada regra dentro do corpo principal de um ficheiro gramatical como um escopo. O âmbito indica se pode referenciar a regra independentemente de ficheiros externos (públicos) ou apenas por outra regra dentro da mesma gramática (privado). Todas as regras são privadas por defeito, a menos que as definas como públicas.

Quando a regra é pública, pode usar o seu atributo ID como âncora para referências de outros documentos. Por exemplo, considere a seguinte sintaxe:

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

Quando invocas este elemento gramatical, refere-se diretamente à regra pública "YesNo" dentro do ficheiro universals.grxml , independentemente de ser a regra raiz do ficheiro.

Observação

A regra raiz de um ficheiro de gramática pode ser privada. Esta regra não pode ser referenciada de forma independente. No entanto, é usado por defeito como ponto de entrada para a gramática quando invocas o próprio ficheiro gramatical.

Extrair significado e devolver resultados

Observação

A SWI_meaning chave deve conter a informação devolvida ao agente com voz que opera dentro do Copilot Studio.

A chave SWI_meaning contém o significado semântico de uma frase reconhecida. Só podes definir isto para a regra raiz. A chave está incluída na lista por padrão swirec_extra_nbest_keys, por isso aparece no resultado XML se a sua gramática definir essa chave.

SWI_meaning filtra respostas redundantes para que as entradas na lista n-best sejam verdadeiramente distintas. Eliminar a redundância melhora as pontuações de confiança e a utilidade da lista n-best.

Quando uma frase reconhecida é semelhante a outra na gramática, geralmente, tem uma pontuação de confiança baixa, porque o motor de reconhecimento de voz restrito não tem a certeza qual das frases está correta. Quando utilizas SWI_meaning corretamente, o motor de reconhecimento de voz limitado agrupa as interpretações redundantes no mesmo slot na lista n-best. No exemplo a seguir, SWI_meaning é definido como "chamadas diretas para casa" se a frase reconhecida for "direcionar as minhas chamadas para casa" ou "por favor, direcione as minhas chamadas para casa".

Sem SWI_meaning, a gramática poderá produzir a seguinte lista n-best:

N Texto
1 direcionar as minhas chamadas para o telemóvel do meu carro
2 chamadas diretas para o meu carro
3 enviar chamadas para casa
4 por favor, envie as minhas chamadas para o escritório
5 envie as minhas chamadas para o escritório
6 chamadas diretas para minha casa

Quando usa SWI_meaning, o motor de reconhecimento de fala restrito organiza a lista n-best pelo significado da interpretação em vez da frase exata dita, de modo que as entradas na lista n-best são verdadeiramente distintas:

N Texto Chave SWI_meaning de nível superior
1 direcionar as minhas chamadas para o telemóvel do meu carro direcionar chamadas carro
chamadas diretas para o meu carro direcionar chamadas carro
2 enviar chamadas para casa direcionar chamadas casa
chamadas diretas para minha casa direcionar chamadas casa
3 por favor, envie as minhas chamadas para o escritório direcionar chamadas trabalho
envie as minhas chamadas para o escritório direcionar chamadas trabalho

O motor de reconhecimento de fala restrito define SWI_meaning automaticamente, mesmo que não o definas explicitamente num script dentro da gramática.

Se não definires SWI_meaning explicitamente na raiz, é construída concatenando todas as chaves definidas na raiz e os seus valores. No entanto, esta construção não se aplica a quaisquer chaves que comecem por SWI_, como SWI_literal. Os pares chave/valor são primeiro ordenados alfabeticamente. O raciocínio é que, no que diz respeito à aplicação, o conjunto de chaves devolvidas é o significado da frase.

Se não houver chaves, os resultados dependerão se está a usar a semântica SISR ou SWI. Com SISR, a chave SWI_meaning não é definida se não houverem chaves. Em contraste, com a semântica SWI, SWI_meaning é definido para o seguinte:

{SWI_literal:<literal>}

Se SWI_meaning for um objeto, será convertido numa representação de cadeia.

Embora a aplicação possa aceder SWI_meaning, usa mais frequentemente outros pares chave/valor definidos especificamente para si.

Alojar gramáticas de voz através do Armazenamento do Azure

O Copilot Studio suporta reconhecimento de fala restrita através de gramáticas de fala. No entanto, não suporta a autoria, testes ou hospedagem direta destas gramáticas. Para alojar gramáticas, utilize o Microsoft Azure Storage para criar uma ligação confiável e segura entre o agente com voz e o armazenamento gramatical.

Configurar uma conta de armazenamento no Azure

Crie uma conta de armazenamento do Azure. Certifique-se de que a subscrição, grupo de recursos, região e nome do recurso da nova conta de armazenamento cumprem as políticas da sua organização. Utilize as seguintes definições:

  • Para Serviço Primário, selecione Armazenamento de Blobs do Azure ou Azure Data Lake Storage Gen 2.

  • Selecione Premium para o Desempenho.

Saiba mais em Criar uma conta de armazenamento Azure.

Configurar o recipiente de armazenamento

Use o Static Website como contentor de armazenamento para os seus ficheiros gramaticais carregados. O contentor de armazenamento fornece o endpoint principal e o endpoint secundário para o website.

Depois de carregar o ficheiro gramatical, selecione o ficheiro no diretório para visualizar as propriedades e detalhes do ficheiro. Salve a URL do arquivo, que deve estar no seguinte formato:

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

Saiba mais em Criar um contentor.

Autenticar o motor de reconhecimento de voz restrito

Para que o reconhecimento de voz restrito funcione dentro de um agente com voz ativada, o sistema precisa de autenticar-se usando a conta de armazenamento criada na etapa anterior como local de confiança. Esta autenticação requer a função Leitor de Dados do Blob de Armazenamento.

Saiba mais em Atribuir Azure funções usando o portal Azure.

Inicie sessão no portal Azure, abra uma sessão Azure Cloud Shell e execute o seguinte comando para criar um principal de serviço de reconhecimento de voz restrito no seu tenant.

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

Observação

Quando procuras pelo principal de serviço, vês que contém "NRaaS" no nome.

Empregar voz restrita no Copilot Studio

Criar uma entidade externa

Pode pensar numa entidade dentro do Copilot Studio como uma unidade de informação que representa um certo tipo de sujeito do mundo real. Por exemplo, um número de telefone, código postal, cidade ou até mesmo o nome de uma pessoa. Ao usar entidades, um agente pode reconhecer a informação relevante a partir de uma entrada do utilizador e guardá-la para uso posterior. Neste cenário, uma gramática da fala restrita realiza o reconhecimento.

Use entidades externas para referenciar gramáticas de fala. Para criar uma entidade externa, abra o seu agente com voz e vá a Definições>Entidades>Adicionar uma entidade>Registar uma entidade externa.

Observação

Ao construir a sua entidade, use uma variável global ou de sistema , e não uma variável de ambiente . Se tiveres de usar uma variável de ambiente, cria uma variável global e atribui-lhe o valor da variável de ambiente. Depois, esta variável global pode ser usada na gramática ULR como referência.

Introduza as seguintes informações:

  • Nome: URL da gramática na forma de https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true

    Observação

    O URL é sensível às maiúsculas e minúsculas.

O modo de reconhecimento padrão é Apenas Reconhecimento de Fala. Para configurações gramaticais alternativas, veja a tabela seguinte:

Tipo Parâmetro de consulta Example
Apenas fala Nenhuma 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
Fala ou DTMF
(mesmo arquivo gramatical)
&mode=speechdtmf https://{resourceName}.blob.core.windows.net/\$web/{grammarFileName}?constrainedrequired=true&mode=speechdtmf
Voz ou DTMF (Ficheiros 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}

Observação

Os URLs também podem incluir nomes diretos de variáveis dentro do Copilot Studio.

Por exemplo, suponha que existem dois conjuntos idênticos de gramáticas, um para inglês e outro para espanhol, e cada um está armazenado num subdiretório diferente. O agente multilíngue deve ser capaz de usar as gramáticas do inglês ao conversar em inglês e, de forma semelhante, em espanhol. Neste caso, o URL gramatical seria: {Env.BaseURL}/common/**{System.User.Language}**/{grammarFileName}?

Onde System.User.Language é en_US ou es_US e muda quando o idioma muda no seu agente.

  • Descrição: Uma descrição simples da gramática, que o seletor na tela referencia como o nome da entidade. Por exemplo, "número do cartão de crédito".

  • Tipo de dados: escolha o tipo de dados Registo e defina o esquema das etiquetas esperadas na resposta. Por exemplo, se a gramática devolver SWI_meaning e a cidade, o esquema de Registo terá esta aparência:

    kind: Record
    properties:
      city: String
      SWI_meaning: String
    

Depois de selecionares Guardar, a entidade aparece na lista. Na tela de criação, aceda a um Nó de pergunta. Assim como acontece com as entidades tradicionais, selecione a entidade externa (anexada a uma gramática) que deseja que o agente reconheça como resultado da resposta do utilizador ao pedido.

Comportamento de tempo de execução

Quando um agente com voz é executado e encontra a lógica que utiliza uma gramática externa, o agente com voz contacta a conta de armazenamento Azure e recupera a gramática para interpretação. Em seguida, o agente corresponde o que o utilizador disse à restrição aplicada dentro da gramática. Se uma correspondência for bem-sucedida, o sistema devolverá a resposta na variável de Registo, de acordo com o esquema definido na entidade externa.

Lógica da tela

O resultado guardado na variável do nó é sempre um tipo Registo, conforme definido no esquema da entidade externa. Os autores podem usar esta variável Registo para aceder a chaves definidas no esquema, como variableName.SWI_meaning ou variableName.city através da notação de pontos.

Debugging

Códigos de erro

Erro Definition
400 Solicitação inválida
401 Não autenticado
403 Proibido
404 Sem Voz
408 Sem Tempo Limite de Entrada
418 Tempo limite da Sessão
419 Sem recursos ativos — falta uma gramática
500 Erro Interno — reporte à Microsoft num pedido de suporte

SWI_Literal

Para muitas gramáticas que funcionam com o motor de reconhecimento de fala restrito, a SWI_Literal funcionalidade devolve a afirmação literal que o utilizador pronunciou, não o resultado interpretado. Regista este valor como um dos resultados no Copilot Studio para ajudar na depuração.

Limitações conhecidas

A solução tem as seguintes limitações:

  • Tamanho máximo do ficheiro de gramática individual, que atualmente está limitado a 100 MB.
  • A transmissão de variáveis não é suportada.
  • A conta de armazenamento tem de estar localizadas dentro do mesmo inquilino que o agente.
  • O tamanho do URL não pode exceder 500 carateres.
  • Só os pontos finais da conta de armazenamento do Azure são permitidos.
  • As sub-gramáticas só podem ser alojadas na mesma conta de armazenamento (usando o mesmo FPA para autorização).
  • Parser XML seguro (ou seja, DTD não é permitido, e tem de validar contra o esquema SRGS/SISR).
  • Apenas o formato de saída NLSML é suportado internamente.
  • O parâmetro swirec_simple_result_key legado não tem efeito e todas as etiquetas são devolvidas.

O serviço Microsoft Dynamics processa sistemas de Reconhecimento de Fala Restrito. Ao usar esta experiência, concorda com os Termos do Dynamics.