Quando o assistente diz «ok, vou ver» antes de responder
Até 12 de maio, entre o momento em que se largava o botão e o momento em que a voz respondia, o ecrã não mostrava nada. Cinco, dez, por vezes quinze segundos sem um sinal, e a aplicação parecia avariada. Esse dia foi dedicado a esses silêncios: halos que reagem à voz, um estado «estou a pensar» que mantém a esfera acesa, uma bolha retirada, e uma frase curta, «ok, vou ver isso», que o assistente diz de imediato quando a resposta vai demorar.
Um ecrã que não tem outra coisa a fazer senão tranquilizar
A aplicação tem um único ecrã, e nesse ecrã, uma esfera. Quando desenhámos esta interface para que não se visse, aceitámos uma contrapartida: tudo o que a aplicação faz tem de se ler nessa esfera, ou em lado nenhum. Uma aplicação comum dispõe de uma roda que gira, de uma barra de progresso, de um botão a cinzento. Aqui há apenas o movimento de uma forma e uma voz.
Enquanto a conversa cabia numa troca curta, bastava. Mantém-se o botão, fala-se, larga-se, a resposta chega um ou dois segundos depois. Mas assim que o pedido exigia uma pesquisa, uma receita, um lugar, uma avaria a diagnosticar, a resposta demorava cinco a sete segundos a arrancar. E quando a transcrição, o modelo e a síntese de voz se somavam, podia esperar-se quinze segundos sem que um píxel se mexesse. O ecrã voltava ao repouso no instante em que o dedo deixava o botão, exatamente como se ninguém tivesse ouvido nada.
A pergunta levantada pelos primeiros testes cabia numa frase: «está bloqueado ou está a trabalhar?» Tocava-se no ecrã, fechava-se uma ficha, repetia-se o pedido. E às vezes a resposta chegava enquanto se estava a repetir.
Esse 12 de maio, entre dois ensaios de fotografias para as fichas, foi portanto dedicado a esses silêncios. Quatro mudanças, duas no ecrã, duas na voz, e uma quinta para o caso em que não há mesmo nada a dizer.
Fim de manhã: bordas que se acendem com a voz
O primeiro sinal em falta era o mais simples. Enquanto se fala, nada mostrava que o microfone estava a ouvir. A esfera pulsava ao seu ritmo, o mesmo do repouso.
Ao fim da manhã, apareceram duas faixas de luz ao longo das bordas esquerda e direita do ecrã. São azuis enquanto o utilizador fala, e a sua intensidade não é uma animação: vem do nível sonoro medido pelo microfone várias vezes por segundo, convertido de uma medida em decibéis num valor entre zero e um, e depois suavizado para que o halo respire em vez de piscar. Quando se levanta a voz, as bordas acendem-se. Quando se cala à procura de uma palavra, acalmam sem se apagar. O botão mantido e as bordas que seguem a voz dizem a mesma coisa: estou a ouvir-te, continua.
Para a voz do assistente, não dispomos do mesmo dado. O leitor de áudio que reproduz a resposta não devolve amplitude em tempo real. Em vez de inventar um nível falso, os halos adotam uma oscilação estilizada, um ritmo próximo da fala, cerca de três ciclos por segundo, noutra cor. O resultado diz «está a falar» sem pretender medir o volume. É um compromisso assumido: um halo que batesse ao ritmo de uma voz real seria mais exato, mas um halo que bate a um ritmo de voz já é honesto.
Um pormenor de canalização era importante para que o efeito aguentasse. A medida do microfone não atravessa o código da aplicação a cada leitura: é depositada num valor partilhado que o motor de animação lê diretamente na thread de desenho. Sem esse atalho, cada leitura teria feito mais uma ida e volta, e um halo que segue a voz com atraso já não segue nada.
Meio-dia: retângulos azuis em vez de halos
O primeiro teste no telemóvel mostrou outra coisa que não halos. Dois retângulos azuis, cheios, opacos, que se sobrepunham no meio do ecrã. A conversa era ilegível por trás.
A causa estava no gradiente. A primeira versão desenhava os halos com um gradiente radial vetorial, cujos raios horizontal e vertical eram dados em percentagem da área. No Android, essa forma de escrever os raios não é compreendida: a biblioteca abandona o gradiente e preenche todo o retângulo com a cor inicial. O mesmo código, e o resultado era uma placa.
Os halos foram refeitos no motor de desenho que já renderiza a esfera. Ele só conhece gradientes radiais circulares; para obter uma elipse, aplica-se ao próprio gradiente uma transformação que o estica na vertical, sem tocar na geometria do retângulo que o suporta. O que sai é um esbatimento elíptico, fiável nos telemóveis experimentados, com as dimensões da maqueta: cada halo ocupa um pouco mais de metade da largura do ecrã e transborda em cima e em baixo, para que o brilho pareça vir de trás da borda e não de um objeto pousado por cima. O volume não muda o tamanho do halo, apenas a sua opacidade: aumentar uma forma a cada leitura teria custado caro em cálculo e dado um efeito de bombeamento desagradável.
A paleta foi revista pelo caminho. O azul continua a ser o do utilizador. Para o assistente, o ciano inicial deu lugar a um brilho mais quente, o mesmo do halo da esfera quando fala, de modo que a esfera e as bordas contam juntas a mesma fase.
O estado que não existia: «estou a pensar»
O silêncio mais longo não era durante a fala. Começava ao largar o botão.
O ecrã conhecia quatro estados: o repouso, a escuta, a fala do assistente e a escrita no teclado. Entre a escuta e a fala, nada. O dedo deixa o botão, a gravação parte, a transcrição volta, o modelo raciocina, chama as suas ferramentas, a síntese de voz fabrica o áudio, e durante todo esse tempo o estado era «repouso». A esfera voltava a subir ao centro e pulsava tranquilamente, como antes de lhe falarem. Cinco a quinze segundos de calma perfeita, precisamente quando a aplicação mais trabalhava.
Foi acrescentado um quinto estado: «a pensar». Dispara no instante em que a mensagem do utilizador pousa no fio, venha da voz ou do teclado. A esfera desce ao fundo do ecrã, para o lugar que ocupa quando o assistente fala, com uma legenda por baixo: «estou a pensar…». Os halos laterais continuam acesos, no tom quente do assistente, e continuam a respirar devagar. O teclado recolhe-se se estava aberto, para que a esfera fique visível. E um toque na esfera interrompe, o mesmo gesto que a meio de uma resposta falada, para que o utilizador mantenha o controlo a todo o momento.
Dois pormenores de transição eram importantes. Primeiro, só se entra em «a pensar» a partir do repouso ou da escuta: se uma transcrição tardia chegar quando o assistente já está a falar, não deve atropelar essa fase. Segundo, sai-se assim que o texto da resposta chega, e não quando o áudio arranca. Se o som está ligado, a reprodução assume de imediato e a esfera passa a «a falar» sem que se veja a costura. Se o som está desligado, não há reprodução, e sem essa saída a esfera teria ficado em baixo a pensar para sempre.
Tarde: uma bolha a mais
O início da tarde foi ocupado pelas fichas e pelas suas imagens. Ao voltar à conversa, uma coisa saltou à vista: durante o ditado, uma pequena bolha por baixo da esfera dizia «estou a ouvir». Tinha sido posta ali quando era o único sinal de que o microfone estava a funcionar. Desde a manhã, as bordas do ecrã diziam a mesma coisa, e melhor, porque seguiam a voz.
Dois sinais para uma única informação é um a mais. A bolha foi retirada. A transcrição parcial que a alimentava continua a ser calculada, para o caso de um dia servir noutro sítio, mas já não é mostrada. É a lição inversa do resto do dia: dizer o que se está a fazer não quer dizer dizê-lo duas vezes.
«Ok, vou ver isso»: a palavra de espera
Restava o silêncio mais incómodo, aquele que o ecrã sozinho não conseguia preencher.
Quando um pedido exige uma pesquisa na web, o modelo encadeia várias ferramentas antes de redigir: consulta primeiro a memória, lança a pesquisa, guarda muitas vezes o resultado numa ficha, e só então escreve a sua resposta, que segue depois para a síntese de voz. Cinco a sete segundos entre o fim da frase do utilizador e a primeira palavra do assistente. O estado «a pensar» mostra que algo está a correr, mas numa conversa, sete segundos de silêncio continuam a ser longos. Entre pessoas, ninguém se cala sete segundos antes de responder: diz-se «espera, vou ver».
É o que o assistente faz desde essa tarde. O maestro do lado do servidor, aquele que faz correr o modelo e executa as suas ferramentas, observa a primeira decisão do modelo. Se essa primeira decisão inclui uma pesquisa na web, a única ferramenta da cadeia que demora sistematicamente mais de um segundo, dispara de imediato uma frase curta: «Ok, vou ver isso, dá-me um instante.» Existem cinco variantes, sorteadas de cada vez, «Um segundo, estou a procurar», «Eu trato disso, dois segundos», para que não se ouça a mesma fórmula a cada pesquisa. São curtas de propósito: o utilizador só precisa de saber que a coisa avança.
O ponto importante é que esta frase não custa tempo. O servidor não espera por ela: lança a síntese da frase e, em paralelo, executa as ferramentas. O texto parte para o telemóvel de imediato, o áudio segue meio segundo depois, e entretanto a pesquisa já está em curso. Quando a verdadeira resposta chega, chega no mesmo momento de antes; simplesmente, o silêncio que a precedia foi preenchido. Para se manter rápida, a frase de espera usa a voz pedida pelo telemóvel sem ir reler as preferências na base de dados, ao contrário da resposta final. E se o utilizador desligou o som, vê a frase no fio sem que nenhum áudio seja fabricado para nada.
Podíamos ter disparado esta palavra de espera em todos os pedidos. Não o fizemos: uma ferramenta sozinha responde em menos de meio segundo, e uma frase de espera antes de uma resposta imediata teria tornado o assistente palrador. A palavra de espera fica reservada ao caso em que a espera existe.
E quando não há mesmo nada a dizer
Um último silêncio foi tratado nessa mesma manhã, alguns minutos antes dos halos, porque pertencia à mesma família: aquele em que o modelo não responde de todo.
Três situações o produziam. O modelo cai a meio do caminho, um erro de rede ou um servidor remoto que recusa. O modelo entra em ciclo, chama ferramentas vezes sem conta e atinge o limite de iterações sem nunca concluir com texto. Ou o modelo devolve uma cadeia vazia, o que acontece mais vezes do que se julgaria. Nos três casos a esfera ficava muda, e o utilizador não tinha maneira de distinguir uma avaria de uma espera.
Agora cada um desses casos produz uma frase falada, distinta conforme a causa: um problema técnico do nosso lado, um erro ao tentar fazer o que foi pedido, ou uma resposta que não pôde ser concluída, sempre com o convite a tentar de novo ou a reformular. Se uma ferramenta falhou mas o modelo explicou ele próprio o problema, guardamos a sua explicação, sempre mais precisa do que uma fórmula feita. A resposta de recurso não está lá para ficar bonita: está lá para que a esfera nunca se cale sem um motivo dito.
O que o dia ensinou
Uma aplicação sem ecrã de navegação não pode permitir-se o silêncio. Cada segundo em que nada se mexe é um segundo em que o utilizador se pergunta se deve recomeçar, e recomeçar é o pior dos cenários: dois pedidos em voo, duas respostas, uma ficha em duplicado.
Esse 12 de maio repartiu a resposta entre o ecrã e a voz. O ecrã diz a fase: estou a ouvir, com bordas que seguem a voz; estou a pensar, com uma esfera que continua acesa; estou a falar, com um brilho quente. A voz diz a espera quando vai ser longa, e diz a falha quando acontece. Nenhum destes sinais acrescenta latência, e nenhum mente: o halo do assistente não pretende medir a sua voz, a frase de espera não promete mais do que uma pesquisa em curso.
É a regra que mantivemos desde então para tudo o que toca à voz e à conversa: um assistente que trabalha deve mostrá-lo, um assistente que espera deve dizê-lo, e um assistente que falha também deve dizê-lo. O resto, a memória, as fichas, as pesquisas, só vale alguma coisa se entretanto não se tiver fechado a aplicação julgando-a morta.
