4 puntos por GN⁺ 2025-01-19 | 1 comentarios | Compartir por WhatsApp
  • El discurso estratégico de alto nivel de StarCraft: Brood War lleva mucho tiempo concentrado en videos y streams en coreano, lo que dificultaba que las comunidades no coreanohablantes siguieran el conocimiento estratégico
  • Las traducciones existentes dependían del trabajo manual de personas que sabían coreano o de Google Translate, y el contexto se rompía con frecuencia porque los build orders y la jerga de la comunidad se traducían de forma literal
  • El nuevo flujo combina yt-dlp, Whisper, Google Colab, LLM y un glosario de TeamLiquid para transcribir audio en coreano y convertirlo en subtítulos en inglés que los jugadores de Brood War puedan entender
  • La distribución de subtítulos se maneja con BWKT Client, que conecta TamperMonkey UserScript, Pastebin, Google Sheets y Apps Script para no quedar bloqueado por los permisos del propietario en YouTube
  • Aunque es un proyecto tipo hack hecho en unas 2 semanas, con apenas unos $30 USD y una combinación de herramientas gratuitas pudo traducir unos 7 videos por día, y todavía deja margen para extensiones como soporte multilingüe

Por qué es difícil acceder al conocimiento de Brood War en coreano

  • StarCraft: Brood War es un RTS competitivo lanzado en 1998 y todavía tiene una comunidad activa
  • El ecosistema de Brood War de alto nivel se mueve, en la práctica, con Corea como centro
    • La mayoría de los jugadores profesionales, equipos y torneos tienen base en Corea
    • Una parte considerable de los espectadores más dedicados y de la comunidad también está en Corea
    • Los integrantes de la comunidad no coreana se llaman a sí mismos “foreigners”
  • En Brood War, como en el ajedrez, es importante el registro de partidas y el estudio estratégico acumulado durante mucho tiempo
    • En niveles altos, estudiar es tan importante como jugar
    • Buena parte del discurso moderno ocurre en videos y transmisiones en vivo de jugadores profesionales de Brood War
  • Así como en ajedrez existen términos como “Sicilian defense” o “Najdorf variation”, Brood War también tiene un lenguaje específico del dominio creado por la comunidad
    • Estos términos no vienen del reglamento, sino que son un lenguaje que condensa y transmite años de investigación y análisis

El problema del Foreigner Knowledge

  • En la comunidad no coreanohablante, es muy raro encontrar personas que hablen coreano con fluidez
    • Si alguien habla coreano con fluidez, tiene menos razones para quedarse con materiales no coreanos, más limitados y de menor calidad
  • La comunidad ha juntado dinero para encargar traducciones de subtítulos de YouTube a personas que saben coreano
    • El trabajo de traducción es difícil y lento
    • La paga tampoco es objetivamente buena
    • Aun así, con este método se traducen unas decenas de videos al año
  • La traducción automática como Google Translate es útil para frases cotidianas, pero no encaja bien con la terminología especializada de Brood War
    • Hay mucha jerga y términos de builds que la herramienta no ha visto
    • La traducción literal termina arruinando el contexto

Dónde falla la traducción literal

  • Los tutoriales en coreano incluyen términos de builds de Brood War como 12 앞마당, 11 스포닝풀, 10가스, 투해처리, 3해처리, 안 3해처리
  • Google Translate los convierte en expresiones que no encajan con el contexto del juego, como 12 courtyard, two-processing o 3-point processing
    • En Brood War no existe un “courtyard”
    • “starting off the most affluently” es una forma torpe y larga de traducir “economic opener/build”
    • “3-point processing” no significa nada ni siquiera para un jugador de Brood War
  • Algunas palabras sí se pueden reconocer
    • Toss, build, fast gas, moderately fast tech-tree, Terran, entre otras, se conservan
    • Pero la mayor parte es ruido de traducción literal, así que incluso el contexto de las palabras reconocibles se vuelve confuso
  • La combinación de subtítulos automáticos de baja calidad y terminología especializada traducida literalmente parece haber provocado que la comunidad no coreanohablante quede décadas por detrás de la comunidad coreana

Nuevo proceso de traducción

  • El nuevo proceso traduce los mismos subtítulos a expresiones comprensibles para jugadores de Brood War, como 12 Natural, economic opener, Protoss, two-Hatchery build, 11 Spawning Pool, 10 Gas y third Hatchery
  • La traducción no es perfecta, pero mejora mucho la relación señal-ruido, al punto de que el tema del video se entiende de inmediato
  • Antes, el límite era traducir decenas de videos al año; con el nuevo método, una persona traduce unos 7 videos por día en su tiempo libre

Pipeline de producción de subtítulos

  • yt-dlp y Whisper

    • Al principio se intentó descargar los subtítulos automáticos en coreano de YouTube con yt-dlp para traducirlos, pero la calidad de esos subtítulos no era útil
    • En su lugar, se descarga la pista de audio del video con yt-dlp y se transcribe directamente con Whisper
    • El resultado fue más limpio y completo que los subtítulos de YouTube, y también parece ignorar mejor ruidos como sonidos del juego y clics del mouse
    • Al inicio, Whisper se ejecutaba en local y usaba alrededor de 10GB de VRAM
    • En Windows había que instalar Python, venv, CUDA, git, etc., lo que imponía demasiadas restricciones para otros colaboradores
  • Google Colab

    • Whisper se puede instalar con pip de Python, y Google Colab ofrece un servicio gratuito de notebooks Jupyter y GPU gratis
    • La GPU de Colab tiene suficiente VRAM para ejecutar Whisper
    • Compartir un notebook parametrizado y de solo lectura resultó ser un buen modelo de distribución
    • Incluso usuarios no técnicos pueden ejecutarlo sin depender de su hardware, y recibir las funciones más recientes con solo actualizar el notebook
    • No hace falta hacer git clone ni descargas repetidas
    • El notebook recibe una sola URL de YouTube, genera un archivo SRT en coreano y permite descargarlo
  • LLM y glosario de jerga coreana

    • TeamLiquid es una antigua comunidad no coreana de Brood War
    • Hace unos 15 años, el miembro de TeamLiquid konadora creó un post de foro con un glosario llamado “Terminología coreana usada por casters de BW”
    • Ese post se copió como un archivo Markdown llamado KoreanSlang.txt y se le proporcionó al LLM
    • El prompt pedía traducir los subtítulos en coreano al inglés, pero tomando como referencia KoreanSlang.txt y el contexto de StarCraft: Brood War
    • Se le indicó que priorizara la claridad por sobre la traducción literal y que conservara los timestamps y el formato del archivo
    • También podía corregir subtítulos duplicados o errores evidentes y, si hacía falta, insertar notas breves del traductor en los subtítulos
    • Las partes incomprensibles debían reemplazarse por (unintelligible) y la salida debía ir en un bloque de código para que fuera fácil de copiar
    • Se usó pegando en ChatGPT con cuenta Pro los subtítulos en coreano generados por Whisper y pidiendo su traducción

Pipeline de consumo de subtítulos

  • Restricciones de subtítulos de YouTube y BWKT Client

    • La función de subtítulos propia de YouTube solo permite que el propietario del video configure o actualice subtítulos
    • Para evitar descargar el video, volver a subirlo y configurar subtítulos, se creó un cliente aparte
    • El UserScript agrega un botón a los videos de YouTube y, si hay subtítulos traducidos correspondientes, los descarga
    • Parsea archivos SRT y VTT y muestra los subtítulos en un pequeño contenedor debajo del reproductor de YouTube
    • Este cliente se llama BWKT Client
  • Pastebin, Google Sheets y Apps Script

    • Como los subtítulos son archivos de texto, se usa Pastebin como repositorio para compartirlos rápido
    • Es simple, ya había una cuenta premium disponible y no se esperaba que el tráfico fuera un problema
    • Los datos de mapeo solo necesitan dos columnas: YouTube URL y Subtitle URL
    • En el futuro se podría agregar una columna Language
    • Usar Google Sheets como base de datos facilita la inspección y actualización manual, y también es sencillo compartirla con otras personas
    • Apps Script es un runtime de JavaScript con acceso a Google Workspace y también ofrece un servidor web integrado
    • Con una forma como function doGet(req) { /* ... */ }, recibe el ID del video de YouTube y devuelve la URL de Pastebin correspondiente
    • La base de datos pública de solo lectura se ofrece como una página de Google Sites

Margen de mejora y pruebas

  • El proyecto es una construcción tipo hack hecha en unas 2 semanas, con un presupuesto de alrededor de $30 USD
    • Se pagó por ChatGPT y tiempo adicional de GPU en Colab
    • Ninguno de los dos era estrictamente necesario, pero eran cómodos
  • Un candidato de expansión es el soporte multilingüe
    • En la comunidad no coreana no solo hay jugadores de Estados Unidos, sino también de México, Polonia, Rumania, China y Taiwán
    • Se considera que podría traducirse a decenas de idiomas y que la carga de trabajo no sería grande
  • También quedan mejoras técnicas
    • Actualmente BWKT Client muestra el botón incluso en videos de YouTube que no tienen subtítulos
    • Si se agrega al servidor web de Apps Script un endpoint que devuelva el índice de videos traducidos, se podría controlar si se muestra el botón o no
  • Se probaron los subtítulos viendo un video de 13 minutos junto con algunos usuarios de Brood War
    • Después de unos 5 minutos, se olvidaron de evaluar la calidad de los subtítulos y empezaron a ver el video, debatir, rebobinar clips cortos y pausar para conversar
    • Los subtítulos pasaron la prueba

Naturaleza del proyecto

  • Rendimiento, escalabilidad y latencia no eran los problemas centrales de este proyecto
  • En su mayoría fue glue code que conectaba herramientas ya existentes
  • El código Python del userscript y del notebook de Colab es corto y fácil de mantener
  • El servidor web se parece a un sistema CRUD de producción simple, así que no hay muchas razones para que se vuelva complejo
  • Quien lo creó ve este proyecto como el más janky que ha publicado, pero aun así le tiene cariño

1 comentarios

 
GN⁺ 2025-01-19
Opiniones en Hacker News
  • Como jugador coreano de Brood War e investigador en reconocimiento de voz, me pareció una lectura interesante.
    La transcripción coreana original también tiene bastantes errores, y parece que el modelo de lenguaje grande los corrigió de forma bastante impresionante más adelante. Por ejemplo, 12 안마당 빌드 probablemente en realidad era 12 앞마당 빌드, lo que para un jugador de Brood War habría sido mucho más fácil de entender. Del mismo modo, 투에처리 빌드 no tiene sentido y debería haberse transcrito como 투해처리 빌드, es decir, build de 2 hatcheries.
    Por eso, incorporar un diccionario de jerga directamente en el proceso de inferencia de Whisper mediante sesgo contextual (contextual biasing) también podría ayudar. Hay muchas formas de hacerlo, pero la más simple sería aumentar por un factor constante la probabilidad de los tokens de jerga incluidos en el diccionario en la capa final de predicción de Whisper. También se puede implementar con relativa facilidad con la biblioteca de HuggingFace: https://huggingface.co/docs/transformers/en/internal/generat...

    • Soy fan de StarCraft, pero no tengo idea de qué significan courtyard o frontyard. Dicho eso, en inglés es común abreviar muchísimo los nombres de edificios, unidades, tecnologías y estrategias. Parece plausible que en coreano también pase.
      Un build de 12 barracks suele llamarse 12 rax; un build de 2 hatcheries con mutalisks, 2 hatch muta; y un ataque de timing/all-in de 3 hatcheries con hydralisks, 3 hatch hydra bust.
    • Como jugador extranjero de Brood War e investigador en procesamiento de voz, creo que un sesgo contextual superficial definitivamente ayudaría. La implementación en sí no es difícil, pero las soluciones de reconocimiento automático de voz más usadas por lo general no exponen esta función de forma fácil de usar.
      Hay un PR que implementa la misma función en ctranslate2, y con eso podría quedar expuesta también en faster-whisper: https://github.com/OpenNMT/CTranslate2/pull/1789
    • ¿De verdad en coreano usan una palabra que significa lanzar algo para referirse a Protoss? Si es así, es un juego de palabras entre idiomas bastante gracioso.
    • Hace mucho que no juego, pero cada vez que veía la traducción me confundía: ¿por qué querrían construir 12 Spawning Pools?
      Según recuerdo, ese edificio servía para permitir que la hatchery produjera zerglings y otras unidades, además de habilitar investigaciones de mejoras. Con construir uno solo se desbloqueaban esas unidades en todas las hatcheries, y como el edificio no producía unidades por sí mismo, construir varios tampoco aumentaba la producción de unidades.
      En teoría, podrías construir varios para investigar mejoras en paralelo, pero solo había unas tres mejoras disponibles, así que no parece haber razón para construir 12. Tal vez como respaldo para seguir produciendo zerglings aunque el enemigo destruyera algunos, pero aun así 12 es demasiado.
      Así que me da curiosidad cuál era exactamente la motivación. Puede que esté diciendo tonterías porque fue hace mucho.
  • No hay que dejarse engañar por el título. Este artículo es un enfoque muy minucioso y creativo para traducir comentarios de StarCraft y hacerlos más accesibles.
    Como señaló acertadamente el autor, en 27 años los comentarios del juego dejaron de ser coreano o inglés y se convirtieron en un lenguaje específico del dominio. Es realmente genial la forma en que usa scripts automáticos e inteligencia artificial para entender más o menos qué se está diciendo y luego convertirlo en frases coherentes.

  • Como alguien cuya lengua materna no es el inglés, este artículo me pareció exactamente el mismo problema que se ve en traducciones de muchas áreas, en particular en traducciones sobre computación y desarrollo de software.
    Hay muchísimos términos difíciles de traducir. Palabras como sharding o hash son ejemplos, y la única solución realista es tomarlas prestadas con el tiempo y adaptarlas en cierta medida a cada idioma. Pero para eso se necesita una comunidad que pueda cruzar, al menos en parte, la brecha entre ambos idiomas, y en este caso eso incluye aprender inglés.
    Mi lengua materna es el español, y cuando hablo de desarrollo de software en español aparece una sucesión constante de términos tomados del inglés. No parece haber una forma clara de manejarlo bien, y me resulta interesante ver cómo lo trata la traducción automática. Al final, hay que pasar por un proceso social en el que ambos idiomas se mezclan y ver qué términos sobreviven.
    Según el criterio del artículo, se necesitaría alguien que sepa coreano hasta cierto punto aunque no lo hable con fluidez, y por supuesto alguien que conozca el juego en sí.

    • En español se suma la complejidad de las diferencias de tradición lingüística en todo el mundo. Por ejemplo, en México aprendí la palabra española ya existente depurar, que encaja bastante bien con debug, pero muchos hispanohablantes toman directamente el inglés y dicen debuguear.
      Para hablar del rendimiento de una computadora o de software, en México aprendí desempeño, pero también escuché que en Argentina se usa el performance con el mismo significado. Parece que lo más común es usar directamente préstamos del inglés en vez de buscar una palabra española existente.
    • En cierto sentido, estos términos son muy fáciles de adaptar. En alemán, sharding simplemente se dice sharding.
      Lo que de verdad es casi imposible de traducir es el lenguaje cotidiano. El alemán Brot tiene connotaciones bastante distintas de esa cosa horrible que los británicos llaman bread, pero no es que haya una palabra mejor, y tomarlo prestado tal cual sonaría bastante raro en la mayoría de los contextos. Mucho más raro que tomar prestado sharding en un contexto técnico.
      Un buen ejemplo de préstamos que con el tiempo se adaptan al idioma se ve en la terminología ferroviaria alemana. Al principio, como la tecnología se importó de Gran Bretaña, todo era en inglés, pero con el tiempo la mayoría de los términos se reemplazaron por palabras que parecen alemanas. Algunas, como Lokomotive, se recrearon a partir de préstamos grecolatinos compartidos con el inglés, pero station ahora es Bahnhof y train es Zug.
    • Sharding o hash usan metáforas fáciles de visualizar en un contexto físico, así que no entiendo muy bien por qué serían difíciles de traducir.
  • Es un poco gracioso que, en un texto sobre traducción, el autor haya usado relación señal-ruido exactamente al revés. Que la relación señal-ruido sea alta, por ejemplo que supere 9000, es algo muy bueno.
    Significa que hay mucha señal y muy poco ruido, así que si la relación señal-ruido baja, quiere decir que hay más ruido.

    • Creo que el autor también escribió lenguaje específico de dominio cuando debería haber dicho jargon.
    • Esa parte también me confundió por un momento. No es que el texto en sí haya empeorado mucho, pero me tomó un rato entender el significado.
    • Tuve que releer esa parte varias veces para entenderla. Se sentía parecido a leer una traducción de Google.
  • También pude entender bien la versión de Google Translate, pero fue posible porque conozco muy bien los detalles de Brood War y de la apertura de 12 Hatchery de Zerg.
    ChatGPT y Claude tradujeron el texto coreano sorprendentemente bien:
    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 el autor lo ve: con yt-dlp se puede descargar una versión del video en menor calidad para ahorrar ancho de banda.
    yt-dlp -f "bv[height<=720]"
    Si se pone ahí la URL o el ID del video, se descarga con una calidad máxima de 720p.

    • El autor dijo que simplemente descarga solo la pista de audio. Eso usa muchos menos datos que descargar cualquier calidad de video.
  • Pregunta tonta de alguien que de chico solo jugó mapas de dinero: ¿qué significan los números delante de los edificios?
    Si dicen 12 Hatcheries, construir 12 Hatcheries en teoría es posible, pero parece poco realista. 12 Spawning Pools obviamente no sirven de nada. Por eso pensé que quizá era la posición en la lista del orden de construcción.
    Pero también aparecen builds como 12 Hatch, 12 Pool, 12 Gas, así que esa interpretación no tiene mucho sentido. No parece ser una simple lista, y como es un árbol pensé que tal vez el 12 era la profundidad de ese edificio, pero construir 11 edificios antes del gas es difícil de imaginar y parece demasiado tarde. Me pregunto si incluye unidades, o si solo cuenta drones/overlords.

    • Si mal no recuerdo, es un uso que empezó con 4-pooling. Con Zerg, cuando solo tienes 4 trabajadores, construyes un Spawning Pool, vuelves a crear el cuarto trabajador y luego produces Zerglings para hacer un ataque temprano, o sea un rush.
      Entonces el rival te insulta de todas las formas posibles y hasta pone en duda tu orientación sexual.
    • Significa la cantidad de suministros que debes tener al empezar a construir el edificio. En esta etapa, todo el suministro viene de trabajadores, así que también indica hasta cuántos trabajadores debes producir.
    • Sobre eso de que 12 Spawning Pools obviamente no sirven de nada, recuerdo vagamente un video de Husky donde de verdad construían 9 Spawning Pools para hacer un 9 pool.
    • ¿No significa la cantidad de trabajadores que tienes cuando construyes ese edificio?
    • En el juego construyes edificios y unidades, y las unidades ocupan suministro, que tiene un límite. Al inicio de la partida, salvo que explores y veas que el rival prepara un ataque extremadamente temprano, produces sobre todo trabajadores que recolectan recursos y construyen edificios.
      El número significa la cantidad de suministro que debes alcanzar cuando construyes esa estructura. Así que 12 hatch 12 pool 12 gas quiere decir que llegas a 12 trabajadores y luego, en cuanto tengas recursos, construyes esos tres edificios en ese orden.
      En Zerg, los trabajadores de hecho se transforman en edificios, así que probablemente el flujo sea llegar a 12, construir la Hatchery, crear un trabajador más, construir el Spawning Pool, crear otro trabajador y luego construir la refinería de gas.
  • Incluso cuando Google Translate ya había mejorado bastante, era difícil traducir de forma efectiva textos en chino y japonés relacionados con go. Había problemas parecidos a los que aparecen en este artículo.
    Muchas palabras del chino y del japonés tienen significados muy específicos en el contexto del go, pero en contextos generales también tienen significados comunes. Por ejemplo, ko es una situación reglamentaria específica en go, pero en general puede significar algo como robbery, así que Google Translate lo traducía de la forma común y hacía que todo resultara incomprensible.
    Con los modelos de lenguaje grandes más recientes, ahora se puede anteponer una instrucción como voy a traducir explicaciones de diagramas de go en chino. La traducción debe sonar natural y no debe evitar usar terminología técnica de go. Por ejemplo, 拆 = extension, 夹 = pincer, 刺 y 觑 = peep, y el resultado es excelente. En la práctica, alcanza para leer casi todo el material que quiera. Parece que había suficiente material de go en los datos de entrenamiento, así que tuve suerte de que no hiciera falta un trabajo más especial.
    Si el autor lo ve, hay algunas correcciones sobre ajedrez. Las jugadas iniciales en ajedrez en inglés no se llaman openers, sino openings. Tampoco existen aperturas separadas solo para blancas y solo para negras, aunque por supuesto un jugador individual puede estudiar una apertura concreta desde la perspectiva de un lado. La preparación de aperturas se considera más bien aún más fundamental cuanto más alto es el nivel. Y esa variante siciliana no es Najdork, sino Najdorf.

    • Ahora en mi cabeza el canon es Najdork.
  • Me gustó este artículo. Hace tiempo intenté jugar algunas partidas de las eliminatorias regionales de Estados Unidos de los World Cyber Games, y siempre me sorprendía lo rápidos que eran los demás.
    Más tarde vi transmisiones en vivo desde Corea y quedé completamente abrumado por la velocidad de juego. Desde el punto de vista de la estrategia, cuando en algún blog explicaron la matemática por la cual un zealot de Protoss podía matar a un zergling de 2 golpes en vez de 3, me di cuenta de una parte muy básica del juego que se me había pasado. Entonces entendí que esto era un juego como el ajedrez y me enganché

  • Sé que es una traducción incorrecta, pero me gusta bastante que hayan traducido natural expansion como courtyard

    • También me gusta front yard. Tiene sentido en SC2, donde algunos mapas recientes tienen bases en el patio trasero.
      Estas bases de patio trasero también aparecen con frecuencia en mapas de equipo, y decidir qué jugador tomará la parte delantera se vuelve parte de la estrategia. Protoss y Terran pueden construir juntos cargadores de escudo y búnkeres, pero Zerg recibe bonificaciones sobre el creep y puede extenderse hacia adelante mucho más rápido