Tiempo de lectura: 3 minutos, 26 segundos En la segunda parte de la serie, les presentaré una implementación del método de modificación de melodía que describí en la primera parte. Disponible aquí. En primer lugar, necesitamos tener una muestra de sonido sobre la que trabajar. Afortunadamente, librosa nos proporciona muestras de sonido interesantes. Echemos un vistazo al ejemplo del diagrama STFT de la parte I. Código: import librosa from librosa import display import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots() y, sr = librosa.load(librosa. ex(‘trompeta’)) stft_absolute_values = np.abs(librosa.stft(y)) img = display.specshow(librosa.amplitude_to_db(stft_absolute_values, ref=np.max), y_axis=»log», x_axis=»time» , ax=ax) ax.set_title(‘Espectrograma de potencia’) fig.colorbar(img, ax=ax, format=»%+2.0f dB») plt.show() Fig. 1. Espectrograma STFT de muestra de ‘trompeta’ de librosa Podemos ver claramente cómo la melodía cambia a través del tiempo, pero la computadora no sabe qué contenedores de frecuencia contienen nuestra información de frecuencia F0. Usaremos la implementación del algoritmo pYIN proporcionada por librosa. Ahora agreguemos el resultado del cálculo F0 al gráfico. Fig. 2. La línea cian muestra cómo cambia la melodía a lo largo del tiempo import librosa from librosa import display import matplotlib.pyplot as plt import librosa.display import numpy as np n_fft = 4096 hop_length = 512 fig, ax = plt.subplots() muestras, sr = librosa.load(librosa.ex(‘trumpet’)) stft_absolute_values = np.abs(librosa.stft(samples)) img = display.specshow(librosa.amplitude_to_db(stft_absolute_values, ref=np.max), y_axis =»log», x_axis=»time», ax=ax) ax.set_title(‘Espectrograma de potencia’) fig.colorbar(img, ax=ax, format=»%+2.0f dB») // agregar f0 gráfico f0 , voiced_flag_t, voiced_probs_t = librosa.pyin(samples, fmin=librosa.note_to_hz(‘C2’), fmax=librosa.note_to_hz(‘C7’), sr=sr, hop_length=hop_length, frame_length=n_fft, pad_mode=»constante» , center=True) f0_times = librosa.times_like(f0) ax.plot(f0_times, f0, label=»f0″, color=»cyan», linewidth=2) plt.show() ¡Vamos a transformarnos! Ahora podemos aplicar algunos cambios a la melodía de la trompeta. Como dije en esta y en la primera parte, necesitamos mover todos los contenedores de frecuencia desde un cierto momento hacia arriba para que su tono suba y la melodía suene más alto en ese momento. De hecho, nuestro espectrograma representa una matriz de valores donde el eje horizontal describe intervalos de tiempo y el eje vertical describe intervalos de frecuencia. Fig. 3. Matriz de potencia sonora (dB) Todo lo que tenemos que hacer es girar una columna (o varias columnas en determinados momentos) n veces hacia arriba o hacia abajo para cambiar la melodía. Luego aplique la inversión de STFT para obtener el sonido transformado. Aquí está el código para el desplazamiento de columnas. Es bastante sencillo, así que échale un vistazo: def _roll_column(two_d_array, column, shift): two_d_array[:, column] = np.roll(dos_d_array[:, column]shift) return two_d_array Ahora usémoslo para modificar la melodía. Estoy aplicando el cambio a algunas columnas de la matriz de melodía de trompeta. Vea el código y cómo ha cambiado la trama después. Estoy aplicando una mezcla aleatoria a los intervalos de tiempo en el rango de 50 a 90 usando el siguiente código: img_modified = display.specshow(librosa.amplitude_to_db(stft_absolute_values_modified, ref=np.max), y_axis=»log», x_axis=»time», ax=ax) ax.set_title(‘Espectrograma de potencia’) fig.colorbar(img_modified, ax=ax, format=»%+2.0f dB») plt.show() Así es como se ve el espectrograma después de la transformación: Fig. 3. Frecuencias transformadas aleatoriamente Fig. 4 Datos originales Podemos ver que las frecuencias se han movido aleatoriamente hacia arriba/abajo en relación con los datos originales. Parece prometedor, pero el cambio en la melodía fue aleatorio y no sonaría bien. Es cierto, pero ahora tenemos una herramienta que abre un amplio espectro de posibilidades para modificar melodías que pueden sonar realmente interesantes. En la siguiente parte vamos a aumentar el tono de toda la pista, cambiar la melodía del habla humana y, por supuesto, reproducir el sonido (lo cual no sucedió en este artículo, sí, lo sé, solo ten paciencia :)). Espero que les haya gustado. En caso de cualquier pregunta y/o comentario, ¡no dudes en comentar o comunicarte conmigo! Feliz 1 100 % Triste 0 0 % Emocionado 0 0 % Sueño 0 0 % Enojado 0 0 % Sorpresa 0 0 %