Traduire des commentaires coréens sur StarCraft: Brood War
(blog.sourcedive.net)- Les discussions stratégiques de haut niveau autour de StarCraft: Brood War sont depuis longtemps concentrées dans des vidéos et streams en coréen, ce qui rend le suivi des connaissances stratégiques difficile pour les communautés non coréanophones
- Les traductions existantes dépendaient soit du travail manuel de personnes parlant coréen, soit de Google Translate, et les build orders comme l’argot communautaire étaient souvent traduits littéralement, ce qui cassait fréquemment le contexte
- Une nouvelle approche combine
yt-dlp, Whisper, Google Colab, un LLM et un glossaire TeamLiquid pour transcrire l’audio coréen et le transformer en sous-titres anglais compréhensibles par les joueurs de Brood War - La distribution des sous-titres passe par BWKT Client, qui relie un UserScript TamperMonkey, Pastebin, Google Sheets et Apps Script afin d’éviter les restrictions liées aux droits propriétaires sur YouTube
- C’est un projet bricolé en environ deux semaines, mais avec seulement environ 30 USD et un assemblage d’outils gratuits, il a permis de traduire environ 7 vidéos par jour, tout en laissant de la place pour des extensions comme le support multilingue
Pourquoi il est difficile d’accéder au savoir de Brood War en coréen
- StarCraft: Brood War est un RTS compétitif sorti en 1998, avec une communauté toujours active
- L’écosystème de haut niveau de Brood War fonctionne de fait de manière centrée sur la Corée
- La majorité des joueurs pros, équipes et tournois sont basés en Corée
- Une grande partie du public le plus passionné et de la communauté s’y trouve aussi
- Les membres non coréens de la communauté se désignent eux-mêmes comme des “foreigners”
- Comme aux échecs, Brood War repose fortement sur l’accumulation historique de parties et de recherches stratégiques
- À haut niveau, étudier le jeu est presque aussi important que d’y jouer
- Une grande partie du discours moderne passe par les vidéos et streams en direct de joueurs pros de Brood War
- Comme les “Sicilian defense” ou “Najdorf variation” aux échecs, Brood War possède aussi un langage spécialisé propre au domaine créé par la communauté
- Ces termes ne viennent pas d’un livret de règles, mais d’une langue qui condense des années de recherche et d’analyse
Le problème du Foreigner Knowledge
- Dans les communautés non coréanophones, les personnes parlant couramment coréen sont extrêmement rares
- Et quand on parle couramment coréen, il y a peu de raisons de se limiter à des ressources non coréanophones plus restreintes et de moindre qualité
- La communauté a financé des traductions de sous-titres YouTube réalisées par des personnes parlant coréen
- Le travail de traduction est pénible et lent
- La rémunération n’est objectivement pas très bonne
- Malgré cela, cette méthode a permis de traduire quelques dizaines de vidéos par an
- La traduction automatique comme Google Translate peut aider pour des phrases du quotidien, mais s’adapte mal au vocabulaire spécialisé de Brood War
- Il existe beaucoup d’argot et de termes de build que ces outils n’ont jamais rencontrés
- La traduction littérale détruit souvent le contexte au lieu de l’éclairer
Là où la traduction littérale échoue
- Les tutoriels coréens contiennent des termes de build de Brood War comme
12 앞마당,11 스포닝풀,10가스,투해처리,3해처리,안 3해처리 - Google Translate les transforme en expressions comme
12 courtyard,two-processing,3-point processing, qui ne correspondent pas au contexte du jeu- Il n’existe pas de “courtyard” dans Brood War
- “starting off the most affluently” est une manière maladroite et verbeuse de rendre “economic opener/build”
- “3-point processing” n’a aucun sens, même pour un joueur de Brood War
- Certains mots restent reconnaissables
Toss,build,fast gas,moderately fast tech-tree,Terran, etc. subsistent- Mais la majorité du texte est parasitée par des traductions littérales au point de brouiller même le contexte des mots identifiables
- La combinaison de sous-titres automatiques médiocres et de termes spécialisés traduits littéralement a, selon l’auteur, laissé les communautés non coréanophones avec plusieurs décennies de retard sur la communauté coréenne
Le nouveau processus de traduction
- Le nouveau processus traduit les mêmes sous-titres par des expressions que les joueurs de Brood War comprennent, comme
12 Natural,economic opener,Protoss,two-Hatchery build,11 Spawning Pool,10 Gas,third Hatchery - La traduction n’est pas parfaite, mais le rapport signal/bruit s’améliore suffisamment pour que le sujet de la vidéo devienne immédiatement clair
- Alors qu’on était auparavant limité à quelques dizaines de vidéos traduites par an, cette nouvelle méthode permet à une seule personne d’en traduire environ 7 par jour sur son temps libre
Pipeline de production des sous-titres
-
yt-dlp et Whisper
- Au départ, l’idée était de récupérer les sous-titres automatiques coréens de YouTube avec
yt-dlp, puis de les traduire, mais leur qualité n’était pas exploitable - À la place,
yt-dlpsert à télécharger la piste audio de la vidéo, qui est ensuite transcrite directement avec Whisper - Le résultat est plus propre et plus complet que les sous-titres YouTube, et semble mieux ignorer les bruits comme les sons du jeu et les clics de souris
- Au début, Whisper tournait en local et utilisait environ 10 Go de VRAM
- Comme cela imposait d’installer Python,
venv, CUDA,git, etc. sous Windows, c’était trop contraignant pour d’autres collaborateurs
- Au départ, l’idée était de récupérer les sous-titres automatiques coréens de YouTube avec
-
Google Colab
- Whisper peut s’installer via Python
pip, et Google Colab fournit des notebooks Jupyter gratuits ainsi qu’un GPU gratuit - Le GPU de Colab dispose de suffisamment de VRAM pour faire tourner Whisper
- Un notebook paramétrable en lecture seule constituait un bon modèle de distribution
- Même des utilisateurs non techniques peuvent l’exécuter sans dépendre de leur matériel, et récupérer les dernières améliorations simplement via les mises à jour du notebook
- Pas besoin de
git cloneni de téléchargements répétés - Le notebook prend une URL YouTube en entrée, génère un fichier SRT en coréen, puis le propose au téléchargement
- Whisper peut s’installer via Python
-
LLM et glossaire d’argot coréen
- TeamLiquid est une ancienne communauté non coréanophone de Brood War
- Il y a environ 15 ans, le membre de TeamLiquid konadora a créé un fil de forum faisant office de glossaire des “termes coréens utilisés par les commentateurs BW”
- Ce contenu a été copié dans un fichier Markdown nommé
KoreanSlang.txtpuis fourni au LLM - Le prompt demande de traduire les sous-titres coréens en anglais en s’appuyant sur
KoreanSlang.txtet sur le contexte de StarCraft: Brood War - Il doit privilégier la clarté plutôt que la traduction littérale, tout en conservant les timestamps et le format du fichier
- Il peut corriger les sous-titres dupliqués ou les erreurs manifestes, et ajouter si besoin une courte note du traducteur dans les sous-titres
- Les passages impossibles à comprendre sont remplacés par
(unintelligible), et la sortie est fournie dans un bloc de code pour faciliter le copier-coller - En pratique, les sous-titres coréens produits par Whisper sont envoyés à ChatGPT Pro avec une demande de traduction
Pipeline de consommation des sous-titres
-
Contraintes de YouTube et BWKT Client
- La fonction de sous-titrage native de YouTube ne permet qu’au propriétaire d’une vidéo de définir ou mettre à jour les sous-titres
- Pour éviter de télécharger puis re-téléverser les vidéos afin d’y associer des sous-titres, un client séparé a été créé
- Le UserScript ajoute un bouton aux vidéos YouTube et télécharge le sous-titre traduit correspondant lorsqu’il existe
- Il parse les fichiers SRT et VTT, puis affiche les sous-titres dans un petit conteneur sous le lecteur YouTube
- Ce client s’appelle BWKT Client
-
Pastebin, Google Sheets, Apps Script
- Comme les sous-titres sont des fichiers texte, Pastebin a été choisi comme stockage simple pour les partager rapidement
- C’est un service simple, un compte premium existait déjà, et le trafic ne devait pas poser problème
- Les données de correspondance n’ont besoin que de deux colonnes :
YouTube URLetSubtitle URL - Une colonne
Languagepourra être ajoutée plus tard - Utiliser Google Sheets comme base de données facilite l’inspection et la mise à jour manuelles, tout en restant simple à partager
- Apps Script est un runtime JavaScript accessible dans Google Workspace, avec un serveur web intégré
- Un endpoint de type
function doGet(req) { /* ... */ }reçoit un identifiant de vidéo YouTube et renvoie l’URL Pastebin correspondante - La base de données publique en lecture seule est exposée via une page Google Sites
Pistes d’amélioration et tests
- Le projet est un assemblage bricolé réalisé en environ deux semaines, avec un budget d’environ 30 USD
- L’argent a servi à ChatGPT et à du temps GPU supplémentaire sur Colab
- Aucune de ces dépenses n’était strictement indispensable, mais elles apportaient du confort
- L’une des pistes d’extension est le support multilingue
- La communauté non coréanophone ne se limite pas aux joueurs américains : elle comprend aussi des joueurs du Mexique, de Pologne, de Roumanie, de Chine et de Taïwan
- Il semble possible de traduire en plusieurs dizaines de langues sans charge de travail énorme
- Des améliorations techniques restent aussi possibles
- Aujourd’hui, BWKT Client affiche encore son bouton sur des vidéos YouTube sans sous-titres disponibles
- En ajoutant au serveur web Apps Script un endpoint qui renvoie l’index des vidéos traduites, on pourrait conditionner l’affichage du bouton
- Les sous-titres ont été testés avec quelques joueurs de Brood War sur une vidéo de 13 minutes
- Après environ 5 minutes, les participants avaient cessé d’évaluer la qualité des sous-titres et regardaient simplement la vidéo, discutaient, revenaient sur de courts passages et mettaient en pause pour commenter
- Les sous-titres ont passé le test
Nature du projet
- Les performances, la scalabilité et la latence n’étaient pas les enjeux principaux de ce projet
- L’essentiel consistait à assembler des outils existants avec du glue code
- Le UserScript et le code Python du notebook Colab sont courts et faciles à maintenir
- Le serveur web ressemble davantage à un simple système CRUD en production qu’à quelque chose de complexe
- Son créateur considère ce projet comme le plus janky qu’il ait publié, tout en l’appréciant beaucoup
1 commentaires
Commentaires sur Hacker News
En tant que joueur coréen de Brood War et chercheur en reconnaissance vocale, j’ai trouvé ça très amusant à lire
La transcription coréenne d’origine contenait déjà pas mal d’erreurs, et il semble qu’un grand modèle de langage les ait corrigées de façon assez impressionnante en aval. Par exemple,
12 안마당 빌드était probablement en réalité12 앞마당 빌드, ce qui aurait été bien plus compréhensible pour un joueur de Brood War. De même,투에처리 빌드n’a pas de sens ; cela aurait dû être transcrit en투해처리 빌드, c’est-à-dire un build 2 hatcheryC’est pourquoi un biais contextuel (contextual biasing) consistant à injecter directement un dictionnaire d’argot dans le processus d’inférence de Whisper pourrait aussi aider. Il y a plusieurs façons de faire, mais la plus simple serait sans doute d’augmenter d’un facteur constant la probabilité des tokens d’argot présents dans le dictionnaire au niveau de la couche finale de prédiction de Whisper. C’est relativement simple à implémenter avec la bibliothèque HuggingFace : https://huggingface.co/docs/transformers/en/internal/generat...
courtyardoufrontyard. Cela dit, dans le monde anglophone, il est très courant d’abréger fortement les noms de bâtiments, d’unités, de technologies et de stratégies. J’imagine que le coréen peut faire pareilUn build 12 barracks s’appelle souvent
12 rax, un build mutalisk 2 hatchery2 hatch muta, et un timing attack / all-in hydralisk 3 hatchery3 hatch hydra bustIl existe une PR qui implémente la même fonctionnalité dans ctranslate2, ce qui pourrait aussi l’exposer via faster-whisper : https://github.com/OpenNMT/CTranslate2/pull/1789
Si je me souviens bien, ce bâtiment servait à permettre aux hatcheries de produire des zerglings et d’autres unités, ainsi qu’à rechercher des améliorations. Il suffisait d’en construire un seul pour débloquer ces unités dans toutes les hatcheries, et comme le bâtiment ne produit pas lui-même d’unités, en construire plusieurs n’augmente pas non plus la capacité de production
En théorie, on pourrait en construire plusieurs pour rechercher des améliorations en parallèle, mais il n’y a que trois améliorations possibles environ, donc il ne semble y avoir aucune raison d’en construire 12. À moins que ce ne soit comme réserve pour continuer à produire des zerglings même si l’ennemi en détruit quelques-uns, mais même là, 12 paraît excessif
Du coup, je me demande quelle était exactement la motivation. C’était il y a longtemps, donc je dis peut-être n’importe quoi
Il ne faut pas se laisser tromper par le titre. Cet article présente une approche extrêmement rigoureuse et créative pour traduire les commentaires de StarCraft et les rendre plus accessibles
Comme l’auteur l’a bien noté, en 27 ans, les commentaires de jeu sont devenus non pas du coréen ou de l’anglais, mais une sorte de langage spécialisé de domaine. Le fait d’utiliser des scripts automatiques et l’intelligence artificielle pour comprendre grosso modo ce qui est dit, puis le reformuler en phrases cohérentes, est vraiment remarquable
Du point de vue de quelqu’un dont l’anglais n’est pas la langue maternelle, cet article me semble exactement refléter les problèmes qu’on rencontre dans la traduction de nombreux domaines, en particulier celle des textes informatiques et du développement logiciel
Il y a énormément de termes difficiles à traduire. Des mots comme sharding ou hash en sont de bons exemples, et la seule solution réaliste semble être de les emprunter progressivement en les adaptant plus ou moins à chaque langue avec le temps. Mais pour cela, il faut une communauté capable de combler au moins partiellement l’écart entre les deux langues, ce qui implique dans ce cas d’apprendre l’anglais
Ma langue maternelle est l’espagnol, et quand on parle de développement logiciel en espagnol, on enchaîne sans cesse les termes empruntés à l’anglais. Il ne semble pas y avoir de méthode sûre pour bien gérer cela, et il est intéressant de voir comment la traduction automatique s’en sort. Au final, il faut passer par un processus social de mélange entre les deux langues, puis voir quels termes survivent
Selon les critères évoqués dans l’article, il faut quelqu’un qui connaisse un peu le coréen sans forcément le parler couramment, et bien sûr quelqu’un qui connaisse le jeu lui-même
depurar, un mot espagnol déjà existant et assez bien adapté àdebug, mais beaucoup de locuteurs hispanophones empruntent directement l’anglais et disentdebuguearQuand on parle des performances d’un ordinateur ou d’un logiciel, au Mexique j’ai appris
desempeño, mais j’ai aussi entendu qu’en Argentine on disaitel performancepour le même sens. Il me semble que le cas le plus fréquent consiste à utiliser directement l’emprunt à l’anglais plutôt que de chercher un mot espagnol existantshardingCe qui est presque impossible à traduire, c’est plutôt la langue du quotidien. Le mot allemand
Brotporte des connotations assez différentes de l’horrible chose que les Britanniques appellent bread, mais il n’existe pas vraiment de meilleur mot, et l’emprunter tel quel sonnerait de façon assez étrange dans la plupart des contextes. Bien plus étrange que d’empruntershardingdans un contexte techniqueUn bon exemple d’emprunts qui finissent par s’adapter à la langue est celui du vocabulaire ferroviaire en allemand. Au départ, comme la technologie venait d’Angleterre, tout était en anglais, mais avec le temps, la plupart des termes ont été remplacés par des mots ayant l’air allemand. Certains ont été reconstruits à partir des mêmes emprunts gréco-latins qu’en anglais, comme
Lokomotive, maisstationest devenuBahnhofettrain,ZugC’est assez drôle que, dans un texte sur la traduction, l’auteur ait complètement inversé le sens du rapport signal/bruit. Dire que le rapport signal/bruit est élevé, par exemple au-delà de 9000, c’est au contraire une très bonne chose
Cela signifie qu’il y a beaucoup de signal et très peu de bruit, donc si le rapport signal/bruit baisse, cela veut dire qu’il y a plus de bruit
jargonJ’arrivais aussi à bien comprendre la version Google Translate, mais seulement parce que je connaissais très bien Brood War et les détails de l’ouverture 12 Hatchery zerg
ChatGPT et Claude ont traduit le texte coréen de manière remarquablement bonne :
Today I'll teach you about the 12 Hatchery build. I'll explain the types of 12 Hatchery builds, their advantages and disadvantages, and the build orders in a simple but detailed way. Against Protoss, this is the build you use when you want to start with the most economic advantage. Against Terran, there are several builds you can do with 12 Hatchery, so I'll explain some of the most commonly used builds. The first is the two-hatchery build that starts with 12 Hatchery: 12 Hatchery 11 Spawning Pool 10 Gas This build uses early gas, and it's often used when you want to quickly transition into a three-hatchery build with three gas bases. The second build is: 12 Hatchery 12 Pool 12 Gas This build allows for moderately fast tech tree and moderately fast three-hatchery expansion. This build is commonly known as the "safe three-hatchery" build, and you can think of it as a build that enables both quick Mutalisks and quick third base.Si l’auteur voit ce message : avec yt-dlp, on peut récupérer une version basse qualité d’une vidéo pour économiser de la bande passante
yt-dlp -f "bv[height<=720]"En y ajoutant l’URL ou l’identifiant de la vidéo, on télécharge au maximum en 720p
Question un peu idiote de quelqu’un qui, étant gamin, ne jouait qu’aux money maps : que signifient les chiffres devant les bâtiments ?
12 Hatcheries, ça pourrait théoriquement vouloir dire construire 12 hatcheries, mais ça paraît irréaliste. Et 12 Spawning Pools n’auraient évidemment aucun intérêt. Je me suis donc dit que c’était peut-être leur position dans la liste de build order
Mais on voit aussi des builds comme
12 Hatch, 12 Pool, 12 Gas, donc cette interprétation ne tient pas vraiment. Ça ne semble pas être une simple liste ; comme c’est une arborescence, je me suis demandé si 12 pouvait être la profondeur correspondant à ce bâtiment, mais construire 11 bâtiments avant le gaz est difficile à imaginer et semble beaucoup trop lent. Je me demande si ça inclut aussi les unités, ou si ça ne compte que les drones/overlords4-pooling. En zerg, on construit un Spawning Pool alors qu’on n’a encore que 4 ouvriers, puis on refait le quatrième ouvrier avant de produire des zerglings pour une attaque de début de partie, c’est-à-dire un rushEt là, l’adversaire te balance toutes sortes d’insultes et remet en question ton orientation sexuelle
12 Spawning Pools n’auraient évidemment aucun intérêt, j’ai le vague souvenir d’une vidéo de Husky où quelqu’un avait effectivement construit 9 Spawning Pools pour faire un 9 poolLe nombre indique le seuil de ravitaillement à atteindre avant de lancer cette structure. Donc
12 hatch 12 pool 12 gassignifie qu’on monte à 12 de ravitaillement, puis qu’on construit ces trois bâtiments dans cet ordre dès que les ressources le permettentComme, chez les zergs, les ouvriers se transforment effectivement en bâtiments, j’imagine que le déroulé serait : atteindre 12, construire la hatchery, produire un ouvrier de plus, construire le Spawning Pool, puis produire encore un ouvrier avant de construire l’extracteur de gaz
Même à l’époque où Google Translate était devenu assez bon, il restait difficile de traduire efficacement des textes chinois ou japonais sur le go. Il y avait des problèmes similaires à ceux mentionnés ici
Beaucoup de mots chinois et japonais ont un sens très spécifique dans le contexte du go, mais aussi un sens ordinaire dans le langage courant. Par exemple,
kodésigne au go une situation de règle bien précise, mais signifie généralement quelque chose commerobbery, si bien que Google Translate le traduisait dans son sens commun et rendait l’ensemble incompréhensibleAvec les modèles de langage récents, on peut désormais préfixer avec des consignes du type
Je vais traduire une explication en chinois d’un diagramme de go. La traduction doit être naturelle et ne pas éviter les termes techniques du go. Par exemple 拆 = extension, 夹 = pincer, 刺 et 觑 = peep, et le résultat est excellent. En pratique, cela permet de lire presque tout ce qu’on veut. On a eu de la chance qu’il y ait apparemment assez de matériel sur le go dans les données d’entraînement, sans qu’un travail plus spécialisé soit nécessaireSi l’auteur lit ceci, quelques corrections côté échecs : en anglais, les coups du début ne s’appellent pas openers mais openings. Il n’existe pas non plus d’ouvertures réservées séparément aux blancs et aux noirs, même si, bien sûr, un joueur donné peut étudier une ouverture depuis la perspective d’un seul camp. L’étude des ouvertures est au contraire considérée comme quelque chose d’autant plus fondamental qu’on monte vers le très haut niveau. Et cette variante de la Sicilienne ne s’appelle pas
Najdorkmais NajdorfJ’ai bien aimé cet article. Il y a longtemps, j’avais essayé de regarder quelques matchs des qualifications régionales américaines des World Cyber Games, et j’étais toujours stupéfait par la vitesse des autres joueurs.
Plus tard, en voyant des retransmissions en direct depuis la Corée, j’ai été complètement écrasé par leur vitesse de jeu. Du point de vue stratégique, quand j’ai vu sur un blog les calculs montrant pourquoi les Zealots Protoss tuent les Zerglings en 2 coups et non en 3, j’ai compris un aspect tout à fait fondamental du jeu qui m’avait échappé. C’est à ce moment-là que j’ai compris que c’était un jeu comme les échecs, et j’y ai totalement accroché.
Je sais que c’est une traduction incorrecte, mais j’aime assez le choix de rendre
natural expansionpar courtyard.front yard. Dans SC2, où certaines cartes récentes ont une base d’arrière-cour, ça fonctionne.Ces bases d’arrière-cour apparaissent aussi souvent sur les cartes en équipe, et décider quel joueur prendra l’avant devient un élément stratégique. Protoss et Terran peuvent construire à la fois des Shield Batteries et des bunkers, mais les Zerg bénéficient d’un bonus sur le creep et peuvent s’étendre vers l’avant beaucoup plus vite.