Intermediário 12 minDesktop

Relatório de reunião automatizado: Whisper + LLM 100 % local

Um relatório de reunião gerado por IA é composto por duas etapas: transcrever o áudio e depois resumir o texto. O problema é que a maioria das ferramentas SaaS envia a gravação completa da sua reunião — nomes, números, estratégia — para servidores de terceiros. Este guia monta o mesmo pipeline inteiramente em ambiente local: Whisper para a transcrição, um LLM via Ollama para extrair decisões e ações, sem que nada saia da sua máquina.

Por Marie L.·Atualização 2026-08-27·Testado no Windows, macOS e Linux

#Por que o processamento local se impõe para reuniões sensíveis

Uma reunião não é um arquivo inofensivo. Em uma hora de gravação, você encontra nomes de clientes, valores, decisões de RH, rumos de produto ainda não anunciados e, às vezes, dados pessoais na acepção do RGPD. Entregar esse áudio a um serviço de geração automática de relatórios de reunião na nuvem é aceitar que todo esse conteúdo seja transferido, processado e potencialmente armazenado por um terceiro.

Confidencialidade real
O áudio e a transcrição permanecem no seu computador. Nenhum dado de negócio passa por um servidor externo que poderia registrá-lo ou usá-lo para treinamento.
Conformidade simplificada com o RGPD
Sem transferência para um subcontratado, muitas vezes situado fora da UE. A parte referente à « transferência de dados pessoais » da sua avaliação de impacto é eliminada na origem.
Nenhum custo recorrente
Sem assinatura por usuário nem cobrança por minuto transcrito. Depois que a máquina estiver instalada, você pode processar quantas reuniões quiser.
Funciona offline
Uma viagem, um local sem conexão confiável, uma reunião em uma sala isolada: o processamento continua disponível sem internet.
i
Executar localmente não dispensa avisar
Gravar uma reunião continua sujeito a regras: informe os participantes e obtenha seu consentimento. O processamento local resolve a questão da transferência de dados, mas não a do consentimento para a gravação.

#O princípio do pipeline em duas etapas

O kit IA Local

Seu ChatGPT privado e gratuito na sua máquina em 1 hora — LM Studio, Ollama, Open WebUI, seus documentos, sem nuvem.

  • Espaço online vitalício
  • PDF + arquivos
  • Atualizações vitalícias

Um relatório de reunião gerado por IA sempre se divide em duas etapas distintas, que não devem ser confundidas. A primeira transforma o áudio em texto: é o papel do Whisper, o modelo de reconhecimento de fala da OpenAI, cujas várias implementações open source funcionam perfeitamente localmente. A segunda transforma esse texto bruto em um documento estruturado: é o papel de um LLM local executado por Ollama.

Transcrição (Whisper)
Entrada: um arquivo de áudio ou vídeo. Saída: o texto completo da reunião, eventualmente com marcações de tempo. É um processamento computacional pesado, mas mecânico.
Síntese (LLM Ollama)
Entrada: a transcrição. Saída: um relatório — resumo, decisões tomadas, ações a serem tomadas com seu responsável. É aí que o prompt faz toda a diferença.

Separar as duas etapas tem um benefício prático: você pode refazer a síntese quantas vezes quiser, com prompts diferentes, sem precisar refazer a transcrição, que é a parte mais lenta.

#Pré-requisitos

Ollama instalado
O daemon escuta por padrão em http://localhost:11434. Se você ainda não instalou o Ollama, veja o guia de instalação listado no final da página.
Um LLM para síntese
Um modelo de 9 a 12B em Q4_K_M (≈7 GB de VRAM) bom em francês é suficiente com folga. Qwen 3.5 9B (256k de contexto, perfeito para transcrições longas) ou Gemma 4 12B são ótimas opções para resumos estruturados.
Whisper
Implementação local: openai-whisper (simples), faster-whisper (rápido) ou whisper.cpp (leve, sem GPU). Este guia utiliza as duas primeiras.
ffmpeg
Indispensável para ler formatos de vídeo (mp4 do Teams/Zoom) e converter áudio. O Whisper depende dele nos bastidores.
Hardware
Um GPU acelera bastante o Whisper, mas o medium também roda em CPU (mais lentamente). Estime cerca de 2 GB de VRAM para o modelo small, mais para o large-v3.
→
Qual modelo Whisper escolher?
Para o francês, small já dá bons resultados com um áudio limpo. Passe para medium em uma reunião com várias vozes ou com áudio de qualidade mediana, e para large-v3 quando a qualidade da transcrição for mais importante que a velocidade (sotaques, jargão, falas sobrepostas).

#Etapa 1: transcrever o áudio da reunião com o Whisper

A instalação mais direta é feita pelo pacote openai-whisper, que fornece um comando de linha de comando pronto para uso. Instale-o em um ambiente Python, com ffmpeg instalado no sistema.

Instalação
# ffmpeg (Debian/Ubuntu)
sudo apt install ffmpeg

# Whisper (dans un venv de préférence)
pip install -U openai-whisper

Em seguida, a transcrição é feita com um único comando. Especificam-se o modelo, o idioma (defini-lo explicitamente evita erros de detecção em reuniões curtas) e o formato de saída em texto.

Terminal
whisper reunion.mp3 \
  --model medium \
  --language French \
  --output_format txt \
  --output_dir ./transcriptions

Você obtém um arquivo reunion.txt contendo a reunião inteira. Se quiser também legendas com marcações de tempo (úteis para localizar um trecho), adicione --output_format srt, ou all para gerar tudo de uma vez.

Para uma reunião de uma hora, a transcrição pode demorar na CPU. É aí que entra o faster-whisper, uma reimplementação que utiliza CTranslate2 e é muito mais rápida, com qualidade idêntica. Aqui está um script Python que transcreve e salva o texto.

transcrire.py
from faster_whisper import WhisperModel

# device="cuda" si GPU NVIDIA, sinon "cpu"
model = WhisperModel("medium", device="cuda", compute_type="float16")

segments, info = model.transcribe(
    "reunion.mp3",
    language="fr",
    vad_filter=True,   # coupe les silences, gagne du temps
)

with open("reunion.txt", "w", encoding="utf-8") as f:
    for seg in segments:
        f.write(seg.text.strip() + "\n")

print(f"Langue détectée : {info.language} — durée : {info.duration:.0f}s")
→
A opção vad_filter
O filtro VAD (detecção de atividade vocal) remove os intervalos sem fala e os silêncios antes da transcrição. Em uma reunião real, cheia de pausas e tempos mortos, ele acelera significativamente o processamento sem prejudicar o texto útil.

#Processar uma gravação do Teams ou do Zoom

As gravações do Teams e do Zoom são arquivos de vídeo .mp4 (às vezes .m4a quando há apenas áudio). O Whisper consegue lê-los diretamente, pois usa ffmpeg, mas extrair primeiro a faixa de áudio em mono a 16 kHz é mais confiável e mais rápido — especialmente com o whisper.cpp, que exige isso.

Extrair o áudio do .mp4
ffmpeg -i reunion_teams.mp4 \
  -ar 16000 -ac 1 \
  -c:a pcm_s16le \
  reunion.wav
-ar 16000
Reamostra para 16 kHz, a frequência esperada pelo Whisper. Não há necessidade de manter 48 kHz: a fala não precisa disso.
-ac 1
Combina os canais em mono. Para a transcrição, não há vantagem em manter o áudio de uma reunião em estéreo.
-c:a pcm_s16le
Saída em WAV não comprimido, o formato mais seguro de entrada para o Whisper.

Onde encontrar o arquivo? No Teams, as gravações são salvas no OneDrive/SharePoint (pasta “Recordings”): baixe o .mp4 localmente antes de processá-lo. No Zoom, a gravação local fica na pasta Documents/Zoom, com um arquivo audio.m4a separado se a opção estiver ativada — é esse arquivo que você deve usar diretamente, sem passar pelo vídeo.

!
Não processe na nuvem SaaS
Toda a proposta de uso local perde o sentido se você deixar a IA do fornecedor (Teams Premium, Zoom AI Companion) gerar o relatório da reunião no servidor. Obtenha o arquivo bruto e processe-o no seu computador: é a única forma de garantir que nada vaze.

#Etapa 2: a síntese por um LLM local

A transcrição bruta é ilegível: sem pontuação confiável, sem estrutura, com repetições. É o LLM local que a transforma em relatório útil. Enviamos o texto para Ollama com instruções claras sobre o formato de saída esperado.

O mais simples para testar: enviar a transcrição via pipe para ollama run. O modelo recebe o prompt seguido do texto da reunião.

Resumo rápido
ollama run qwen3.5:9b "Résume ce compte rendu de réunion en français, \
en listant les points clés, les décisions et les actions à mener. \
Voici la transcription :

$(cat reunion.txt)"

Para uso recorrente, é melhor usar a API REST de Ollama na porta 11434: ela separa corretamente a mensagem de sistema (o papel e o formato) do conteúdo (a transcrição) e torna o resultado reutilizável em um script.

synthese.py
import requests

transcript = open("reunion.txt", encoding="utf-8").read()

SYSTEM = """Tu es un assistant qui rédige des comptes rendus de réunion clairs et concis en français.
Tu ne inventes rien : tu ne t'appuies que sur la transcription fournie."""

resp = requests.post("http://localhost:11434/api/chat", json={
    "model": "qwen3.5:9b",
    "stream": False,
    "messages": [
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": PROMPT + "\n\n---\n" + transcript},
    ],
})

print(resp.json()["message"]["content"])
i
Cuidado com a janela de contexto
Uma reunião de uma hora gera facilmente entre 8.000 e 12.000 palavras. Verifique se o contexto do modelo é suficiente (num_ctx). Acima disso, divida a transcrição em seções e resuma por partes antes da síntese final — um mini pipeline map-reduce.

#O prompt que gera decisões e ações de forma clara

Essa é a essência de um bom relatório de reunião gerado por IA. Um prompt vago gera um resumo em um bloco longo de texto; um prompt estruturado gera um documento diretamente utilizável. A chave: impor um formato de saída explícito, em seções, e pedir ao modelo para distinguir claramente o que foi decidido do que ainda precisa ser feito.

Prompt de síntese
À partir de la transcription de réunion ci-dessous, produis un compte rendu structuré en français, en respectant EXACTEMENT ce format :

## Résumé
Trois à cinq phrases sur l'objet et les conclusions de la réunion.

## Décisions prises
- Une puce par décision actée, formulée clairement.

## Actions à mener
- [Responsable] Action précise — échéance si mentionnée.

## Points en suspens
- Sujets évoqués sans conclusion, à traiter plus tard.

Règles :
- Ne reprends que ce qui est réellement dit dans la transcription.
- Si le responsable ou l'échéance d'une action n'est pas mentionné, écris « non précisé ».
- Reste factuel, pas de reformulation marketing.
Formato obrigatório
Os títulos de seção (##) obrigam o modelo a organizar a informação em vez de misturá-la. Você obtém um resultado homogêneo de reunião em reunião.
A regra contra alucinações
“Inclua apenas o que foi realmente dito” e “não especificado” reduzem muito o risco de o LLM inventar um prazo ou um responsável que não existe.
O responsável entre colchetes
Indicar [Responsável] no início de cada ação torna o relatório diretamente utilizável para agir — basta uma olhada para saber quem faz o quê.
→
Teste vários modelos na mesma transcrição
Como a transcrição já foi feita, comparar os modelos não custa nada: gere novamente o resumo com Qwen 3.5 9B e depois com Gemma 4 12B usando o mesmo reunion.txt. Você verá rapidamente qual estrutura melhor as ações em francês.

#Automatizar todo o pipeline

Após a validação das duas etapas, elas são encadeadas em um único script: forneça a ele um arquivo de reunião, e ele gera o relatório em Markdown. É isso que transforma o procedimento em uma ferramenta para o dia a dia.

compte-rendu.sh
#!/usr/bin/env bash
set -euo pipefail

INPUT="$1"                 # reunion.mp4 ou reunion.mp3
BASE="$(basename "${INPUT%.*}")"

# 1. Extraire l'audio en 16 kHz mono
ffmpeg -y -i "$INPUT" -ar 16000 -ac 1 -c:a pcm_s16le "$BASE.wav"

# 2. Transcrire
whisper "$BASE.wav" --model medium --language French \
  --output_format txt --output_dir .

# 3. Synthétiser avec le LLM local
python synthese.py "$BASE.txt" > "$BASE-compte-rendu.md"

echo "Compte rendu prêt : $BASE-compte-rendu.md"

Ajuste o arquivo synthese.py para que ele leia o arquivo passado como argumento e escreva o resultado na saída padrão. Assim, você terá um comando único: ./compte-rendu.sh reunion_teams.mp4, e o resumo em Markdown aparece alguns minutos depois, sem que um único byte tenha saído da máquina.

#Solução de problemas

Transcrição que sai em inglês
O Whisper detectou incorretamente o idioma em um início silencioso ou bilíngue. Force sempre --language French (ou language="fr").
Nomes próprios mal escritos
Normal: o Whisper tenta adivinhar com base na pronúncia. Adicione uma breve etapa de correção ao prompt de síntese (“corrija os nomes claramente mal transcritos”) ou forneça um glossário de nomes ao LLM.
Reunião longa demais para a janela de contexto
Divida a transcrição em blocos de ~3.000 palavras, resuma cada um e depois faça uma síntese dos resumos. Aumente também num_ctx na chamada ao Ollama se sua VRAM permitir.
Whisper muito lento
Mude para faster-whisper, ative o vad_filter, reduza o modelo (medium → small) ou mude para GPU. O whisper.cpp também é uma boa opção em máquinas sem GPU.
Vozes que se sobrepõem
Whisper não separa os falantes. Para um relatório de «quem disse o quê», é necessário adicionar previamente uma etapa de diarização (por exemplo, pyannote) — um assunto que merece ser tratado à parte.

#Para se aprofundar

Este guia combina dois componentes já tratados em detalhe no site. Para aprofundar cada etapa ou tornar o conjunto mais seguro:

Whisper + Ollama: pipeline de transcrição e resumo 100% local
O guia de referência sobre o componente de áudio, com as variantes de implementação do Whisper e um exemplo completo, de ponta a ponta, de uma reunião de uma hora.
Escolher sua quantização (Q4, Q5, Q8, FP16)
Para fazer um modelo de síntese de 14B ou 32B caber na sua GPU sem prejudicar a qualidade do relatório da reunião.
LLM local e RGPD: conformidade na proteção de dados privados nas empresas
O equivalente na área regulatória: processar reuniões localmente simplifica a conformidade; este guia detalha o que ainda precisa ser documentado.
Este guia ajudou você?

Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.