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 » :
- 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.
- Coupure au milieu d'un mot —
君 / を見るたび. Une particule ne peut pas commencer une ligne. - 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.
- 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ègle | Contre-exemple |
|---|---|---|
| R1 | Les coupures se font uniquement aux limites d'un 文節. Ne pas séparer un nom + particule, un verbe + auxiliaire | ✗ 君/を見るたび ✗ 見/てるのに |
| R2 | L'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 |
| R3 | Maximum 3 segments par ligne, de préférence 2 | ✗ 君を/見る/たび |
| R4 | Pas de ponctuation affichée ; espaces pleine chasse entre les segments | ✗ 君を、見るたび |
| R5 | Rè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 っ |
| R6 | Une ligne ≤ 16 caractères (norme des sous-titres japonais Netflix) | — |
| R7 | Une 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 |
| R8 | Le 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)
- Extraire F0 :
librosa.pyin(fmin=150, fmax=900, hop_length=128), puis filtrer médian sur F0 pour supprimer le vibrato. - Trouver les limites candidates : saut de hauteur ≥ 0,8 demi-ton ∪
librosa.onset.onset_detect(delta=0.30, wait=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
UNSUREet 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.055ou allonger0.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ément | Valeur 1080p |
|---|---|
| Hauteur des caractères principaux | 97~108 px |
| Petits caractères (voix off) | 53 px |
| Caractères d'accentuation du refrain | 124 px |
| Caractères géants d'arrière-plan | 270~670 px |
| Ligne de base inférieure | y ≈ 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,31 | 42,76 | 43,09 | 43,41 | 43,61 | 43,98 | 44,18 |
| Hauteur | B3 | E4 | F#4 | G#4 | F#4 | F4 | F#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[].startpour obtenir le temps réel beatspour les points de percussion (coupes / flashs / impact de texte) ;beats_smoothpour 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[].indexpeut 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)
| Balise | Rôle |
|---|---|
groupeA/groupeB | Forcer 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 ligne | Ligne « 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.
| Outil | Erreur début (médiane) | Erreur fin (médiane) | Couverture | Avis |
|---|---|---|---|---|
| MMS_FA (torchaudio) | 0,08 s | 0,11 s | 8/8 | ✅ Seul à atteindre le seuil |
| whisper-timestamped | — | 0,16 s | 8/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 |
| aeneas | 2,70 s | 3,66 s | 8/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
| Valeur | Objectif | Source |
|---|---|---|
| 0,15–0,25 s | Permettre la lecture (avance de lecture) | Moteur de paroles par défaut : « texte 0,2 s avant la voix » |
| 0,03–0,05 s | Permettre 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ègle | Application |
|---|---|
| Ponctuation | Occupe 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 paragraphe | Espacer d'une case |
| ⛔ Césure interdite | La ponctuation ne peut pas apparaître en début de ligne |
| Ponctuation en fin de ligne | Si la ponctuation tombe en fin de ligne sans case, écrire en dehors ou sur la même case que le dernier caractère |
| Chiffres | En é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ément | AVTpro JA (norme certifiée) | GoLocalise | DMPJ | Adopté |
|---|---|---|---|---|
| Vitesse max de lecture | 4,0 cps | 12 cps (≈ limite haute différente) | ~4 cps | 4,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'écran | 2 | 2 | 2 | 2 |
| Durée d'affichage minimale | 20 images (0,8 s @25fps) | 1 s | 1,5 s | ≥ 0,8 s |
| Durée d'affichage maximale | 6 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 :
- « ⛔ 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.
- « 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éthode | Ré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 colonne | Max 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ôme | L3–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 racine | La 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ée | En 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étecter | Le 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
| Police | Sous-titres intégrés dans une vidéo | Usage commercial | Remarque |
|---|---|---|---|
| SIL OFL 1.1 (Noto/Source Han, M PLUS, Zen Maru, Kosugi, Shippori, 侵食明朝…) | ✅ | ✅ Aucune mention requise | Seule 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 licence | Licence commerciale requise | Les 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ément | Valeur |
|---|---|
| Police actuelle | C:\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 :
| Candidate | Licence | Atmosphère | Adaptation |
|---|---|---|---|
| Zen Maru Gothic | OFL | Rond, doux | ⭐ La plus adaptée à notre ton rose/violet/mignon |
| Shippori Mincho | OFL | Mincho chargé d'émotion | Pour les phrases lyriques, mais en tension avec le côté « mignon » |
| M PLUS 1p | OFL | Géométrique, moderne | Neutre et sûr |
| Noto Sans JP | OFL | La plus neutre | Filet 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.