<?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 windows (testado no Windows Vista). 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.
# abre comunicação com o Julius
$f = popen('julius -C opcoes.jconf', 'r');
while (true) {
  # aguarda a saída de 10 opções do julius
  $linha = '';
  while (strpos($linha .= fread($f, 4096), 'sentence10') == false);
  # separa as frases candidatas
  preg_match_all('/sentence\d+.(.*)/m', $linha, $matches);
  $opcoes = $matches[1];
  # ignora a respiração
  $opcoes = array_map('trim', $opcoes);
  $opcoes = array_map('utf8_decode', $opcoes);
  if (in_array('há um ano', $opcoes)) {
    ignora('respiração', opcoes);
    continue;
  }
  # monta um menu com as opções, e cola o resultado na aplicação corrente
  menu($opcoes);
}
# monta um menu com as opções
function menu($opcoes) {
  global $esta_janela;
  # monta opções de comando
  $op_cmd = '';
  $tamanho = 0;
  foreach($opcoes as $opcao) {
    if ($opcao) {
      # tira espaços repetidos
      $opcao = preg_replace('/\s{2,}/', ' ', $opcao);
      $op_cmd .= " \"$opcao\"";
      $tamanho += strlen($opcao);
    }
  }
  # na escolha da frase pode haver ruídos
  # se o tamanho total for pequeno, ignora.
  if ($tamanho < 50) return ignora("tamanho insuficiente: $tamanho", $opcoes);
  # monta comando
  # comando se o autohotkey estiver instalado (no vista):
  # $comando = "\"c:\program Files\AutoHotkey\AutoHotkey.exe\" menu.ahk $op_cmd";
  # comando para uso com menu.exe:
  $comando = "menu $op_cmd";
  # executa o comando
  shell_exec($comando);
}
function ignora($motivo, $opcoes) {
  # loga motivo
  echo "\nIgnorando: $motivo\nOpções:\n";
  foreach ($opcoes as $opcao) echo "    '$opcao'\n";
  return false;
}
?>