HOWTO · Python
Convertir MP3 a WAV en Python
En este tutorial discutiremos cómo convertir MP3 a WAV en Python
En esta página
Para convertir un archivo MP3 a WAV en Python, usa pydub si prefieres una interfaz de biblioteca sencilla, o llama a ffmpeg si necesitas controlar directamente sus opciones de línea de comandos. Ambos métodos requieren que el ejecutable ffmpeg esté disponible. WAV suele estar sin comprimir y puede ocupar mucho más espacio que MP3; convertir un MP3 con pérdida no recupera los detalles de audio descartados durante la compresión.
Convertir MP3 a WAV con pydub
Instala pydub en el entorno que ejecuta tu script con python -m pip install pydub. También necesitas instalar el ejecutable ffmpeg y tenerlo disponible en tu PATH; instalar pydub no lo incluye. Consulta la guía de ffmpeg para obtener más información. Los pasos de instalación varían según el sistema operativo, así que utiliza el gestor de paquetes o el método de instalación compatible con tu sistema.
En este ejemplo, input.mp3 es el archivo de origen y test.wav el destino. Sustituye esas rutas por las de tus propios archivos. El código comprueba que el archivo de entrada exista antes de importar pydub, por lo que puedes usarlo como plantilla; si el archivo está disponible, lo carga y exporta un WAV.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from pathlib import Path
source_path = Path("input.mp3")
destination_path = Path("test.wav")
if not source_path.is_file():
print(f"Place an MP3 file at {source_path} and run again.")
else:
from pydub import AudioSegment
audio = AudioSegment.from_mp3(str(source_path))
audio.export(str(destination_path), format="wav")
print(f"Created {destination_path}")
Ejecutar ffmpeg directamente para convertir MP3 a WAV
Puedes ejecutar ffmpeg en una terminal sin usar una biblioteca de audio de Python. Comprueba que ffmpeg esté instalado y se pueda invocar por nombre, o indica la ruta completa del ejecutable. El argumento -i especifica el archivo de entrada y el último argumento indica la ruta de salida: ffmpeg -i input.mp3 test.wav.
Este comando supone que input.mp3 está en el directorio actual y escribe test.wav, igual que los ejemplos de Python que aparecen más adelante. Si el archivo de entrada está en otra ubicación, indica la ruta correcta. Es posible que ffmpeg pregunte antes de sobrescribir un archivo de destino existente; elige otro nombre o usa la opción de sobrescritura solo si realmente quieres reemplazar ese archivo.
Usar subprocess para convertir MP3 a WAV en Python
En un script de Python, subprocess.run() puede pasar una lista de argumentos al programa externo ffmpeg. Así evitas construir una cadena de comandos para la shell y permites que Python detecte un estado de proceso distinto de cero. El ejemplo usa el mismo archivo de origen input.mp3 y el destino test.wav que los otros métodos; sustituye ambas rutas por las de tus archivos. Antes de llamar a ffmpeg, comprueba que exista el archivo de origen.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from pathlib import Path
import subprocess
source_path = Path("input.mp3")
destination_path = Path("test.wav")
if not source_path.is_file():
print(f"Place an MP3 file at {source_path} and run again.")
else:
subprocess.run(
["ffmpeg", "-i", str(source_path), str(destination_path)],
check=True,
)
print(f"Created {destination_path}")
Con check=True, Python informa de los errores de conversión en vez de continuar sin avisar. ffmpeg escribe el archivo de audio de destino; subprocess no redirige su salida estándar a ese archivo WAV. En procesos por lotes, captura subprocess.CalledProcessError y registra la ruta del archivo de origen y los detalles del error para poder diagnosticar los fallos.
Verificar el archivo WAV de salida y solucionar problemas comunes
Los tres ejemplos de conversión usan input.mp3 como archivo de origen y test.wav como destino. Si cambiaste el destino en alguno de los ejemplos, asigna esa misma ruta a destination_path más abajo. La comprobación primero confirma que el archivo exista y luego lo abre con el módulo wave de Python para verificar que contenga un archivo WAV legible. Esta comprobación es independiente del archivo WAV sintético que aparece a continuación: ese archivo sirve para probar la inspección de WAV y no convierte un MP3.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from pathlib import Path
import wave
# Match this path to the destination used by the conversion example.
destination_path = Path("test.wav")
if not destination_path.is_file():
print(f"WAV file not found: {destination_path}")
else:
try:
with wave.open(str(destination_path), "rb") as wav_file:
print(
f"WAV: {wav_file.getnchannels()} channel(s), "
f"{wav_file.getframerate()} Hz"
)
except (OSError, wave.Error) as error:
print(f"Could not read WAV file: {error}")
El siguiente ejemplo autónomo crea un pequeño archivo WAV de prueba con la biblioteca estándar de Python y comprueba sus metadatos básicos. Sirve únicamente para mostrar cómo inspeccionar un WAV; no decodifica un MP3.
from pathlib import Path
import tempfile
import wave
with tempfile.TemporaryDirectory() as directory:
output_path = Path(directory) / "test.wav"
with wave.open(str(output_path), "wb") as wav_file:
wav_file.setnchannels(1)
wav_file.setsampwidth(2)
wav_file.setframerate(8000)
wav_file.writeframes(b"\x00\x00" * 800)
with wave.open(str(output_path), "rb") as wav_file:
print(f"WAV: {wav_file.getnchannels()} channel(s), {wav_file.getframerate()} Hz")
Salida:
WAV: 1 channel(s), 8000 Hz
Los valores impresos describen el flujo WAV, no indican si su calidad de sonido es mejor que la del MP3 de origen. Si Python no encuentra ffmpeg, instala el ejecutable o añade su directorio al PATH y luego reinicia la terminal o el proceso que ejecuta Python. Si ffmpeg no puede abrir la entrada, comprueba el nombre del archivo y su ruta relativa al directorio de trabajo del script. Si la conversión falla, revisa los mensajes de diagnóstico de ffmpeg y confirma que se pueda leer el archivo de entrada y escribir en el directorio de destino. Elige pydub si su API más sencilla se adapta al script; usa ffmpeg mediante subprocess si te resulta útil acceder directamente a sus opciones y al estado del proceso.