Conoce Music Understanding: análisis de audio en el dispositivo
En la WWDC 2026, el equipo de Final Cut Pro de Apple lanzó dos funciones construidas sobre un único framework: una detección de pulso que revela la cuadrícula de tiempos de una canción para que los editores alineen sus cortes con compases y pulsos, y una función de montaje en el iPad que sincroniza los clips con la música de forma automática.1 Ambas se apoyan en Music Understanding, un nuevo framework que te entrega la inteligencia musical de una canción (tonalidad, ritmo, estructura, ritmo percibido, actividad instrumental y sonoridad) sin pedirte que sepas nada de procesamiento de señales ni de aprendizaje automático. Se ejecuta por completo en el dispositivo, así que el audio que analizas se mantiene privado y funciona sin conexión.1 Este artículo recorre el framework como un taller práctico: las seis áreas de análisis, cómo las produce una MusicUnderstandingSession y el AsyncSequence de sonoridad en streaming que vuelve prácticos los visuales reactivos al audio.
En resumen
- Music Understanding analiza seis áreas de una canción (tonalidad, ritmo, estructura, ritmo percibido, actividad instrumental y sonoridad) en el dispositivo, sin necesidad de experiencia en procesamiento de señales ni en aprendizaje automático.1
- Creas una
MusicUnderstandingSessiona partir de unAVAsseto de un proveedor de audio personalizado, y luego llamas aanalyze()para obtenerlo todo o aanalyze(for:)para apuntar a tipos concretos y omitir cálculos innecesarios.1 - Los resultados llegan en una estructura
SessionResultdonde cada característica es un campo opcional; elanalyze()general los rellena todos, y elanalyze(for:)dirigido deja el resto ennil.1 - Dos tipos que tienen en cuenta el tiempo recorren toda la API: un
TimedValueempareja un valor con unCMTime, y unRangedValueempareja un valor con unCMTimeRange.1 MusicUnderstandingSessiontambién expone una API de sonoridad en streaming que entrega valores a través de unAsyncSequencepor cada 100 ms de audio analizado, lo cual es la base para impulsar animaciones reactivas al audio en vivo.1
Por qué importa la inteligencia musical en el dispositivo
Conner, del Computational Music Team de Apple, enumera las seis áreas de análisis del framework a partir del minuto 1:39.
La propuesta es acotada y honesta: el framework «se encarga de todo el procesamiento de señales y la inferencia del modelo por ti, de modo que no necesitas ninguna experiencia en procesamiento de señales ni en aprendizaje automático para usarlo».1 Eso elimina la parte del análisis de audio que la mayoría de los desarrolladores de apps nunca quiso asumir. Detectar un tempo, segmentar una canción en un coro y una estrofa, o medir la sonoridad percibida solían significar, antes, o bien licenciar un motor de terceros o bien construir a mano una canalización de DSP.
Ejecutarse en el dispositivo también cambia la ecuación de la privacidad. Como el framework «se ejecuta por completo en el dispositivo, el audio que analizas se mantiene privado y funciona sin conexión».1 Una canción nunca abandona el teléfono para analizarse, y el análisis funciona en un avión sin señal. Para una app de DJ que ordena una biblioteca por tempo, o un editor de video que ajusta los cortes a los pulsos, esa combinación de ninguna dependencia de red y ningún audio saliendo del dispositivo es la verdadera ventaja práctica.
Apple plantea las seis áreas como los bloques que componen una canción. El ritmo es el pulso, impulsado por pulsos individuales que se acumulan en compases; la cantidad de pulsos en un minuto son los beats per minute, es decir, los bpm.1 Los compases forman frases (oraciones musicales), las frases se combinan en segmentos y los segmentos construyen secciones como un coro, una estrofa, una intro o un puente.1 Instrumentos como una batería, un bajo o las voces suenan en momentos e intensidades distintos en torno a un conjunto común de notas llamado tonalidad.1 Una canción puede mantener un bpm constante mientras distintas partes se sienten más lentas o más rápidas, algo que Apple llama ritmo percibido, y la canción suena más fuerte en unos puntos que en otros.1 Esos seis conceptos se corresponden uno a uno con los tipos de resultado del framework.
La sesión: un solo objeto, dos maneras de preguntar
Las apps interactúan con una MusicUnderstandingSession, que inicializan «con un AVAsset o con un proveedor de audio personalizado».1 Para ejecutar el análisis, llamas a analyze y esperas los resultados. El comportamiento por defecto es analizar todos los tipos, y Apple es explícita sobre la palanca de rendimiento: «Para el máximo rendimiento, puedes especificar qué tipos de análisis te interesan y así evitar cálculos innecesarios».1 Calcular solo lo que muestras es la diferencia entre una herramienta ágil y una que se atasca en cada carga.
La app de ejemplo, Music Understanding Lab, muestra la ruta del archivo de principio a fin. Un fileImporter de SwiftUI selecciona una canción y devuelve su URL, y esa URL se convierte en un AVURLAsset. Apple señala un ajuste decisivo: establece PreferPreciseDurationAndTimingKey en true «para garantizar los resultados más precisos».1 Luego creas la sesión a partir del asset, llamas a analyze y esperas a que devuelva los resultados de la sesión.
Esos resultados aterrizan en una estructura SessionResult, donde «cada característica que Music Understanding analiza tiene su propio campo de resultados. Todos son opcionales».1 Los dos puntos de entrada difieren en qué rellenan. La API general analyze() deja disponibles todos los resultados. La API dirigida analyze(for:) solo devuelve los resultados que pediste, y «el resto será nil».1 La opcionalidad, entonces, no es un accidente del diseño de la API: es la forma en que el framework te dice qué trabajo hizo realmente.
Dos tipos se repiten en todo el framework para asociar tiempo a un valor. Un TimedValue asocia un valor con un CMTime (un instante único), y un RangedValue asocia un CMTimeRange (un intervalo) con un valor.1 Casi todos los resultados de abajo se expresan con una de esas dos formas, así que aprenderlas una vez rinde frutos en las seis áreas.
Recorriendo los seis resultados
Tonalidad. Para el análisis de tonalidad, el framework devuelve una estructura KeyResult, que «contiene un arreglo de rangos que asignan una KeySignature a un rango de tiempo específico mediante un RangedValue».1 Una KeySignature contiene una tónica y un modo. La tónica «puede ser cualquiera de las alturas cromáticas estándar» y representa la nota fundamental (como do o sol) sobre la que se construye la canción; el modo «es mayor o menor».1 Como el resultado es un arreglo de rangos y no un valor único, la API admite canciones que cambian de tonalidad a mitad de camino.
Ritmo. Analizar el ritmo produce un RhythmResult. La estructura te da «las marcas de tiempo de cada pulso y cada compás como arreglos de CMTime», además del tempo global general a través de beatsPerMinute.1 Un detalle importa para las interfaces en vivo: beatsPerMinute es opcional, «porque si el framework no ha procesado suficiente audio para encontrar al menos dos pulsos, el bpm quedará en nil».1 Necesitas dos pulsos para medir un intervalo, así que ese nil es el framework negándose a adivinar.
Estructura. Solicitar el análisis de estructura devuelve un StructureResult con tres propiedades, «para secciones, segmentos y frases», y para cada una obtienes un arreglo de CMTimeRange.1 Los tres niveles se anidan: una sección se compone de uno o más segmentos, y cada segmento se compone de frases.1 Esa jerarquía es lo que permite a un editor ajustar un corte al límite de un coro en lugar de a una marca de tiempo arbitraria.
Ritmo percibido. El ritmo percibido «te indica qué tan rápida le resulta la música al oyente», con las partes más enérgicas portando un valor más alto que las más lentas.1 Solicitarlo devuelve un PaceResult, una estructura con «una sola propiedad que contiene un arreglo de valores con rango».1 El ritmo percibido es distinto de los bpm: el tempo puede mantenerse constante mientras la energía sentida sube y baja.
Actividad instrumental. Solicitar la actividad instrumental devuelve un InstrumentActivityResult con dos propiedades, una para rangos y otra para actividad.1 La API Ranges «proporciona un diccionario que asigna cada Instrument a» un valor por instrumento (la transcripción se corta antes de nombrar el tipo de ese valor), y Apple plantea los rangos como la opción adecuada cuando «solo quieres saber si un instrumento está presente o no».1 La propiedad activity aporta más detalle: «asigna un instrumento a un TimedValue de Floats», y esos valores «expresan con qué intensidad suena un instrumento a lo largo del tiempo».1 Apple califica el resultado de actividad como «una excelente fuente para impulsar animaciones reactivas al audio», porque una intensidad por instante y por instrumento es exactamente a lo que un visualizador quiere vincularse.1
Sonoridad. El framework mide la sonoridad en Loudness Units Full Scale (LUFS), «el estándar de la industria para modelar cómo el oído humano percibe el volumen».1 Solicitar el análisis de sonoridad produce una estructura LoudnessResult que admite las sonoridades integrated, momentary y shortTerm.1 La integrated es un valor único para la sonoridad global del audio. Las sonoridades momentary y shortTerm proporcionan ambas valores con marca de tiempo cada 100 milisegundos, pero sobre ventanas distintas: momentary usa una ventana de 400 milisegundos y capta «picos de sonoridad cortos y repentinos», mientras que shortTerm usa una ventana de 3 segundos para «una vista más suavizada de la tendencia de la sonoridad a lo largo del tiempo».1 El resultado también lleva un valor de pico, el volumen de audio absolutamente más alto, medido en decibelios.1
El AsyncSequence de sonoridad en streaming
Las API por lotes de arriba analizan un archivo terminado. Para el trabajo en vivo, MusicUnderstandingSession «también proporciona una API de streaming para la sonoridad», donde «los valores se entregan a través de un AsyncSequence por cada 100 ms de audio analizado por el framework».1 Una nueva lectura de sonoridad cada 100 ms es la cadencia a la que funciona un visualizador en tiempo real, y por eso es esta API, y no la de lotes, la pieza central para una interfaz reactiva al audio.
El patrón de uso son dos tareas concurrentes. Inicializas la sesión como antes y luego «configuras dos tareas: una para consumir los resultados de sonoridad a medida que se entregan, y otra para iniciar el análisis».1 Una tarea espera los valores de la secuencia y los empuja hacia tu animación; la otra hace avanzar el análisis. El productor y el consumidor corren uno al lado del otro en vez de bloquearse mutuamente.
Alimentar audio en vivo implica suministrar un AudioProvider. Un AudioProvider «se ajusta a AsyncSequence y produce objetos AVReadOnlyAudioPCMBuffer».1 Apple señala el contrato de finalización de forma explícita: cuando el proveedor «ha enviado todos los búferes de audio, debe enviar un nil final para señalar la finalización».1 Olvida el nil del final y la tarea consumidora espera para siempre un audio que nunca termina. Que el proveedor sea en sí mismo un AsyncSequence es la parte elegante: tu fuente de audio y la salida de sonoridad del framework hablan el mismo lenguaje de iteración asíncrona de principio a fin.
Dos capacidades más de la sesión completan el panorama. Cada resultado de Music Understanding es codable, así que exportar un análisis completo es «solo crear un JSONEncoder y codificar los resultados de la sesión».1 Y el mosaico Video de la app de ejemplo muestra cómo se componen los resultados: «usa la estructura y el ritmo percibido para crear un video sincronizado con la música», identificando los rangos de tiempo de las secciones y luego usando el ritmo percibido de cada sección (una tasa de eventos por minuto dividida entre 60 segundos) para decidir cuántos clips caben en ese rango, con clips más cortos y rápidos en las partes enérgicas y clips más largos y lentos en las tranquilas.1
Puntos clave
Para quienes desarrollan apps de audio y multimedia:
- Parte de
analyze(for:), no deanalyze(): nombra solo los tipos de análisis que muestras para que el framework omita el resto, ya que los resultados no solicitados vuelven ennilde todos modos.1 - Trata
beatsPerMinutecomo genuinamente opcional en tu interfaz; unnilsignifica que el framework aún no ha visto dos pulsos, así que muestra un estado pendiente en lugar de un tempo falso.1 - Establece
PreferPreciseDurationAndTimingKeyentrueen elAVURLAssetantes de crear la sesión, porque Apple liga la exactitud de los resultados a esa bandera.1
Para el trabajo en tiempo real y de visualizadores:
- Construye la animación reactiva al audio en vivo sobre el
AsyncSequencede sonoridad (un valor cada 100 ms) y sobre la propiedadactivityde los instrumentos, que asigna cada instrumento a unTimedValuede intensidad a lo largo del tiempo.1 - Ejecuta una tarea consumidora y una tarea de análisis de forma concurrente, y haz que tu
AudioProviderpersonalizado envíe unnilfinal después del últimoAVReadOnlyAudioPCMBufferpara que el flujo termine de forma limpia.1
Para los equipos de catálogo y herramientas:
- Ordena o agrupa una biblioteca musical por tonalidad o tempo usando
KeyResultyRhythmResult, y conserva los análisis codificando elSessionResultcodable a JSON para reutilizarlos.1
Preguntas frecuentes
¿Qué analiza el framework Music Understanding de Apple?
Analiza seis áreas de una canción: tonalidad, ritmo, estructura, ritmo percibido, actividad instrumental y sonoridad. Cada una se corresponde con un tipo de resultado (KeyResult, RhythmResult, StructureResult, PaceResult, InstrumentActivityResult y LoudnessResult) que se devuelve dentro de un SessionResult. El framework se encarga del procesamiento de señales y de la inferencia del modelo, así que no se requiere experiencia en DSP ni en aprendizaje automático.1
¿Music Understanding se ejecuta en el dispositivo o en la nube?
En el dispositivo. Apple afirma que el framework «se ejecuta por completo en el dispositivo», por lo que el audio que analizas se mantiene privado y funciona sin conexión. El análisis funciona en todas las plataformas de Apple sin dependencia de red.1
¿Cómo obtengo solo el análisis que necesito?
Llama a analyze(for:) en lugar del analyze() general. La llamada general rellena cada campo del SessionResult; la llamada dirigida solo devuelve los tipos que solicitaste y deja el resto en nil. Apple recomienda especificar los tipos «para el máximo rendimiento» y así evitar cálculos innecesarios.1
¿Cuál es la diferencia entre TimedValue y RangedValue?
Un TimedValue asocia un valor con un único instante CMTime, mientras que un RangedValue asocia un valor con un intervalo CMTimeRange. Ambos tipos aparecen en todo el framework: las armaduras de tonalidad llegan como valores con rango, por ejemplo, y la actividad por instrumento llega como valores con marca de tiempo.1
¿Cómo construyo un visualizador reactivo al audio en vivo con esto?
Usa la API de sonoridad en streaming de MusicUnderstandingSession, que entrega valores a través de un AsyncSequence por cada 100 ms de audio analizado. Ejecuta dos tareas concurrentes (una consumiendo resultados, otra impulsando el análisis) y alimenta el audio en vivo mediante un AudioProvider personalizado que se ajuste a AsyncSequence, produzca objetos AVReadOnlyAudioPCMBuffer y envíe un nil final para señalar la finalización.1
El análisis de audio en el dispositivo se sitúa junto a la demás inteligencia multimedia que Apple lanzó este año: mira cómo la IA en el dispositivo llega a Spotlight y a los medios en iOS 27 y cómo el framework Speech se compara con SFSpeechRecognizer para la vertiente de audio a texto del mismo problema. Cuando superes por completo los modelos integrados de Apple, ejecutar tus propios modelos en Apple silicon con Core AI es el siguiente paso. El eje completo de la serie es la Apple Ecosystem Series.
Referencias
-
Apple, WWDC 2026 session 253, Meet the Music Understanding framework. Fuente del enfoque en la ejecución en el dispositivo, la privacidad y el modo sin conexión; de las funciones de detección de pulso en Final Cut Pro y de montaje en el iPad; de las seis áreas de análisis (tonalidad, ritmo, estructura, ritmo percibido, actividad instrumental y sonoridad) y de las definiciones de los bloques que componen una canción; de la
MusicUnderstandingSessioninicializada a partir de unAVAsseto un proveedor de audio; deanalyze()frente aanalyze(for:)y delSessionResultcon campos opcionales; de la configuración delAVURLAssety dePreferPreciseDurationAndTimingKeymediante elfileImporterde SwiftUI; de los tiposTimedValue/CMTimeyRangedValue/CMTimeRange; de los tiposKeyResult/KeySignature(tónica y modo),RhythmResult/beatsPerMinute(opcional por debajo de dos pulsos),StructureResult(secciones, segmentos, frases),PaceResult,InstrumentActivityResult(ranges y activity, activity como unTimedValuede Floats) yLoudnessResult(LUFS, ventanas integrated/momentary/shortTerm, pico en decibelios); delAsyncSequencede sonoridad en streaming que entrega valores cada 100 ms con dos tareas concurrentes; delAudioProviderque se ajusta aAsyncSequence, produce objetosAVReadOnlyAudioPCMBuffery envía unnilfinal; de los resultados codables y la exportación conJSONEncoder; y del algoritmo del mosaico Video basado en la estructura y el ritmo percibido. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩