Avançado 22 minSaúde

Transcrição médica e LLM local: conformidade dos dados patient

Ditar uma consulta, obter uma transcrição clara e depois um relatório SOAP pronto para colar no prontuário do paciente — sem que nenhum segundo de áudio saia do consultório. É essa promessa que este guia permite colocar em prática: um pipeline de transcrição médica com LLM local HDS baseado em Whisper-large-v3 e um modelo de 14B+ (Llama 4 ou Qwen3), projetado para manter a conformidade com o sigilo médico e o marco normativo HDS.

Por Léa B.·Atualização 2026-06-15·Testado no Windows, macOS e Linux

#Regras de HDS e sigilo médico

O sigilo médico (artigo L.1110-4 do Código da Saúde Pública) se aplica a qualquer documento que contenha informações de saúde que permitam identificar uma pessoa, inclusive transcrições de áudio. Assim que um dado de paciente é tratado fora das instalações do consultório ou do hospital, o provedor de hospedagem deve ter certificação HDS (referencial ASIP/ANS). Na prática, enviar uma consulta a uma API em nuvem sem certificação HDS — Whisper da OpenAI, Claude ou qualquer plataforma voltada ao público em geral — coloca você fora das regras aplicáveis, mesmo para um teste.

A solução: nunca enviar o áudio nem a transcrição para fora do perímetro que você controla. É exatamente isso que um pipeline de transcrição médica com LLM local permite: a máquina de inferência está no consultório, o disco está criptografado, a rede está isolada. Sem provedor de hospedagem, sem credenciamento a solicitar.

!
Nuvem sem certificação HDS = fora do quadro de conformidade
Muitos profissionais de saúde usam ChatGPT ou uma versão hospedada do Whisper para economizar tempo. Isso constitui uma violação do sigilo profissional passível de processos disciplinares (Artigo 4 do Código de Ética Médica) e penais (Artigo 226-13 do Código Penal). Uma auditoria da ARS detecta essa violação facilmente por meio dos fluxos de saída.

#Arquitetura 100% local

O kit IA Local na Empresa

Implantar uma IA local no trabalho: RGPD, AI Act, arquitetura multiusuário, custos, nota para a diretoria.

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

O pipeline é composto por quatro etapas, todas locais: captura de áudio → Whisper-large-v3 → LLM com template SOAP → exportação para o software do consultório (LGC) ou para o DMP.

Gravação
Microfone de lapela ou microfone USB cardioide posicionado entre o profissional de saúde e o paciente. Sem Bluetooth (latência e compressão). Gravação em WAV 16 kHz mono.
Transcrição
Whisper-large-v3 (OpenAI, pesos abertos, licença MIT) executado via faster-whisper na GPU local. Modelo carregado na memória, áudio destruído após a transcrição.
Estruturação
Llama 4 Scout (17B-A2B, MoE) ou Qwen3-14B servido pelo Ollama. O LLM processa a transcrição e produz um relatório SOAP (Subjective, Objective, Assessment, Plan).
Exportação
O relatório é inserido no LGC (Weda, Medistory, AxiSanté, Doctolib Pro, Maiia) por meio da área de transferência, de um atalho HL7 CDA ou de uma API, se disponível.
i
Por que Whisper-large-v3, e não v3-turbo
Whisper-large-v3-turbo é mais rápido, mas perde 1 a 2 pontos de WER (taxa de erro de palavras) no francês médico e, sobretudo, piora a transcrição de nomes próprios e da posologia. Em contexto clínico, a precisão tem prioridade sobre a velocidade — especialmente porque a consulta já terminou quando se inicia o pipeline.

#Pré-requisitos de hardware e software

GPU
RTX 4070 com 12 GB, no mínimo; RTX 4080 com 16 GB ou RTX 4090 com 24 GB para rodar com folga. Whisper-large-v3 ocupa aproximadamente 3 GB de VRAM; o LLM de 14B em Q4_K_M usa cerca de 9 GB.
Alternativa para Mac
O Mac mini M4 Pro com 48 GB de RAM unificada executa a stack completa. Ideal para um consultório particular: silencioso, com as ventoinhas paradas em repouso, baixo consumo.
Armazenamento
SSD NVMe criptografado com LUKS (Linux), BitLocker (Windows Pro) ou FileVault (macOS). 100 GB são suficientes: modelos ~25 GB, o restante para transcrições temporárias.
Rede
A estação de inferência está em uma VLAN separada do Wi-Fi dos pacientes. Sem acesso de saída à Internet em produção — somente durante atualizações supervisionadas.
Software
Ollama (≥ 0.5) para disponibilizar o LLM em http://localhost:11434, faster-whisper (Python) para a transcrição, ffmpeg para a conversão de áudio.
→
Isolamento progressivo da rede
Comece com uma simples regra de firewall que bloqueie todo o tráfego de saída, exceto para os domínios de atualização (ollama.com, huggingface.co, repositórios da distribuição). Desative a regra apenas durante janelas de manutenção validadas e registradas.

#1. Whisper-large-v3 em consultas em francês

O faster-whisper é um fork baseado no CTranslate2, de 4 a 5 vezes mais rápido que a implementação Python de referência, com a mesma qualidade. Ele aceita os mesmos modelos e oferece uma API simples.

Instalação
python -m venv ~/venv-medtranscript
source ~/venv-medtranscript/bin/activate
pip install faster-whisper==1.1.0 ffmpeg-python

# Téléchargement du modèle (téléchargé une fois, ~3 Go)
python -c "from faster_whisper import WhisperModel; WhisperModel('large-v3', device='cuda', compute_type='float16')"

O código de transcrição em si cabe em poucas linhas. Observe a instrução language='fr', que desativa a detecção automática e evita desvios no início da consulta.

transcribe.py
from faster_whisper import WhisperModel
import sys, pathlib

AUDIO = pathlib.Path(sys.argv[1])
model = WhisperModel('large-v3', device='cuda', compute_type='float16')

segments, info = model.transcribe(
    str(AUDIO),
    language='fr',
    vad_filter=True,             # coupe les silences
    vad_parameters={'min_silence_duration_ms': 500},
    beam_size=5,
    initial_prompt=(
        'Consultation médicale en français. Vocabulaire clinique, '
        'noms de molécules, posologies. Termes courants : doliprane, '
        'amoxicilline, lévothyrox, ECG, IRM, NFS, CRP, HbA1c.'
    ),
)

transcript = '\n'.join(seg.text.strip() for seg in segments)
OUT = AUDIO.with_suffix('.txt')
OUT.write_text(transcript, encoding='utf-8')
print(f'Transcription : {OUT}')
→
O papel do initial_prompt
O Whisper condiciona sua decodificação a esse prompt. Listar vocabulário da área, moléculas comuns e acrônimos biológicos melhora significativamente o reconhecimento — é a versão de baixa complexidade tecnológica de um fine-tuning. Adapte a lista à sua especialidade (cardiologia, pediatria, ginecologia).

Em uma RTX 4080, uma consulta de 15 minutos é transcrita em cerca de 90 segundos. O arquivo de áudio original é excluído imediatamente após a transcrição — a transcrição é suficiente, e o áudio representa um risco desnecessário.

#2. LLM e template SOAP

O relatório SOAP é o padrão de fato: Subjetivo (motivo, queixas do paciente), Objetivo (exame clínico, sinais vitais, exames complementares), Avaliação (diagnóstico ou hipóteses), Plano (prescrições, exames futuros, acompanhamento). Pede-se ao LLM que preencha esse modelo rigorosamente, sem inventar informações.

Escolha do modelo
# Option 1 — Llama 4 Scout (multimodal, 17B MoE, ~10 Go en Q4)
ollama pull llama4:scout

# Option 2 — Qwen3 14B (excellent en français)
ollama pull qwen3:14b

# Option 3 — Mistral Magistral 24B si VRAM ≥ 16 Go
ollama pull magistral:24b

O prompt de sistema impõe regras rígidas: não inventar informações, citar literalmente em caso de incerteza e usar francês com terminologia médica.

system_prompt_soap.txt
Tu es un assistant médical chargé de structurer une transcription
de consultation au format SOAP. Tu écris en français médical clair.

RÈGLES IMPÉRATIVES :
1. N'INVENTE JAMAIS de symptôme, diagnostic, traitement ou posologie
   qui ne figure pas explicitement dans la transcription.
2. En cas d'information ambiguë, écris littéralement :
   "À préciser par le praticien : [extrait textuel de la transcription]".
3. Conserve les unités exactes (mg, mL, fois/jour). Ne convertis rien.
4. Pour toute posologie, cite mot pour mot la phrase d'origine
   entre guillemets dans la section Plan.
5. Ne formule pas de diagnostic définitif si le praticien ne l'a pas
   posé. Utilise "hypothèse diagnostique" ou "à confirmer par...".
6. Garde uniquement ce qui relève de la consultation. Ignore les
   éléments hors propos (conversations annexes, interruptions).

STRUCTURE DE SORTIE (Markdown, exactement ces sections) :

## Subjective
- Motif de consultation :
- Histoire de la maladie actuelle :
- Antécédents pertinents évoqués :
- Traitements en cours évoqués :

## Objective
- Examen clinique :
- Constantes mentionnées :
- Examens complémentaires cités :

## Assessment
- Hypothèse(s) diagnostique(s) :
- Diagnostics différentiels évoqués :

## Plan
- Prescriptions (citer textuellement) :
- Examens complémentaires demandés :
- Conseils donnés au patient :
- Suivi prévu :

À la fin, ajoute une section :

## Points à vérifier par le praticien
Liste des éléments douteux, manquants ou nécessitant validation.
!
Posologia: tolerância zero à invenção
Um erro de dosagem gerado por um LLM pode matar. A regra de citação textual entre aspas não é negociável. Se o modelo reformular uma dose, você tem um problema — troque de modelo ou torne o prompt mais rigoroso.

#3. Pipeline de ponta a ponta

Encadeamos a transcrição e, em seguida, a estruturação por meio da API REST local do Ollama. O script permanece compacto e auditável — cerca de 40 linhas, o que é intencional: menos código, menos superfície de ataque.

pipeline_soap.py
import sys, json, pathlib, requests, hashlib, datetime
from faster_whisper import WhisperModel

AUDIO = pathlib.Path(sys.argv[1])
MODEL_LLM = 'qwen3:14b'
SYS_PROMPT = pathlib.Path('system_prompt_soap.txt').read_text('utf-8')

# --- 1. Transcription locale
whisper = WhisperModel('large-v3', device='cuda', compute_type='float16')
segments, _ = whisper.transcribe(str(AUDIO), language='fr', vad_filter=True)
transcript = '\n'.join(s.text.strip() for s in segments)

# --- 2. Structuration SOAP via Ollama (localhost uniquement)
resp = requests.post(
    'http://localhost:11434/api/chat',
    json={
        'model': MODEL_LLM,
        'messages': [
            {'role': 'system', 'content': SYS_PROMPT},
            {'role': 'user', 'content': transcript},
        ],
        'options': {'temperature': 0.1, 'num_ctx': 8192},
        'stream': False,
    },
    timeout=600,
)
soap = resp.json()['message']['content']

# --- 3. Sortie + hash d'intégrité pour le journal d'audit
ts = datetime.datetime.now().isoformat(timespec='seconds')
sha = hashlib.sha256(soap.encode('utf-8')).hexdigest()[:16]
out = AUDIO.with_suffix('.soap.md')
out.write_text(
    f'<!-- généré le {ts} — modèle {MODEL_LLM} — sha256:{sha} -->\n\n{soap}',
    encoding='utf-8',
)

# --- 4. Effacement immédiat de l'audio et de la transcription brute
AUDIO.unlink()
print(f'Compte-rendu : {out}')
→
Baixa temperatura, contexto generoso
Uma temperatura de 0.1 bloqueia a criatividade — o que é desejável aqui. num_ctx 8192 cobre uma consulta longa sem perda. Se você lidar com casos complexos (psiquiatria, neurologia com anamnese extensa), aumente para 16384 e escolha um modelo cuja janela nativa permita esse valor (o Llama 4 Scout funciona com folga até 256k).

Uma consulta de 15 minutos é processada pelo pipeline completo em menos de 3 minutos em uma RTX 4080. O relatório .soap.md está pronto para ser colado no LGC.

#4. Integração com o software do consultório

Três níveis de integração de acordo com seu LGC:

  1. 01
    Nível 1 — Área de transferência
    O script copia automaticamente o relatório (pyperclip). O profissional cola no LGC em dois cliques. Compatível com 100% dos LGC, sem necessidade de integração por parte do fornecedor do software. É o ponto de partida recomendado.
  2. 02
    Nível 2 — Atalho HL7 CDA
    O relatório em Markdown é convertido em CDA R2 (Clinical Document Architecture) por um script pandoc + template XML e depois importado pela função de import documentaire do LGC. Compatível com Weda, Medistory e AxiSanté, que aceitam CDA.
  3. 03
    Nível 3 — API nativa do LGC
    Alguns fornecedores de software (Doctolib Pro, Maiia) oferecem uma API para inserir observações. O pipeline envia diretamente o relatório para o prontuário do paciente identificado pelo INS. É a opção mais cômoda, mas exige um acordo com o fornecedor e autenticação CPS.
i
Identificador Nacional de Saúde (INS)
Se você automatizar a associação ao paciente correto, use o INS qualificado, e não o número interno do prontuário. É a única chave que continua válida após uma mudança de LGC e que é juridicamente oponível. A obtenção do INS é feita pelo serviço eletrônico INSi.

#Conformidade e registro de auditoria

O uso de uma ferramenta de apoio à redação médica deve ser documentado. No mínimo, três elementos no prontuário do paciente:

Menção à IA de auxílio à redação
Uma linha no rodapé do relatório: "Relatório estruturado assistido por um modelo de IA local (Qwen3-14B, versão 2026-04-12). Validado pelo Dr. [...] em [data]." Essa menção serve para fins de rastreabilidade.
Registro de acessos
Cada execução do pipeline é registrada localmente (quem, quando, qual áudio, qual modelo, hash do relatório). O registro permite apenas acrescentar novas entradas, é assinado e mantido por 10 anos (prazo de conservação do prontuário do paciente).
DPIA do RGPD
Faça uma análise de impacto (artigo 35 do RGPD) para o tratamento "transcrição assistida por IA". O caráter 100% local simplifica a análise: nenhuma transferência para fora da UE, nenhum subcontratado, finalidade única.
Informação ao paciente
O cartaz na sala de espera e a menção no formulário de recepção devem indicar o uso de uma ferramenta de auxílio à transcrição. O paciente pode recusar — preveja um fluxo de trabalho alternativo.
Criptografia em repouso
O disco inteiro é criptografado. Os relatórios são armazenados na pasta do paciente do LGC, não no sistema de arquivos da estação de inferência. Limpe os arquivos .soap.md temporários no fim do dia.
Atualizações supervisionadas
Qualquer atualização de modelo (Whisper, LLM) aciona uma revalidação com um conjunto de 10 consultas de teste anonimizadas. Bug de regressão conhecido = não implantar.
!
Excluir o arquivo ≠ apagamento seguro
Um unlink() remove o inode, mas deixa os blocos recuperáveis em um SSD não criptografado. A criptografia completa do disco (LUKS/FileVault/BitLocker) é o que torna a exclusão irreversível na prática. Não deixe isso de lado.

#Para se aprofundar

Esse pipeline abrange o uso diário de um profissional de saúde autônomo ou de um serviço hospitalar de porte modesto. Três extensões naturais: industrializar a implantação em vários computadores com Docker e um proxy reverso de autenticação CPS, adicionar um RAG local sobre as recomendações da HAS para auxiliar o Assessment e reforçar a segurança da rede até o isolamento completo (air-gap).

Este guia ajudou você?

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