Testando uma gramática

Considere novamente a gramática de exemplo pizza.gram. Há duas maneiras pelas quais essa gramática pode ser testada sem que seja efetivamente utilizada para reconhecimento de áudio: pode-se testar se uma dada sentença é aceita pela gramática, ou pode-se gerar sentenças aleatórias que seguem as regras impostas pela gramática. No primeiro cenário, a ferramenta a ser utilizada chama-se grammar-test, e ela pode ser invocada da seguinte maneira:

$ grammar-test pizza.gram pizza vegetariana por favor

Se a gramática informada aceita a sentença dada – ou seja, se a regra raiz da gramática é capaz de produzir a sentença –, a ferramenta grammar-test retorna 0 e escreve «true» (sem as aspas) na saída padrão; caso contrário, ela retorna 1 e escreve «false» (sem as aspas) na saída padrão. Um valor de retorno 2 indica que um erro ocorreu (por exemplo, a gramática de entrada possui um erro sintático).

É possível testar se uma gramática aceita a entrada vazia (ou seja, se a regra raiz da gramática pode produzir $NULL). Para tanto, deve-se passar «» como segundo argumento para a ferramenta grammar-test:

$ grammar-test pizza.gram ""

Quando a referência especial $GARBAGE é utilizada em uma regra, a ferramenta grammar-test permite, no local onde a referência ocorre, qualquer quantidade (inclusive zero) de palavras, independentemente de sua presença ou não no léxico da gramática. Por exemplo, considere a seguinte gramática, armazenada no arquivo 123.gram.

#ABNF 1.0 utf-8;
root $digitos;
$digitos = $GARBAGE (um | dois | três)<1->;

Para essa gramática, a ferramenta grammar-test retornará «true» para todos os casos a seguir.

$ grammar-test 123.gram um dois três
$ grammar-test 123.gram foo bar um um dois
$ grammar-test 123.gram o que você quiser dois

Entretanto, os casos abaixo produzirão «false» como resposta.

$ grammar-test 123.gram um dois três foo
$ grammar-test 123.gram foo um um dois bar
$ grammar-test 123.gram o que você quiser
$ grammar-test 123.gram ""

A ferramenta também é capaz de ler a sentença da entrada padrão. Nesse caso, invoque-a com apenas um parâmetro.

$ echo "um dois três" | grammar-test 123.gram

Nota

A ferramenta grammar-test apenas simula o reconhecimento de uma sentença, sem empreender nenhuma tentativa de levar em consideração condições do áudio de entrada ou parâmetros do modelo acústico. Isso significa que é possível que um usuário fale uma sentença corretamente e, mesmo assim, o motor de reconhecimento não seja capaz de produzir a saída desejada por conta de ruídos no áudio de entrada ou uma má configuração do modelo acústico. Assim sendo, se a ferramenta grammar-test estiver informando que a sentença deveria ser aceita, mas mesmo assim um desempenho insatisfatório está sendo obtido no reconhecimento, estes outros fatores devem ser levados em conta.

Outra maneira de depurar uma gramática é através da geração de sentenças aleatórias conformes a ela. Para este fim, está disponível a ferramenta grammar-randgen. Abaixo encontra-se um exemplo de como este utilitário pode ser invocado, juntamente com uma saída de exemplo.

$ grammar-randgen --sents=10 pizza.gram

gostaria de uma vegetariana
pizza queijo por gentileza
queijo
queijo por gentileza
queria pizza vegetariana
quero calabresa
quero de queijo por gentileza
quero uma vegetariana por favor
vegetariana por favor
vegetariana por gentileza

Por padrão, a ferramenta gera apenas uma sentença; esse comportamento pode ser modificado através da opção --sents. Quando mais de uma sentença é gerada, sentenças duplicadas são removidas da saída da ferramenta, de modo que o número real de sentenças geradas pode ser menor que o valor requisitado.