AudioMarker

Publié le · 20 min

Wlad
Wlad
Fondateur & Tech Lead Swift

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égorieChamps

Core

title, artist, album, genre, year, trackNumber, discNumber

Professional

composer, albumArtist, publisher, copyright, encoder, comment, bpm, key, language, isrc

Artwork

artwork (JPEG ou PNG)

Lyrics

unsynchronizedLyrics, synchronizedLyrics

URLs

artistURL, audioSourceURL, audioFileURL, publisherURL, commercialURL, customURLs

Custom

customTextFields, privateData, uniqueFileIdentifiers

Stats

playCount, rating

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 (chpl atom) — Lu par VLC, ffmpeg, et la plupart des lecteurs
    • 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).

FormatExtensionImportExportUsage typique

Podlove JSON

.json

Oui

Oui

Podcasts modernes, Podlove Publisher

Podlove XML

.xml

Oui

Oui

Feeds RSS étendus

MP4Chaps

.txt

Oui

Oui

Subler, mp4chaps CLI

FFMetadata

.ini

Oui

Oui

FFmpeg, conversion batch

Podcast Namespace

.json

Oui

Oui

Podcasting 2.0

Cue Sheet

.cue

Oui

Oui

CD ripping, DJ software

Markdown

.md

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ègleCe qu'elle vérifie

ChapterOrderRule

Les timestamps sont en ordre croissant

ChapterOverlapRule

Pas de chevauchement entre chapitres

ChapterTitleRule

Chaque chapitre a un titre non vide

ChapterBoundsRule

Aucun chapitre ne dépasse la durée audio

ChapterNonNegativeRule

Pas de timestamps négatifs

MetadataTitleRule

Le fichier a un titre

ArtworkFormatRule

L'artwork est en JPEG ou PNG

MetadataYearRule

L'année est valide (> 0)

LanguageCodeRule

La langue est un code ISO 639-2 valide

RatingRangeRule

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 :

OptionDéfautDescription

id3Version

.v2_3

Version ID3v2 pour les écritures MP3

validateBeforeWriting

true

Valider automatiquement avant écriture

preserveUnknownData

true

Conserver les frames/atomes inconnus

id3PaddingSize

2048

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 :

StandardSpécificationUsage

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 Sendable

  • Zero 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.

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…

GitHub