winsound en Python: audio en Windows

Publicado el: 26/08/2026
Tempo de leitura: 6 minutos
A laptop screen showing a code editor with visible programming code in a dimly lit environment.

El módulo winsound ofrece acceso sencillo a funciones de audio de Windows. Puede reproducir sonidos del sistema, archivos WAV, aliases registrados, loops asíncronos y tonos básicos generados mediante la interfaz del speaker. Resulta útil para notificaciones locales, herramientas administrativas, prototipos, programas educativos y pequeñas utilidades que necesitan feedback audible sin instalar una biblioteca externa.

No es un motor de audio completo. No ofrece mezcla multicanal, reproducción general de MP3, streaming, edición, volumen preciso por sonido ni síntesis de baja latencia. Además, solo está disponible en Windows. Para aplicaciones portables o multimedia avanzada, utiliza una biblioteca dedicada.

Disponibilidad

Protege el import cuando el proyecto también deba funcionar en Linux o macOS.

import sys

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

Una aplicación puede ofrecer una notificación visual cuando el audio no esté disponible. Esto también mejora la accesibilidad y evita que el sonido sea la única indicación de un error.

El primer beep

Beep(frequency, duration) produce un tono con frecuencia en hertz y duración en milisegundos.

import winsound

winsound.Beep(880, 200)

Los límites aceptados dependen de la implementación de Windows. Valores inválidos generan un error. La llamada bloquea mientras se reproduce el tono, así que evita duraciones largas en una GUI o dentro de un loop cerrado.

Crea una secuencia de tonos

Una melodía simple puede representarse mediante pares de frecuencia y duración.

import winsound

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

for frecuencia, duracion in notas:
    winsound.Beep(frecuencia, duracion)

Es apropiado para demostraciones y feedback básico, no para música profesional. El timing, el timbre y la polifonía son limitados.

Sonidos del sistema con MessageBeep

MessageBeep() reproduce un sonido asociado a un evento de Windows. Constantes como MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION y MB_OK identifican categorías conocidas.

import winsound

winsound.MessageBeep(winsound.MB_ICONEXCLAMATION)

El usuario puede haber personalizado o desactivado esos sonidos. No supongas que un evento siempre produce el mismo audio.

PlaySound para archivos y aliases

PlaySound(sound, flags) es la entrada más flexible. El primer argumento identifica un archivo, alias o datos en memoria, mientras las flags indican cómo interpretarlo.

import winsound

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

Usa una raw string para rutas Windows o construye la ruta con pathlib.Path. Comprueba la existencia cuando la aplicación necesite un diagnóstico específico para un archivo ausente.

Archivos WAV

La API está orientada a sonidos compatibles con el mecanismo tradicional de Windows, especialmente WAV. No esperes que un archivo funcione solo porque un reproductor de escritorio puede abrirlo. El formato, codec, canales y parámetros de sample pueden influir.

Para MP3, OGG, FLAC, streaming o reproducción avanzada, elige una biblioteca de audio apropiada.

Aliases del sistema

Con SND_ALIAS, el primer argumento es el nombre de un evento sonoro registrado en Windows.

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

Los aliases pueden variar según la versión, configuración e idioma de Windows. Incluye fallback y evita nombres no documentados.

Reproducción asíncrona

SND_ASYNC inicia la reproducción y vuelve inmediatamente.

winsound.PlaySound(
    "alerta.wav",
    winsound.SND_FILENAME | winsound.SND_ASYNC,
)
print("La aplicación continúa")

La reproducción usa estado compartido del proceso y del sistema. Una llamada posterior puede reemplazar o interrumpir el sonido anterior según las flags y el entorno.

Repite con SND_LOOP

SND_LOOP repite el sonido. Combínalo con reproducción asíncrona para que el programa continúe y pueda detener el loop más adelante.

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

Un loop sin ruta de parada crea una mala experiencia. Ofrece cancelación y detén el audio durante shutdown, excepciones o cambios de pantalla.

Detén un sonido

Una llamada con None detiene la reproducción controlada por PlaySound().

winsound.PlaySound(None, 0)

Usa un bloque finally cuando el sonido sea temporal.

try:
    iniciar_alarma()
    ejecutar_tarea()
finally:
    winsound.PlaySound(None, 0)

No interrumpas un sonido activo

SND_NOSTOP solicita que la llamada falle en lugar de sustituir un sonido que ya se está reproduciendo. Puede servir cuando una notificación secundaria no debe interrumpir una alarma importante.

Trata el fallo como estado normal y no como error fatal.

Controla el fallback

SND_NODEFAULT impide que Windows use un sonido predeterminado cuando no encuentra el solicitado. Sin esta flag, el usuario puede escuchar algo distinto de lo previsto.

Elige conscientemente entre silencio, fallback propio y sonido estándar del sistema.

Datos en memoria

SND_MEMORY permite proporcionar bytes WAV desde memoria.

from pathlib import Path
import winsound

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

Este modo no es compatible con todas las opciones asíncronas. Además mantiene los bytes en memoria mientras son necesarios. Limita tamaño y valida archivos no confiables antes de cargarlos.

Aplicaciones gráficas

Las llamadas síncronas bloquean la thread actual. En una GUI pueden congelar botones, entrada y rendering. Usa reproducción asíncrona o envía una operación corta a un worker controlado, manteniendo cancelación.

No crees una thread ilimitada por cada notificación. Un gestor central puede serializar sonidos, aplicar prioridades y limpiar loops.

Servicios y sesiones no interactivas

Un servicio de Windows, tarea programada, proceso remoto o sesión de background puede no tener un destino de audio interactivo. El usuario esperado quizá nunca escuche el sonido.

Los alertas operativos también deben usar logs, métricas, e-mail o un servicio de notificaciones. El audio local no es un canal fiable de monitorización.

Volumen y preferencias

winsound no expone un control general de volumen por aplicación. El resultado depende del mixer de Windows, dispositivo activo, mute, políticas y preferencias del usuario.

Respeta una opción para desactivar sonidos. No aumentes repetición o duración para compensar silencio.

Accesibilidad

El feedback audible debe estar acompañado por texto, icono, estado visual, vibración u otro canal apropiado. Algunos usuarios no oyen el sonido, trabajan en un entorno compartido o utilizan tecnologías asistivas.

Evita alertas repentinos, muy fuertes o excesivamente largos. Permite probar y configurar el comportamiento.

Seguridad de rutas

No construyas una ruta de audio directamente con entrada no confiable. Restringe assets a un directorio conocido y verifica la ruta resuelta.

from pathlib import Path

base = Path("sonidos").resolve()
candidato = (base / nombre_archivo).resolve()
if base not in candidato.parents:
    raise ValueError("archivo fuera del directorio permitido")

Esto ayuda contra path traversal, aunque permisos y enlaces simbólicos también requieren atención.

Errores y fallbacks

Los fallos suelen aparecer como RuntimeError. Captura la operación de audio, registra contexto útil y continúa solo cuando el sonido sea opcional.

try:
    winsound.PlaySound("alerta.wav", winsound.SND_FILENAME)
except RuntimeError as error:
    registrar_aviso(f"no se pudo reproducir el sonido: {error}")

No silencies el fallo de una alarma que representa una condición crítica. Activa otro canal.

Pruebas

Prueba archivo ausente, WAV inválido, salida silenciada, cambio de dispositivo, sesión remota, servicio, varias notificaciones, shutdown durante un loop, sonidos personalizados y máquinas virtuales.

Los tests unitarios pueden reemplazar la llamada por un mock, pero conserva pruebas manuales en Windows real.

Arquitectura recomendada

Crea una interfaz pequeña como notificar(evento) y permite que un backend Windows use winsound. Otros sistemas pueden usar otro backend o solo feedback visual. Así evitas imports condicionales por toda la aplicación.

Centraliza prioridades, cooldown, repetición y cancelación.

Errores comunes

Los fallos frecuentes son asumir soporte para cualquier formato, bloquear la GUI con reproducción síncrona, iniciar SND_LOOP sin cancelación, depender únicamente de audio, aceptar una ruta no confiable, ignorar preferencias y esperar que un servicio reproduzca sonido en la sesión correcta.

Conclusión

winsound resuelve notificaciones y efectos simples en Windows con muy poco código. Usa MessageBeep() para eventos del sistema, PlaySound() para WAV y aliases y Beep() para tonos básicos.

Ofrece fallback visual, respeta accesibilidad, controla loops y no trates la API como motor multimedia. Consulta la documentación oficial de winsound y lee msvcrt en Python para otras integraciones con Windows.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Rack de servidores que representa el balanceo de conexiones con SO_REUSEPORT_LB en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    SO_REUSEPORT_LB: reparte conexiones entre workers

    Aprende SO_REUSEPORT_LB en Python para distribuir conexiones entre workers con pruebas, portabilidad y cierre ordenado.

    Ler mais

    Tempo de leitura: 5 minutos
    11/10/2026
    Código Python asíncrono en un portátil para inspect.markcoroutinefunction
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    markcoroutinefunction: detecta wrappers async

    Aprende inspect.markcoroutinefunction en Python para identificar wrappers asíncronos, integrar frameworks y evitar detecciones incorrectas.

    Ler mais

    Tempo de leitura: 5 minutos
    10/10/2026
    Código Python para recorrer carpetas y archivos con Path.walk
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    Path.walk: recorre directorios con seguridad

    Aprende Path.walk en Python para recorrer directorios, filtrar archivos, tratar errores y controlar la travesía con seguridad.

    Ler mais

    Tempo de leitura: 5 minutos
    10/10/2026
    Depuración de un proceso Python en terminal con código
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    pdb -p: depura procesos Python en ejecución

    Aprende a conectar pdb a un proceso Python en ejecución, inspeccionar la pila y diagnosticar bloqueos de forma segura.

    Ler mais

    Tempo de leitura: 6 minutos
    09/10/2026
    Código Python para representar fracciones exactas
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    fractions.from_number: convierte números en fracciones

    Aprende fractions.from_number en Python para convertir números en fracciones exactas, controlar precisión, validar entradas y evitar redondeos inesperados.

    Ler mais

    Tempo de leitura: 4 minutos
    09/10/2026
    Desarrollador configurando un servidor HTTPS y certificado TLS con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    HTTPSServer: crea un servidor HTTPS local en Python

    Aprende HTTPSServer en Python para crear servicios HTTPS locales, configurar certificados, usar hilos y comprender sus límites.

    Ler mais

    Tempo de leitura: 4 minutos
    08/10/2026