Poznaj Music Understanding: analiza dźwięku na urządzeniu
Na WWDC 2026 zespół Final Cut Pro w Apple udostępnił dwie funkcje zbudowane na jednym frameworku: wykrywanie rytmu, które ujawnia siatkę uderzeń utworu, dzięki czemu montażyści mogą dopasowywać cięcia do taktów i uderzeń, oraz funkcję montażu na iPadzie, która automatycznie synchronizuje klipy z muzyką.1 Obie opierają się na Music Understanding — nowym frameworku, który przekazuje muzyczną inteligencję utworu (tonację, rytm, strukturę, tempo odczuwane, aktywność instrumentów i głośność), nie wymagając żadnej wiedzy o przetwarzaniu sygnałów ani o uczeniu maszynowym. Działa w całości na urządzeniu, więc analizowany dźwięk pozostaje prywatny i działa bez połączenia z siecią.1 Ten artykuł przechodzi przez framework w formie warsztatu: sześć obszarów analizy, sposób, w jaki wytwarza je MusicUnderstandingSession, oraz strumieniowy AsyncSequence głośności, który urealnia wizualizacje reagujące na dźwięk.
W skrócie
- Music Understanding analizuje sześć obszarów utworu (tonację, rytm, strukturę, tempo odczuwane, aktywność instrumentów i głośność) na urządzeniu, bez potrzeby posiadania wiedzy o przetwarzaniu sygnałów czy uczeniu maszynowym.1
- Z
AVAssetlub własnego dostawcy dźwięku tworzy sięMusicUnderstandingSession, a następnie wywołujeanalyze(), aby uzyskać wszystko, alboanalyze(for:), aby wskazać konkretne typy i pominąć zbędne obliczenia.1 - Wyniki trafiają do struktury
SessionResult, w której każda cecha jest polem opcjonalnym; ogólneanalyze()wypełnia je wszystkie, a ukierunkowaneanalyze(for:)pozostawia resztę jakonil.1 - Przez całe API przewijają się dwa typy uwzględniające czas:
TimedValuełączy wartość zCMTime, aRangedValuełączy wartość zCMTimeRange.1 MusicUnderstandingSessionudostępnia też strumieniowe API głośności, które dostarcza wartości przezAsyncSequencedla każdych 100 ms przeanalizowanego dźwięku — to fundament napędzania animacji reagującej na dźwięk na żywo.1
Dlaczego muzyczna inteligencja na urządzeniu ma znaczenie
Conner z Computational Music Team w Apple wymienia sześć obszarów analizy frameworka, zaczynając od 1:39.
Obietnica jest wąska i uczciwa: framework „zajmuje się za Ciebie całym przetwarzaniem sygnałów i wnioskowaniem modelu, więc do jego użycia nie potrzebujesz żadnej wiedzy o przetwarzaniu sygnałów ani o uczeniu maszynowym”.1 Zdejmuje to z barków twórców aplikacji tę część analizy dźwięku, której większość z nich nigdy nie chciała brać na siebie. Wykrycie tempa, podzielenie utworu na refren i zwrotkę czy zmierzenie postrzeganej głośności oznaczało dawniej albo licencjonowanie zewnętrznego silnika, albo ręczne zbudowanie potoku DSP.
Działanie na urządzeniu zmienia również rachunek prywatności. Ponieważ framework „działa w całości na urządzeniu, analizowany dźwięk pozostaje prywatny i działa bez połączenia z siecią”.1 Utwór nigdy nie opuszcza telefonu, by zostać przeanalizowany, a analiza działa w samolocie bez zasięgu. Dla aplikacji DJ-skiej porządkującej bibliotekę według tempa albo dla montażysty wideo dopasowującego cięcia do uderzeń to połączenie — brak zależności od sieci i brak dźwięku opuszczającego urządzenie — stanowi praktyczny przełom.
Apple przedstawia sześć obszarów jako elementy budulcowe utworu. Rytm to puls, napędzany pojedynczymi uderzeniami, które układają się w takty; liczba uderzeń w ciągu minuty to beats per minute, czyli bpm.1 Takty tworzą frazy (muzyczne zdania), frazy łączą się w segmenty, a segmenty budują sekcje, takie jak refren, zwrotka, intro czy mostek.1 Instrumenty — bęben, bas czy wokal — grają w różnym czasie i z różną intensywnością wokół wspólnego zbioru dźwięków zwanego tonacją.1 Utwór może utrzymywać stałe bpm, choć poszczególne części odczuwane są jako wolniejsze lub szybsze, co Apple nazywa tempem odczuwanym, a w pewnych momentach utwór robi się głośniejszy niż w innych.1 Te sześć pojęć odpowiada jeden do jednego typom wyników frameworka.
Sesja: jeden obiekt, dwa sposoby zapytania
Aplikacje współpracują z MusicUnderstandingSession, inicjując ją „za pomocą AVAsset albo własnego dostawcy dźwięku”.1 Aby uruchomić analizę, wywołuje się analyze i czeka na wyniki. Domyślnie analizowane są wszystkie typy, lecz Apple jasno wskazuje dźwignię wydajności: „Aby uzyskać najwyższą wydajność, można wskazać interesujące typy analizy i tym samym uniknąć zbędnych obliczeń”.1 Obliczanie wyłącznie tego, co się wyświetla, stanowi różnicę między narzędziem responsywnym a takim, które zacina się przy każdym wczytaniu.
Aplikacja przykładowa, Music Understanding Lab, pokazuje ścieżkę pliku od początku do końca. fileImporter w SwiftUI wybiera utwór i zwraca jego URL, a ten URL staje się AVURLAsset. Apple zwraca uwagę na jedno kluczowe ustawienie: należy ustawić PreferPreciseDurationAndTimingKey na true „w celu zapewnienia najdokładniejszych wyników”.1 Następnie tworzy się sesję z assetu, wywołuje analyze i czeka na zwrócenie wyników sesji.
Wyniki te lądują w strukturze SessionResult, w której „każda cecha analizowana przez Music Understanding ma własne pole wyniku. Wszystkie są opcjonalne”.1 Dwa punkty wejścia różnią się tym, co wypełniają. Ogólne API analyze() udostępnia wszystkie wyniki. Ukierunkowane API analyze(for:) zwraca tylko te wyniki, o które poproszono, a „reszta będzie nil”.1 Opcjonalność nie jest więc przypadkiem w projekcie API — to sposób, w jaki framework informuje, jaką pracę faktycznie wykonał.
Dwa typy powracają w całym frameworku, aby powiązać czas z wartością. TimedValue wiąże wartość z CMTime (pojedynczym momentem), a RangedValue wiąże CMTimeRange (przedział) z wartością.1 Niemal każdy z poniższych wyników przyjmuje jedną z tych dwóch postaci, więc jednorazowe ich poznanie procentuje we wszystkich sześciu obszarach.
Spacer po sześciu wynikach
Tonacja. Dla analizy tonacji framework zwraca strukturę KeyResult, która „zawiera tablicę zakresów, odwzorowując KeySignature na określony przedział czasu za pomocą RangedValue”.1 KeySignature przechowuje tonikę i tryb. Tonika „może być dowolną ze standardowych wysokości chromatycznych” i reprezentuje dźwięk podstawowy (jak C czy G), wokół którego zbudowany jest utwór; tryb „jest durowy albo molowy”.1 Ponieważ wynikiem jest tablica zakresów, a nie jedna wartość, API obsługuje utwory, które w połowie zmieniają tonację.
Rytm. Analiza rytmu daje RhythmResult. Struktura przekazuje „znaczniki czasu każdego uderzenia i taktu jako tablice CMTime”, a ponadto ogólne, globalne tempo przez beatsPerMinute.1 Jeden szczegół ma znaczenie dla interfejsów na żywo: beatsPerMinute jest opcjonalne, „ponieważ jeśli framework nie przetworzył dość dźwięku, by znaleźć co najmniej dwa uderzenia, bpm zostanie ustawione na nil”.1 Do zmierzenia odstępu potrzebne są dwa uderzenia, więc to nil oznacza, że framework odmawia zgadywania.
Struktura. Żądanie analizy struktury zwraca StructureResult z trzema właściwościami, „dla sekcji, segmentów i fraz”, a dla każdej otrzymuje się tablicę CMTimeRange.1 Trzy poziomy zagnieżdżają się: sekcja składa się z jednego lub kilku segmentów, a każdy segment składa się z fraz.1 To właśnie ta hierarchia pozwala montażyście przyciągnąć cięcie do granicy refrenu zamiast do dowolnego znacznika czasu.
Tempo odczuwane. Tempo odczuwane „mówi, jak szybka wydaje się muzyka słuchaczowi”, przy czym partie bardziej energetyczne niosą wyższą wartość niż wolniejsze.1 Jego żądanie zwraca PaceResult — strukturę z „pojedynczą właściwością zawierającą tablicę wartości z zakresem”.1 Tempo odczuwane różni się od bpm: tempo może utrzymywać się na stałym poziomie, podczas gdy odczuwana energia rośnie i opada.
Aktywność instrumentów. Żądanie aktywności instrumentów zwraca InstrumentActivityResult z dwiema właściwościami: jedną dla zakresów i jedną dla aktywności.1 API Ranges „udostępnia słownik odwzorowujący każdy Instrument na” wartość przypisaną do instrumentu (transkrypcja urywa się przed podaniem typu tej wartości), a Apple przedstawia zakresy jako właściwy wybór, gdy „chcesz jedynie wiedzieć, czy instrument jest obecny, czy nie”.1 Właściwość activity niesie więcej szczegółów: „odwzorowuje instrument na TimedValue typu Float”, a wartości te „wyrażają, jak intensywnie instrument gra w czasie”.1 Apple nazywa wynik aktywności „znakomitym źródłem do napędzania animacji reagujących na dźwięk”, ponieważ intensywność każdego instrumentu w każdej chwili to dokładnie to, do czego wizualizator chce się przywiązać.1
Głośność. Framework mierzy głośność w Loudness Units Full Scale (LUFS), „branżowym standardzie modelowania tego, jak ludzkie ucho odbiera głośność”.1 Żądanie analizy głośności wytwarza strukturę LoudnessResult, która obsługuje głośności integrated, momentary i shortTerm.1 Integrated to pojedyncza wartość dla ogólnej głośności dźwięku. Momentary i shortTerm dostarczają wartości ze znacznikami czasu co 100 milisekund, ale w różnych oknach: momentary używa okna 400 milisekund i wychwytuje „krótkie, nagłe skoki głośności”, podczas gdy shortTerm używa okna 3 sekund, by dać „bardziej wygładzony obraz trendu głośności w czasie”.1 Wynik niesie również wartość szczytową — bezwzględnie najwyższą głośność dźwięku, mierzoną w decybelach.1
Strumieniowy AsyncSequence głośności
Powyższe API wsadowe analizują gotowy plik. Do pracy na żywo MusicUnderstandingSession „udostępnia także strumieniowe API głośności”, w którym „wartości są dostarczane przez AsyncSequence dla każdych 100 ms dźwięku przeanalizowanego przez framework”.1 Nowy odczyt głośności co 100 ms to rytm, w jakim działa wizualizator czasu rzeczywistego — dlatego to właśnie to API, a nie wsadowe, jest sercem interfejsu reagującego na dźwięk.
Wzorzec użycia opiera się na dwóch współbieżnych zadaniach. Sesję inicjuje się jak poprzednio, a następnie „ustawia dwa zadania: jedno do konsumowania wyników głośności w miarę ich dostarczania, a drugie do rozpoczęcia analizy”.1 Jedno zadanie oczekuje na wartości z sekwencji i przekazuje je do animacji; drugie posuwa analizę naprzód. Producent i konsument działają obok siebie, zamiast wzajemnie się blokować.
Podawanie dźwięku na żywo wymaga dostarczenia AudioProvider. AudioProvider „jest zgodny z AsyncSequence i wytwarza obiekty AVReadOnlyAudioPCMBuffer”.1 Apple wyraźnie wskazuje kontrakt zakończenia: gdy dostawca „wysłał wszystkie bufory dźwięku, musi wysłać końcowe nil, aby zasygnalizować zakończenie”.1 Jeśli zapomni się o końcowym nil, zadanie konsumujące będzie wiecznie czekać na dźwięk, który nigdy się nie kończy. To, że dostawca sam jest AsyncSequence, stanowi elegancką część rozwiązania: źródło dźwięku i wyjście głośności frameworka mówią od początku do końca tym samym językiem iteracji asynchronicznej.
Dwie kolejne możliwości sesji dopełniają obraz. Każdy wynik Music Understanding jest codable, więc wyeksportowanie pełnej analizy to „po prostu utworzenie JSONEncoder i zakodowanie wyników sesji”.1 A kafelek Video w aplikacji przykładowej pokazuje, jak wyniki się składają: „wykorzystuje strukturę i tempo odczuwane do stworzenia wideo zsynchronizowanego z muzyką”, identyfikując przedziały czasu sekcji, a następnie używając tempa odczuwanego każdej sekcji (liczby zdarzeń na minutę podzielonej przez 60 sekund), by zdecydować, ile klipów zmieści się w danym przedziale — z krótszymi, szybszymi klipami w partiach energetycznych i dłuższymi, wolniejszymi w spokojnych.1
Najważniejsze wnioski
Dla twórców aplikacji audio i multimedialnych:
- Zacznij od
analyze(for:), a nie odanalyze(): wymień tylko te typy analizy, które wyświetlasz, aby framework pominął resztę, ponieważ niezamówione wyniki i tak wracają jakonil.1 - Traktuj
beatsPerMinutew interfejsie jako rzeczywiście opcjonalne;niloznacza, że framework nie zobaczył jeszcze dwóch uderzeń, więc pokaż stan oczekiwania zamiast fałszywego tempa.1 - Ustaw
PreferPreciseDurationAndTimingKeynatruedlaAVURLAssetprzed utworzeniem sesji, ponieważ Apple wiąże dokładność wyników z tą flagą.1
Dla pracy w czasie rzeczywistym i wizualizatorów:
- Buduj animację reagującą na dźwięk na żywo w oparciu o
AsyncSequencegłośności (wartość co 100 ms) oraz o właściwośćactivityinstrumentów, która odwzorowuje każdy instrument naTimedValueintensywności w czasie.1 - Uruchamiaj zadanie konsumujące i zadanie analizy współbieżnie, a w swoim własnym
AudioProviderzadbaj o wysłanie końcowegonilpo ostatnimAVReadOnlyAudioPCMBuffer, aby strumień zakończył się czysto.1
Dla zespołów zajmujących się katalogiem i narzędziami:
- Sortuj lub grupuj bibliotekę muzyczną według tonacji albo tempa przy użyciu
KeyResultiRhythmResult, a analizy zachowuj, kodując codableSessionResultdo JSON w celu ponownego wykorzystania.1
FAQ
Co analizuje framework Music Understanding od Apple?
Analizuje sześć obszarów utworu: tonację, rytm, strukturę, tempo odczuwane, aktywność instrumentów i głośność. Każdy z nich odpowiada typowi wyniku (KeyResult, RhythmResult, StructureResult, PaceResult, InstrumentActivityResult oraz LoudnessResult) zwracanemu wewnątrz SessionResult. Framework obsługuje przetwarzanie sygnałów i wnioskowanie modelu, więc nie jest wymagana wiedza o DSP ani o uczeniu maszynowym.1
Czy Music Understanding działa na urządzeniu, czy w chmurze?
Na urządzeniu. Apple stwierdza, że framework „działa w całości na urządzeniu”, więc analizowany dźwięk pozostaje prywatny i działa bez połączenia z siecią. Analiza działa na wszystkich platformach Apple bez zależności od sieci.1
Jak uzyskać tylko tę analizę, której potrzebuję?
Wywołaj analyze(for:) zamiast ogólnego analyze(). Wywołanie ogólne wypełnia każde pole SessionResult; wywołanie ukierunkowane zwraca tylko żądane typy, a resztę pozostawia jako nil. Apple zaleca wskazywanie typów „dla najwyższej wydajności”, aby uniknąć zbędnych obliczeń.1
Jaka jest różnica między TimedValue a RangedValue?
TimedValue wiąże wartość z pojedynczym momentem CMTime, natomiast RangedValue wiąże wartość z przedziałem CMTimeRange. Oba typy pojawiają się w całym frameworku: na przykład sygnatury tonacji przychodzą jako wartości z zakresem, a aktywność poszczególnych instrumentów jako wartości ze znacznikiem czasu.1
Jak zbudować z tego wizualizator reagujący na dźwięk na żywo?
Skorzystaj ze strumieniowego API głośności w MusicUnderstandingSession, które dostarcza wartości przez AsyncSequence dla każdych 100 ms przeanalizowanego dźwięku. Uruchom dwa współbieżne zadania (jedno konsumujące wyniki, drugie napędzające analizę) i podawaj dźwięk na żywo przez własny AudioProvider, który jest zgodny z AsyncSequence, wytwarza obiekty AVReadOnlyAudioPCMBuffer i wysyła końcowe nil, aby zasygnalizować zakończenie.1
Analiza dźwięku na urządzeniu stoi obok pozostałej inteligencji multimedialnej, którą Apple udostępniło w tym roku: zobacz, jak AI na urządzeniu trafia do Spotlight i mediów w iOS 27 oraz jak framework Speech wypada w porównaniu z SFSpeechRecognizer po stronie zamiany dźwięku na tekst tego samego problemu. Gdy całkowicie wyrośniesz z wbudowanych modeli Apple, kolejnym krokiem jest uruchamianie własnych modeli na Apple silicon za pomocą Core AI. Pełnym centrum serii jest Apple Ecosystem Series.
Źródła
-
Apple, WWDC 2026 session 253, Meet the Music Understanding framework. Źródło ujęcia działania na urządzeniu, prywatności i trybu offline; funkcji wykrywania rytmu w Final Cut Pro oraz montażu na iPadzie; sześciu obszarów analizy (tonacja, rytm, struktura, tempo odczuwane, aktywność instrumentów i głośność) oraz definicji elementów budulcowych utworu;
MusicUnderstandingSessioninicjowanej zAVAssetlub dostawcy dźwięku;analyze()w zestawieniu zanalyze(for:)orazSessionResultzłożonego z pól opcjonalnych; konfiguracjiAVURLAssetiPreferPreciseDurationAndTimingKeyprzezfileImporterw SwiftUI; typówTimedValue/CMTimeorazRangedValue/CMTimeRange; typówKeyResult/KeySignature(tonika i tryb),RhythmResult/beatsPerMinute(opcjonalne poniżej dwóch uderzeń),StructureResult(sekcje, segmenty, frazy),PaceResult,InstrumentActivityResult(ranges i activity, activity jakoTimedValuetypu Float) orazLoudnessResult(LUFS, okna integrated/momentary/shortTerm, wartość szczytowa w decybelach); strumieniowegoAsyncSequencegłośności dostarczającego wartości co 100 ms przy dwóch współbieżnych zadaniach;AudioProviderzgodnego zAsyncSequence, wytwarzającego obiektyAVReadOnlyAudioPCMBufferi wysyłającego końcowenil; wyników codable oraz eksportu przezJSONEncoder; a także algorytmu kafelka Video opartego na strukturze i tempie odczuwanym. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩