Testando uma gramática

Considere novamente a gramática de exemplo comandos.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 comandos.gram por favor abra a porta

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 comandos.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 comandos.gram
abra a porta por favor
abra a porta por gentileza
desligue a TV por favor
desligue a TV por gentileza
disque quatro oito zero três cinco quatro dois seis quatro seis oito

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.