Capítulo 10 de 13

Áudio, foto e marcar horário na agenda

Metade dos clientes manda áudio. Como ouvir, como ler a foto e como fechar o horário sem digitar.

Manual gratuito de Certu · Atualizado em 30 de agosto de 2026 · ver o manual inteiro

Como fazer o atendente de IA entender áudio no WhatsApp?

Resposta curta

A Meta não manda o áudio no aviso, manda um identificador. Você pede o endereço do arquivo, baixa com a sua chave e envia o áudio para um modelo que aceita som. A resposta volta como texto e segue o mesmo caminho de uma mensagem escrita.

O que ter aberto antes de começar

Por que áudio não é opcional no Brasil?

Uma parte grande dos clientes prefere gravar a escrever, principalmente quem está dirigindo, trabalhando com as mãos ou tem pouca intimidade com teclado.

Um atendente que responde "não consigo ouvir áudio, pode escrever?" perde a conversa ali. É a falha mais cara desta lista.

Baixar o arquivo, em dois passos

A Meta manda só o identificador. O arquivo vem em duas chamadas.

src/index.jsjavascript
async function baixarMidia(env, idDaMidia) {
  // 1. pedir o endereco
  const info = await fetch('https://graph.facebook.com/v26.0/' + idDaMidia, {
    headers: { Authorization: 'Bearer ' + env.WHATSAPP_TOKEN },
  });
  if (!info.ok) return null;
  const { url, mime_type } = await info.json();

  // 2. baixar. O endereco tambem exige a chave.
  const arquivo = await fetch(url, {
    headers: { Authorization: 'Bearer ' + env.WHATSAPP_TOKEN },
  });
  if (!arquivo.ok) return null;

  const bytes = new Uint8Array(await arquivo.arrayBuffer());
  let binario = '';
  for (const b of bytes) binario += String.fromCharCode(b);
  return { base64: btoa(binario), mime: mime_type };
}

Onde as pessoas se queimam

O endereço devolvido no primeiro passo só funciona com o cabeçalho de autorização e vence rápido. Baixe na hora, dentro da mesma requisição, em vez de guardar o endereço para depois.

Entender o áudio e a imagem

O mesmo modelo do capítulo 5 aceita o arquivo junto da instrução.

Depois disso, o resto do fluxo é igual: o texto transcrito entra no lugar da mensagem escrita.

Para foto, a instrução muda conforme o negócio: uma oficina quer saber a peça, um restaurante quer ler o comprovante de pagamento, uma clínica quer o pedido do exame.

src/index.jsjavascript
async function lerMidia(env, midia, instrucao) {
  const resposta = await fetch(
    'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent',
    {
      method: 'POST',
      headers: {
        'x-goog-api-key': env.GEMINI_API_KEY,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        contents: [{
          role: 'user',
          parts: [
            { text: instrucao },
            { inline_data: { mime_type: midia.mime, data: midia.base64 } },
          ],
        }],
      }),
    },
  );
  if (!resposta.ok) return null;
  const dados = await resposta.json();
  return dados?.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? null;
}

// No webhook:
// if (mensagem.type === 'audio') {
//   const midia = await baixarMidia(env, mensagem.audio.id);
//   texto = await lerMidia(env, midia, 'Transcreva este audio em portugues do Brasil.');
// }
// if (mensagem.type === 'image') {
//   const midia = await baixarMidia(env, mensagem.image.id);
//   texto = await lerMidia(env, midia, 'Descreva o que aparece nesta imagem em uma frase.');
// }

Marcar o horário na agenda

O atendente só fecha o atendimento de verdade quando o horário entra em algum lugar.

O token do Google sai de uma conta de serviço com acesso à agenda, criada no console de nuvem do Google. É o passo mais burocrático deste capítulo e é feito uma vez só.

O caminho mais simples, se você não quer mexer com isso agora: o atendente pergunta o horário, o seu código manda o pedido para o dono e alguém confirma. Automatize a agenda depois, quando o volume justificar.

criar o evento no Google Agendajavascript
async function criarEvento(tokenGoogle, agendaId, evento) {
  const resposta = await fetch(
    'https://www.googleapis.com/calendar/v3/calendars/' + agendaId + '/events',
    {
      method: 'POST',
      headers: {
        Authorization: 'Bearer ' + tokenGoogle,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        summary: evento.titulo,
        description: evento.observacao,
        start: { dateTime: evento.inicio, timeZone: 'America/Sao_Paulo' },
        end: { dateTime: evento.fim, timeZone: 'America/Sao_Paulo' },
      }),
    },
  );
  return resposta.ok;
}

Onde as pessoas se queimam

Antes de marcar, confira o horário livre. Atendente que marca dois clientes no mesmo horário gera um problema maior do que o que ele resolveu.

Perguntas frequentes

Transcrever áudio encarece muito?

Pouco. Um áudio curto de atendimento custa uma fração de centavo nos modelos rápidos, e evita perder a conversa inteira.

Dá para responder com áudio?

Dá, gerando o som e enviando como mídia. Vale a pena testar antes: em atendimento, muita gente prefere ler a resposta para conferir preço e horário.

E documento em PDF?

O caminho é o mesmo do áudio e da imagem: identificador, download com a chave e envio ao modelo. Muda só a instrução.

Preciso guardar os arquivos?

Só se o seu negócio precisar deles depois. Guardar áudio e foto de cliente sem motivo aumenta o custo e o risco, e o capítulo 11 explica por quê.

E onde entra Certu

Certu já entende áudio, foto e documento e marca na agenda sem esse encanamento todo. É o tipo de peça que parece pequena no manual e vira metade do trabalho de manutenção quando o volume chega.

Ver o que Certu faz e quanto custa

Continuar o manual