O verdadeiro push-to-talk
Um botão que se mantém pressionado deve manter a fala aberta enquanto o mantemos. O nosso não o fazia realmente: o problema não vinha do nosso código, mas de um limite que não podíamos ver antes de o atingir.
Um botão que prometia mais do que cumpria
O princípio do push-to-talk é simples: carregas, falas, soltas, é transmitido. Acontece que o reconhecimento de voz integrado no Android tem o seu próprio cronómetro, invisível para o nosso código: após cerca de um segundo e meio de silêncio, ele considera que terminaste de falar e corta a escuta, quer o teu dedo ainda esteja no botão ou não. Uma hesitação, uma respiração um pouco longa enquanto procuras as palavras, e a frase era truncada sem aviso. Pior: para continuar a ouvir apesar deste corte, era preciso reiniciar o motor discretamente, o que produzia bipes audíveis e falhas na transcrição. O botão dizia «eu ouço-te enquanto me manténs pressionado», mas na verdade, ele cortava-te a palavra após uma pausa um pouco demasiado natural.
Uma parede que não se pode mover
Primeiro, tentámos contornar este cronómetro: desativá-lo, alongá-lo, escondê-lo atrás de um reinício mais discreto. Nada funcionou. É um limite definido pelo sistema, documentado como tal, e reproduzido de forma idêntica em vários telefones Android recentes. Um push-to-talk digno desse nome deve poder durar o tempo que o utilizador decidir, incluindo pausas: um lembrete ditado, uma lista de compras pensada em voz alta, um pensamento que hesita antes de se formular. Nenhuma configuração permitia obter isso com este motor. Era preciso sair dele.
Capturar, enviar, transcrever noutro lugar
Mudámos, portanto, a abordagem na raiz. Em vez de fazer o reconhecimento de voz diretamente no telefone, o XNeuronal agora grava o áudio bruto, num formato compacto, durante todo o tempo em que o botão é mantido pressionado, sem qualquer limite de duração imposto pelo sistema. Ao soltar, este ficheiro é enviado para o servidor, acompanhado do teu identificador, para ser transcrito pelo nosso reconhecimento de voz na cloud. Durante a gravação, uma bolha «🎙 a ouvir…» permanece exibida diretamente no fluxo da conversa; ao soltar, ela torna-se «transcrição…» durante o tempo de ida e volta da rede, e depois transforma-se na tua mensagem final: um único e mesmo ponto de referência visual do início ao fim, onde antes a indicação flutuava sob o orbe, separada do fluxo.
Esta mudança também foi uma oportunidade para tornar o gesto mais rigoroso: enquanto o botão é mantido pressionado, nenhum alerta de erro perturba a escuta, e o soltar aciona o envio sem ambiguidade, mesmo que tenhas retirado o dedo um instante demasiado cedo ou demasiado tarde. É este gesto, mantido e fiável, que permanece no centro da voz e da conversa com o XNeuronal. Enviar um ficheiro em vez de ouvir em direto também desloca o risco: a falha já não está no microfone, pode vir da rede. Sem rede, o ditado simplesmente não pode ser transcrito. Nos bastidores, o módulo vocal aguenta as interrupções temporárias da ligação: se a sessão for interrompida a meio, ele reinicia-a com um tempo de espera crescente, até oito tentativas, para que uma micro-interrupção isolada não se transforme num ditado perdido.
O que ganhamos, o que pagamos
O ganho é claro: a transcrição já não depende de um motor limitado por um cronómetro que não controlamos, e a sua fidelidade é melhor, incluindo em frases longas, hesitantes, ou repletas de nomes próprios que um motor genérico integrado reconhecia mal. O preço, assumimo-lo: uma vez que o áudio vai para um servidor, já não há retorno instantâneo enquanto falas, nenhuma palavra exibida em direto, apenas a promessa de uma transcrição fiel assim que o botão é solto, e uma dependência de facto da rede para que essa transcrição chegue. Preferimos esta honestidade a um botão que parecia reativo na fachada, mas te cortava a palavra sem o dizer.
