Na versão beta do Telegram para Android 13.0.3 (build 7179), era possível enviar mensagens de voz como texto: o botão "Aa" ao lado da pausa transcrevia a gravação antes mesmo do envio, e o usuário escolhia o que seria enviado ao interlocutor — o texto ou o próprio áudio. A função foi observada como disponível apenas para usuários Premium. Posteriormente, a transcrição foi removida da beta, sendo considerada um experimento temporário de um dos desenvolvedores; a segunda novidade da mesma build permaneceu — a gravação experimental de mensagens de voz com supressão de ruído usando a rede neural RNNoise. Isso se aplica àqueles que instalam a versão beta: na versão estável 13.0.2, não há nem um nem outro.
Como isso aparecia na beta
O botão "Aa" aparecia no modo de gravação bloqueada — quando o dedo é deslizado para cima a partir do ícone do microfone durante a gravação, e esta continua sem a necessidade de manter o botão pressionado. Tocar em "Aa" exibia a transcrição, e então restava escolher o que enviar. Se a mensagem de voz fosse complementada ou cortada, a beta oferecia a opção de transcrevê-la novamente.
A gravação com supressão de ruído é ativada nas configurações experimentais da beta. O ruído é removido do áudio antes que ele seja compactado para Opus — o formato no qual o Telegram armazena e envia mensagens de voz. Um aviso da mesma build: a supressão de ruído pode comprometer a gravação de música e de fala muito baixa. Cantarolar uma melodia em uma mensagem de voz com este modo ativado é uma má ideia: para a rede, a música é percebida como ruído, e a razão para isso será explicada abaixo.
Por que a transcrição antes do envio é uma mecânica nova
A transcrição de mensagens de voz no Telegram existe há muito tempo, mas apenas para mensagens que já estão no chat. Ela é feita pelo servidor: o cliente chama o método messages.transcribeAudio, e o método possui dois parâmetros — o chat e o número da mensagem nele. A resposta chega com um identificador de transcrição e o texto; uma gravação longa pode retornar com a anotação "em andamento", e então o texto é complementado por atualizações updateTranscribedAudio separadas.
Uma gravação não enviada não possui um número de mensagem, portanto, este método não é aplicável a ela. Não há um método que aceite o próprio arquivo, nem no esquema público da API (TDLib em 8 de outubro), nem nos códigos-fonte do Android 13.0.2 com a camada 231. O reconhecedor de fala do sistema Android (android.speech) também não é usado no código 13.0.2.
Como a beta contornava essa limitação não é visível nos artefatos abertos: os códigos-fonte da build 13.0.3 não foram publicados, o repositório termina na 13.0.2 (7175), lançada em 13 de outubro. As linhas do novo botão também não estão na plataforma de traduções — o que corrobora a versão de um experimento pessoal que não chegou à localização. Uma hipótese, e não um fato do código: o reconhecimento ocorria por meio de um método de servidor que ainda não está no esquema público, ou no próprio dispositivo.
Para quem a transcrição está disponível agora
Para mensagens de voz recebidas, as regras são visíveis no código do cliente. A transcrição sem restrições está incluída no Premium — na descrição da assinatura, há uma linha sobre a transcrição de qualquer mensagem de voz recebida. Sem o Premium, o servidor oferece transcrições de teste: o número semanal e a duração máxima da gravação são lidos pelo cliente a partir da configuração do servidor, usando as chaves transcribe_audio_trial_weekly_number e transcribe_audio_trial_duration_max. O limite de duração nas configurações de outubro é de 300 segundos, e o número de testes semanais variava entre 0 e 2. Quando os testes acabam, o cliente mostra a data até a qual esperar ou oferece o Premium.
Como o RNNoise funciona
RNNoise é uma biblioteca de supressão de ruído de código aberto da Xiph.Org sob licença BSD. O autor é Jean-Marc Valin, um dos criadores do codec Opus; o funcionamento é descrito em seu artigo de 2017.
A abordagem é híbrida. O processamento de sinal clássico divide o áudio em quadros de 10 ms (480 amostras a 48 kHz) e decompõe o espectro de cada quadro em 22 bandas, com larguras próximas à forma como a audição distingue as frequências. Uma pequena rede recorrente — que lembra os quadros anteriores — analisa as características das bandas e, para cada uma, produz um coeficiente de 0 a 1: quanta energia deve ser mantida nessa banda. Um filtro de altura de tom separado limpa o ruído entre os harmônicos da voz. Simultaneamente, a rede produz a probabilidade de haver fala no quadro.
A rede controla 22 coeficientes, e não centenas de amostras de frequência, por isso é pequena e funciona em tempo real no processador do telefone. O lado negativo é que ela foi treinada para separar a fala do ruído, e tudo o que não se assemelha à fala é considerado ruído. Daí o aviso sobre música; a voz baixa se perde pela mesma razão — suas características nas bandas são próximas ao fundo.
RNNoise já estava no aplicativo
Não foi necessário adicionar a biblioteca. Os códigos-fonte estão no repositório do cliente Android em jni/voip/rnnoise, são compilados em uma biblioteca estática e incorporados à biblioteca nativa principal do aplicativo. Até agora, ela funcionava em videochamadas: o módulo de chamadas passa cada quadro do microfone através do RNNoise, obtém a estimativa de fala para o indicador de quem está falando e substitui o áudio pelo limpo quando a "Supressão de Ruído" está ativada nas configurações da videochamada.
O cliente grava mensagens de voz do microfone em mono a 48 kHz e as compacta com o codec Opus no modo para voz. A frequência de gravação coincide com a que o RNNoise opera, de modo que o experimento da beta se resume a um elo entre o microfone e o codificador — o mesmo que já existe nas videochamadas há muito tempo.




