AudioMarker
Publié le · 20 min
Le problème
Vous avez un fichier audio brut. Vous voulez y ajouter des chapitres horodatés, une pochette, des métadonnées propres. Simple, non ?
En réalité, c'est le parcours du combattant.
À l'époque où je produisais des podcasts de musique électronique, GarageBand permettait d'encoder des fichiers M4A/M4B avec chapitrage intégré. C'était fastidieux, mais ça fonctionnait. Apple a depuis abandonné cette fonctionnalité — et personne n'a vraiment pris le relais.
Aujourd'hui, les options sont limitées : des outils en ligne de commande obscurs, des apps payantes peu flexibles, ou des dépendances lourdes comme FFmpeg qu'on ne peut pas embarquer dans une app iOS. Rien de natif, rien de Swift, rien de vraiment conçu pour les développeurs Apple.
AudioMarker comble ce vide.
La solution
AudioMarker est une bibliothèque Swift production-ready pour enrichir vos fichiers audio avec métadonnées, chapitres, artwork et paroles synchronisées.
Le coeur de la librairie est en Swift pur sans aucune dépendance externe. Tout le parsing et l'écriture — que ce soit ID3v2 pour les MP3 ou les atomes ISOBMFF/iTunes pour les M4A — se fait au niveau byte, avec un I/O streaming qui ne charge jamais les données audio en mémoire. Même sur un podcast de 3 heures, l'empreinte mémoire reste minimale.
Deux interfaces, une même puissance :
Une librairie Swift — Intégrable dans vos apps iPhone, iPad, Mac et Vision Pro. Zéro dépendance externe, 100% natif, compatible App Store.
Un outil CLI — 17 commandes pour les traitements en ligne de commande, l'automatisation et les pipelines CI/CD.
Ce qu'AudioMarker sait faire
La liste est longue, et c'est voulu. Quand on travaille avec de l'audio, on veut un outil qui gère tous les cas — pas juste les 80% faciles.
30 champs de métadonnées — Du basique (titre, artiste, album) au pro (ISRC, BPM, clé musicale, publisher, copyright)
Chapitres avec URLs et artwork — Chaque chapitre peut avoir son propre lien et sa propre image, parfait pour les Enhanced Podcasts
Paroles synchronisées — Import/export LRC, TTML, WebVTT et SRT avec fidélité complète
Karaoke et speakers — Timing word-level et identification des intervenants pour les podcasts multi-voix
9 formats d'échange — Podlove JSON/XML, MP4Chaps, FFMetadata, Podcast Namespace, Cue Sheet, Markdown, WebVTT, SRT
Moteur de validation — 10 règles intégrées, extensible via protocole
Batch processing — Traitement parallèle avec concurrence bornée
ID3v2.3 et v2.4 — Support complet lecture/écriture pour 29 types de frames
MP4/M4A/M4B — Lecture/écriture de 17 atomes iTunes, chapitres Nero et QuickTime
Quick Start
Commençons par le cas le plus simple : lire un fichier audio et afficher ses informations.
AudioMarkerEngine est le point d'entrée unifié. Il auto-détecte le format depuis les magic bytes et l'extension de fichier, puis dispatche vers le reader approprié — vous n'avez pas à vous soucier de savoir si c'est un MP3, un M4A ou un M4B.
Écrire des métadonnées
AudioMarker supporte 30 champs de métadonnées répartis en 7 catégories. Voici comment écrire les plus courants :
Le format de l'artwork est auto-détecté depuis les magic bytes — pas besoin de spécifier si c'est du JPEG ou du PNG.
Les 30 champs disponibles
Pour les curieux, voici la liste complète organisée par catégorie :
| Catégorie | Champs |
|---|---|
Core |
|
Professional |
|
Artwork |
|
Lyrics |
|
URLs |
|
Custom |
|
Stats |
|
Ces champs couvrent à la fois la spec ID3v2 (frames TXXX, WXXX, PRIV, UFID...) et les atomes iTunes pour M4A. AudioMarker écrit dans le bon format selon le type de fichier.
Chapitres : le coeur du sujet
Les chapitres, c'est ce qui transforme un fichier audio monolithique en une expérience navigable. Podcast, audiobook, mix DJ — tout devient plus accessible avec un bon chapitrage.
AudioMarker gère automatiquement les points IN/OUT : vous n'avez pas besoin de spécifier la fin de chaque chapitre, elle est calculée à partir du début du suivant.
Enhanced Podcasts : URLs et artwork par chapitre
Le format Enhanced Podcast (popularisé par Apple dans les années 2000) permet d'associer un lien et une image à chaque chapitre. Idéal pour les show notes, les sponsors, ou les références visuelles.
Double écriture Nero + QuickTime
Pour les fichiers M4A/M4B, AudioMarker écrit les chapitres dans deux formats simultanément :
- Nero chapter list (
chplatom) — Lu par VLC, ffmpeg, et la plupart des lecteurs
- Nero chapter list (
- QuickTime text track — Lu par Apple Podcasts, QuickTime Player, et les apps Apple natives
Cette double écriture garantit une compatibilité maximale sans effort de votre part.
Import/Export de chapitres
Vous avez des chapitres dans un format externe ? Ou vous voulez exporter vers un format spécifique ? AudioMarker supporte 7 formats d'échange avec import/export bidirectionnel (sauf Markdown, export uniquement).
| Format | Extension | Import | Export | Usage typique |
|---|---|---|---|---|
Podlove JSON |
| Oui | Oui | Podcasts modernes, Podlove Publisher |
Podlove XML |
| Oui | Oui | Feeds RSS étendus |
MP4Chaps |
| Oui | Oui | Subler, mp4chaps CLI |
FFMetadata |
| Oui | Oui | FFmpeg, conversion batch |
Podcast Namespace |
| Oui | Oui | Podcasting 2.0 |
Cue Sheet |
| Oui | Oui | CD ripping, DJ software |
Markdown |
| Non | Oui | Documentation, show notes |
Exemple d'export vers Podlove JSON :
Vous pouvez aussi importer directement dans un fichier audio :
Paroles synchronisées
Au-delà des chapitres, AudioMarker gère les paroles synchronisées — ces textes horodatés qui s'affichent en temps réel pendant la lecture. Trois niveaux de complexité sont supportés.
Paroles simples (ligne par ligne)
Karaoke (timing word-level)
Pour le karaoké, chaque mot peut avoir son propre timing. AudioMarker utilise LyricSegment pour découper une ligne en morceaux :
Identification des speakers
Pour les podcasts avec plusieurs intervenants, ou les pièces de théâtre audio, vous pouvez identifier qui parle à chaque ligne :
Stockage intelligent pour M4A
Lors de l'écriture en M4A, AudioMarker choisit automatiquement le meilleur format de stockage :
- Paroles simples mono-langue → LRC (compatibilité maximale avec les lecteurs)
- Karaoké, multi-langue ou speakers → TTML (fidélité complète)
Vous n'avez pas à y penser — le bon choix est fait pour vous.
Import/Export de paroles
4 formats sont supportés pour l'échange de paroles :
TTML supporte les round-trips complets — les speakers, styles et régions survivent à l'export/import.
Validation
Avant de publier un fichier audio enrichi, mieux vaut vérifier que tout est cohérent. AudioValidator inspecte un AudioFileInfo et remonte les problèmes potentiels :
Les 10 règles intégrées
| Règle | Ce qu'elle vérifie |
|---|---|
| Les timestamps sont en ordre croissant |
| Pas de chevauchement entre chapitres |
| Chaque chapitre a un titre non vide |
| Aucun chapitre ne dépasse la durée audio |
| Pas de timestamps négatifs |
| Le fichier a un titre |
| L'artwork est en JPEG ou PNG |
| L'année est valide (> 0) |
| La langue est un code ISO 639-2 valide |
| Le rating est entre 0 et 255 |
Règles personnalisées
Vous pouvez créer vos propres règles via le protocole ValidationRule :
Validation automatique à l'écriture
Vous pouvez configurer l'engine pour valider automatiquement avant chaque écriture :
Batch processing
Quand vous avez 200 épisodes de podcast à traiter, le faire un par un n'est pas une option. BatchProcessor traite plusieurs fichiers en parallèle avec une concurrence TaskGroup bornée — vous contrôlez combien de fichiers sont traités simultanément.
Suivi de progression
Pour afficher une barre de progression ou un indicateur, utilisez processWithProgress qui retourne un AsyncStream :
Opérations batch supportées : .read, .write(_:), .strip, .exportChapters(format:outputURL:).
Timestamps
AudioTimestamp est le type utilisé partout dans AudioMarker pour représenter un instant dans le temps. Il offre une précision à la milliseconde et des utilitaires de parsing/formatage :
Configuration avancée
L'engine accepte plusieurs options de configuration :
| Option | Défaut | Description |
|---|---|---|
|
| Version ID3v2 pour les écritures MP3 |
|
| Valider automatiquement avant écriture |
|
| Conserver les frames/atomes inconnus |
|
| Padding pour éviter la réécriture complète |
Le padding ID3 est une optimisation importante : si vous modifiez souvent les tags d'un fichier, un padding suffisant permet d'éviter de réécrire tout le fichier audio à chaque modification.
CLI : 17 commandes pour tout faire
audio-marker est l'interface ligne de commande qui expose toutes les fonctionnalités de la librairie. Parfait pour les scripts, l'automatisation et les pipelines CI/CD.
Installation
Lecture et écriture
Gestion des chapitres
Import/Export
Paroles
Artwork et utilitaires
Batch
Standards et spécifications
AudioMarker implémente plusieurs standards audio. Voici les références pour les curieux qui veulent comprendre ce qui se passe sous le capot :
| Standard | Spécification | Usage |
|---|---|---|
ID3v2.3 | id3.org (archivé) | Tags MP3, frames CHAP/CTOC/APIC/SYLT |
ID3v2.4 | id3.org (archivé) | Version moderne avec UTF-8 natif |
ISO 14496-12 (ISOBMFF) | ISO | Structure des fichiers MP4/M4A |
iTunes Metadata | Apple | Atomes ©nam, ©ART, covr, etc. |
Nero Chapter Format | Nero AG | Atom chpl pour chapitres M4A |
Podlove Simple Chapters | podlove.org/simple-chapters | Format JSON/XML pour podcasts |
LRC | Enhanced LRC format | Paroles synchronisées karaoké |
TTML | W3C Timed Text | Paroles avec speakers et styles |
WebVTT | W3C WebVTT | Sous-titres web |
Podcast Namespace | podcastindex.org/namespace | Extensions RSS Podcasting 2.0 |
Architecture
Le package est organisé en modules distincts avec une séparation claire des responsabilités :
Le module AudioMarker n'a aucune dépendance externe. Seul le CLI dépend de swift-argument-parser pour le parsing des arguments.
Installation
Prérequis
Swift 6.2+ avec strict concurrency
macOS 14+ · iOS 17+ · visionOS 1+ · Mac Catalyst 17+
Ajoutez le package à votre Package.swift :
Puis ajoutez la dépendance à votre target :
Roadmap
AudioMarker est en version 0.1.0 avec toutes les fonctionnalités documentées ci-dessus. Voici ce qui est prévu pour les prochaines versions :
Nouveaux formats audio — FLAC, WAV, AIFF, OGG Vorbis/Opus
Support Linux — Compatibilité Foundation cross-platform
Legacy ID3 — Lecture ID3v1 et ID3v2.2
Formats artwork additionnels — WebP, AVIF, HEIF
Sous le capot
Swift 6.2 — Strict concurrency, tous les types publics sont
SendableZero dependencies — Que du Swift pur pour le core
Streaming I/O — Les données audio ne sont jamais chargées en mémoire
Multi-platform — iOS, macOS, visionOS, Mac Catalyst
App Store ready — Pas de binaires tiers, signable sans problème
Liens
GitHub - atelier-socle/swift-audio-marker: Swift library for enriching audio files with chapters, metadata, artwork, and synchronized lyrics. Native ID3v2 and MP4 atom reading/writing, streaming I/O, zero third-party dependencies.
Swift library for enriching audio files with chapters, metadata, artwork, and synchronized lyrics. Native ID3v2 and MP4 atom reading/writing, streamin…