Sous-titres et transcriptions JSON

OuvrirEnregistrerTranscriptionsReconnaissance vocale

Pas un seul format mais plusieurs : le JSON est le moyen par lequel les moteurs de reconnaissance vocale, les sites vidéo et les sites de sous-titres transmettent sous-titres et transcriptions, chacun dans une forme qui lui est propre. Subtitld enregistre les siens, dans la forme qu'écrit Whisper, avec tout ce que contient un sous-titre, et ouvre ce qu'une douzaine d'autres outils écrivent.

En bref

Extension.json
Type de médiaapplication/json
SpécificationLe JSON lui-même : RFC 8259 et ECMA-404. La forme de chaque outil lui est propre.
Précision temporelleCelle de Subtitld : secondes, à la milliseconde. Les autres : millisecondes, secondes, tics de 100 nanosecondes, ou du texte comme "1.400s".
Encodage du texteUTF-8
StyleCelui de Subtitld : les balises que conserve son texte. Celui de YouTube : gras, italique, soulignement et couleurs. Les autres : aucun.
PositionnementCelui de Subtitld : dans le texte, sous la forme {\an8}. Celui de YouTube : des fenêtres. Celui de Bilibili : un emplacement.
LocuteursLe speaker de Subtitld ; les services de reconnaissance vocale nomment les leurs
Dans les conteneursAucun

Anatomie du JSON de Subtitld

Ce qu'enregistre Subtitld, pour un sous-titre :

{
  "language": "en-us",
  "segments": [
    {
      "id": 0,
      "start": 23.0,
      "end": 24.5,
      "text": "You're a jerk, Thom.",
      "speaker": "Celia"
    }
  ],
  "text": "You're a jerk, Thom."
}
Élément Ce que c'est
"language" La langue du projet, telle que la nomme Subtitld (en-us)
"segments" Les sous-titres, dans l'ordre
"id" Son numéro, à partir de 0, comme le numérote Whisper
"start", "end" Secondes
"text" Son texte, avec ses balises (<i>, {\an8}) et ses sauts de ligne (\n)
"speaker", "translations" … Tout le reste que contient le sous-titre : son locuteur, ses traductions par langue, ses doublages
"text", à la fin Tout le texte sur une seule ligne, pour les outils qui n'en veulent que ça. Non relu.

La forme de Whisper, délibérément. C'est celle qu'écrit le Whisper d'OpenAI, si bien que les outils qui lisent les segments de Whisper lisent les fichiers de Subtitld, et que Subtitld ouvre ceux de Whisper, en laissant de côté les statistiques de son décodage et les temps de chaque mot.

Ce que Subtitld ouvre

Le JSON de chaque outil indique lui-même lequel il est, par ses clés. Subtitld ouvre ceux-ci :

Outil Ce que Subtitld en prend
Subtitld, Whisper d'OpenAI Chaque champ (ceux de Subtitld) ; le texte et la langue (ceux de Whisper)
whisper.cpp Ses segments, et ses locuteurs lorsqu'il distingue les deux canaux
WhisperX Ses segments et ses locuteurs
YouTube (.json3, tel qu'yt-dlp l'enregistre) Texte, gras, italique, soulignement, couleurs et emplacement
Bilibili (.bcc) Texte et emplacement
AssemblyAI, Deepgram, AWS Transcribe, Rev.ai, Google Speech-to-Text, Azure Speech, Speechmatics Les mots, les locuteurs et la langue, transformés en sous-titres
Amara Texte, italique, gras, soulignement, et sous-titres en haut

Un fichier JSON qui n'est aucun de ceux-là le dit. Un fichier qui n'est pas du JSON valide indique où il se trompe, par ligne et colonne.

Transcriptions en sous-titres

Les services de reconnaissance vocale livrent des mots avec leurs temps, ou de longs tours de parole. Subtitld en fait des sous-titres, dans les limites de son panneau Vérification qualité : caractères par ligne, lignes et secondes. Un sous-titre se termine :

  • lorsque le locuteur change, ou que la parole marque une pause de plus d'une seconde ;
  • à la fin d'une phrase, lorsque le suivant la ferait dépasser une ligne ;
  • lorsqu'il est plein : à sa dernière ponctuation qui le laisse assez plein, sinon entre deux mots.

Un tour de parole sans temps de mots est réparti de la même façon, son temps étant partagé selon la longueur de ses parties.

Réglez d'abord les limites. Les sous-titres sont créés à l'ouverture du fichier : modifiez les limites de Vérification qualité avant d'ouvrir une transcription pour obtenir des sous-titres plus longs ou plus courts.

Locuteurs et langues

Les services numérotent leurs locuteurs : 0, spk_1, SPEAKER_02, S3. Subtitld les appelle A, B, C … dans l'ordre où ils prennent la parole pour la première fois, comme il nomme lui-même ses locuteurs ; un locuteur qu'un fichier nomme, comme peut le faire Rev.ai, garde son nom.

La langue du projet vient du fichier, sous forme de code (en_us, pt) ou de nom (English, tel que Whisper le garde lorsqu'on le lui demande), ou sinon du nom du fichier : video.en.json3. Un fichier dans la langue du projet garde le pays du projet : pt dans un projet pt-br reste pt-br.

JSON de YouTube

Ce que lit le lecteur de YouTube, et qu'yt-dlp enregistre au format .json3 : des événements de texte en millisecondes, avec des plumes pour le gras, l'italique, le soulignement et les couleurs, et des fenêtres pour l'endroit où ils s'affichent. Les sous-titres automatiques défilent, une ligne après l'autre, chacune affichée jusqu'à l'apparition de la suivante ; Subtitld fait de chaque ligne un sous-titre jusqu'au début de la suivante.

BCC de Bilibili

Ce que lit le lecteur de Bilibili, et l'autre JSON que Subtitld enregistre.

{
  "font_size": 0.4,
  "font_color": "#FFFFFF",
  "background_alpha": 0.5,
  "background_color": "#9C27B0",
  "Stroke": "none",
  "body": [
    {
      "from": 23.0,
      "to": 24.5,
      "location": 2,
      "content": "You're a jerk, Thom."
    }
  ]
}

Les temps sont en secondes ; content est du texte brut, ses lignes séparées par \n. L'aspect en haut est celui que portent les fichiers propres à Bilibili, et que Subtitle Edit écrit aussi.

Un sous-titre à la fois. Les sous-titres affichés au même moment deviennent une seule entrée, leurs textes une ligne chacun, si bien que la chronologie n'a aucun chevauchement. location vaut toujours 2, le centre bas : le lecteur de Bilibili n'est pas connu pour s'en servir afin de placer les sous-titres ailleurs.

JSON dans Subtitld

Conservé dans le JSON de Subtitld
  • Le texte, la mise en forme et l'emplacement de chaque sous-titre
  • Les locuteurs, les traductions et les doublages
  • Début et fin, à la milliseconde
  • La langue du projet
Aucun moyen de les garder
  • Les temps de chaque mot, et le degré de certitude d'un service pour chacun
  • Les statistiques de décodage de Whisper
  • Polices, tailles, bordures et arrière-plans de YouTube
  • En BCC : mise en forme, emplacement, et traductions à côté de l'original

Enregistrez un projet .usfx pour conserver ce qui est propre à Subtitld.

Exporter

La boîte de dialogue d'export de Subtitld avec BCC choisi, l'original et les noms des locuteurs avant lui

Exporter, puis Sous-titres, propose les deux :

  • JSONCelui de Subtitld : le projet tel qu'il est, chaque sous-titre et chaque champ.
  • BCCCelui de Bilibili : l'original, une traduction, ou les deux, la traduction en dessous ; noms des locuteurs omis ou avant le texte ; temps décalés si vous le choisissez.

Anecdotes

UTF-8

La norme JSON, RFC 8259 de 2017, veut que le JSON échangé entre systèmes soit en UTF-8.

10,000,000

Tics par seconde dans les transcriptions d'Azure : il compte le temps en centaines de nanosecondes.

5

Secondes pendant lesquelles le lecteur de YouTube affiche un sous-titre json3 qui ne dit pas combien de temps il dure.

Formats associés

Un fichier .json à corriger ?

Ouvrez-le dans Subtitld avec la vidéo et recalez-le sur la forme d'onde.

Télécharger Subtitld