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.