<?xml version='1.0' encoding='UTF-8'?>
<elementos_gw>
  <documento>
    <id>916</id>
    <autor>5</autor>
    <nome>fala.php</nome>
    <nome_facil>fala php</nome_facil>
    <criacao>2010-12-28 17:35:59</criacao>
    <alteracao>2010-12-31 15:43:53</alteracao>
    <texto>{{{
&lt;?php
# Sistema de reconhecimento de fala. Idioma português brasileiro.
# Mostra um menu de opções e cola o resultado no aplicativo em uso.
# Feito para linux (testado no Ubuntu 10.04). Licença: Domínio público.
# (c) 2010 Sony Fermino dos Santos - http://gigawiki.com/sony/
# Fornecido sem quaisquer garantias. Use por sua conta e risco.
# Veja instruções de uso em http://gigawiki.com/sony/reconhecimento-de-fala
#
# Parte destes comentários foi redigida verbalmente com este programa.

# tempo de espera para executar operações de foco, teclas e clipboard
$sleep = 100000;  # microssegundos

# identifica essa janela
$ultima_ativa = $esta_janela = pega_janela_ativa();

# abre comunicação com o Julius
$f = popen(&#039;julius -C opcoes.jconf&#039;, &#039;r&#039;);

while (true) {
  # aguarda a saída do julius
  $linha = fread($f, 4096);

  # separa as frases candidatas
  preg_match_all(&#039;/sentence...(.*)/m&#039;, $linha, $matches);
  $opcoes = $matches[1];

  # ignora a respiração
  $opcoes = array_map(&#039;trim&#039;, $opcoes);
  if (in_array(utf8_encode(&#039;há um ano&#039;), $opcoes)) {
    ignora(&#039;respiração&#039;, opcoes);
    continue;
  }

  # salva a janela ativa
  $janela_ativa = pega_janela_ativa();

  # loop para certificar-se de que foi escolhida a opção desejada
  while (true) {
    # monta um menu com as opções
    $ret = menu($opcoes);

    if ($ret) {
      # dá opções de pontuação
      $pontos = str_split(&#039;.,;:!?&#039;);
      array_unshift($pontos, &#039;&#039;);

      $ucfirst = mb_strtoupper(mb_substr($ret, 0, 1, &#039;utf-8&#039;), &#039;utf-8&#039;) .
        mb_substr($ret, 1, 256, &#039;utf-8&#039;);

      $pontuacoes = array();

      foreach(array($ret, $ucfirst) as $frase)
      foreach($pontos as $pt)
      {
        $pontuacoes[] = $frase . $pt;
      }

      $ret = menu($pontuacoes, 2);

      # se foi cancelada, não foi escolhida a opção desejada
      if (!$ret) continue;
    }

    break;
  }

  # restaura o foco
  ativa($janela_ativa);

  if ($ret) {
    # salva o clipboard
    $clip = get_clipboard();

    # copia o resultado para o clipboard
    set_clipboard(&quot;$ret &quot;);

    # cola
    tecla(&quot;ctrl+v&quot;);

    # restaura o clipboard
    set_clipboard($clip);
  }
}

function respira($suspiros = 1) {
  global $sleep;
  for($i = 0; $i &lt; $suspiros; $i++) usleep($sleep);
}

function ativa($wid) {
  global $ultima_ativa;
  if ($wid != $ultima_ativa) {
    shell_exec(&quot;xdotool windowactivate $wid&quot;);
    $ultima_ativa = $wid;
    respira();
  }
}

function pega_janela_ativa() {
  return shell_exec(&#039;xdotool getactivewindow&#039;);
}

function tecla($teclas) {
  shell_exec(&quot;xdotool key $teclas&quot;);
  respira();
}

function set_clipboard($texto) {
  shell_exec(&quot;echo -n &#039;$texto&#039; | xsel -i -b&quot;);
  respira();
}

function get_clipboard() {
  return shell_exec(&quot;xsel -o -b&quot;);
}

# monta um menu com as opções (que já devem estar em utf-8)
function menu($opcoes, $etapa = 1) {
  global $esta_janela;

  $etapas = array(1 =&gt; &#039;a frase&#039;, &#039;a pontuação&#039;);

  # monta opções de comando
  $op_cmd = &#039;&#039;;
  $num_op = 0;
  $tamanho = 0;
  foreach($opcoes as $opcao) {
    if ($opcao) {
      # tira espaços repetidos
      $opcao = preg_replace(&#039;/\s{2,}/&#039;, &#039; &#039;, $opcao);
      $op_cmd .= &quot; &#039;$opcao&#039;&quot;;
      $num_op++;
      $tamanho += strlen($opcao);
    }
  }

  # na escolha da frase pode haver ruídos
  if ($etapa == 1) {
    # se o tamanho total for pequeno, ignora.
    if ($tamanho &lt; 50) return ignora(&quot;tamanho insuficiente: $tamanho&quot;, $opcoes);
  }

  # trata textos
  $texto = utf8_encode(&quot;Escolha &quot; . $etapas[$etapa]);
  $coluna = utf8_encode(&#039;opções&#039;);
  $titulo = &#039;Reconhecimento de fala&#039;;

  # calcula a altura
  $height = $num_op * 20 + 180;

  # monta comando
  $comando = &quot;zenity --list --title=&#039;$titulo&#039; --text=&#039;$texto&#039; --column=&#039;$coluna&#039; --height=$height --width=500 $op_cmd&quot;;

  # mostra o menu
  ativa($esta_janela);
  $fp = popen($comando, &#039;r&#039;);
  respira(2 + $etapa);

  # seleciona a primeira opção
  tecla(&#039;Down&#039;);

  # aguarda o resultado
  $ret = fread($fp, 256);
  fclose($fp);

  # estudo para determinar tamanho mínimo a ser considerado
  if (!$ret and $etapa == 1) {
    echo utf8_encode(&quot;\nCancelado pelo usuário. Tamanho: $tamanho\n&quot;);
  }

  return trim($ret);
}

function ignora($motivo, $opcoes) {
  # loga motivo
  echo &quot;\nIgnorando: &quot; . utf8_encode($motivo . &quot;\nOpções:\n&quot;);
  foreach ($opcoes as $opcao) echo &quot;    &#039;$opcao&#039;\n&quot;;
  return false;
}

?&gt;
}}}
</texto>
    <publico>1</publico>
    <original>0</original>
    <anterior>0</anterior>
    <versao>0</versao>
    <traducao>0</traducao>
    <propriedade>
      <nome>categ</nome>
      <valor>script</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>linguagem</nome>
      <valor>php</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>sistema</nome>
      <valor>linux</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>projeto</nome>
      <valor>Reconhecimento de fala</valor>
      <publico>1</publico>
    </propriedade>
  </documento>
</elementos_gw>
