Communitygithub.com

CatsMansion/mv-jp-lyrics-subtitle

Construisez des sous-titres de paroles japonaises pour un clip vidéo, comme les lecteurs japonais les lisent réellement : coupez aux limites des 文節 (bunsetsu), révélez chaque syntagme à son attaque vocale mesurée (pas en moyennant le nombre de syllabes), écrivez en 漢字仮名交じり plutôt qu'en tout kana, et vérifiez que chaque caractère de la ligne apparaît aussi dans la typographie d'arrière-plan. À utiliser lorsque la tâche implique des paroles de chansons japonaises à l'écran, le timing karaoké/phrasé, la 字幕断句, la ルビ/縦書き, la typographie lyrique, ou que 'les sous-titres semblent bizarres à un spectateur japonais'. Livre deux scripts : un extracteur d'attaques mesurées (pyin + filtrage énergétique, avec correction des faux positifs de fin de syntagme) et un vérificateur de couverture.

Qu'est-ce que mv-jp-lyrics-subtitle ?

Ce skill résout le problème des sous-titres de paroles japonaises qui, bien que semblant corrects, sont immédiatement perçus comme erronés par un locuteur natif japonais. Il se concentre sur quatre erreurs courantes : le découpage temporel uniforme des syllabes (moyennant artificiellement la durée), les césures à l'intérieur des mots (par exemple, couper après une particule), l'utilisation exclusive de hiragana (rendant la lecture enfantine), et le collage des attaques de mots sur les points de changement de hauteur (faisant démarrer une phrase une demi-seconde trop tôt). Le skill fournit une méthode robuste pour mesurer avec précision l'attaque de chaque syntagme (文節). Il utilise la séparation de la voix (Demucs), puis l'extraction de la hauteur (pyin), la détection des débuts (onset detection), et un filtrage critique en trois étapes pour distinguer une vraie attaque d'une fin de phrase descendante. Cette méthode inclut un correctif essentiel qui vérifie la présence de voix dans les 180 ms suivant une attaque candidate, évitant ainsi les faux positifs des fins de phrase. Il spécifie également les règles typographiques japonaises standard (JIS X 4051) pour la césure, le nombre maximum de caractères par ligne, le choix de l'écriture (漢字仮名交じり), et les paramètres de mise en page (taille de police, espacement, couleur dérivée de l'analyse de MV commerciaux). Il inclut un script de vérification de couverture (`check_lyric_coverage.py`) qui garantit que chaque caractère de la ligne de sous-titres apparaît également dans le texte d'arrière-plan (typographie géante). Enfin, le skill met en garde contre les pièges courants : ne pas utiliser le BPM comme une grille temporelle, ne pas se fier aux horodatages ASR (trop imprécis pour les attaques mesurées), ne pas utiliser Whisper pour les paroles (hallucinations fréquentes), et ne pas appliquer deux fois les valeurs de compensation d'avance. Il fournit également un benchmark comparatif des outils d'alignement forcé (MMS_FA est le seul à atteindre la précision requise de ≤0.15s, mais avec une licence CC-BY-NC).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add CatsMansion/mv-jp-lyrics-subtitle

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Sous-titres de paroles japonaises : césure, timing d'apparition, notation et mise en page

0. Que résout ce skill ?

Les quatre erreurs les plus fréquentes dans les sous-titres de paroles japonaises, toutes « semblent correctes, mais un Japonais les voit immédiatement » :

  1. Division égale du temps par le nombre de caractères — une phrase de 5,7 s avec 16 syllabes, moyenne de 0,36 s par syllabe. En réalité, les durées réelles varient du simple au triple.
  2. Coupure au milieu d'un mot — 君 / を見るたび. Une particule ne peut pas commencer une ligne.
  3. Tout en hiragana — les paroles sont souvent écrites en hiragana pour les modèles TTS/génération, mais affichées ainsi, elles ressemblent à un livre pour enfant.
  4. L'attaque du mot est accrochée au « point de changement de hauteur » — la note descendante de fin de phrase est prise pour le début de la phrase suivante, avançant toute la phrase d'une demi-seconde.

1. Huit règles strictes

#RègleContre-exemple
R1Les coupures se font uniquement aux limites d'un 文節. Ne pas séparer un nom + particule, un verbe + auxiliaire✗ 君/を見るたび ✗ 見/てるのに
R2L'instant d'apparition de chaque segment = l'attaque réelle de la première syllabe du segment. ⛔ Interdiction de diviser également le temps par le nombre de caractères✗ (end-start)/n × k
R3Maximum 3 segments par ligne, de préférence 2✗ 君を/見る/たび
R4Pas de ponctuation affichée ; espaces pleine chasse entre les segments  ✗ 君を、見るたび
R5Règles de césure (JIS X 4051) : les petites kana ゃゅょっ, le tiret long ー, la gémination, et les parenthèses fermantes ne commencent pas de ligne✗ Ligne commençant par っ
R6Une ligne ≤ 16 caractères (norme des sous-titres japonais Netflix)—
R7Une fois apparu, le texte ne disparaît pas (affichage cumulatif), sinon le public perd le contexte✗ Supprimer le premier segment quand le deuxième apparaît
R8Le texte géant d'arrière-plan doit contenir tous les caractères de la ligne, missing doit être vide après vérification caractère par caractère✗ L'arrière-plan n'a que la seconde moitié

Pourquoi R1 utilise 文節 et non « mot » : le japonais n'a pas d'espaces, et la coupure machine se fait à la largeur de la boîte. Un lecteur respire par 文節 — 君を/見るたび correspond exactement à deux respirations. Méthode de jugement : lisez ce segment à voix haute ; si cela ressemble à une seule respiration, c'est correct.


2. Timing d'apparition mesuré (essentiel, ne pas estimer)

2.1 Prérequis

Vous avez besoin de la piste vocale séparée (Demucs / htdemucs -> vocals.wav). La piste mixte a des pics d'énergie venant de la batterie et de la basse.

python scripts/measure_lyric_onsets.py --vocal vocals.wav --lines lines.json --out timing.json

lines.json ressemble à ceci (kana pour estimer la position attendue en fonction du nombre de syllabes, disp est la notation réelle à l'écran) :

[{"id": 9, "start": 42.26, "end": 48.00,
  "kana": ["きみを", "みるたび", "しんぞうがとまるの"],
  "disp": ["君を", "見るたび", "心臓が止まるの"]}]

2.2 Algorithme (trois étapes ; en manquer une provoque des erreurs)

  1. Extraire F0 : librosa.pyin(fmin=150, fmax=900, hop_length=128), puis filtrer médian sur F0 pour supprimer le vibrato.
  2. Trouver les limites candidates : saut de hauteur ≥ 0,8 demi-ton ∪ librosa.onset.onset_detect(delta=0.30, wait=3).
  3. ⛔ Filtrage par seuil (étape la plus critique) : un point candidat doit satisfaire simultanément :
    • L'énergie dans les 40 ms suivantes n'est pas inférieure à 55 % de celle des 40 ms précédentes (pas une chute brutale)
    • La proportion de trames avec F0 non NaN dans les 180 ms suivantes est ≥ 60 % (la personne chante encore)

Ensuite : pour chaque 文節, calculer la position relative attendue comme nombre cumulé de syllabes / nombre total de syllabes, et l'accrocher à la limite valide la plus proche.

2.3 Pourquoi l'étape 3 est indispensable (contre-exemple mesuré)

Dans « 君を見るたび 心臓が止まるの », le び à 44,87 s a une fin descendante (F#2 → fin), silence de 0,33 s, puis しんぞう commence à 45,24.

  • Étape 2 seule → la limite attrape 44,81 (la descente de び), avançant « 心臓が止まるの » de 0,43 s.
  • Étape 3 première condition seule (rapport d'énergie sur 40 ms) → encore faux. À 44,81, l'énergie n'a pas encore chuté, la fenêtre de 40 ms est trop courte.
  • Ajout de « présence de voix dans les 180 ms suivantes » → 45,17, soit 0,07 s d'écart avec la vérification manuelle. ✅

⇒ « Y a-t-il encore quelqu'un qui chante après ? » est plus discriminant que « l'énergie à ce moment est-elle élevée ? » pour distinguer un changement de mot d'une fin de phrase.

2.4 Quand cette méthode échoue-t-elle aussi ?

  • Phrases en anglais : pas de plateau de hauteur, pyin ne peut pas détecter les limites syllabiques. Division proportionnelle à la durée uniquement, avec mention claire « estimation ».
  • Mélismes (une syllabe sur plusieurs notes) : le nombre de plateaux de hauteur > nombre de syllabes, l'accrochage sera biaisé. Nécessite une écoute humaine.
  • Phrases dont l'écart d'accrochage > 0,45 s : marquer systématiquement UNSURE et confier à un humain, ne pas considérer comme mesuré correctement.

2.5 ⛔⛔ Vérifier d'abord « la fenêtre temporelle de chaque phrase » elle-même, avant de parler de découpage intra-phrase

C'est un piège plus en amont que le §2.3, et le plus souvent ignoré.

La grande majorité des fichiers de timing de paroles (lyrics.ts / SRT / LRC) ont leurs start/end découpés linéairement par nombre de lignes ou estimés manuellement, et non écoutés phrase par phrase. Si on utilise ces fichiers pour les sous-titres, même un timing intra-phrase parfait donne une phrase entièrement décalée.

Symptôme : les sous-titres sont en avance ou en retard de 1 à 4 secondes par rapport à la voix, et plus on avance, plus le décalage augmente (car c'est un étirement linéaire). L'utilisateur ne le remarque pas pendant le refrain (la fenêtre du refrain est généralement correcte), mais il le constate dès les premières phrases du couplet.

Solution : ré-ancrer chaque phrase en utilisant les intervalles de respiration

Sur la piste vocale séparée, il y a toujours un silence entre les phrases. C'est la frontière la plus solide, sans besoin de modèle :

rms = librosa.feature.rms(y=vocal, frame_length=1024, hop_length=128)[0]
e = rms / rms.max()
quiet = e < 0.055                      # seuil relatif, suffisant en pratique
# marquer comme intervalle de respiration une séquence continue de quiet >= 0,16 s

Ensuite : le segment sonore entre deux intervalles consécutifs est une phrase musicale.

Exemple mesuré (même chanson) :

Intervalle 0.00-12.12 (intro sans chant)
Sonore   12.12-13.73  ← ドアのとこで
Intervalle 13.73-14.67
Sonore   14.67-16.59  ← 立ち止まってる
Intervalle 16.59-17.07
Sonore   17.07-17.98  ← 本当は

Alors que le tableau de paroles indique « Phrase 1 : 12.00–15.75 », « Phrase 3 : à partir de 19.50 » — la phrase 3 commence en réalité à 23.63, soit 4,1 s plus tôt.

⭐ Critère : comparer le nombre de segments sonores détectés au nombre de 文節 de ce passage.

  • Si les nombres sont égaux ⇒ le chanteur respire après chaque 文節, correspondance 1:1, précision à la milliseconde, pas de conjecture.
  • Si le nombre est inférieur ⇒ il y a des mélismes, utiliser la méthode de hauteur (§2.2) pour trouver les limites intra-phrase.
  • Si le nombre est supérieur ⇒ le seuil est trop lâche, augmenter 0.055 ou allonger 0.16.

⛔ Ne pas utiliser le « comptage des pics d'énergie » à la place de la détection de respiration : le vibrato d'une longue note produit plusieurs pics. Mesuré : une phrase de 16 syllabes produit 33 pics d'énergie, totalement inutilisable.

⛔ Ne pas utiliser la « normalisation par médiane glissante + seuil bas » pour trouver les faibles respirations : le couplet produira 23 faux intervalles (vrai : 19), impossible de séparer le bruit des vraies respirations. Il vaut mieux n'ancrer que les phrases qui ont un vrai silence dur, et marquer clairement les autres comme « remappage/estimation ».


3. Notation : 漢字仮名交じり

Les tableaux de paroles (surtout ceux générés par IA) sont souvent écrits entièrement en hiragana. Ils doivent être convertis en notation standard utilisant les kanji usuels.

Tout hiragana (paroles brutes)Notation à l'écran
きみをみるたび君を見るたび
ほんとは / きみのほう本当は / 君のほう
なかに中に
においだけで匂いだけで
いちばんとおい一番遠い
こわれちゃいそう / ちかづくと壊れちゃいそう / 近づくと
たちどまってる立ち止まってる
わたしのあかし私の証

⛔ Ne pas sur-kanjiser : すきだよって ne doit pas devenir 好きだよって… en fait, il faut l'écrire (好き). Mais les adverbes oraux/particules finales comme なっちゃう, ずるいよね, なんてかな restent en kana — tout mettre en kanji sonne artificiel. Critère : ce mot est-il généralement écrit en kanji dans les romans/paroles japonaises ? En cas de doute, gardez le kana.


4. Paramètres de mise en page (sourcés, ne pas inventer)

Les valeurs suivantes proviennent du rétro-ingénierie quantitative de quatre MV commerciaux d'animation (base 1280×720 convertie en 1080p) :

ÉlémentValeur 1080p
Hauteur des caractères principaux97~108 px
Petits caractères (voix off)53 px
Caractères d'accentuation du refrain124 px
Caractères géants d'arrière-plan270~670 px
Ligne de base inférieurey ≈ 950~1004
Largeur maximale d'une ligne≤ 1747 px (≤ 91 % de la largeur de l'image)

⭐ Découverte la plus importante : les MV commerciaux n'ont généralement PAS de fond pour les paroles principales. Texte blanc + contour foncé de 2~3 px. Seules les phrases d'accentuation utilisent une bande blanche pleine largeur avec texte noir. Ajouter un fond arrondi à chaque ligne est la principale source d'aspect amateur.

Ne changez pas de palette de couleurs en cours de route : un clip n'a qu'une teinte principale, le refrain ne fait qu'augmenter la saturation sans changer la teinte.

4.1 Disposition verticale multi-colonnes = visualisation des coupures

En disposition horizontale, la séparation par espaces pleine chasse donne l'impression « pas de coupure ». En disposition verticale, chaque 文節 devient une colonne, de droite à gauche, et la coupure devient la mise en page elle-même :

君を | 見るたび | 息が止まるの
colonne droite    colonne centrale    colonne gauche

La position de la colonne est fixe en fonction du numéro du 文節 (le k-ième segment est toujours dans la k-ième colonne). Lorsqu'un nouveau segment apparaît, les colonnes existantes ne bougent pas — sinon le bloc de texte saute à chaque apparition.

4.2 Limite physique de la disposition verticale (calculer d'abord la taille de police, puis l'appliquer)

Ligne de n caractères, interligne 1,46 : hauteur nécessaire = n × taille_police × 1,46. Hauteur d'image 1080, espace utilisable 940 px ⇒ taille_police maximale = 940 / (n × 1,46).

  • 8 caractères (心臓が止まるの) → 79 px, en dessous du minimum de 97 px
  • 6 caractères → 107 px ✅

⇒ Les longues phrases de plus de 7 caractères ne tiennent pas dans la fourchette de taille de police des paroles principales en vertical ; il faut passer en horizontal sur deux lignes. Calculez d'abord, ne découvrez pas le problème après la mise en page.


5. Auto-vérification (à imprimer à chaque fois ; ne pas livrer sans vérifier)

python scripts/check_lyric_coverage.py --timing timing.json --disp disp.json

La sortie doit satisfaire simultanément :

COVER line='君を見るたび' missing=[] OK=True
ORDER sub_a='君を' sub_b='見るたび' concat_equals_full=True

missing non vide ⇒ cette version ne peut pas être livrée. ORDER vérifie que la concaténation des sous-parties est égale à la phrase complète (évite les caractères manquants/répétés).


6. Une chose à faire absolument avant de commencer

Faites d'abord un grep dans la documentation du projet pour les spécifications des sous-titres. Les tailles de police, palettes, et fonds déjà décidés pour ce projet se trouvent généralement dans 02_文档/ ou docs/ d'un dossier d'analyse/décision :

grep -rn -E "字幕|字体|排版|几何|字高|描边|底板" docs/ 02_文档/ | head -40

⛔ Ne décidez pas vous-même « je trouve que c'est plus joli comme ça » — cela entrera inévitablement en conflit avec les spécifications déjà validées, et le coût de reprise sera le rendu complet du clip. La section 4 de ce skill a été écrite à cause de cette leçon.


7. Relevé de mesures (pour calibrer les attentes)

Une chanson japonaise à 163,994 BPM, première phrase du refrain :

Syllabeきみをみるたび
Attaque (s)42,3142,7643,0943,4143,6143,9844,18
HauteurB3E4F#4G#4F#4F4F#4

7 syllabes ↔ 7 plateaux de hauteur, correspondance un-à-un ⇒ cette chanson est à une note par syllabe. Avec une autre chanson comportant plus de mélismes, le nombre de plateaux sera inférieur au nombre de syllabes, et l'accrochage devra être marqué UNSURE.


8. ⛔ Le BPM n'est pas une grille (dérive mesurée)

Le champ bpm d'une chanson ne peut servir que d'étiquette, pas pour calculer des points de coupe. Mesuré : une chanson à 128,28 → 132,39 BPM (468 ms → 453 ms par beat), la grille fixe est décalée d'un battement complet dès la 30e mesure.

  • Utiliser beats[] (déjà accroché aux attaques) + bars[].start pour obtenir le temps réel
  • beats pour les points de percussion (coupes / flashs / impact de texte) ; beats_smooth pour les mouvements continus (vitesse de caméra / boucles)
  • ⛔ Ne jamais écrire t0 + n * 60 / bpm
  • Le numéro de mesure n'est pas égal à l'indice du tableau : avec une mesure anacrouse, bars[].index peut différer de la position. Chercher par index.

9. ⛔ Les horodatages de mots de l'ASR sont trop en avance, ne peuvent pas servir de timing d'attaque

Écart mesuré : 0,04 à 2,0 s, médiane 0,62 s ; pire après une longue note. ⇒ L'ASR ne peut servir qu'à obtenir l'approximation du début de chaque phrase (±1s). Le timing précis de l'attaque doit utiliser l'alignement forcé (MMS CTC / torchaudio). Critère : l'erreur sur l'attaque de chaque phrase doit être ≤ 0,15 s pour être considérée comme correcte.

10. ⛔ Liste des hallucinations de Whisper (à supprimer si elles apparaissent)

En cas de silence, souffle, vocalises, Whisper génère :

  • « ご視聴ありがとうございました » (a déjà couvert 0,6–103 s)
  • « チャンネル登録… »
  • « 作詞・作曲・編曲 初音ミク »
  • Répétitions de mots courts, ラララ…

⇒ Règle : les paroles officielles sont la référence ; en l'absence de paroles officielles, utiliser la transcription, mais en la comparant ligne par ligne avec le document officiel (la comparaison de différences ne détecte pas « une ligne entière manquante »). ⇒ Le VAD doit être désactivé (Silero confond les voyelles chantées). La piste vocale séparée est supérieure à tout renforcement DSP.

11. Balises LRC (mini-langage pour les animations de paroles)

BaliseRôle
groupeA/groupeBForcer un saut de ligne, les deux moitiés deviennent des battements différents
*mot*Accentuation : plus grand + composant d'impact + couleur d'accent
! en fin de ligneLigne « kime » (traitement le plus fort, peut inclure flash/impact) — 1 à 2 lignes par refrain
[間奏]Ligne instrumentale : empêche la ligne précédente de rester affichée dans le vide

⛔ Ne pas compenser deux fois l'avance : le moteur de paroles intègre généralement déjà un « 0,2 s avant la voix ». Si votre timeline a déjà soustrait 0,2 s, en ajouter à nouveau ici donnera 0,4 s d'avance.

12. La mesure de fin de refrain (stop)

Les mesures à la fin du refrain où le groupe s'arrête, quasi a cappella, sont l'emplacement le plus important de tout le clip pour l'image à afficher, pas un moment pour couper. Ne le traitez pas comme « il n'y a pas de batterie ici, donc mettez n'importe quoi ».


13. ⭐ Comparaison mesurée de cinq outils d'alignement forcé sur des paroles japonaises

Source : benchmark tiers (20 segments, avec chinois/anglais/japonais), le tableau ci-dessous prend la colonne japonais.

OutilErreur début (médiane)Erreur fin (médiane)CouvertureAvis
MMS_FA (torchaudio)0,08 s0,11 s8/8✅ Seul à atteindre le seuil
whisper-timestamped—0,16 s8/8⚠️ Second choix
WhisperX—1,67 s (p90 2,81)8/8❌ Couverture complète mais limites instables
NeMo NFA——0/8❌ Pas de CTC pré-entraîné pour le japonais
aeneas2,70 s3,66 s8/8❌ Échec

⛔ aeneas est inadapté au chant : sa propre documentation indique « Audio is assumed to be spoken: not suitable for song captioning ». Mesuré : erreur de 2,7 à 3,7 s en japonais, pire qu'une division uniforme par nombre de caractères.

⇒ Pour ≤ 0,15 s, seul MMS_FA convient. Les autres sont en dessous du seuil.

⚠️⚠️ Mais la licence de MMS_FA est CC-BY-NC (non commerciale). Si nous commercialisons sur Steam, nous devons faire un autre arrangement de licence, ou l'utiliser uniquement pour l'alignement interne sans distribuer les poids du modèle avec le produit. Cette condition doit être vérifiée avant la commercialisation.

⚠️ MMS_FA utilise uroman pour la romanisation des langues non latines. Avec un mélange kanji/kana en japonais, le p90 des longs segments peut dériver jusqu'à 2,53 s ⇒ vérifier phrase par phrase.

14. Les deux valeurs d'avance ne sont pas la même chose

ValeurObjectifSource
0,15–0,25 sPermettre la lecture (avance de lecture)Moteur de paroles par défaut : « texte 0,2 s avant la voix »
0,03–0,05 sPermettre de suivre le chant (sensation de synchronisation karaoké)Pratique de vidéos de paroles d'une autre source

⇒ Le choix dépend de si ce clip est « du texte à lire » ou « du texte à chanter ». Nous faisons du texte à lire ⇒ utiliser 0,15–0,2 s. ⛔ Ne pas additionner les deux.


15. Règles pratiques de composition verticale (pas simplement « mettre le texte à la verticale »)

RègleApplication
PonctuationOccupe une case, écrite en haut à droite (en horizontal : en bas à gauche)
Petites kana (っ ゃ ゅ ょ)Occupent une case, écrites en haut à droite
Digrammes (きゃ)Considérées comme deux kana, chacune occupant une case
Tiret long « ー »Occupe une case
Début de paragrapheEspacer d'une case
⛔ Césure interditeLa ponctuation ne peut pas apparaître en début de ligne
Ponctuation en fin de ligneSi la ponctuation tombe en fin de ligne sans case, écrire en dehors ou sur la même case que le dernier caractère
ChiffresEn écriture verticale, utiliser les chiffres kanji ; en horizontale, on peut utiliser les chiffres arabes (1–2 par case)

⇒ Actuellement, notre verticale est « un caractère par ligne qui s'empile », sans traiter la position de la ponctuation, le décalage des petites kana, ni l'espacement de début de paragraphe. En ajoutant ces trois éléments, un lecteur japonais trouvera immédiatement que « c'est correct ».


16. Critère de vitesse de lecture : 4 cps est la norme des sous-titres de diffusion, pas des paroles (avec mesures de ce projet)

⚠️ Distribution de la fiabilité : niveau B pour les chiffres (guide de style AVTpro JA pour la certification de sous-titres japonais, spécifications publiques de deux sociétés de sous-titrage, trois sources en accord) ; « Comment utiliser les paroles » est ma déduction personnelle, niveau D — explicitement marqué, ne pas utiliser comme preuve.

16.1 Chiffres durs donnés par les trois sources (parties en accord)

ÉlémentAVTpro JA (norme certifiée)GoLocaliseDMPJAdopté
Vitesse max de lecture4,0 cps12 cps (≈ limite haute différente)~4 cps4,0–5,0 cps
Caractères par ligne (horizontal)15 car.16 car.13–16 car.≤ 15
Caractères par ligne (vertical)11 car.——≤ 11
Nombre de lignes à l'écran2222
Durée d'affichage minimale20 images (0,8 s @25fps)1 s1,5 s≥ 0,8 s
Durée d'affichage maximale6 s (paroles : 7 s)7 s—6 s (paroles 7 s)
Gestion de la ponctuation。→ espace pleine chasse ; 、→ espace demi-chasse——Identique à AVTpro
Policeゴシック—Gothic prioritaire (lisibilité)ゴシック

⭐ Deux éléments valident nos décisions antérieures :

  1. « ⛔ Pas de ponctuation » est correct — la pratique officielle d'AVTpro est de remplacer la ponctuation par des espaces (。→ pleine chasse, 、→ demi-chasse). Nous ne mettons simplement pas de ponctuation, l'effet est équivalent et plus propre ⇒ R7 n'a pas besoin d'être modifiée.
  2. « Police ゴシック » est correct — notre Yu Gothic Bold est une ゴシック, la direction est bonne (mais la licence de police pose problème, voir §17).

16.2 ⛔ Mais 4 cps ne peut pas s'appliquer directement aux paroles (ma déduction, niveau D)

La raison d'être de 4 cps est : si on ne comprend pas le dialogue, il faut le revoir ; le sous-titre est la seule source d'information. Alors que les paroles sont chantées en même temps — le spectateur voit le mot à la seconde même où il l'entend, il n'a pas besoin de « lire puis comprendre ».

⇒ Les sous-titres de paroles ne doivent pas être conçus pour « lire », mais pour « suivre le chant ». (D'ailleurs, AVTpro lui-même fait une exception pour les paroles : la durée d'affichage maximale passe de 6 s à 7 s, ce qui montre que l'industrie reconnaît que les paroles sont une catégorie distincte.)

⚠️ Mais cela ne signifie pas qu'« on peut mettre ce qu'on veut » dans les paroles. Au-delà de ~6 cps, même « suivre le chant » devient impossible, car l'œil ne peut pas trouver le mot en cours. ⇒ Critère pratique : cps max ≤ 5,0 : acceptable ; 5,0–6,0 : à améliorer ; >6,0 : modifier la mise en page (saut de ligne / affichage simultané de deux lignes / raccourcir les 文節).

16.3 Mesures de ce projet (lyric_timing_v2.json, 22 lignes / 52 文節)

MéthodeRésultat
Par ligne entière (v7 actuelle WHOLE_LINE)22 lignes : 5 > 4,0 cps, pire L5 = 5,30 cps (16 car. / 3,02 s)
Par 文節 (si on revenait à un affichage segment par segment)52 segments : 11 > 4,0 cps (21 %), pire L3 « ポケットのなかに » 6,90 cps
Disposition verticale : caractères par colonneMax 16 car. → deux colonnes de 8 car., ≤ 11, OK

⇒ Conclusion en deux couches, ne pas mélanger :

  • Avec le critère strict de 4,0 cps : 5 lignes non conformes, mais avec le critère paroles du §16.2 (≤ 5,0), seule L5 à 5,30 doit être traitée.
  • ⛔ Si on revenait à un affichage segment par segment, 21 % des segments dépasseraient 5–7 cps ⇒ c'est la base quantitative de la décision d'afficher la ligne entière (la décision initiale de WHOLE_LINE reposait sur l'intuition que « l'affichage segment par segment inciterait le public à vérifier la synchronisation », maintenant nous avons les chiffres).

16.4 ⭐ Défaut réel découvert en passant : le timing de L3–L7 est calculé par division égale

SymptômeL3–L7 cinq lignes consécutives ont exactement la même durée de 3,02 s, et leurs extrémités s'emboîtent parfaitement (23,63→38,72 = 15,09 s ÷ 5)
Cause racineLa détection des intervalles de respiration sur ce passage (legato, pas de respiration entre les mots) ne trouve aucun gap, REMAP dégénère en division égale, et n'a pas émis d'alerte
Contre-preuve mesuréeEn scannant 4 seuils × 2 longueurs min dans la fenêtre 22–44 s, le vrai silence n'apparaît que 7 fois (22,63 / 23,01 / 24,24 / 25,60 / 28,29 / 31,43 / 41,55), aucun ne tombe sur 26,65 / 29,67 / 32,69 / 35,70 / 38,72 ⇒ ces cinq limites ne sont pas mesurées
Pourquoi c'est difficile à détecterLe champ source écrit simplement REMAP, sans distinguer « remappage basé sur des preuves » de « solution de repli par division égale »
Correction (non réalisée, fait partie du logiciel)① REMAP divisé en REMAP_ANCHORED / EQUAL_DIVIDE, ce dernier doit imprimer un avertissement ② la solution de repli par division égale doit aussi sortir le cps, et si > 5,0, le marquer en rouge ③ pour les passages legato, utiliser la continuité de hauteur de pyin pour déterminer les limites, pas le silence

⛔ Ceci est un autre exemple de « tous les critères semblent verts, mais en réalité c'est faux » : missing=[] indique seulement que « chaque ligne a un timing », pas que « le timing a été mesuré ».

17. ⛔ Licence de police : nous utilisons actuellement une police système Windows, risque commercial (niveau B)

⚠️ Fiabilité B (pages de licence officielles des différentes fonderies / FAQ originales, lues une par une, pas de seconde main)

17.1 Quatre catégories de licences, très différentes

PoliceSous-titres intégrés dans une vidéoUsage commercialRemarque
SIL OFL 1.1 (Noto/Source Han, M PLUS, Zen Maru, Kosugi, Shippori, 侵食明朝…)✅✅ Aucune mention requiseSeule obligation : ⛔ ne pas vendre le fichier de police seul ; les modifications doivent être sous la même licence
IPA Font License 1.0 (IPAex, こころ明朝…)✅ Précise « contenu vidéo » autorisé✅⛔ Le nom de la police dérivée ne doit pas contenir « IPA » ; la redistribution doit inclure la licence
ヒラギノ (intégré à macOS)✅ Le produit peut être vendu/distribué✅⛔ Mais interdit explicitement « la création de données sous une forme qui fonctionne comme une police dans un contenu numérique » ; et lié à macOS, l'utiliser sur Windows = hors limites
日本書技研究所 etc. (polices commerciales)⚠️ Acheter une licenceLicence commerciale requiseLes superpositions vidéo coûtent ¥22 000–55 000 selon le capital social
ことり文字ふぉんと Pro✅ (inclut les revenus YouTube)✅⚠️ Mais « intégration/police web » interdite en principe ⇒ intégrer dans une vidéo ≠ incorporer une police, ces deux actions sont régies par des clauses différentes

⭐ Distinction clé (la plus facile à confondre) : « Brûler du texte dans une image » et « incorporer le fichier de police dans un document/page web » sont deux actions différentes, soumises à des clauses différentes. La première produit des pixels, généralement traitée comme « produit final » ; la seconde transmet la police elle-même. ⛔ Ne lisez pas l'interdiction d'incorporation de ことり comme une interdiction de faire des vidéos — sa propre FAQ précise que « l'utilisation dans une vidéo » est clairement autorisée.

17.2 Notre situation actuelle

ÉlémentValeur
Police actuelleC:\Windows\Fonts\YuGothB.ttc (Yu Gothic Bold, intégrée à Windows)
Direction des glyphesゴシック ✅ (conforme à la recommandation de lisibilité du §16.1)
État de la licence⚠️ Non vérifié. Les polices intégrées à Windows sont liées à la licence du système d'exploitation. Les intégrer dans un produit commercial (DLC Steam) est une zone grise, pas une autorisation explicite

⇒ Recommandation : passer à une police OFL (gratuite, utilisable en commerce, aucune mention requise), classées par atmosphère :

CandidateLicenceAtmosphèreAdaptation
Zen Maru GothicOFLRond, doux⭐ La plus adaptée à notre ton rose/violet/mignon
Shippori MinchoOFLMincho chargé d'émotionPour les phrases lyriques, mais en tension avec le côté « mignon »
M PLUS 1pOFLGéométrique, moderneNeutre et sûr
Noto Sans JPOFLLa plus neutreFilet de sécurité, ne peut pas se tromper

⚠️ Changer de police = changer l'aspect visuel, doit être validé par Ronny, ⛔ Pas de changement unilatéral de ma part (c'est une modification « couche image », selon la règle de fer du niveau utilisateur, il doit la voir).


Fin de la traduction.

Skills associés