Python
Meili
Meili (美丽) é um software que permite traduzir o chinês ao vivo, com uma sobreposição transparente com pinyin e significado.
美丽 (Meili) significa "bonito".

HUD DE ESTUDO DE MANDARIM • TRADUÇÃO LOCAL • TEXTO PARA FALA
O que é isso?
Meili (美丽) é um software que permite traduzir chinês ao vivo, com uma sobreposição transparente com pinyin e significado.
Funcionalidades
1. Região de visualização
- Ao iniciar, você escolhe a janela a ser compartilhada na caixa de diálogo do sistema.
- Clique na sobreposição para abrir um quadro congelado do fluxo, em seguida, desenhe uma caixa sobre ele para definir a região observada (clique com o botão direito ou Esc cancela).
- O aplicativo continua observando essa área da janela compartilhada: a cada 3 segundos ele lê o chinês ali e o traduz apenas quando uma nova linha aparece.
- Clique com o botão direito na sobreposição para limpar a região.
2. Cartão de estudo
- Cada resultado mostra hanzi, pinyin (
pypinyin), uma divisão de palavras do CC-CEDICT e a tradução (MarianMT local,Helsinki-NLP/opus-mt-zh-en). - O cartão fica centralizado horizontalmente na parte inferior da sobreposição. O aplicativo desenha o texto com um contorno para que ele permaneça legível sobre o vídeo.
3. Tradução por seleção
- Selecione texto em chinês em qualquer lugar da área de trabalho e o aplicativo o executa através do mesmo pipeline: filtro CJK → cartão → tradução.
4. Atalho de teclado
- Pressione
Ctrl+Alt+Spara capturar a tela. O aplicativo faz OCR dela e traduz qualquer chinês encontrado.
5. Texto para Fala
- NeuTTS (TTS neural local, opcional, ativado na configuração).
- Fallback gTTS.
- O aplicativo fala o hanzi ou a tradução, em chinês ou inglês, respectivamente.
6. Extensão de Navegador (Chromium)
- Selecione texto em chinês em uma página e a extensão mostra uma dica de tradução na página.
- A extensão se comunica com o backend local em
127.0.0.1:8263. - A extensão mantém o contexto da página apenas na memória. Ela não grava nada em disco.
Instalação
Pré-requisitos
- Python 3.12+
- Node.js (última LTS, para a extensão do navegador)
- Tesseract OCR com traineddata
chi_simeeng(fornecido emdata/tessdata/) - PyGObject + GStreamer + o plugin GStreamer PipeWire (para o compartilhamento de portal no Wayland)
- Navegador baseado em Chromium (para a extensão)
Configuração
# Dependências do sistema (Arch Linux)
./scripts/install_dependencies.sh
# Dependências do Python
make install-pip
# Opcional: NeuTTS
make vendor
# Extensão do navegador
make build-extension
# Configuração
cp config/example_config.yaml config/config.yaml
Configuração
Edite config/config.yaml:
ocr:
engine: "pytesseract"
languages: ["en", "zh"] # chi_sim faz o trabalho de hanzi
translation:
service: "helsinki-nlp"
model: "Helsinki-NLP/opus-mt-zh-en" # Chinês -> Inglês
target_language: "en"
performance:
use_gpu: false
neutts_enabled: false # precisa de vendor/neutts e src/assets/voice_ref.wav
use_gpu: false executa o modelo de tradução na CPU.
Executar
make run
Carregar Extensão
- Compile-a:
make build-extension - Abra
chrome://extensions, ative o Modo Desenvolvedor - "Carregar sem pacote" e selecione a saída de compilação da extensão (
src/extension/dist)
Estrutura do Projeto
Meili/
├── src/
│ ├── mesly/ # Aplicação Python
│ │ ├── capture/ # Streaming de janela Portal/PipeWire, captura de tela
│ │ ├── config/ # Configurações e especificações do sistema
│ │ ├── dictionary/ # Consulta CC-CEDICT, pinyin, segmentação
│ │ ├── ocr/ # Tesseract OCR + filtragem apenas CJK
│ │ ├── server/ # Backend FastAPI (endpoint da extensão)
│ │ ├── translation/ # Serviço local MarianMT (opus-mt-zh-en)
│ │ ├── tts/ # Síntese de voz NeuTTS / gTTS
│ │ ├── utils/ # Logging, atalhos de teclado
│ │ └── window/ # Sobreposição HUD PyQt5
│ └── extension/ # Extensão Chromium (selecionar para traduzir)
├── data/ # Tessdata fornecido + CC-CEDICT
├── config/ # Configuração de tempo de execução
├── vendor/ # NeuTTS (opcional)
├── scripts/ # Scripts de instalação
└── main.py # Ponto de entrada
Contribuições
Contribuições são bem-vindas. Veja AGENTS.md para diretrizes de desenvolvimento:
- Importar no nível superior
- Separar módulos em pastas
- Usar classes em extensões