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

    Close-up view of a computer screen displaying code in a software development environment.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    winreg no Python: Registro do Windows

    Aprenda winreg no Python para ler e gravar o Registro do Windows, controlar permissões, tipos, WOW64, exclusões e segurança.

    Ler mais

    Tempo de leitura: 6 minutos
    26/08/2026
    Macro shot capturing detailed patterns of a python in its natural surroundings.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    posix no Python: chamadas Unix diretas

    Entenda posix no Python, chamadas Unix, descritores, permissões, processos, segurança e quando usar os em vez do módulo direto.

    Ler mais

    Tempo de leitura: 7 minutos
    26/08/2026
    A male software engineer working on code in a modern office setting.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    curses no Python: interfaces no terminal

    Aprenda curses no Python para criar interfaces de terminal com janelas, cores, teclado, resize, Unicode e cleanup seguro.

    Ler mais

    Tempo de leitura: 7 minutos
    26/08/2026
    Detailed close-up of a reticulated python showcasing intricate scales and piercing eyes.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    grp no Python: consulte grupos Unix

    Aprenda grp no Python para consultar grupos Unix, GIDs, membros, ownership e grupos suplementares com NSS e containers.

    Ler mais

    Tempo de leitura: 6 minutos
    26/08/2026
    A person typing on a laptop with a Python programming book visible, capturing technology and learning.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pwd no Python: consulte usuários Unix

    Aprenda pwd no Python para consultar usuários Unix por UID ou login, obter home, shell e ownership sem usar a

    Ler mais

    Tempo de leitura: 6 minutos
    26/08/2026
    Close-up view of freshly cut log slices stacked for wood storage, showing natural texture.
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    syslog no Python: envie logs ao sistema

    Aprenda syslog no Python para enviar logs Unix com prioridades, facilities, máscaras, conteúdo estruturado e proteção contra log injection.

    Ler mais

    Tempo de leitura: 6 minutos
    26/08/2026