- Audio Decomposition es un programa de código abierto que busca dividir el audio en las notas e instrumentos que lo componen para pasar la música a partitura
- Las muestras de instrumentos se toman de la University of Iowa Electronic Music Studios instrument database, y se guarda la transformada de Fourier y la envolvente de cada forma de onda para usarlas como referencia de comparación
- El archivo musical se analiza en intervalos de 0.1 segundos para crear un espectrograma, y se combinan las transformadas de Fourier guardadas de cada instrumento para estimar la magnitud de cada uno en ese segmento
- El análisis de la envolvente divide las secciones de attack·sustain·release y la atenuación estática/dinámica, y luego calcula el costo por instrumento en las bandas de notas filtradas
- En lugar de recrear el audio, el resultado se muestra como una gráfica de dispersión de matplotlib similar a una partitura, lo que facilita resolver problemas y visualizar datos dispersos
Descomposición de audio para conversión a partitura
- Audio Decomposition comenzó con el objetivo de crear un programa que convierta música en partitura
- La motivación surgió del deseo personal de pasar música a partitura y de sentir que faltaban algoritmos simples y de código abierto para separación de fuentes de audio
- Hay videos de demostración publicados en YouTube
- El repositorio de GitHub es mbird1258/Audio-Decomposition
- Las muestras de instrumentos se toman de la University of Iowa Electronic Music Studios instrument database
- Para cada archivo, se calcula y guarda la transformada de Fourier de toda la forma de onda y su envolvente
Transformada de Fourier en intervalos de 0.1 segundos
- Se parte de la idea de que el sonido de los instrumentos puede caracterizarse principalmente con la transformada de Fourier y la envolvente, y con esa información se estima qué instrumento toca qué nota
- El archivo musical se procesa realizando una transformada de Fourier cada 0.1 segundos en forma de espectrograma
- Para reproducir la transformada de Fourier de cada segmento de 0.1 segundos, se suman las transformadas de Fourier guardadas de cada instrumento
- La magnitud por instrumento se calcula resolviendo la matriz obtenida de las derivadas parciales por frecuencia de la función de costo MSE
- Cada fila de la matriz corresponde a la derivada parcial de cada instrumento, como cello, piano, etc.
- El ejemplo corresponde al cálculo del costo para valores por frecuencia, como un valor de transformada de Fourier a 5Hz
Envolvente y separación de segmentos de nota
- La envolvente es la línea superior de la forma de onda, y como las funciones existentes a veces no funcionan bien con ruido o ciertas formas de onda, se usa un método aparte
- El cálculo divide la forma de onda en fragmentos y toma el valor máximo de cada fragmento
- Después, se refinan los resultados agregando nuevos puntos donde la envolvente queda por debajo de la forma de onda original
- La envolvente se divide en attack, sustain y release
- attack: el sonido inicial de la nota
- sustain: la sección en la que la nota se mantiene
- release: la sección en la que la nota se apaga
- En las muestras de instrumentos, el primer valor distinto de cero se usa como punto de inicio del attack
- El límite entre attack y sustain se define como el primer punto donde la función se vuelve cóncava hacia abajo o decrece
- El límite entre sustain y release se define recorriendo desde el final y encontrando el primer punto donde la función aumenta o es cóncava hacia abajo
- El final del release se encuentra recorriendo desde el final hasta el primer punto distinto de cero
Tipos de atenuación y emparejamiento de instrumentos
- Para distinguir las formas principales de la onda, se consideran la atenuación estática y la atenuación dinámica
- Algunos instrumentos, como el piano, tienen una atenuación estática que suele seguir una forma de decaimiento exponencial
- Algunos instrumentos, como el violin, pueden aumentar o disminuir su volumen incluso durante el sustain
- Entre las muestras de instrumentos hay archivos que se mantienen hasta que el sonido desaparece naturalmente y otros que pasan a release antes de tiempo
- Se distingue si la atenuación es estática o dinámica según si el coeficiente de atenuación es mayor que 1 o si se desvía demasiado de la curva de atenuación
- Se determina si la envolvente tiene release, es decir, si es AS o ASR, comparando la tasa media de cambio de sustain y release
- Si la tasa de cambio de release es menor, se considera que no hay release
- Al procesar el archivo musical, se aplica un filtro pasa banda para cada frecuencia de nota
- Sobre la forma de onda filtrada, se recorren los instrumentos calculando la correlación cruzada del attack y release normalizados para encontrar el inicio y final de la nota
- Luego se calcula el MSE entre la forma de onda del instrumento y el audio filtrado, y eso se usa como costo del instrumento en ese momento
- La magnitud final se calcula multiplicando la magnitud de la etapa de transformada de Fourier por
1 / costode la etapa de envolvente
Visualización de resultados basada en gráfica de dispersión
- El resultado se representa como una partitura usando una scatter plot de matplotlib con puntos en forma de
- - Originalmente se intentó recrear el audio a partir de las magnitudes calculadas, pero hubo muchos problemas, llevaba tiempo y dificultaba la depuración
- También se probó imshow de matplotlib, pero era muy ineficiente en una situación donde la mayoría de los valores eran 0
- Esto se debía a que, al mover la pantalla o hacer zoom, había que volver a dibujar todos los puntos sin importar si estaban visibles o no
- Como resultado, puede usarse para lograr una mejor reproducción de partituras, especialmente cuando es difícil encontrar el pitch o los acordes correctos
- Como ejemplo, se usó para recrear una partitura en Noteflight a partir de un video de YouTube
- El tiempo de ejecución tampoco es excesivamente largo
1 comentarios
Comentarios de Hacker News
El título es un poco confuso. Si escribes open-source separation, se puede leer como source separation, pero en realidad no es eso sino un algoritmo de detección de pitch, y luego clasifica de qué instrumento proviene el pitch detectado
Está bastante genial, pero si de verdad necesitas resultados precisos, parece que corregir la salida podría tomar más tiempo que hacerlo a mano
Para alguien de esa edad, el resultado es impresionante
Cuando músicos intentan reconstruir desde un solo archivo de audio algo cercano a las pistas originales previas a la mezcla, o sea stems, siento que escucho más este último término
No vi que lo mencionaran directamente en el artículo, pero para quien le interese, la transcripción automática de música, o sea convertir audio a MIDI, es un subcampo bastante grande dentro del deep learning y de la recuperación de información musical
También ha habido varios modelos exitosos en transcripción musical multitrack, y está el proyecto MT3 de Google: https://research.google/pubs/mt3-multi-task-multitrack-music...
En el caso de la transcripción de piano, ya se ha llegado a una precisión casi perfecta incluso con audio de muy baja calidad: https://github.com/EleutherAI/aria-amt
Como referencia, soy el autor del repositorio de arriba
Los sistemas de transcripción audio-MIDI aciertan bien el pitch y el momento de inicio, pero la duración y la intensidad son mucho menos estables
Porté su Colab para usarlo más fácilmente como runtime, pero la salida MIDI era bastante rara
Incluso metiendo stems simples, en algunas pistas la salida MIDI no coincidía bien con el audio y tenía problemas de timing al punto de ser inutilizable, aunque con otros audios sí funcionaba razonablemente bien
Si te interesa la separación de audio o la separación de stems, vale la pena ver RipX: https://hitnmix.com/ripx-daw-pro/
También puede exportar las pistas separadas como archivos MIDI. Todavía tiene algunos problemas, pero funciona bastante bien
La separación de stems se está volviendo una función estándar en el software musical y casi todos los DAW ya la ofrecen
Para lo que yo hago, moises me resultó fácil de usar: https://moises.ai/
Soporta transposición de toda la canción o time stretching, y tiene una interfaz simple para separación de stems y muteo/ajuste de volumen por pista. Detecta automáticamente tempo y acordes
No tengo ninguna relación con ellos; solo soy un usuario satisfecho que lo usa casi todos los días para aprender y practicar canciones. Normalmente subo la parte del bajo y bajo todo lo demás a menos de 10% de volumen para escuchar el bajo con claridad, y eso deja muy en evidencia con qué frecuencia se equivocan las partituras en línea, incluso las de pago. Después de aprender la parte, silencío el bajo y toco sobre la canción original como si fuera el bajista
0: https://www.stemroller.com/
Ableton Live - no
Bitwig - no
Cubase - no
FL - sí
Logic - sí
Pro Tools - no
Reason - no
Reaper - no
Studio One - sí
Polymath es efectivo para separar y extraer pistas de instrumentos individuales desde MP3, y funciona muy bien
Está realmente genial, pero existe física real de los instrumentos que no se capta con simples plantillas de transformada de Fourier. Por ejemplo, una trompeta puede tener un espectro armónico muy distinto al tocar suave o fuerte aun con el mismo pitch
La trompeta genera una serie armónica rica con armónicos fuertes, así que en la transformada de Fourier aparecen picos notorios en múltiplos enteros de la frecuencia fundamental. Instrumentos como la flauta producen tonos más puros, pero los metales suelen tener armónicos altos más fuertes, así que las derivadas parciales de la ecuación matricial que aparece en el artículo probablemente también se vuelvan más complejas
Este script identifica el timing de las notas usando filtrado pasa banda y correlación cruzada de envolventes de ataque y release. Como los metales pueden mostrar un comportamiento no lineal donde la composición armónica cambia mucho según la intensidad de ejecución, no tengo claro cómo manejaría este algoritmo los casos donde el brillo cambia entre pp y ff. Para mejorar la precisión, yo consideraría agregar plantillas de Fourier dependientes de la intensidad para cada instrumento
Todos estos modelos fallan cuando el instrumento no produce su sonido típico, o en bandas donde la interpretación y la mezcla no están hechas para maximizar la separación entre instrumentos. Por ejemplo, una guitarra eléctrica con armónicos distorsionados puede tocar las mismas notas que la voz, el baterista puede producir solo ruido agudo en los platillos y el bajista puede imitar con su instrumento sonidos percusivos como un bombo
En esta música experimental, los resultados de source separation se vuelven totalmente impredecibles, y puede que sirvan o no para reequilibrio musical
Parece un trabajo hecho por el hermano de Joshua Bird. Joshua Bird también hizo antes proyectos impresionantes que llegaron a HN: https://www.youtube.com/@joshuabird333
Me hizo recordar cuando jugaba Audiosurf hace como 15 años. Cómo pasa el tiempo
https://en.wikipedia.org/wiki/Audiosurf
No sé si entendí mal, pero no parece que ninguno de los demos de YouTube esté mostrando separación de fuentes
Además, en investigación de audio, separación de fuentes significa separar el audio en clips distintos
Soy fan de Ultrastar Deluxe desde hace mucho. Es un clon de código abierto de Singstar, un juego de karaoke donde la gente compite cantando canciones
Detecta las notas que cantas y las compara con un archivo de mapeo del tiempo de la voz para esa canción; mientras mejor sigas la melodía, más puntos obtienes. No importa mucho si aciertas exactamente la letra
Hay muchas bibliotecas de canciones mapeadas hechas por fans, pero nunca alcanzan, y hay muy pocas canciones mapeadas en idiomas aparte del inglés y el español. Mapear todo a mano toma muchísimo tiempo, y en mi caso es aún más difícil porque casi no tengo oído
Desde hace tiempo me pregunto qué software podría automatizar este proceso de forma más sencilla, y esta herramienta se ve muy buena para detectar el tiempo y las notas de la voz en la canción original
Uno de mis pendientes de vida es armar algún día una lista de reproducción tipo Singstar en mi lengua materna y hacer una fiesta de karaoke con amigos. Si alguien conoce herramientas parecidas, me interesa
Parece que el archivo de texto necesita voz y tono con marcas de tiempo, y la IA ya se está acercando a un nivel en el que podría automatizar su generación
Dejo un enlace que acabo de encontrar para leer más: https://www.reddit.com/r/karaoke/comments/x61kzy/modern_equi...
Según yo, algunos de los videos parecen estar sin audio