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.