Codificación - Colab PDF
Document Details
Uploaded by ChivalrousPlutonium8456
Universidad Politécnica de Madrid
Tags
Summary
This document provides Python code for audio processing tasks, including creating and analyzing spectrogram. The code utilizes libraries such as pydub, librosa, matplotlib, and numpy to perform audio compression and visualization operations. It features audio signal analysis and compression methods in Python.
Full Transcript
16/12/24 11:41 codificación - Colab !pip install pydub Collecting pydub Downloading pydub-0.25.1-py2.py3-none-any.whl.metadata (1.4 kB) Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)...
16/12/24 11:41 codificación - Colab !pip install pydub Collecting pydub Downloading pydub-0.25.1-py2.py3-none-any.whl.metadata (1.4 kB) Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB) Installing collected packages: pydub Successfully installed pydub-0.25.1 import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np from pydub import AudioSegment import os import IPython.display as ipd import soundfile as sf from scipy.signal import windows def generar_tonos_enmascaramiento(frecuencia_mascarante, frecuencia_enmascarada, sr, duracion, amplitud_ t = np.linspace(0, duracion, int(sr*duracion), endpoint=False) tono_mascarante = amplitud_mascarante * np.sin(2 * np.pi * frecuencia_mascarante * t) tono_enmascarado = amplitud_enmascarada * np.sin(2 * np.pi * frecuencia_enmascarada * t) señal = tono_mascarante + tono_enmascarado return señal # Función para demostrar el efecto de enmascaramiento def demo_enmascaramiento(frecuencia_base=440, desfase=5): sr = 44100 # Tasa de muestreo duracion = 2.0 # Duración en segundos frecuencia_mascarante = frecuencia_base # Frecuencia en Hz frecuencia_enmascarada = frecuencia_base + desfase # Frecuencia cercana amplitud_mascarante = 1.0 amplitud_enmascarada = 0.1 # Generación de la señal señal = generar_tonos_enmascaramiento(frecuencia_mascarante, frecuencia_enmascarada, sr, duracion, a # Reproducción de la señal print("Señal con enmascaramiento:") ipd.display(ipd.Audio(señal, rate=sr)) # Visualización del espectro plt.figure(figsize=(14, 5)) S = np.abs(librosa.stft(señal, n_fft=32000, hop_length=512)) S_db = librosa.amplitude_to_db(S, ref=np.max) librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='log') plt.colorbar(format='%+2.0f dB') plt.title('Espectrograma de la Señal con Enmascaramiento') plt.show() demo_enmascaramiento(frecuencia_base=440, desfase=5) https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 1/7 16/12/24 11:41 codificación - Colab Señal con enmascaramiento: 0:02 / 0:02 # Cargar el archivo WAV y, sr = librosa.load("summertime.wav", sr=44100) # Mostrar el espectrograma original plt.figure(figsize=(10, 4)) librosa.display.specshow(librosa.amplitude_to_db(np.abs(librosa.stft(y, n_fft=4096, hop_length=512)), ref= sr=sr, x_axis='time', y_axis='log') plt.colorbar(format='%+2.0f dB') plt.title('Espectrograma del archivo original') plt.xlabel('Tiempo (s)') plt.ylabel('Frecuencia (Hz)') plt.show() audio = AudioSegment.from_file("summertime.wav") # Crear diferentes versiones comprimidas audio.export("audio_320kbps.mp3", format="mp3", bitrate="320k") audio.export("audio_128kbps.mp3", format="mp3", bitrate="128k") audio.export("audio_64kbps.mp3", format="mp3", bitrate="64k") audio.export("audio_32kbps.mp3", format="mp3", bitrate="32k") https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 2/7 16/12/24 11:41 codificación - Colab # Mostrar tamaños de archivo print("Tamaños de archivo:") print(f"Original: {os.path.getsize('summertime.wav') / 1024:.2f} KB") ipd.display(ipd.Audio("summertime.wav", rate=sr)) print(f"320 kbps: {os.path.getsize('audio_320kbps.mp3') / 1024:.2f} KB") ipd.display(ipd.Audio("audio_320kbps.mp3", rate=sr)) print(f"128 kbps: {os.path.getsize('audio_128kbps.mp3') / 1024:.2f} KB") ipd.display(ipd.Audio("audio_128kbps.mp3", rate=sr)) print(f"64 kbps: {os.path.getsize('audio_64kbps.mp3') / 1024:.2f} KB") ipd.display(ipd.Audio("audio_64kbps.mp3", rate=sr)) print(f"32 kbps: {os.path.getsize('audio_32kbps.mp3') / 1024:.2f} KB") ipd.display(ipd.Audio("audio_32kbps.mp3", rate=sr)) Tamaños de archivo: Original: 2383.30 KB 0:00 / 0:13 320 kbps: 542.90 KB 0:00 / 0:13 128 kbps: 217.19 KB 0:00 / 0:13 64 kbps: 108.61 KB 0:00 / 0:13 32 kbps: 54.43 KB 0:00 / 0:13 # Cargar y analizar archivos comprimidos def plot_compressed_spectrogram(filename, title): compressed_y, _ = librosa.load(filename, sr=sr) plt.figure(figsize=(10, 4)) librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(np.abs(compressed_y), n_fft=4096, hop_le sr=sr, x_axis='time', y_axis='log') plt.colorbar(format='%+2.0f dB') plt.title(title) plt.xlabel('Tiempo (s)') plt.ylabel('Frecuencia (Hz)') plt.show() # Espectrogramas de los archivos comprimidos plot_compressed_spectrogram("audio_320kbps.mp3", "Espectrograma - MP3 320 kbps") plot_compressed_spectrogram("audio_128kbps.mp3", "Espectrograma - MP3 128 kbps") plot_compressed_spectrogram("audio_64kbps.mp3", "Espectrograma - MP3 64 kbps") plot_compressed_spectrogram("audio_32kbps.mp3", "Espectrograma - MP3 32 kbps") https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 3/7 16/12/24 11:41 codificación - Colab :5: UserWarning: amplitude_to_db was called on complex input so phase librosa.display.specshow(librosa.amplitude_to_db(librosa.stft(np.abs(compressed_y), n_fft=4096, h https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 4/7 16/12/24 11:41 codificación - Colab # Función para simular el preeco def demo_preeco(peso_umbral=0.5): import numpy as np import matplotlib.pyplot as plt import IPython.display as ipd from scipy.signal import windows from scipy.fftpack import dct, idct sr = 44100 # Tasa de muestreo duracion = 1.0 # Duración en segundos t = np.linspace(0, duracion, int(sr*duracion), endpoint=False) # Generación de un pulso corto (transitorio) pulso = np.zeros_like(t) inicio_pulso = int(0.5 * sr) duracion_pulso = int(0.005 * sr) # Pulso de 1 ms pulso[inicio_pulso:inicio_pulso+duracion_pulso] = 1.0 # Aplicación de ventana para suavizar el pulso ventana = windows.hann(duracion_pulso*2)[:duracion_pulso] pulso[inicio_pulso:inicio_pulso+duracion_pulso] *= ventana # Simulación de compresión con transformada de coseno discreta (DCT) bloque_tamaño = 1024 señal_comprimida = np.zeros_like(pulso) for i in range(0, len(pulso), bloque_tamaño): bloque = pulso[i:i+bloque_tamaño] if len(bloque) < bloque_tamaño: bloque = np.pad(bloque, (0, bloque_tamaño - len(bloque)), 'constant') bloque_dct = dct(bloque, norm='ortho') # Cuantización simulada (eliminando coeficientes pequeños) umbral = peso_umbral * np.max(np.abs(bloque_dct)) # Aumentar el umbral para más preeco bloque_dct_cuantizado = np.where(np.abs(bloque_dct) > umbral, bloque_dct, 0) bloque_recuperado = idct(bloque_dct_cuantizado, norm='ortho') señal_comprimida[i:i+bloque_tamaño] = bloque_recuperado[:min(bloque_tamaño, len(pulso)-i)] # Reproducción del pulso original y comprimido print("Pulso Original:") ipd.display(ipd.Audio(pulso, rate=sr)) print("Pulso Después de la Compresión (con preeco):") ipd.display(ipd.Audio(señal_comprimida, rate=sr)) # Visualización de las señales en el dominio temporal plt.figure(figsize=(14, 5)) plt.plot(t, pulso, label='Original') plt.plot(t, señal_comprimida, label='Comprimido', alpha=0.7) plt.xlim(0.49, 0.51) # Zoom en el área del pulso plt.legend() plt.title('Señal Original vs Comprimida (Preeco)') plt.xlabel('Tiempo (s)') plt.ylabel('Amplitud') https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 5/7 16/12/24 11:41 codificación - Colab plt.show() demo_preeco(peso_umbral=0.9) # peso_umbral debe estar entre 0 y 1 Pulso Original: 0:01 / 0:01 Pulso Después de la Compresión (con preeco): 0:01 / 0:01 # Función para cargar y reproducir un archivo de audio def cargar_audio(ruta_audio): audio, sr = librosa.load(ruta_audio, sr=None) return audio, sr # Función para aplicar cuantización al audio def cuantizar_audio(audio, bits): # Normalización audio_norm = audio / np.max(np.abs(audio)) # Cuantización niveles = 2 ** bits audio_cuantizado = np.round(audio_norm * (niveles / 2 - 1)) / (niveles / 2 - 1) # Desnormalización audio_cuantizado = audio_cuantizado * np.max(np.abs(audio)) return audio_cuantizado # Función para visualizar la señal original y cuantizada def mostrar_cuantizacion(audio_original, audio_cuantizado, sr, bits): tiempo = np.linspace(0, len(audio_original) / sr, num=len(audio_original)) plt.figure(figsize=(14, 5)) plt.plot(tiempo, audio_original, label='Original', alpha=0.7) plt.plot(tiempo, audio_cuantizado, label=f'Cuantizado a {bits} bits', alpha=0.7) plt.xlim(1, 1.02) # Zoom en los primeros 20 ms plt.ylim(-0.2, 0.2) plt.legend() plt.title(f'Señal Original vs Cuantizada a {bits} bits') plt.xlabel('Tiempo (s)') plt.ylabel('Amplitud') plt.show() # Función para mostrar el espectrograma de banda estrecha def mostrar_espectrograma_banda_estrecha(audio, sr, titulo): plt.figure(figsize=(14, 5)) n_fft = 4096 # FFT largo para mayor resolución frecuencial hop_length = 512 S = np.abs(librosa.stft(audio, n fft=n fft, hop length=hop length)) https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 6/7 16/12/24 11:41 codificación - Colab p ( ( , _ _ , p_ g p_ g )) S_db = librosa.amplitude_to_db(S, ref=np.max) librosa.display.specshow(S_db, sr=sr, hop_length=hop_length, x_axis='time', y_axis='hz') plt.colorbar(format='%+2.0f dB') plt.title(titulo) plt.xlabel('Tiempo (s)') plt.ylabel('Frecuencia (Hz)') plt.show() # Carga del audio original audio, sr = cargar_audio('summertime.wav') # Reproducción del audio original print("Audio Original:") ipd.display(ipd.Audio(audio, rate=sr)) # Lista de bits para cuantización bits_list = [16, 8, 6, 4] # Aplicación de cuantización y visualización for bits in bits_list: audio_cuantizado = cuantizar_audio(audio, bits) print(f"\nAudio Cuantizado a {bits} bits:") ipd.display(ipd.Audio(audio_cuantizado, rate=sr)) # Visualización de la señal original y cuantizada mostrar_cuantizacion(audio, audio_cuantizado, sr, bits) # Mostrar espectrograma de banda estrecha mostrar_espectrograma_banda_estrecha(audio_cuantizado, sr, f'Espectrograma Cuantizado a {bits} bits') # Actividad para los participantes print("\nActividad:") print("Prueben a cuantizar el audio con diferentes números de bits y observen cómo afecta a la calidad y a print("También pueden cambiar los formatos y las tasas de bits al guardar el audio para comparar resultado https://colab.research.google.com/drive/11HBaiVNEYgbW-NtNs4Evpqpjy7Y9RWd1#scrollTo=4_sWm_uDzxwA&printMode=true 7/7