Formato SRGS

O ASR permite que as gramáticas para o reconhecimento de fala sejam informadas diretamente no formato de arquivos de texto, seguindo o padrão SRGS.

Os arquivos de gramática podem ser disponibilizados em um diretório local no próprio servidor ASR, ou através de um servidor WEB, usando HTTP ou HTTPS. Qualquer que seja a forma usada, no momento do reconhecimento, deve-se informar o caminho do arquivo de gramática desejado.

Como exemplo, crie o diretório /opt/grammar/, na máquina do servidor ASR:

$ sudo mkdir -p /opt/grammar
$ sudo chmod 777 /opt/grammar
$ cd /opt/grammar

Em seguida, crie a gramática em formato SRGS ABNF pizza.gram:

#ABNF 1.0 UTF-8;
tag-format <semantics/1.0>;
root $pedido;

$pedido = [$gostaria] $pizza [$por_favor] { out = rules.pizza };

$por_favor = por favor | por gentileza;

$gostaria = [eu] (quero | queria | gostaria de) [uma];

$pizza = [pizza | de | pizza de] $sabor { out = rules.sabor };

$sabor = calabresa | queijo | vegetariana;

Essa gramática reconhece frases como essas mostradas abaixo:

eu quero pizza de calabresa por gentileza
pizza calabresa por gentileza
pizza vegetariana por favor
queijo
queria calabresa
queria de vegetariana por gentileza
queria pizza queijo
queria pizza vegetariana por gentileza
quero pizza vegetariana por gentileza
vegetariana por gentileza

Em seguida, precisamos de um arquivo de áudio em formato WAV, contendo uma frase como as do exemplo acima. O ASR vem acompanhado de alguns arquivos de áudio que podemos usar no nosso teste. No caso do Português do Brasil, os arquivos encontram-se no diretório /opt/cpqd/asr/samples/audio/ptbr. No nosso teste, vamos utilizar o arquivo pizza_veg_audio_8k.wav com a frase “eu quero uma pizza vegetariana”. Neste caso, usamos um áudio com taxa de amostragem de 8kHz e devemos então ter instalado um modelo acústico para o Português e áudio de 8kHz.

Para o reconhecimento, podemos usar o comando curl do Linux. Verifique que o resultado do teste apresenta a frase reconhecida:

$ curl --header "Content-Type: audio/wav" \
       --data-binary "@/opt/cpqd/asr/samples/audio/ptbr/pizza_veg_audio_8k.wav" \
       "http://127.0.0.1:8025/asr-server/rest/recognize?lm=file:///opt/grammar/pizza.gram"

[{"alternatives":[{"text":"eu quero uma pizza vegetariana","interpretations":["pizza_vegetariana"],"words":[{"text":"eu","score":93,"start_time":3.0829227,"end_time":3.1989636},{"text":"quero","score":97,"start_time":3.208283,"end_time":3.4463},{"text":"uma","score":86,"start_time":3.4472868,"end_time":3.5715106},{"text":"pizza","score":96,"start_time":3.6009455,"end_time":3.990146},{"text":"vegetariana","score":100,"start_time":4.03105,"end_time":4.8281574}],"score":94,"lm":"file:///opt/cpqd/asr/samples/grammar/ptbr/pizza.gram","interpretation_scores":[94]}],"segment_index":0,"last_segment":true,"final_result":true,"start_time":2.91,"end_time":5.12,"result_status":"RECOGNIZED"}]

Vamos agora fazer um teste com uma entrada inválida, ou seja, uma sentença fora da gramática. Vamos usar o arquivo pizza_pedra_audio_8k.wav, em que o locutor pede uma pizza de pedra. Execute novamente o comando curl:

$ curl --header "Content-Type: audio/wav" \
       --data-binary "@/opt/cpqd/asr/samples/audio/ptbr/pizza_pedra_audio_8k.wav" \
       "http://127.0.0.1:8025/asr-server/rest/recognize?lm=file:///opt/grammar/pizza.gram"

[{"alternatives":[],"segment_index":0,"last_segment":true,"final_result":true,"start_time":2.9,"end_time":5.04,"result_status":"NO_MATCH"}]

Desta vez, o comando devolve o resultado NO_MATCH, indicando que o áudio não foi reconhecido pela gramática.

No caso da gramática ser disponibilizada através de um servidor WEB, deve ser informada a URL da gramática, por exemplo: http://webcontent.com/grammar/pizza.gram.

O ASR também aceita gramáticas SRGS em formato XML. Por convenção, tais gramáticas são armazenadas em arquivos com extensão .grxml. Nos exemplos acima, utilizamos a gramática pizza.gram, em formato ABNF; porém, poderíamos ter utilizado a gramática equivalente pizza.grxml, listada abaixo, e obteríamos exatamente os mesmos resultados.

<?xml version="1.0" encoding="utf8" standalone="no" ?>
<grammar xmlns="http://www.w3.org/2001/06/grammar"
         mode="voice"
         root="pedido"
         tag-format="semantics/1.0"
         version="1.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd">

  <rule id="pedido">
    <item repeat="0-1">
      <item>
        <ruleref uri="#gostaria"/>
      </item>
    </item>
    <ruleref uri="#pizza"/>
    <item repeat="0-1">
      <item>
        <ruleref uri="#por_favor"/>
      </item>
    </item>
    <tag> out = rules.pedido </tag>
  </rule>

  <rule id="por_favor">
    <one-of>
      <item>por favor</item>
      <item>por gentileza</item>
    </one-of>
  </rule>

  <rule id="gostaria">
    <item repeat="0-1">
      <item>eu</item>
    </item>
    <one-of>
      <item>quero</item>
      <item>queria</item>
      <item>gostaria de</item>
    </one-of>
    <item repeat="0-1">
      <item>uma</item>
    </item>
  </rule>

  <rule id="pizza">
    <item repeat="0-1">
      <one-of>
        <item>pizza</item>
        <item>de</item>
        <item>pizza de</item>
      </one-of>
    </item>
    <ruleref uri="#sabor"/>
    <tag> out = rules.sabor </tag>
  </rule>

  <rule id="sabor">
    <one-of>
      <item>calabresa</item>
      <item>queijo</item>
      <item>vegetariana</item>
    </one-of>
  </rule>

</grammar>

Nota

A biblioteca de ASR utiliza a extensão do arquivo no processo de determinar o formato da gramática (ABNF ou XML). Arquivos com extensão .gram são sempre lidos como gramáticas ABNF, e arquivos com extensão .grxml, sempre como gramáticas XML. Se o arquivo de entrada possuir alguma outra extensão, a biblioteca de ASR tentará inferir o formato da gramática pelo seu conteúdo. Porém, é sempre recomendável utilizar a extensão convencional.