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 %
Etiqueta: procesamiento de la señal
Tiempo de lectura: 5 minutos, 5 segundos A partir de este artículo, presentaré una serie sobre un tema original (al menos para mí y para este blog). En primer lugar por el lenguaje de programación que estoy usando para mostrar mi idea y en segundo lugar por el tema: modificación de melodías, o para ser más precisos, procesamiento de sonido usando el lenguaje Python. Ya escribí una tesis sobre este tema en mi idioma nativo (polaco), por lo que decidí comenzar esta serie para que la audiencia mundial pueda aprender sobre ello. Teoría En primer lugar, debemos introducir algunos conceptos clave para poder transformarlos en una aplicación funcional. Necesitamos comprender los dominios que son el procesamiento de sonido y señales. Sonido Todo sonido que podemos escuchar puede ser en realidad una onda que se propaga por el aire. Es un cambio en la presión del aire a lo largo del tiempo. Fig. 1, Por Rburtonresearch – Trabajo propio, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45035734 Esos cambios de presión y amplitudes se pueden medir y guardar como un archivo para el ordenador (como un archivo WAVE, por ejemplo). El archivo WAVE contiene información clara sobre las amplitudes. Procesamiento de señales FT y FFT Ok, ya hemos hojeado el tema, pero ¿cómo encontrar qué frecuencia estamos escuchando en un momento particular? Necesitamos utilizar un método brillante llamado Transformada de Fourier (FT) o, para ser más precisos, su versión de algoritmo adaptada a computadora llamada Transformada Rápida de Fourier (FFT). Una versión ingenua de este algoritmo (FT) es realmente ineficaz y tomaría demasiado tiempo procesar datos de sonido, así que ahí es donde entra en juego la FFT. Sin embargo, la historia de FT y FFT es una gran idea para un artículo diferente. Gracias a wiki podemos visualizar la idea de FT en gráficos. Fig 2. Función y su La primera figura muestra un gráfico de amplitud en el tiempo ya conocido para la función: este último presenta el resultado del operador Transformada de Fourier (matemáticamente hablando, FT es un operador lineal) aplicado a la entrada de muestra que se muestra en el primer gráfico. Como resultado obtenemos frecuencias que forman la onda de entrada y su potencia en dB. STFT Tenemos frecuencias de toda la muestra pero aún no sabemos qué frecuencia (nota) tiene el sonido en un determinado momento. Para ese problema, tenemos que utilizar otro método brillante con un acrónimo genial Short Time Fourier Transform (STFT). STFT nos permite calcular la frecuencia y su potencia en dB en un momento determinado. Una nota, por ejemplo un sonido C7, es una onda sonora que tiene una frecuencia de 2093,00 Hz. La tabla disponible en https://pages.mtu.edu/~suits/notefreqs.html muestra las frecuencias de la mayoría de las notas sonoras que el oído humano puede oír. ¡La conclusión es que tener un valor de frecuencia y su potencia en un determinado momento nos permite reproducir la melodía de toda la muestra! Fig. 3, Resultado de STFT en una muestra de voz humana: análisis espectral La figura anterior muestra el resultado de STFT aplicado a la muestra de sonido: un análisis espectral. (es una muestra diferente, no la misma ola que en las dos figuras anteriores). La línea verde, etiquetada como F0, es un gráfico de la melodía calculada por el algoritmo pYIN. Modificando las frecuencias en determinados momentos podemos cambiar la melodía. Entonces sólo necesitamos usar iSTFT (operación inversa) para adquirir sonido modificado. Frecuencia fundamental Una última pieza de teoría. ¿Cuál es la frecuencia fundamental etiquetada como F0? Según wikipedia, «lo fundamental es el tono musical de una nota que se percibe como el presente parcial más bajo». El tono se puede asignar a la frecuencia en nuestros términos. Mirando la Fig. 3 podemos ver el área más brillante que abarca desde aproximadamente 0,06 a 0,36 s. – el mismo que ha sido marcado con línea azul. Esta es la frecuencia más baja de todos los armónicos en un momento determinado. Todos los armónicos más altos (F1, F2) también se pueden ver en la figura como franjas más brillantes (mayor potencia en dB) en frecuencias más altas. Implementación Hay mucha teoría detrás de este concepto. Afortunadamente, tenemos una maravillosa biblioteca de Python que hace los cálculos por nosotros para que podamos centrarnos en nuestra idea en lugar de implementarla a mano (aunque eso también sería divertido). librosa es una rica biblioteca para análisis de música y audio. Sólo necesitamos obtener Python, instalarlo, luego obtener librosa e instalarlo también. Estoy usando PyCharm de JetBrains, lo que hace que sea bastante fácil de hacer, pero puedes elegir tu IDE favorito. PyCharm Una vez que haya adquirido PyCharm, vaya a Archivo -> Configuración. Luego elija el intérprete de Python y haga clic en el signo «más». Escribe ‘librosa’ y elige la última versión (0.8.0 en el momento de escribir esto). Haga clic en Instalar paquete, luego en Aceptar, espere a que se instale y estará listo. Otras bibliotecas que deben instalarse para mostrar un gráfico son ‘matplotlib’ y ‘numpy’. Repita los pasos anteriores e instale la versión más reciente. Probando librosa Cree un nuevo archivo .py y escriba el código a continuación. importar librosafrom librosa importar displayimport matplotlib.pyplot como pltimport numpy como npfig, ax = plt.subplots()y, sr = librosa.load(librosa.ex(‘trumpet’))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() Ejecute el código y ¡listo! Transformamos rápidamente ondas sonoras en frecuencias y creamos un diagrama realmente claro usando Python y librosa. Buen trabajo. Aquí es donde me detengo. En la siguiente parte, les mostraré una implementación real del código de modificación de melodías, conversión de muestras usando STFT y viceversa. Explique detalladamente cómo leer, comprender y modificar los resultados de la Transformación de Fourier. ¡Espero verte allí! Si tiene alguna pregunta o comentario, ¡no dude en comunicarse conmigo! Feliz 0 0 % Triste 0 0 % Emocionado 0 0 % Sueño 0 0 % Enojado 0 0 % Sorpresa 0 0 %