winsound no Python: sons no Windows

Publicado em: 26/08/2026
Tempo de leitura: 7 minutos
Striking image of a red-bellied python showcasing its vibrant scales in dramatic lighting.

O módulo winsound oferece acesso simples a recursos de áudio do Windows. Ele pode reproduzir sons do sistema, arquivos WAV, aliases registrados, sequências assíncronas e tons básicos gerados pelo speaker. É útil para notificações locais, ferramentas administrativas, protótipos, aplicações educacionais e pequenos programas que precisam de feedback sonoro sem instalar uma biblioteca externa.

Ele não é um motor de áudio completo. Não oferece mixagem multicanal, reprodução geral de MP3, streaming, edição, controle preciso de volume ou baixa latência. Além disso, está disponível apenas no Windows. Para aplicações portáveis ou multimídia avançada, use uma biblioteca dedicada.

Disponibilidade

Proteja o import quando o mesmo projeto também precisa funcionar em Linux ou macOS.

import sys

if sys.platform == "win32":
    import winsound
else:
    winsound = None

Uma aplicação pode oferecer notificações visuais quando o áudio não estiver disponível. Isso também melhora acessibilidade e evita que um som seja a única forma de comunicar um erro.

O primeiro beep

Beep(frequency, duration) produz um tom com frequência em hertz e duração em milissegundos.

import winsound

winsound.Beep(880, 200)

Os limites aceitos dependem da implementação do Windows. Valores inválidos geram erro. O beep bloqueia enquanto o tom é executado, portanto não deve ser usado em loops apertados ou na thread principal de uma interface gráfica quando a duração for longa.

Crie uma sequência de tons

Uma melodia simples pode ser representada por pares de frequência e duração.

import winsound

notas = [
    (523, 150),
    (659, 150),
    (784, 250),
]

for frequencia, duracao in notas:
    winsound.Beep(frequencia, duracao)

Isso é adequado para demonstrações, não para música profissional. Timing, timbre e polifonia são limitados.

Sons do sistema com MessageBeep

MessageBeep() reproduz um som associado a eventos do Windows. Constantes como MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION e MB_OK indicam categorias conhecidas.

import winsound

winsound.MessageBeep(winsound.MB_ICONEXCLAMATION)

O usuário pode ter personalizado ou desativado esses sons. Não presuma que um evento sempre produzirá o mesmo áudio.

PlaySound para arquivos e aliases

PlaySound(sound, flags) é a função mais flexível. O primeiro argumento identifica um arquivo, um alias ou dados em memória, e as flags definem como interpretá-lo.

import winsound

winsound.PlaySound(
    r"C:\Windows\Media\notify.wav",
    winsound.SND_FILENAME,
)

Use uma string raw para caminhos Windows ou construa o caminho com pathlib.Path. Verifique a existência do arquivo antes da reprodução quando a ausência exigir uma mensagem específica.

Arquivos WAV

A API é orientada a sons compatíveis com o mecanismo tradicional do Windows, principalmente WAV. Não espere que um arquivo seja aceito apenas porque um player comum consegue abri-lo. Formato, codec, canais e parâmetros podem influenciar a compatibilidade.

Para MP3, OGG, FLAC ou streaming, escolha uma biblioteca de áudio apropriada.

Aliases do sistema

Com SND_ALIAS, o primeiro argumento é o nome de um evento sonoro registrado no Windows.

winsound.PlaySound(
    "SystemAsterisk",
    winsound.SND_ALIAS,
)

Aliases podem variar entre versões, configurações e idiomas. Tenha fallback e não dependa de um alias não documentado.

Reprodução assíncrona

SND_ASYNC inicia o som e retorna imediatamente.

winsound.PlaySound(
    "alerta.wav",
    winsound.SND_FILENAME | winsound.SND_ASYNC,
)
print("A aplicação continua")

A reprodução usa recursos globais do processo e do sistema. Um segundo som pode interromper ou substituir o anterior dependendo das flags e do ambiente.

Repetição com SND_LOOP

SND_LOOP repete o som. Ele deve ser combinado com reprodução assíncrona para que o programa consiga continuar e posteriormente interromper o loop.

winsound.PlaySound(
    "alarme.wav",
    winsound.SND_FILENAME | winsound.SND_ASYNC | winsound.SND_LOOP,
)

Um loop sem caminho de parada é uma experiência ruim. Sempre ofereça cancelamento e pare o som durante shutdown, exceção ou troca de tela.

Pare um som

Uma chamada com None interrompe a reprodução controlada por PlaySound().

winsound.PlaySound(None, 0)

Coloque a parada em um bloco finally quando o som for temporário.

try:
    iniciar_alarme()
    executar_tarefa()
finally:
    winsound.PlaySound(None, 0)

Não interrompa outro som

SND_NOSTOP pede para a chamada falhar em vez de interromper um som já ativo. Isso pode ser útil quando notificações secundárias não devem substituir um alarme importante.

Trate a falha como estado normal, não como exceção fatal da aplicação.

Fallback quando o som não existe

SND_NODEFAULT impede que o Windows use um som padrão quando o som solicitado não é encontrado. Sem essa flag, a aplicação pode tocar algo diferente do esperado.

Escolha conscientemente entre silêncio, fallback próprio e som padrão do sistema.

Dados em memória

SND_MEMORY permite fornecer bytes de um WAV em memória.

from pathlib import Path
import winsound

dados = Path("alerta.wav").read_bytes()
winsound.PlaySound(dados, winsound.SND_MEMORY)

Esse modo não combina com todas as opções assíncronas. Também mantém os bytes na memória durante a reprodução. Limite o tamanho e não carregue arquivos não confiáveis sem validação.

Aplicações gráficas

Chamadas síncronas bloqueiam a thread atual. Em uma GUI, isso pode congelar botões e rendering. Use reprodução assíncrona ou despache a chamada para uma thread curta, mantendo o controle de cancelamento.

Não crie uma nova thread ilimitada para cada notificação. Um gerenciador de áudio central evita sobreposição e vazamento de recursos.

Serviços e sessões sem desktop

Um serviço Windows, tarefa agendada ou processo remoto pode não possuir sessão de áudio interativa. A chamada pode não ser ouvida pelo usuário esperado.

Para alertas operacionais, use também logs, e-mail, métricas ou notificações do sistema. Som local não é um canal confiável de monitoramento.

Volume e preferências

winsound não oferece um controle de volume por aplicação. O resultado depende do mixer, dispositivo ativo, políticas, modo silencioso e preferências do usuário.

Respeite uma opção para desativar sons. Não aumente volume nem repita alertas agressivamente para compensar silêncio.

Acessibilidade

Feedback sonoro deve ser acompanhado por texto, cor, ícone, vibração ou outro canal apropriado. Usuários podem não ouvir o som, estar em ambiente compartilhado ou usar tecnologias assistivas.

Também evite tons repentinos e muito longos. Permita testar a notificação e ajustar a preferência.

Segurança de caminhos

Não monte um caminho de áudio diretamente com entrada não confiável. Restrinja arquivos a um diretório conhecido e valide a resolução final.

from pathlib import Path

base = Path("sons").resolve()
candidato = (base / nome_arquivo).resolve()
if base not in candidato.parents:
    raise ValueError("arquivo fora do diretório permitido")

Essa validação ajuda a evitar path traversal, mas permissões e symlinks também precisam ser considerados.

Erros e fallback

Falhas normalmente aparecem como RuntimeError. Capture a operação de áudio, registre contexto e continue somente quando o som for opcional.

try:
    winsound.PlaySound("alerta.wav", winsound.SND_FILENAME)
except RuntimeError as erro:
    registrar_aviso(f"não foi possível tocar o som: {erro}")

Não esconda problemas em um alarme que representa condição crítica. Nesse caso, acione outro canal.

Teste

Teste com o arquivo ausente, WAV inválido, saída de áudio desativada, dispositivo trocado, sessão remota, serviço, várias notificações, shutdown durante loop, usuário com sons do sistema personalizados e reprodução em máquina virtual.

Testes unitários podem substituir a chamada por um mock, mas mantenha testes manuais no Windows real.

Arquitetura recomendada

Crie uma interface pequena, como notificar(evento), e deixe um backend Windows usar winsound. Outros sistemas podem usar outro backend ou apenas log visual. Isso evita espalhar imports condicionais por toda a aplicação.

Centralize prioridades, cooldown, repetição e cancelamento.

Erros comuns

Os erros mais frequentes são presumir suporte a qualquer formato, bloquear a GUI com reprodução síncrona, iniciar SND_LOOP sem cancelamento, depender apenas de áudio, usar caminho não confiável, ignorar preferências do usuário e esperar que serviços reproduzam som na sessão correta.

Conclusão

winsound resolve notificações e efeitos simples no Windows com poucas linhas. Use MessageBeep() para eventos do sistema, PlaySound() para WAV e aliases e Beep() para tons básicos.

Mantenha fallback visual, respeite acessibilidade, controle loops e não trate essa API como motor multimídia. Consulte a documentação oficial de winsound e veja msvcrt no Python para outras integrações com Windows.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Rack de servidores representando balanceamento de conexões com SO_REUSEPORT_LB no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    SO_REUSEPORT_LB: distribua conexões entre workers

    Aprenda SO_REUSEPORT_LB no Python para distribuir conexões entre múltiplos workers com segurança, testes e portabilidade.

    Ler mais

    Tempo de leitura: 6 minutos
    11/10/2026
    Código Python assíncrono em notebook para inspect.markcoroutinefunction
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    markcoroutinefunction: identifique wrappers async

    Aprenda inspect.markcoroutinefunction no Python para identificar wrappers assíncronos, integrar frameworks e evitar detecção incorreta de corrotinas.

    Ler mais

    Tempo de leitura: 6 minutos
    10/10/2026
    Código Python para percorrer pastas e arquivos com Path.walk
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    Path.walk: percorra diretórios com segurança

    Aprenda Path.walk no Python para percorrer diretórios, filtrar arquivos, tratar erros e controlar a travessia com segurança.

    Ler mais

    Tempo de leitura: 6 minutos
    10/10/2026
    Depuração de processo Python em terminal com código
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pdb -p: depure processos Python em execução

    Aprenda a anexar o pdb a um processo Python em execução, inspecionar pilhas e diagnosticar travamentos com segurança.

    Ler mais

    Tempo de leitura: 6 minutos
    09/10/2026
    Código Python e representação de frações numéricas
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    fractions.from_number: converta números em frações

    Aprenda fractions.from_number no Python para converter números em frações exatas, controlar precisão e evitar arredondamentos inesperados.

    Ler mais

    Tempo de leitura: 5 minutos
    09/10/2026
    Desenvolvedor configurando servidor HTTPS e certificado TLS com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    HTTPSServer: crie servidor HTTPS local no Python

    Aprenda HTTPSServer no Python para servir HTTPS localmente, configurar certificados, usar threads e entender limites de segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    08/10/2026