Traduzindo comentários em coreano de StarCraft: Brood War
(blog.sourcedive.net)- O discurso estratégico de alto nível de StarCraft: Brood War ficou concentrado por muito tempo em vídeos e streams em coreano, o que dificultava para comunidades que não falam coreano acompanhar o conhecimento estratégico
- As traduções existentes dependiam de trabalho manual feito por pessoas que sabiam coreano ou do Google Translate, e a tradução literal de build orders e gírias da comunidade frequentemente destruía o contexto
- O novo fluxo combina
yt-dlp, Whisper, Google Colab, LLM e um glossário da TeamLiquid para transcrever áudio em coreano e transformá-lo em legendas em inglês que jogadores de Brood War consigam entender - A distribuição das legendas é feita pelo BWKT Client, que conecta TamperMonkey UserScript, Pastebin, Google Sheets e Apps Script para evitar a limitação das permissões de proprietário no YouTube
- Embora seja um projeto hackeado em cerca de duas semanas, ele conseguiu traduzir por volta de 7 vídeos por dia usando só cerca de $30 USD e uma combinação de ferramentas gratuitas, com espaço para expansão como suporte multilíngue
Por que é difícil acessar o conhecimento coreano de Brood War
- StarCraft: Brood War é um RTS competitivo lançado em 1998 e ainda tem uma comunidade ativa
- O ecossistema de alto nível de Brood War gira praticamente em torno da Coreia
- A maioria dos jogadores profissionais, times e torneios fica na Coreia
- Uma parte significativa do público mais engajado e da comunidade também está lá
- Membros não coreanos da comunidade se chamam de “foreigners”
- Assim como no xadrez, Brood War depende de um acúmulo longo de partidas e pesquisa estratégica
- Em alto nível, estudar é tão importante quanto jogar
- Grande parte do discurso moderno acontece em vídeos e transmissões ao vivo de jogadores profissionais de Brood War
- Assim como o xadrez tem “Sicilian defense” e “Najdorf variation”, Brood War também tem uma linguagem especializada do domínio criada pela comunidade
- Esses termos não vêm de um livro de regras, mas de uma linguagem que comprime anos de estudo e análise
O problema do conhecimento dos foreigners
- Na comunidade não coreana, é extremamente raro encontrar alguém fluente em coreano
- Se a pessoa for fluente em coreano, há pouco motivo para ficar restrita a materiais não coreanos, que são mais limitados e de qualidade inferior
- A comunidade vinha arrecadando dinheiro para pagar a pessoas que sabem coreano para traduzir legendas do YouTube
- O trabalho de tradução é pesado e lento
- A remuneração objetivamente não é boa
- Mesmo assim, esse método conseguia traduzir algumas dezenas de vídeos por ano
- Tradução automática como Google Translate ajuda em frases do dia a dia, mas funciona mal com a terminologia especializada de Brood War
- Há muitas gírias e termos de build que a ferramenta nunca viu
- A tradução literal destrói o contexto em vez de ajudar
Onde a tradução literal falha
- Tutoriais coreanos usam termos de build de Brood War como
12 앞마당,11 스포닝풀,10가스,투해처리,3해처리,안 3해처리 - O Google Translate transforma isso em coisas como
12 courtyard,two-processing,3-point processing, que não fazem sentido no contexto do jogo- Não existe “courtyard” em Brood War
- “starting off the most affluently” é uma forma estranha e prolixa de dizer “economic opener/build”
- “3-point processing” não significa nada nem para jogadores de Brood War
- Algumas palavras até podem ser reconhecidas
Toss,build,fast gas,moderately fast tech-tree,Terranainda aparecem- Mas a maior parte vira ruído de tradução literal, e até o contexto das palavras reconhecíveis se perde
- A combinação de legendas automáticas ruins com tradução literal da terminologia especializada acabou deixando a comunidade não coreana décadas atrás da comunidade coreana
O novo processo de tradução
- O novo processo traduz as mesmas legendas para expressões que jogadores de Brood War entendem, como
12 Natural,economic opener,Protoss,two-Hatchery build,11 Spawning Pool,10 Gas,third Hatchery - A tradução não é perfeita, mas a relação sinal-ruído melhora muito, a ponto de o tema do vídeo ficar claro de imediato
- Antes, traduzir algumas dezenas de vídeos por ano já era o limite; com o novo método, uma única pessoa consegue traduzir cerca de 7 vídeos por dia no tempo livre
Pipeline de produção de legendas
-
yt-dlp e Whisper
- No começo, a ideia era baixar as legendas automáticas em coreano do YouTube com
yt-dlpe traduzi-las, mas a qualidade dessas legendas não era útil - Em vez disso, o
yt-dlppassou a baixar a faixa de áudio do vídeo, e a transcrição é feita diretamente com Whisper - O resultado ficou mais limpo e mais completo do que as legendas do YouTube, e parece ignorar melhor ruídos como sons do jogo e cliques de mouse
- No início, o Whisper rodava localmente e usava cerca de 10GB de VRAM
- Como era preciso instalar Python, venv, CUDA, git etc. no Windows, isso era pouco prático para outras pessoas colaborarem
- No começo, a ideia era baixar as legendas automáticas em coreano do YouTube com
-
Google Colab
- O Whisper pode ser instalado com Python
pip, e o Google Colab oferece notebooks Jupyter gratuitos e GPU gratuita - A GPU do Colab tem VRAM suficiente para rodar Whisper
- Compartilhar um notebook parametrizado em modo somente leitura acabou sendo um bom modelo de distribuição
- Mesmo usuários não técnicos podem executar sem depender do hardware local e recebem recursos novos apenas com a atualização do notebook
- Não é necessário fazer git clone nem downloads repetidos
- O notebook recebe uma única URL do YouTube, gera um arquivo SRT em coreano e permite baixá-lo
- O Whisper pode ser instalado com Python
-
LLM e glossário de gírias coreanas
- TeamLiquid é uma antiga comunidade não coreana de Brood War
- Cerca de 15 anos atrás, o membro da TeamLiquid konadora criou um post de fórum com o glossário “The Korean Terminology Thread”
- Esse post foi copiado para um arquivo Markdown chamado
KoreanSlang.txte fornecido ao LLM - O prompt instrui a traduzir as legendas em coreano para o inglês usando como referência
KoreanSlang.txte o contexto de StarCraft: Brood War - A prioridade é clareza, não tradução literal, mantendo timestamps e formato do arquivo
- O modelo pode corrigir legendas duplicadas ou erros evidentes e, se necessário, inserir notas curtas do tradutor nas legendas
- Trechos incompreensíveis podem ser substituídos por
(unintelligible), e a saída deve vir em bloco de código para facilitar a cópia - O uso prático foi colocar no ChatGPT Pro as legendas em coreano produzidas pelo Whisper e pedir a tradução
Pipeline de consumo das legendas
-
Restrições de legendas no YouTube e o BWKT Client
- O sistema nativo de legendas do YouTube só permite que o dono do vídeo configure ou atualize legendas
- Para evitar o fluxo de baixar o vídeo, reenviar e então configurar legendas, foi criado um cliente separado
- O UserScript adiciona um botão aos vídeos do YouTube e baixa a legenda traduzida correspondente quando ela existe
- Ele faz o parse de arquivos SRT e VTT e mostra as legendas em um pequeno contêiner abaixo do player do YouTube
- O nome desse cliente é BWKT Client
-
Pastebin, Google Sheets e Apps Script
- Como legendas são arquivos de texto, o Pastebin foi usado como armazenamento para compartilhamento rápido
- É simples, já havia uma conta premium e não se esperava que tráfego fosse um problema
- Os dados de mapeamento precisam de apenas duas colunas:
YouTube URLeSubtitle URL - No futuro, pode ser adicionada uma coluna
Language - Usar o Google Sheets como banco de dados facilita inspeção manual, atualização e compartilhamento com outras pessoas
- Apps Script é um runtime JavaScript com acesso ao Google Workspace e também oferece um servidor web embutido
- No formato
function doGet(req) { /* ... */ }, ele recebe o ID do vídeo do YouTube e retorna a URL correspondente no Pastebin - O banco de dados público em modo somente leitura é disponibilizado por uma página do Google Sites
Espaço para melhorias e testes
- O projeto foi uma construção hackeada em cerca de duas semanas, com orçamento de aproximadamente $30 USD
- Houve gastos com ChatGPT e tempo extra de GPU no Colab
- Nenhum dos dois era estritamente necessário, mas ambos ajudavam
- Um candidato claro para expansão é o suporte multilíngue
- A comunidade não coreana não inclui só jogadores dos EUA, mas também do México, Polônia, Romênia, China e Taiwan
- A ideia é que seria possível traduzir para dezenas de idiomas sem um aumento grande no trabalho
- Ainda há melhorias técnicas possíveis
- Hoje o BWKT Client mostra o botão até em vídeos do YouTube sem legendas disponíveis
- Se o servidor Apps Script ganhar um endpoint que retorne o índice dos vídeos traduzidos, será possível controlar quando o botão aparece
- As legendas foram testadas assistindo a um vídeo de 13 minutos com alguns usuários de Brood War
- Depois de cerca de 5 minutos, as pessoas já tinham parado de avaliar a qualidade da legenda e estavam assistindo, discutindo, voltando pequenos trechos e pausando para conversar
- As legendas passaram no teste
A natureza do projeto
- Desempenho, escalabilidade e latência não eram os problemas centrais deste projeto
- A maior parte foi apenas glue code conectando ferramentas já existentes
- O código Python do user script e do notebook do Colab é curto e fácil de manter
- O servidor web se parece mais com um sistema CRUD simples de produção, sem muitos motivos para ficar complexo
- O criador considera este o projeto mais janky que já colocou em produção, mas ainda assim gosta muito dele
1 comentários
Comentários no Hacker News
Como jogador coreano de Brood War e pesquisador de reconhecimento de fala, li com interesse
A transcrição original em coreano também tinha bastante erros, e parece que o modelo de linguagem grande corrigiu isso de forma bem impressionante depois. Por exemplo,
12 안마당 빌드provavelmente era na verdade12 앞마당 빌드, o que seria muito mais fácil de entender para jogadores de Brood War. Da mesma forma,투에처리 빌드não faz sentido; deveria ter sido transcrito como투해처리 빌드, ou seja, build de 2 hatcheriesEntão, inserir um glossário de gírias diretamente no processo de inferência do Whisper por meio de viés contextual (contextual biasing) também poderia ajudar. Há muitas formas de fazer isso, mas a mais simples seria aumentar, por um fator constante, a probabilidade dos tokens de gírias que estão no glossário na camada final de predição do Whisper. Também dá para implementar isso com relativa facilidade usando a biblioteca HuggingFace: https://huggingface.co/docs/transformers/en/internal/generat...
courtyardoufrontyardquerem dizer. Ainda assim, em inglês é comum abreviar bastante nomes de construções, unidades, tecnologias e estratégias. Parece plausível que o coreano também faça issoUma build de 12 barracks normalmente é chamada de
12 rax; uma build de 2 hatcheries com mutalisks, de2 hatch muta; e um ataque de timing/all-in de 3 hatcheries com hydralisks, de3 hatch hydra bustHá um PR que implementa a mesma funcionalidade no ctranslate2, o que poderia expô-la também no faster-whisper: https://github.com/OpenNMT/CTranslate2/pull/1789
Pelo que me lembro, essa construção servia para permitir que a hatchery produzisse zerglings e outras unidades, além de possibilitar pesquisas de upgrades. Construir uma só já liberava essas unidades em todas as hatcheries, e ela própria não produzia unidades; então construir várias não aumentaria a produção de unidades
Em teoria, daria para construir várias para pesquisar upgrades em paralelo, mas só há uns 3 upgrades disponíveis, então não parece haver motivo para construir 12. Talvez como reserva para continuar produzindo zerglings caso o inimigo destruísse algumas, mas mesmo assim 12 é exagero
Então fiquei curioso sobre qual era exatamente a motivação. Faz muito tempo, então talvez eu esteja falando besteira
Não se deixe enganar pelo título. Este texto é uma abordagem extremamente minuciosa e criativa para traduzir narrações/comentários de StarCraft e torná-los mais acessíveis
Como o autor apontou corretamente, ao longo de 27 anos os comentários do jogo deixaram de ser coreano ou inglês e viraram uma linguagem específica de domínio. É muito legal a forma como ele usa scripts automáticos e inteligência artificial para entender aproximadamente o que está sendo dito e depois transformar isso em frases consistentes
Como alguém que não tem inglês como língua nativa, este texto me pareceu exatamente o mesmo tipo de problema encontrado na tradução em várias áreas, especialmente na tradução de textos de computação e desenvolvimento de software
Há uma quantidade enorme de termos difíceis de traduzir. Palavras como sharding ou hash são exemplos, e a única solução realista é elas serem emprestadas e adaptadas, com o tempo, a cada idioma. Mas, para isso, é necessária uma comunidade capaz de atravessar em alguma medida o vão entre as duas línguas, o que neste caso inclui aprender inglês
Minha língua nativa é o espanhol, e quando se fala de desenvolvimento de software em espanhol, aparece uma sequência constante de termos trazidos do inglês. Não parece haver um jeito garantido de lidar bem com isso, e é interessante ver como a tradução automática trata o problema. No fim, é preciso passar por um processo social de mistura entre as duas línguas e ver quais termos sobrevivem nesse processo
Pelos critérios mencionados no texto, seria preciso alguém que, mesmo não sendo fluente em coreano, o conheça em algum grau e, claro, alguém que conheça o jogo em si
depurar, que corresponde muito bem adebug, mas muitos falantes de espanhol simplesmente pegam o inglês emprestado e dizemdebuguearAo falar de desempenho de computadores ou software, no México aprendi
desempeño, mas também ouvi na Argentinael performancecom o mesmo sentido. Parece que o mais comum é usar diretamente empréstimos do inglês, em vez de procurar palavras espanholas existentesshardingO que é quase impossível de traduzir de verdade é a linguagem cotidiana. O alemão
Brottem conotações bem diferentes daquele objeto horrível que os britânicos chamam de bread, mas também não há uma palavra melhor, e tomá-la emprestada sem tradução soaria bastante estranho na maioria dos contextos. Muito mais estranho do que emprestarshardingem um contexto técnicoUm bom exemplo de termos que foram emprestados e, com o tempo, adaptados ao idioma aparece na terminologia ferroviária alemã. No começo, como a tecnologia veio do Reino Unido, era tudo em inglês, mas com o tempo a maioria dos termos mudou para palavras que parecem alemãs. Algumas foram recriadas a partir dos mesmos empréstimos greco-latinos do inglês, como
Lokomotive, masstationhoje éBahnhof, etrainéZugÉ meio engraçado que, em um texto sobre tradução, o autor tenha usado relação sinal-ruído de forma completamente invertida. Uma relação sinal-ruído alta, por exemplo acima de 9000, é uma coisa muito boa.
Significa que há muito sinal e pouquíssimo ruído; portanto, quando a relação sinal-ruído diminui, quer dizer que há mais ruído.
jargon.Também consegui entender bem a versão do Google Translate, mas isso foi possível porque eu conhecia muito bem Brood War e os detalhes da abertura de 12 Hatchery dos Zergs.
ChatGPT e Claude traduziram o texto em coreano de forma surpreendentemente boa:
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.Se o autor estiver lendo: com yt-dlp, dá para baixar uma versão do vídeo em qualidade mais baixa para economizar largura de banda.
yt-dlp -f "bv[height<=720]"Colocando a URL ou o ID do vídeo aí, ele baixa com qualidade de no máximo 720p.
Pergunta boba de alguém que, quando era criança, só jogava mapas de dinheiro: o que significam os números antes dos prédios?
Dizer 12 Hatcheries poderia, em teoria, significar construir 12 Hatcheries, mas parece pouco realista. 12 Spawning Pools obviamente não servem para nada. Então pensei que talvez fosse a posição na lista da ordem de build.
Só que também aparecem builds como
12 Hatch, 12 Pool, 12 Gas, então essa interpretação não faz muito sentido. Não parece ser uma lista simples; talvez, por ser uma árvore, o 12 seja a profundidade daquele prédio, mas é difícil imaginar construir 11 edifícios antes do gás, e isso parece tarde demais. Fico curioso se inclui unidades, ou se conta só drones/overlords.4-pooling. É uma estratégia em que, jogando de Zerg, você constrói um Spawning Pool quando tem apenas 4 trabalhadores, depois faz o quarto trabalhador de novo e produz Zerglings para um ataque inicial, ou seja, um rush.Aí o adversário xinga de todos os jeitos e até questiona sua orientação sexual.
12 Spawning Pools obviamente não servem para nada, tenho uma vaga lembrança de um vídeo do Husky em que alguém de fato construiu 9 Spawning Pools para fazer um 9 pool.O número significa a quantidade de supply que você deve atingir ao construir aquela estrutura. Então
12 hatch 12 pool 12 gasquer dizer ir até 12 trabalhadores e, conforme houver recursos, construir esses três edifícios nessa ordem.Como os trabalhadores Zerg de fato se transformam em edifícios, o fluxo provavelmente é chegar a 12, construir a Hatchery, fazer mais um trabalhador, construir o Spawning Pool, fazer mais um trabalhador de novo e então construir a refinaria de gás.
Mesmo quando o Google Translate ficou bastante bom, ainda era difícil traduzir de forma eficaz textos em chinês e japonês relacionados a Go. Havia problemas parecidos com os mencionados neste texto.
Muitas palavras em chinês e japonês têm significados muito específicos no contexto de Go, mas também têm sentidos comuns em contextos gerais. Por exemplo,
koé uma situação específica de regra no Go, mas em geral pode significar algo comorobbery; o Google Translate traduzia do jeito comum e deixava o todo incompreensível.Com os grandes modelos de linguagem atuais, agora dá para colocar antes uma instrução como
vou traduzir explicações de diagramas de Go em chinês. A tradução deve soar natural e não deve evitar o uso de termos técnicos de Go. Por exemplo, 拆 = extension, 夹 = pincer, 刺 e 觑 = peep, e o resultado é excelente. Na prática, dá para ler quase todo o material que eu quiser. Parece que havia material de Go suficiente nos dados de treinamento, então tive sorte de não precisar de nenhum trabalho mais especial.Sobre xadrez, se o autor estiver lendo, há algumas correções. Os lances iniciais do xadrez em inglês não são chamados de
openers, mas de openings. Também não existem aberturas separadas só para as brancas e só para as pretas, embora, é claro, um jogador individual possa estudar uma abertura específica da perspectiva de um dos lados. O estudo de aberturas é considerado, na verdade, ainda mais fundamental quanto mais se chega ao nível mais alto. E aquela variante siciliana não éNajdork, mas Najdorf.Gostei deste texto. Há algum tempo, tentei algumas vezes jogar partidas das eliminatórias regionais dos EUA do World Cyber Games, e sempre ficava impressionado com a velocidade dos outros
Mais tarde, vi uma transmissão ao vivo da Coreia e fiquei completamente esmagado pela velocidade de jogo. Do ponto de vista estratégico, quando um blog explicou a matemática de como um zealot Protoss passa a matar um zergling em 2 golpes em vez de 3, percebi uma parte extremamente básica do jogo que eu tinha deixado passar. Foi aí que entendi que isso era um jogo como xadrez e me apaixonei
Sei que é uma tradução incorreta, mas gostei bastante da escolha de traduzir
natural expansioncomo courtyardfront yard. Em SC2, onde alguns mapas recentes têm bases no quintal, faz sentidoEssas bases de quintal também aparecem com frequência em mapas de equipe, e decidir qual jogador vai pegar a parte da frente se torna uma estratégia. Protoss e Terran podem construir juntos recarregadores de escudo e bunkers, mas Zerg recebe bônus sobre o creep e consegue espalhá-lo muito mais rápido para a frente