
Een label tagde zijn catalogus met C2PA voor de EU AI Act. Ik zag één transcode alles strippen.
De eerste keer dat ik een van mijn eigen testtracks door een gewone social-transcode duwde, zag ik de C2PA-herkomst die een label zou hebben betaald om toe te voegen in één enkele doorgang verdwijnen. Er gebeurde niets dramatisch op het scherm. Het bestand ging erin met een ondertekende herkomstheader, de encoder deed zijn gewone werk, en het bestand kwam eruit schoon, lichter en gestript. De herkomst was gewoon weg, zoals die weg is het moment dat een echte track TikTok of Instagram raakt. Ik zat daar met een licht misselijk gevoel, omdat ik de hele demo had geschetst op de aanname dat C2PA toevoegen het antwoord was, en ik had net het antwoord zien verdampen.
Daar gaat dit essay over. Ik wilde een EU AI Act Artikel 50-ingestpoort bouwen voor door AI gegenereerde audio, iets wat de app Tessera noemt, en de bouw nam stilzwijgend de aanname uit elkaar waarmee bijna iedereen in muziekrechten binnenkomt. De aanname is dat Artikel 50 een watermerkprobleem is dat je oplost door je catalogus te taggen. Dat is het niet. Het is een overlevingsprobleem, en het meeste van wat de industrie druk bezig is toe te voegen overleeft niet. Als je de poort zelf wilt zien beslissen, staat die hier: veriprajna.com/nl/demos/eu-ai-act-artikel-50-audio-ingestpoort-herkomst-die-de-social-transcodering-overleeft.
De reflex waarmee ik begon was "voeg gewoon C2PA toe"
Ik begon deze bouw in de overtuiging van hetzelfde als elk rights-tech-deck dat ik had gelezen, namelijk dat naleving van Artikel 50 een labelingoefening is.
De regelgeving is echt en de klok is echt. Artikel 50 van de EU AI Act trad in werking op 2 augustus 2026, en het vereist dat generatieve-audio-uitvoer in een machineleesbaar formaat wordt gemarkeerd en detecteerbaar blijft, in de taal van de ontwerpgedragscode van de Commissie uit januari 2026, "na gangbare wijzigingen." Artikel 99 zet de tanden erin, boetes tot €15M of 3% van de wereldwijde omzet. De schaal eronder is ook niet klein. Ruwweg 28% van de dagelijkse uploads van Deezer is nu volledig door AI gegenereerd (Beatdapp/Beatport, geciteerd in Veriprajna WP31-onderzoek, 2026). Dus de natuurlijke zet, de zet die ik in mijn eerste schets van de pipeline maakte, is om een C2PA-manifest aan elke AI-track te hangen en de catalogus als gedekt te beschouwen.
Hier is de mislukking die ik nog niet had geïnternaliseerd tot ik die zag gebeuren. C2PA, zoals de meeste mensen die inzetten, is harde binding. De herkomst zit in de metadata van het bestand. En harde binding wordt gestript door vrijwel elke social-platform-transcode bij upload, wat het Veriprajna WP31-oplossingsonderzoek (2026) de grootste operationele zwakte in het C2PA-ecosysteem van vandaag noemt. Dus een label dat plichtsgetrouw zijn hele catalogus tagde, is operationeel ongedekt het moment dat een track de schone overdracht verlaat en de wildernis raakt.
Het label deed alles wat de leidraad zei. Het voegde C2PA toe. En het was ongedekt het moment dat de eerste track social raakte, omdat het deel dat het toevoegde precies het deel is dat wordt gestript.
Wat daadwerkelijk overleeft is zachte binding. Een onwaarneembaar watermerk draagt een kleine identifier, en nadat de metadata weg is gebruik je die identifier om het manifest opnieuw vanuit een ledger op te halen. Het is weinig glamoureuze integratie-engineering. Het is ook, voor zover ik kan zien, waar het echt om draait.
De nacht dat mijn eigen watermerk als rommel terugkwam
Ik stond op het punt zachte binding op een dinsdagavond op te geven, toen mijn eigen watermerkdecoder begon ruis terug te geven.
Ik had de pipeline van begin tot eind draaien. Een track ging door het leveringskanaal, een spread-spectrum-decoder las het merkteken terug uit de geleverde golfvorm, en de herstelde sleutel zocht het manifest op. Toen draaide ik opnieuw een batch die ik de dag ervoor had afgewerkt, en de herstelde sleutels kwamen terug als rommel. Het bitfoutpercentage op het watermerk lag rond 0.5, wat een muntworp is, wat de manier van een decoder is om te zeggen dat hij ruis leest. Mijn eerste gedachte was dat zachte binding eigenlijk niet werkte, dat het merkteken een echte codec niet kon overleven, en dat het hele uitgangspunt van de demo fout was.
Ik was een paar uur lang overtuigd dat de aanpak dood was. Het was niet de aanpak. Het was een verouderd corpus op schijf. Een eerdere cache was uit sync geraakt met de deterministische seeds waaruit de tracks worden gegenereerd, dus de decoder las merktekens die niet meer bij de audio pasten. Ik herbouwde het corpus vanuit de seeds, draaide alles opnieuw door echte ffmpeg-transcodes, en de sleutels kwamen schoon terug. Die mislukking was meer waard voor mij dan elke schone run, omdat die me leerde een goed getal te wantrouwen tot ik precies weet wat het produceerde. Elke benchmark in deze demo werd pas na die herbouw vastgelegd.

Toen het werkte, was dat contrast het duidelijkste wat ik ooit op een scherm had gezet. Neem Neon Tide, een synthetische in-house-AI-release geleverd via het social-kanaal (elke track in dit corpus is procedureel gegenereerde toon, geen echte muziek of artiesten, en de namen zijn fixtures). De harde binding wordt gestript door de transcode. Het zachte-binding-watermerk wordt hersteld bij confidence 0.989, en het C2PA-manifest wordt opnieuw vanuit de ledger opgehaald. Harde binding stierf. Zachte binding droeg de herkomst door. Zij aan zij, op dezelfde track, in dezelfde doorgang. Dat ene paneel is het argument.
Heb ik dan gewoon een beter watermerk gebouwd?
Ik krijg een versie van deze vraag in bijna elk gesprek, en het antwoord is nee, wat mensen meestal verrast.
Ik heb geen watermerk gebouwd dat bedoeld is om die van iemand anders te verslaan, en ik zeg dat zorgvuldig, omdat de verleiding om iets anders te suggereren sterk is. De marktleidende detectors, Google's SynthID-Audio, Meta's AudioSeal, Digimarc, zitten in deze demo als stub-adapters achter een gedocumenteerde swap-for-SDK-interface. SynthID's detector is Google-gesloten en AudioSeal heeft een GPU nodig, dus in de demo melden ze aanwezigheid bij een vaste confidence en verder niets. Het spread-spectrum-merkteken dat ik wél schreef bestaat voor precies één taak: een 32-bit assetsleutel en een CRC dragen zodat het manifest opnieuw kan worden opgehaald. Het doet niet mee aan enige robuustheidswedstrijd, en ik claim niet dat het een vendor verslaat.
Wat ik bouwde is de laag rond het algoritme. Google en Meta mogen het watermerk bezitten. Het deel dat niemand als één product levert is de integratie: de multi-standard-detector, de zachte-binding-architectuur, de DDEX-middleware, en het regulator-ready dossier. Die laag is waar het overlevingsprobleem daadwerkelijk wordt opgelost, en het is het deel dat geen enkele vendor zich haast om je aan te reiken.

Ik wil precies zijn over wat die overlevingsmatrix betekent, omdat eerlijke scope het hele punt is van bouwen bij een bedrijf genaamd Veriprajna, wat ware wijsheid betekent. Op een vast synthetisch corpus van 12 releases decodeert mijn merkteken, opnieuw gecodeerd via mp3-128, aac-128 en opus-96, opnieuw bij bitfoutpercentage 0.0, terwijl harde binding geen van die social-kanalen overleeft. Dat is een echte meting met echte ffmpeg. Het is geen universele "overleeft alles"-claim, en de demo zelf bevat een track waar het merkteken helemaal niet overleeft, wat het deel is waar ik het meest trots op ben.
Ik heb geen beter watermerk gebouwd. Ik bouwde de laag die beslist of de herkomst die je nog hebt genoeg is om te certificeren, en weigert wanneer dat niet zo is.
De track die ik zo graag wilde laten passeren
Ik herinner me dat ik naar Radio Imaging Sweep 7 staarde en hem wilde laten passeren, en dat is het moment waarop deze hele demo zijn naam verdiende.
Het is een broadcast-cut die binnenkwam via wat ik modelleer als de analoge kloof, een speaker-naar-microfoon-heropname vanaf een FM-monitor. Het merkteken overleefde dat pad niet. De decoder las het terug bij confidence 0.699, de CRC faalde, en er was geen herstelbare identifier meer om een manifest mee op te halen. Hier zat de verleiding, precies daar op het scherm. De overlevingsmatrix, gedraaid op de schone master door de social-codecs, toont dat het merkteken zou overleven bij een normale transcode. Dus ik kon een versie van de logica zien die zei dat het merkteken in de basis prima is, dit is gewoon een slecht kanaal, laat het door. Artikel 99 is wat dat instinct doodde. Een vals "compliant" onder een boeteregime van €15M of 3% is de dure soort fout.

Dus de poort doet het moeilijkere. Wanneer een merkteken het kanaal waardoor een track daadwerkelijk binnenkwam echt niet overleeft, geeft hij NEEDS PROOF terug en stuurt de track door naar een mens, met de analoge-kloof-mislukking en een genoemde eigenaar eraan gekoppeld. Hij certificeert niet. Ik schreef dat als een unit-geteste invariant, een test letterlijk genoemd naar het watermerk dat sterft in de analoge kloof, omdat ik wilde dat de onthouding een eigenschap van het systeem was en geen stemming. Onthouding is niet dat de poort faalt. Onthouding is dat de poort weigert te bluffen, en weigeren te bluffen is wat een Head of Trust and Safety daadwerkelijk koopt.
Een vals "compliant" is geen kleine fout onder de boetes van Artikel 99. Het is de dure soort fout, precies daarom is de poort gebouwd om zich te onthouden voordat hij zal bluffen.
Is een hersteld watermerk niet genoeg?
Ik nam vroeg aan dat het herstellen van het watermerk in de basis de finishlijn was, en Glasshouse is de track die me corrigeerde.
Glasshouse herstelde zijn merkteken schoon, bij confidence 0.992, bitfoutpercentage 0.0 over alle drie de codecs. Herkomst, in de enge zin, was perfect. En de poort blokkeerde hem toch. De reden is de rest van de keten. DDEX ERN 4.3 heeft geen AI-disclosure-velden, en de meeste aggregators (CD Baby, DistroKid, Believe) geven geen granulaire disclosure door, volgens het Veriprajna WP31-onderzoek (2026). Glasshouse kwam binnen via DistroKid met drie van zijn vier disclosure-velden ontbrekend: instrumentation, mixing en mastering. Onder Artikel 50(4) zou het as-is verzenden een actieve disclosure-overtreding zijn, dus het oordeel is BLOCKED, met precies die clausule geciteerd op het scherm.

Daarom controleert de poort de hele keten en niet alleen het merkteken: een machineleesbaar merkteken, plus zachte-binding-herstel na het leveringskanaal, plus volledige DDEX-disclosure, plus een genoemde takedown-eigenaar. Mis één schakel en je krijgt geen groen licht. Over de volle batch van 12 releases kwam de verdeling uit op 7 gecertificeerd COMPLIANT, 2 doorgestuurd naar menselijke remediatie, en 3 geblokkeerd, en elk van de 12 draagt een oordeel met een geciteerde clausule. Die dekking is het deel waar ik om geef, omdat een Head of Rights Tech geen black box financiert, maar iets wat ze kunnen kruisverhoren ("waarom werd Glasshouse geblokkeerd? Artikel 50(4), drie DDEX-velden ontbrekend").
En de beslissingen die juridisch gewicht dragen zijn expres deterministisch. Watermerkherstel, overlevingsmeting, de zachte-binding-lookup, en de Artikel 50 pass/fail zijn gewone code, buiten de taalmodellen. Er zitten agents in het systeem, één die disclosure-velden uit vrije tekst haalt en één die elke certificering adversarieel aanvalt, maar ze adviseren. Ze beslissen niet, en het geheel draait keyless op een deterministische fallback, zodat de cijfers van de poort identiek zijn mét of zonder een LLM. Agents adviseren, code beslist.
Ik moet even duidelijk zijn over wat dit niet is, omdat het merk een overclaim niet overleeft. De manifests zijn JSON C2PA-stand-ins in een SQLite-ledger, geen cryptografisch ondertekende C2PA 2.0. De DSP- en aggregator-connectors zijn mocks. De releases zijn synthetische toon, geen echte opnames, en de tool ondersteunt een Artikel 50-antwoord, hij geeft niemand juridische certificering. Wat echt is, is het mechanisme: het herstel, de overlevingsmeting, de hele-keten-poort, en het dossier dat hij exporteert.
Een hersteld watermerk vertelde me dat de herkomst intact was. De toezichthouder vraagt nog steeds of de disclosure compleet is en wie de takedown eigendom heeft. Dat zijn andere vragen, en de poort moet ze allemaal stellen.
De vraag die ik stel voordat ik iets laat certificeren
Ik merkte dat dit bouwen iets kleins in mij veranderde, kleiner dan de grote these, en dat kleinere ding langer is blijven hangen.
Ik stopte met vragen of een AI-track heeft herkomst, omdat ik dat meestal kan beantwoorden en het blijkt niet genoeg te zijn. Neon Tide had herkomst en Glasshouse ook, en de ene werd gecertificeerd terwijl de andere werd geblokkeerd. De vraag die ik nu stel, voordat iets de poort als COMPLIANT verlaat, is of ik kan bewijzen dat de herkomst het specifieke kanaal waardoor deze track daadwerkelijk binnenkwam heeft overleefd, en of elke andere schakel in de keten houdt, en of ik liever onthoud dan gok wanneer dat niet zo is.
Dat is geen vraag die een beter watermerk beantwoordt. Naarmate de modellen van Google en Meta verbeteren, en dat zullen ze, verplaatst de waarde zich niet naar het algoritme, omdat zij het algoritme al bezitten. Die blijft in de integratielaag die herkomst de echte wereld laat overleven, en in de discipline om NEEDS PROOF te zeggen wanneer zelfs zachte binding faalt. Het duurzame deel van deze bouw is geen robuustheidsscore die veroudert de volgende keer dat SynthID beter wordt. Het is de overlevingsmeting, de hele-keten-poort, en de eerlijkheidsinvariant, waarvan geen enkele makkelijker of moeilijker wordt naarmate het watermerk verbetert. Als je wilt zien waar ik landde, staat de poort hier nogmaals: veriprajna.com/nl/demos/eu-ai-act-artikel-50-audio-ingestpoort-herkomst-die-de-social-transcodering-overleeft.
En als je liever kijkt dan mij het te horen beschrijven, hier is de hele poort van begin tot eind draaiend.
Dus de vraag die ik je wil nalaten is die welke de deadline van 2 augustus nu stil aan elk label stelt. Je hebt het merkteken toegevoegd. Kun je bewijzen dat het de reis overleefde? Want aan de andere kant van één enkele social-transcode is de tag waarop je rekende al weg, en het enige dat certificeert is wat je bouwde om te herstellen wat er nog over is.


