Capítulo 10 de 13
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
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.
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.
A Meta manda só o identificador. O arquivo vem em duas chamadas.
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.
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.
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.');
// }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.
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.
Pouco. Um áudio curto de atendimento custa uma fração de centavo nos modelos rápidos, e evita perder a conversa inteira.
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.
O caminho é o mesmo do áudio e da imagem: identificador, download com a chave e envio ao modelo. Muda só a instrução.
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