<?xml version='1.0' encoding='UTF-8'?>
<elementos_gw>
  <documento>
    <id>943</id>
    <autor>5</autor>
    <nome>falawin.rb</nome>
    <nome_facil>falawin rb</nome_facil>
    <criacao>2011-02-02 12:29:26</criacao>
    <alteracao>2020-05-05 20:57:08</alteracao>
    <texto>{{{
#
# 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 Seven). Licença: Domínio público.
# (c) 2011 Sony Fermino dos Santos - http://gigawiki.com/sony/
# Fornecido sem quaisquer garantias e responsabilidades.
# Use por sua conta e risco.
# Veja instruções de uso em http://gigawiki.com/sony/reconhecimento-de-fala
#
# Este é meu primeiro trabalho em Ruby.
#
# Parte destes comentários foi redigida verbalmente com este programa.

puts &quot;Iniciando reconhecimento de fala!&quot;

require &#039;thread&#039;

# codificação utf8 &lt;-&gt; iso_8859-1
# inspirado em http://forum.rubyonbr.org/forums/1/topics/507 (by Ronie Uliana)
class String
  def utf8_decode
    array_utf8 = self.unpack(&#039;U*&#039;)
    array_enc = []
    array_utf8.each do |num|
      if num &lt;= 0xFF
        array_enc &lt;&lt; num
      else
        array_enc.concat &quot;&amp;\#\#{num};&quot;.unpack(&#039;C*&#039;)
      end
    end
    array_enc.pack(&#039;C*&#039;)
  end

  def utf8_decode!
    self.replace(self.utf8_decode)
  end

  def utf8_encode
    self.unpack(&#039;C*&#039;).pack(&#039;U*&#039;)
  end

  def utf8_encode!
    self.replace(self.utf8_encode)
  end
end

def ignora(motivo, opcoes)
  # loga motivo
  puts &quot;\nIgnorando: #{motivo}\nOpcoes:&quot;
  opcoes.each {|o| puts &quot;    &#039;#{o}&#039;&quot;}
end

# abre comunicação com o Julius
puts &quot;Abrindo comunicacao com o Julius...&quot;
f = IO.popen(&quot;julius.bat -C opcoes.jconf 2&gt;nul:&quot;, &quot;r+&quot;)

# ignora primeira frase (que é vazia), enquanto espera o Julius ficar pronto
f.readpartial(4096)

# thread para ler o Julius em paralelo, enquanto a principal aguarda todas as opções.
lin = &#039;&#039;
mutex = Mutex.new      # mutex p/ lin
termina = false

thread = Thread.new do
  while not termina
    linha = f.readpartial(4096)
    mutex.synchronize do
      lin += linha
    end
  end
end

at_exit do
  # fecha a outra thread e o pipe.
  print &quot;\nTerminando... &quot;
  termina = true
  f.write &quot;Termina\n&quot;
  f.close
  puts &quot;Ok!&quot;
end

while true
  print &quot;\nAguardando frase... &quot;
  linhas = linha = &#039;&#039;
  
  # espera chegarem as opções do Julius
  while true

    mutex.synchronize do
      linha = lin
      lin = &#039;&#039;
    end
    
    if linha != &#039;&#039;
      # estão chegando linhas
      linhas += linha
      sleep 0.01
      next
    elsif linhas == &#039;&#039;
      # ainda não veio nada
      sleep 0.2
      next
    else
      # acabaram de vir as linhas!
      break
    end
  end
  
  print &quot;Ok!&quot;
  
  # separa as frases candidatas
  opcoes = linhas.scan(/sentence\d+.(.*)/).collect!{|e| e[0]}

  # ignora a respiração
  opcoes.each {|s| s.strip!; s.utf8_decode!}
  if opcoes.include? &#039;há um ano&#039;
    ignora &#039;respiracao&#039;, opcoes
    next
  end
  
  # monta um menu com as opções, e cola o resultado na aplicação corrente
  # monta opções de comando
  op_cmd = &#039;&#039;
  tamanho = 0
  opcoes.each do |opcao|
    if !opcao.empty?
      # tira espaços repetidos
      opcao.squeeze!(&#039; &#039;)
      op_cmd += &quot; \&quot;#{opcao}\&quot;&quot;
      tamanho += opcao.length
    end
  end

  # na escolha da frase pode haver ruídos
  # se o tamanho total for pequeno, ignora.
  if tamanho &lt; 50
    ignora &quot;tamanho insuficiente: &quot; + tamanho.to_s, opcoes
    next
  end
  
  # mostra a primeira opção para identificar o texto
  puts &quot; - &quot; + opcoes[0]
  
  # monta comando do menu

  # comando se o autohotkey estiver instalado (no vista):
  # comando = &quot;\&quot;c:\program Files\AutoHotkey\AutoHotkey.exe\&quot; menu.ahk &quot; + op_cmd

  # comando para uso com menu.exe:
  comando = &quot;menu &quot; + op_cmd

  # executa o comando
  print &quot;Lancando o menu... &quot;
  system(comando)
  puts &quot;Ok!&quot;
end
}}}

</texto>
    <publico>1</publico>
    <original>0</original>
    <anterior>0</anterior>
    <versao>0</versao>
    <traducao>0</traducao>
    <propriedade>
      <nome>projeto</nome>
      <valor>Reconhecimento de fala</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>linguagem</nome>
      <valor>ruby</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>categ</nome>
      <valor>script</valor>
      <publico>1</publico>
    </propriedade>
    <propriedade>
      <nome>sistema</nome>
      <valor>windows</valor>
      <publico>1</publico>
    </propriedade>
  </documento>
</elementos_gw>
