StarCraft Brood War की कोरियाई कमेंट्री का अनुवाद करना
(blog.sourcedive.net)- StarCraft: Brood War में उच्च-स्तरीय रणनीति पर चर्चा लंबे समय से कोरियाई वीडियो और streams में केंद्रित रही है, जिससे गैर-कोरियाई भाषी community के लिए रणनीतिक ज्ञान के साथ बने रहना मुश्किल रहा
- मौजूदा अनुवादों के लिए कोरियाई जानने वालों के manual काम या Google Translate पर निर्भर रहना पड़ता था, और build orders व community slang का शाब्दिक अनुवाद होने से context अक्सर टूट जाता था
- नया workflow
yt-dlp, Whisper, Google Colab, LLM और TeamLiquid terminology dictionary को जोड़कर कोरियाई audio को transcribe करता है और उसे ऐसे English subtitles में बदलता है जिन्हें Brood War players समझ सकें - Subtitle distribution को YouTube owner permissions से बाधित न होने देने के लिए TamperMonkey UserScript, Pastebin, Google Sheets और Apps Script को जोड़ने वाले BWKT Client से संभाला गया
- करीब 2 हफ्तों में बना यह एक hacky project है, लेकिन लगभग $30 USD और free tools के combination से ही रोज़ लगभग 7 videos का अनुवाद किया जा सका, और multilingual support जैसे expansion की गुंजाइश भी बची है
कोरियाई Brood War ज्ञान तक पहुंचना मुश्किल क्यों है
- StarCraft: Brood War 1998 में रिलीज़ हुआ competitive RTS है, और आज भी इसकी active community है
- High-level Brood War ecosystem असल में कोरिया-केंद्रित है
- ज़्यादातर pro players, teams और tournaments कोरिया में based हैं
- उत्साही दर्शकों और community का बड़ा हिस्सा भी कोरिया में है
- गैर-कोरियाई community members खुद को “foreigners” कहते हैं
- Chess की तरह Brood War में भी लंबे समय से जमा match records और strategy research महत्वपूर्ण हैं
- ऊंचे स्तर पर game खेलने जितना ही पढ़ना/अध्ययन करना भी महत्वपूर्ण है
- आधुनिक discussion का बड़ा हिस्सा pro Brood War players के videos और live streams में होता है
- Chess के “Sicilian defense”, “Najdorf variation” की तरह Brood War में भी community द्वारा बनाई गई domain-specific भाषा है
- ये terms rulebook की भाषा नहीं हैं, बल्कि लंबे समय के research और analysis को संक्षेप में पहुंचाने वाली भाषा हैं
Foreigner Knowledge समस्या
- गैर-कोरियाई भाषी community में कोरियाई fluently जानने वाले लोग बहुत दुर्लभ हैं
- अगर कोई कोरियाई fluently जानता है, तो उसके पास अधिक सीमित और कम-quality गैर-कोरियाई resources तक सीमित रहने की कम वजह होती है
- Community कोरियाई जानने वालों को पैसे इकट्ठा करके YouTube subtitle translation का काम देती रही है
- Translation का काम कठिन और धीमा है
- भुगतान भी objectively अच्छा नहीं है
- फिर भी इस तरीके से साल में कुछ दर्जन videos अनुवादित हो जाते हैं
- Google Translate जैसी machine translation रोज़मर्रा के वाक्यों के लिए उपयोगी है, लेकिन Brood War की specialized terminology के लिए ठीक से काम नहीं करती
- ऐसे बहुत सारे slang और build terms हैं जिन्हें tool ने नहीं देखा होता
- शाब्दिक अनुवाद उल्टा context बिगाड़ देता है
शाब्दिक अनुवाद कहां fail होता है
- कोरियाई tutorials में
12 앞마당,11 스포닝풀,10가스,투해처리,3해처리,안 3해처리जैसे Brood War build terms आते हैं - Google Translate इन्हें
12 courtyard,two-processing,3-point processingजैसे expressions में बदल देता है जो game context से मेल नहीं खाते- Brood War में “courtyard” नहीं होता
- “starting off the most affluently” “economic opener/build” का अटपटा और बहुत लंबा translation है
- “3-point processing” का Brood War players के लिए भी कोई मतलब नहीं है
- कुछ शब्द पहचाने जा सकते हैं
Toss,build,fast gas,moderately fast tech-tree,Terranवगैरह बच जाते हैं- लेकिन ज़्यादातर हिस्सा शाब्दिक translation noise होता है, इसलिए पहचाने जाने वाले शब्दों का context भी धुंधला हो जाता है
- Low-quality automatic subtitles और शाब्दिक translated technical terms के overlap से, माना जाता है कि गैर-कोरियाई community को कोरियाई community से कई दशकों पीछे कर देने वाला परिणाम बना
नया translation process
- नया process वही subtitles
12 Natural,economic opener,Protoss,two-Hatchery build,11 Spawning Pool,10 Gas,third Hatcheryजैसे expressions में अनुवाद करता है जिन्हें Brood War players समझ सकें - Translation perfect नहीं है, लेकिन video का topic तुरंत स्पष्ट हो जाए इतना signal-to-noise ratio काफी बेहतर हो जाता है
- पहले साल में कुछ दर्जन videos translate करना ही सीमा थी, लेकिन नए तरीके से एक व्यक्ति अपने खाली समय में रोज़ लगभग 7 videos translate करता है
Subtitle production pipeline
-
yt-dlp और Whisper
- शुरुआत में
yt-dlpसे YouTube के automatic Korean subtitles download करके translate करने की कोशिश की गई, लेकिन automatic subtitles की quality उपयोगी नहीं थी - इसके बजाय
yt-dlpसे video का audio track download किया गया और Whisper से सीधे transcribe किया गया - YouTube subtitles से ज्यादा साफ और complete result मिला, और ऐसा लगता है कि यह in-game sounds और mouse clicks जैसे noise को भी बेहतर ignore करता है
- शुरुआत में Whisper को local machine पर चलाया गया और इसने करीब 10GB VRAM इस्तेमाल किया
- Windows पर Python, venv, CUDA, git वगैरह install करने पड़ते थे, इसलिए दूसरे collaborators के लिए इसका इस्तेमाल सीमित था
- शुरुआत में
-
Google Colab
- Whisper को Python
pipसे install किया जा सकता है, और Google Colab free Jupyter notebook service व free GPU देता है - Colab GPU में Whisper चलाने के लिए पर्याप्त VRAM है
- Parameterized read-only notebook share करना distribution model के रूप में सही था
- Non-technical users भी hardware की परवाह किए बिना इसे चला सकते हैं, और सिर्फ notebook update से latest features पा सकते हैं
- git clone या बार-बार downloads की जरूरत नहीं है
- Notebook एक YouTube URL input के रूप में लेता है, Korean SRT file generate करता है और download करवाता है
- Whisper को Python
-
LLM और Korean slang dictionary
- TeamLiquid एक पुरानी गैर-कोरियाई Brood War community है
- करीब 15 साल पहले TeamLiquid member konadora ने “Brood War commentators द्वारा इस्तेमाल Korean terminology” dictionary forum post बनाया था
- इस post को
KoreanSlang.txtनाम की Markdown file में copy करके LLM को दिया गया - Prompt में शर्त रखी गई कि Korean subtitles को English में translate करे, लेकिन
KoreanSlang.txtऔर StarCraft: Brood War context का reference ले - शाब्दिक translation की बजाय clarity को प्राथमिकता देने और timestamps व file format बनाए रखने को कहा गया
- Duplicate subtitles या स्पष्ट errors सुधार सकता है, और जरूरत हो तो subtitles में छोटा translator note डाल सकता है
- जो हिस्सा समझ न आए उसे
(unintelligible)से replace करने और आसानी से copy करने के लिए code block में output देने को कहा गया - Pro account वाले ChatGPT में Whisper से बने Korean subtitles डालकर translation request करने के तरीके से इस्तेमाल किया गया
Subtitle consumption pipeline
-
YouTube subtitle restrictions और BWKT Client
- YouTube का अपना subtitle feature सिर्फ video owner को subtitles set या update करने देता है
- Video download करके फिर upload करने और subtitles set करने वाले workflow से बचने के लिए अलग client बनाया गया
- UserScript YouTube video में button जोड़ता है, और matching translated subtitles हों तो उन्हें download करता है
- SRT और VTT files parse करके YouTube player के नीचे छोटे container में subtitles दिखाता है
- इस client का नाम BWKT Client है
-
Pastebin, Google Sheets, Apps Script
- Subtitles text files हैं, इसलिए उन्हें तेजी से share करने के storage के तौर पर Pastebin इस्तेमाल किया गया
- यह सरल है, पहले से premium account मौजूद है, और traffic समस्या बनेगा ऐसा अनुमान नहीं था
- Mapping data में सिर्फ दो columns चाहिए:
YouTube URLऔरSubtitle URL - भविष्य में
Languagecolumn जोड़ा जा सकता है - Google Sheets को database की तरह इस्तेमाल करने से manual inspection और updates आसान होते हैं, और दूसरों के साथ share करना भी सरल है
- Apps Script Google Workspace तक access वाला JavaScript runtime है, और built-in web server भी देता है
function doGet(req) { /* ... */ }के रूप में YouTube video ID लेकर corresponding Pastebin URL return करता है- Public read-only database Google Sites page के रूप में दिया गया है
सुधार की गुंजाइश और testing
- Project लगभग 2 हफ्तों में बना hacky setup है, और budget करीब $30 USD था
- ChatGPT और Colab के extra GPU time पर पैसा खर्च हुआ
- दोनों strictly जरूरी नहीं थे, लेकिन होने पर सुविधा हुई
- Expansion candidate के रूप में multilingual support है
- गैर-कोरियाई community में सिर्फ US players नहीं, बल्कि Mexico, Poland, Romania, China और Taiwan के players भी हैं
- दर्जनों भाषाओं में translate किया जा सकता है, और workload भी बहुत बड़ा नहीं माना गया
- Technical improvements भी बाकी हैं
- अभी BWKT Client उन YouTube videos पर भी button दिखाता है जिनके subtitles नहीं हैं
- Apps Script web server में translated videos index return करने वाला endpoint जोड़ने से button दिखाना है या नहीं, इसे control किया जा सकता है
- कुछ Brood War users के साथ 13-minute video देखते हुए subtitles test किए गए
- करीब 5 मिनट बाद वे subtitle quality evaluate करना भूलकर video देखते हुए discussion कर रहे थे, short clips rewind कर रहे थे, pause करके बात कर रहे थे
- Subtitles ने test pass कर लिया
Project का स्वभाव
- Performance, scalability और latency इस project की core problems नहीं थीं
- ज़्यादातर काम पहले से मौजूद tools को जोड़ने वाला glue code था
- User script और Colab notebook का Python code छोटा और maintain करने में आसान है
- Web server एक simple production CRUD system जैसा है, इसलिए उसके जटिल होने की बड़ी वजह नहीं है
- बनाने वाला इस project को अपने deploy किए गए projects में सबसे janky मानता है, फिर भी उसे यह पसंद है
1 टिप्पणियां
Hacker News की टिप्पणियां
एक कोरियाई Brood War प्लेयर और speech recognition researcher के तौर पर यह पढ़ना दिलचस्प लगा
मूल Korean transcription में भी काफी गलतियां हैं, और बाद में बड़े language model ने उन्हें काफी प्रभावशाली तरीके से ठीक किया लगता है। उदाहरण के लिए
12 안마당 빌드असल में शायद12 앞마당 빌드था, और Brood War खिलाड़ियों के लिए यह कहीं ज्यादा समझने योग्य होता। इसी तरह투에처리 빌드का कोई मतलब नहीं बनता, इसे투해처리 빌드, यानी 2-hatchery build के रूप में transcribe किया जाना चाहिए थाइसलिए slang dictionary को सीधे Whisper inference प्रक्रिया में डालने वाली contextual biasing भी मददगार हो सकती है। तरीके कई हैं, लेकिन सबसे सरल रूप में Whisper की final prediction layer में dictionary में मौजूद slang tokens की probability को एक constant factor से बढ़ाया जा सकता है। HuggingFace library से इसे लागू करना भी अपेक्षाकृत आसान है: https://huggingface.co/docs/transformers/en/internal/generat...
courtyardयाfrontyardसे क्या मतलब है, यह बिल्कुल नहीं समझता। हालांकि English-speaking समुदाय में buildings, units, technologies और strategy names को बहुत ज्यादा संक्षिप्त करके बोलना आम है। Korean में भी ऐसा हो सकता है12 barracks build को आमतौर पर
12 rax, 2-hatchery mutalisk build को2 hatch muta, और 3-hatchery hydralisk timing attack/all-in को3 hatch hydra bustकहा जाता हैctranslate2 में यही feature implement करने वाला एक PR है, जिससे यह faster-whisper में भी expose हो सकता है: https://github.com/OpenNMT/CTranslate2/pull/1789
मेरी याद के मुताबिक वह building hatchery से zerglings और दूसरे units बनाने की सुविधा देती थी और upgrades research करने देती थी। एक ही बना देने पर सभी hatcheries में वह unit unlock हो जाता था, और वह खुद units produce नहीं करती थी, इसलिए कई बनाने से unit production भी नहीं बढ़ता
सैद्धांतिक रूप से upgrades parallel में research करने के लिए कई बनाए जा सकते हैं, लेकिन उपलब्ध upgrades भी करीब 3 ही हैं, इसलिए 12 बनाने की कोई वजह नहीं दिखती। अगर दुश्मन कुछ तोड़ दे तो zergling production जारी रखने के लिए backup के तौर पर हो, तब भी 12 बहुत ज्यादा हैं
इसलिए उत्सुक हूं कि असल motivation क्या था। बहुत पहले की बात है, इसलिए हो सकता है मैं बकवास कर रहा हूं
शीर्षक से धोखा नहीं खाना चाहिए। यह लेख StarCraft commentary को translate करने और अधिक accessible बनाने के काम के लिए एक बेहद thorough और creative approach के बारे में है
लेखक ने सही पकड़ा है कि 27 वर्षों में game commentary Korean या English नहीं, बल्कि एक domain-specific language बन चुकी है। automatic scripts और artificial intelligence का इस्तेमाल करके मोटे तौर पर बात समझना और फिर उसे consistent sentences में बदलना वाकई शानदार है
जिसकी native language English नहीं है, उसके नजरिए से यह लेख कई क्षेत्रों में translation, खासकर computer writing और software development translation में आने वाली समस्याओं जैसा ही लगा
बहुत सारे terms हैं जिनका translation मुश्किल है। sharding या hash जैसे शब्द ऐसे ही हैं, और एकमात्र व्यावहारिक समाधान यही है कि समय के साथ उन्हें हर language के हिसाब से किसी हद तक उधार लेकर अपना लिया जाए। लेकिन इसके लिए ऐसी community चाहिए जो दोनों languages के बीच की दूरी कुछ हद तक पार कर सके, और इस मामले में English सीखना भी शामिल है
मेरी native language Spanish है, और जब Spanish में software development की बात करते हैं तो English से आए terms लगातार आते रहते हैं। इसे अच्छी तरह handle करने का कोई पक्का तरीका नहीं दिखता, और automatic translation इसे कैसे संभालता है यह दिलचस्प है। आखिर में socially दोनों languages के mix होने की प्रक्रिया से गुजरना होगा, और देखना होगा कि उस process में कौन से terms टिकते हैं
लेख में बताए criteria के हिसाब से, Korean धाराप्रवाह न सही, पर कुछ हद तक जानने वाला व्यक्ति और जाहिर है खुद game को जानने वाला व्यक्ति चाहिए
debugके लिए काफी उपयुक्त मौजूदा Spanish शब्दdepurarसीखा था, लेकिन कई Spanish speakers English को सीधे उधार लेकरdebuguearकहते हैंcomputer या software की performance की बात करते समय Mexico में मैंने
desempeñoसीखा था, लेकिन Argentina में इसी अर्थ मेंel performanceकहते सुना है। मौजूदा Spanish शब्द खोजने के बजाय English loanwords को ज्यों का त्यों इस्तेमाल करना सबसे आम लगता हैshardingकहा जा सकता हैवास्तव में लगभग impossible to translate चीजें everyday language की होती हैं। German
Brotके meanings और connotations उन भयानक चीजों से काफी अलग हैं जिन्हें British लोग bread कहते हैं, लेकिन कोई बेहतर शब्द भी नहीं है, और इसे सीधे उधार लेना ज्यादातर contexts में काफी अजीब लगेगा। technical context मेंshardingउधार लेने से कहीं ज्यादा अजीबसमय के साथ language में ढलकर उधार लिए जाने का अच्छा उदाहरण German के railway terms में देखा जा सकता है। शुरुआत में technology Britain से आई थी इसलिए सब English था, लेकिन समय के साथ ज्यादातर शब्द German जैसे दिखने वाले शब्दों में बदल गए।
Lokomotiveजैसे कुछ शब्द English की तरह Greek/Latin borrowings से दोबारा बने, लेकिनstationअबBahnhofहै, औरtrainZugहो गया हैअनुवाद पर लिखे लेख में लेखक ने signal-to-noise ratio को पूरी तरह उल्टा इस्तेमाल किया, यह थोड़ा मज़ेदार था। signal-to-noise ratio का ऊँचा होना, जैसे 9000 से ऊपर होना, बहुत अच्छी बात है
इसका मतलब है signal ज़्यादा और noise बहुत कम, इसलिए signal-to-noise ratio कम होना यानी noise ज़्यादा होना
jargonकहना चाहिए था, वहाँ domain-specific language भी लिखाGoogle Translate वाला version भी मैं ठीक से समझ पाया, लेकिन यह इसलिए संभव हुआ क्योंकि मुझे Brood War और Zerg 12 Hatchery opening की डिटेल्स बहुत अच्छी तरह पता थीं
ChatGPT और Claude ने Korean टेक्स्ट का हैरान कर देने जितना अच्छा अनुवाद किया:
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.अगर लेखक यह देख रहे हों: yt-dlp से bandwidth बचाने के लिए कम quality वाला video डाउनलोड किया जा सकता है
yt-dlp -f "bv[height<=720]"यहाँ URL या video ID डालने पर maximum 720p quality में डाउनलोड होगा
यह किसी ऐसे व्यक्ति का बेवकूफ़ी भरा सवाल है जिसने बचपन में सिर्फ़ money maps खेले हैं: building के आगे का number क्या मतलब रखता है?
12 Hatcheries कहें तो 12 hatchery बनाना theoretically संभव तो है, लेकिन अव्यावहारिक लगता है। 12 spawning pool तो obviously बेकार हैं। इसलिए मुझे लगा कि शायद build order list में उसकी position होगी
लेकिन
12 Hatch, 12 Pool, 12 Gasजैसे build भी दिखते हैं, तो उस interpretation से बात ज़्यादा समझ नहीं आती। यह सिर्फ़ simple list नहीं लगता; शायद tree है और 12 उस building की depth है, ऐसा सोचा, लेकिन gas से पहले 11 buildings बनाना कल्पना करना मुश्किल है और बहुत late लगता है। क्या इसमें units भी शामिल हैं, या सिर्फ़ drones/overlords गिने जाते हैं?4-poolingसे शुरू हुआ था। Zerg में जब सिर्फ़ 4 workers हों तब spawning pool बनाना, फिर चौथा worker दोबारा बनाना और फिर zerglings बनाकर शुरुआती attack, यानी rush करनातब opponent तरह-तरह की गंदी गालियाँ देता है और sexual orientation तक पर शक करने लगता है
12 spawning pool तो obviously बेकार हैंवाली बात के संदर्भ में, Husky के किसी video में सचमुच 9 spawning pool बनाकर 9 pool करने की धुंधली याद हैnumber उस structure को बनाते समय पहुँचने वाले supply count को बताता है। इसलिए
12 hatch 12 pool 12 gasका मतलब है 12 workers तक जाना, फिर resources मिलते ही उन तीन buildings को क्रम से बनानाZerg में worker सचमुच building में बदल जाता है, इसलिए flow शायद ऐसा होगा: 12 तक पहुँचकर hatchery बनाना, फिर एक worker और बनाना और spawning pool बनाना, फिर एक worker और बनाकर gas refinery बनाना
Google Translate काफ़ी बेहतर हो चुका था तब भी Go से जुड़े Chinese/Japanese texts को effectively translate करना मुश्किल था। इस लेख में बताई गई समस्या जैसी ही दिक्कत थी
Chinese और Japanese के कई शब्द Go context में बहुत specific अर्थ रखते हैं, लेकिन general context में उनके ordinary meanings भी होते हैं। उदाहरण के लिए
koGo में एक specific rule situation है, लेकिन आम तौर पर इसका मतलबrobberyजैसा होता है, इसलिए Google Translate ने उसे general तरीके से translate कर दिया और पूरा टेक्स्ट समझ से बाहर हो गयाअब नए large language models में पहले से ऐसा instruction जोड़ा जा सकता है:
मैं Chinese Go diagram explanations का अनुवाद करूँगा। translation natural होनी चाहिए और Go terminology इस्तेमाल करने से बचना नहीं चाहिए। उदाहरण के लिए 拆 = extension, 夹 = pincer, 刺 और 觑 = peep, और result शानदार आता है। practically, जितना material चाहिए लगभग सब पढ़ा जा सकता है। लगता है training data में Go material पर्याप्त था, इसलिए कोई और special काम करने की ज़रूरत नहीं पड़ी—यह luck थाchess के बारे में, अगर लेखक देख रहे हों तो कुछ corrections हैं। chess की शुरुआती चालों को English में
openersनहीं, openings कहा जाता है। white-only और black-only openings अलग से नहीं होते, हालांकि individual player किसी एक side के perspective से कोई specific opening पढ़ सकता है। opening study को highest level तक जाते-जाते उल्टा और भी fundamental माना जाता है। और वह Sicilian variationNajdorkनहीं, Najdorf हैयह लेख अच्छा लगा। पहले मैंने World Cyber Games के अमेरिकी क्षेत्रीय qualifiers के कुछ मैच खेलने की कोशिश की थी, और हमेशा हैरान होता था कि बाकी लोग कितने तेज़ हैं
बाद में जब मैंने Korea से live broadcast देखा, तो खेलने की speed देखकर पूरी तरह अभिभूत हो गया। strategy के लिहाज़ से, जब किसी blog ने यह math समझाया कि Protoss zealot Zergling को 3 hits की बजाय 2 hits में कैसे मारता है, तब मुझे एहसास हुआ कि game की एक बहुत बुनियादी चीज़ मैं miss कर रहा था। उसी समय समझ आया कि यह chess जैसा game है, और मैं इसमें डूब गया
मुझे पता है कि यह गलत translation है, लेकिन
natural expansionको courtyard के रूप में अनुवाद करना मुझे काफ़ी पसंद आयाfront yardभी पसंद आया। SC2 के कुछ recent maps में backyard base होते हैं, इसलिए यह बात समझ आती हैऐसी backyard bases team maps में भी अक्सर दिखती हैं, और यह तय करना strategy बन जाता है कि कौन-सा player आगे वाला base लेगा। Protoss और Terran shield battery और bunker साथ में बना सकते हैं, लेकिन Zerg creep पर buff पाता है और उसे बहुत तेज़ी से आगे फैला सकता है