Sintaxe e recursos disponíveis

Este capítulo descreve os tipos de gramática reconhecidos pela biblioteca de ASR, e enumera quais das funcionalidades apresentadas na especificação SRGS são suportadas pela biblioteca.

Gramáticas SRGS

Uma gramática é um documento de texto contendo regras que delimitam as sequências de palavras (i.e., as sentenças) que o motor de reconhecimento de fala pode reconhecer.

A especificação SRGS define dois formatos de gramáticas:

  • O formato ABNF (Augmented Backus-Naur Form) representa a gramática por meio de uma sintaxe que estende a forma BNF original com construtos que facilitam a expressão de padrões de repetição. O formato é conciso e de fácil compreensão e modificação por um usuário humano, o que o torna adequado ao desenvolvimento e teste de gramáticas.

  • O formato XML representa a gramática como um documento XML. Aos olhos de um usuário humano, o formato é mais verboso e difícil de modificar, quando comparado ao formato ABNF. Entretanto, o formato é adequado para interações máquina-máquina, uma vez que funcionalidades de geração e interpretação de documentos XML são ubíquas em sistemas computacionais modernos.

A biblioteca de ASR aceita documentos de gramática em ambos os formatos, não havendo necessidade de conversão em nenhum momento. Algumas funcionalidades especificadas pelo padrão SRGS não são suportadas pela biblioteca de ASR do CPQD. Estas são:

  • Probabilidades de repetição (SRGS, seção 2.5.1). Repetições são suportadas, mas probabilidades de repetição não o são.

  • Anexos de linguagem (SRGS, seção 2.7). A versão atual da biblioteca ASR oferece suporte apenas ao português brasileiro. A presença de anexos de linguagem em um documento de gramática não gera erros de processamento; tais anexos são ignorados, e uma mensagem de alerta é emitida cada vez que tal construto aparece na gramática.

  • Recursão. Regras da gramática que direta ou indiretamente referenciem a si mesmas não são suportadas. A especificação SRGS não requer que processadores de gramática compatíveis com a especificação admitam gramáticas recursivas. Prover à biblioteca ASR uma gramática recursiva para compilação causará um erro.

  • Modo DTMF (SRGS, seção 4.6). Gramáticas em modo dual-tone multi-frequency (DTMF) não são suportadas.

Abaixo encontra-se uma lista de detalhes de implementação relevantes ao desenvolvimento de gramáticas.

Regras especiais

As regras especiais NULL, VOID, e GARBAGE são suportadas.

Metadados XML

Metadados XML informados por meio do elemento <metadata> não geram erros de processamento, mas são ignorados.

Elemento XML <token>

No formato XML, elementos <token> são permitidos, mas não possuem nenhum efeito.

Aspas duplas

No formato XML, todo conteúdo lexical delimitado por aspas duplas é tratado como se estivesse no corpo de um elemento <token> (ou seja, as aspas duplas não possuem nenhum efeito).

No formato ABNF, o conteúdo delimitado por aspas duplas é tratado como uma sequência atômica de palavras, com a diferença de que caracteres reservados do formato ABNF (como ?, +, *, $) são permitidos. Por exemplo, as duas construções a seguir são equivalentes:

$rule1 = isto é " um  exemplo de $regra "<1-2> com aspas;
$rule2 = isto é (um exemplo de "$regra")<1-2> com aspas;

Note que as aspas fazem com que «$regra» seja uma palavra que inclui o caractere «$», e não uma referência à regra regra. Isso significa que aspas duplas podem ser usadas para inserir caracteres especiais no corpo da gramática. Apesar disso, recomenda-se evitar utilizar tais caracteres.

Referências a gramáticas externas

Referências a gramáticas externas são suportadas. Documentos ABNF podem referenciar documentos XML e vice-versa. Entretanto, inclusões circulares de documentos de gramática não são suportadas (uma inclusão circular acontece quando, por exemplo, uma gramática A referencia uma regra presente na gramática B, e a gramática B, por sua vez, referencia uma regra presente na gramática A). O uso de referências circulares em documentos de gramática resultará em erro.

Léxicos definidos pelo usuário

Léxicos definidos pelo usuário – que relacionam palavras com suas respectivas formas de pronúncia – são suportados. Consulte o capítulo Trabalhando com léxicos para detalhes de uso.

Palavras e nomes de regras

Nomes de regras podem conter qualquer combinação de caracteres alfanuméricos e underscores. Nenhum outro símbolo é permitido. O comprimento dos nomes de regra não está limitado, mas recomenda-se evitar nomes muito grandes. O comprimento das palavras no corpo da gramática também não está limitado. A seção Tratamento de palavras apresenta a forma como as palavras são tratadas quanto à normalização de espaços em branco, e a seção Léxicos e pronúncias das palavras, quanto à transcrição fonética.

Extensões de arquivos e media types

Um arquivo de gramática é um arquivo de texto contendo uma gramática SRGS no formato ABNF ou XML. Múltiplas gramáticas no mesmo arquivo não são permitidas. O media type para gramáticas ABNF é, conforme a especificação SRGS, application/srgs; o media type para gramáficas XML é application/srgs+xml.

Quando uma gramática é referenciada, seja no corpo de outra gramática (como uma referência externa) ou como argumento para uma ferramenta em linha de comando, o media type pode ser informado como parte da URI (SRGS, seção 2.2); caso um media type não tenha sido informado, as seguintes convenções são adotadas:

  • Um arquivo com extensão .gram será interpretado como uma gramática em formato ABNF.

  • Um arquivo com extensão .grxml será interpretado como uma gramática em formato XML.

  • Um arquivo com outra extensão terá seu conteúdo inspecionado, e a biblioteca de ASR tentará determinar o formato com base no conteúdo.

Quando uma URI possui uma declaração de media type, a biblioteca de ASR assume que o arquivo está no formato correspondente, independentemente de sua extensão.

A tabela abaixo sumariza as informações apresentadas acima.

Table 6 Extensões de arquivos e media types para gramáticas SRGS.

Formato

Extensão de Arquivos

Media Type

ABNF

gram

application/srgs

XML

grxml

application/srgs+xml

Nota

Apesar de a biblioteca de ASR realizar introspecção no conteúdo dos arquivos de gramática para tentar determinar seu formato, recomenda-se que a convenção acima seja sempre adotada.

Codificações de caracteres

Um arquivo de gramática pode especificar sua codificação de caracteres. No formato ABNF, a codificação aparece no cabeçalho ABNF. Por exemplo, o seguinte cabeçalho é válido para um arquivo em codificação UTF-8:

#ABNF 1.0 UTF-8;

No formato XML, a codificação é especificada por meio do atributo encoding da declaração XML:

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

No nome da codificação, não se diferenciam maiúsculas e minúsculas. Quando a biblioteca ASR processa um arquivo de gramática, ela o converte internamente para UTF-8 usando a biblioteca ICU (International Components for Unicode). Apesar de isso significar que todos os esquemas de codificação suportados pela biblioteca ICU podem ser usados em arquivos de gramática, a codificação UTF-8 é a recomendada, e deve ser utilizada sempre que possível. Quando nenhuma codificação é informada, a biblioteca ASR assume UTF-8, e nenhuma tentativa é feita no sentido de inferir a codificação do arquivo. Mantenha esse fato em mente caso esteja desenvolvendo gramáticas em uma plataforma cujo esquema de codificação padrão não é UTF-8 (e.g., Windows). Recomenda-se sempre informar a codificação do arquivo de gramática no cabeçalho do arquivo, mesmo quando o arquivo está em UTF-8.

Tratamento de palavras

As sentenças reconhecidas por uma gramática são sequências de palavras. Em arquivos SRGS, caracteres de espaço em branco são utilizados para delimitar essas palavras. Por exemplo, considere a seguinte regra de uma gramática ABNF:

$regra = o livro  que eu comprei
         em "  Nova
         York" era bom;

Após o processamento pela biblioteca, essa regra produzirá uma sequência de dez palavras: «o», «livro», «que», «eu», «comprei», «em», «Nova», «York», «era», «bom».

A fim de que uma sentença possa ser reconhecida, deve-se atribuir a cada palavra uma pronúncia. O capítulo Trabalhando com Léxicos explica como isso é realizado, e como os usuários podem especificar pronúncias personalizadas para palavras em suas gramáticas. Ele também descreve a ferramenta grammar-g2p, que pode ser usada para avaliar a transcrição fonética que é atribuída a cada palavra.

A lista a seguir contém algumas boas práticas recomendadas a desenvolvedores de gramáticas. Sua adoção evita erros comuns que usualmente levam ao mau desempenho de reconhecimento.

  • Evite utilizar palavras com símbolos não alfanuméricos, como «?», «!», «#», «$», entre outros. Dependendo da língua alvo, eles podem ser pronunciados de diferentes maneiras, e a biblioteca de reconhecimento pode gerar a pronúncia errada para um dado contexto. Prefira escrevê-los por extenso. Por exemplo, em vez de utilizar «$», escreva «cifrão» ou alguma outra pronúncia pretendida.

  • Evite números maiores que 9 em formato numérico (e.g., 123). O padrão SRGS não requer de processadores de gramáticas aderentes à especificação a capacidade de converter números em sua forma por extenso (e.g., transformar «123» em «cento e vinte e três»). Além disso, uma sequência como «1234» pode ser pronunciada de múltiplas maneiras em alguns idiomas; por exemplo, para o português, ela pode ser pronunciada como um número cardinal («mil duzentos e trinta e quatro»), como uma sequência de dígitos («um dois três quatro»), ou como uma sequência de dois números («doze trinta e quatro»). Nesse caso, prefira escrever o número por extenso. Dígitos de 0 a 9 podem ser usados, uma vez que a especificação SRGS requer que processadores de gramática sejam capazes de processar tais dígitos.

  • Evite abreviações e acrônimos. Essas palavras podem ter pronúncia ambígua (por exemplo, em um sistema insensível a maiúsculas e minúsculas, «TI» pode ser pronunciado como uma palavra - o pronome de segunda pessoa «ti» - ou como uma sigla - «tê i»), ou não trivial (por exemplo, «jason» para JSON, ou «skuzzy» para SCSI). Nesse caso, recomenda-se escrever a sigla ou acrônimo da maneira como ela deve ser pronunciada (por exemplo, escreva «i três é», em vez de «IEEE»). Letras isoladas são permitidas. É também possível adicionar uma entrada correspondente à sigla ou acrônimo no léxico do usuário, e incluir esse léxico na gramática; consulte o capítulo Trabalhando com Léxicos para mais detalhes.