lingo-bridge / openspec /project.md
Iona401's picture
Publish Lingo Bridge
7135dbd verified
|
Raw
History Blame Contribute Delete
4.83 kB

Project Context

Purpose

Lingo Bridge is a Progressive Translation Card Stack built for the Hugging Face "Build Small Hackathon". It turns a single sentence into a visible and audible 7-layer progressive translation: the source language gradually becomes the target language, one phrase-type at a time. The result is shown as an interactive 3D card stack plus a 2D parallel-sets visualization, with per-layer text-to-speech.

The product goal is for it to feel like an interactive language toy, not a normal translator. Build priority order: clarity first, then visual impact.

Status: mid-build. Where source-file comments disagree with this document, this document and the capability specs under openspec/specs/ are the source of truth (the code still carries some stale comments, e.g. older model names).

Tech Stack

  • Language / runtime: Python 3.11, served by FastAPI + uvicorn (port 7860 locally). Deliberately not Gradio (targets the "Off-Brand" bonus).
  • Text model: Qwen3-4B-Instruct-2507 (Q4_K_M GGUF, repo unsloth/Qwen3-4B-Instruct-2507-GGUF) run via llama.cpp (llama-cpp-python). A deterministic mock backend is the fallback when no GGUF is present.
  • TTS model: target is Qwen3-TTS-12Hz-1.7B (the CustomVoice variant, which ships preset speaker voices). Interim/current engine is Kokoro-82M via kokoro-onnx (Apache-2.0, torch-free), pluggable via env TTS_ENGINE.
  • Frontend: fully custom WebGL (Three.js, vendored locally) 3D card stack + a 2D parallel-sets (SVG) view. Lives under static/.
  • Deployment: Modal.com (serverless GPU), app name lingo-bridge, file modal_app.py. Models live in a Modal Volume lingua-models.

Project Conventions

Code Style

  • Small, single-responsibility modules at repo root: config.py, llm.py, translate.py, tts.py, examples.py, app.py, modal_app.py.
  • All configuration is env-driven through config.py (LINGO_MODELS_DIR, LINGO_AUDIO_DIR, LINGO_STATIC_DIR, LINGO_LLM_REPO/LINGO_LLM_FILE, LINGO_LLM_THREADS, LINGO_GPU_LAYERS, TTS_ENGINE).
  • Keep LLM JSON simple and validate model output before rendering.
  • Every backend that can fail has a graceful fallback (mock LLM, beep/silence TTS) so the app and frontend always work.

Architecture

  • One structured LLM call decomposes + aligns the sentence into phrase "units"; plain Python then builds the 7 layers and all the cross-layer links deterministically. This keeps JSON small and makes every visual link valid by construction.
  • Backend API (FastAPI, app.py):
    • GET /api/status
    • POST /api/translate {text, source, target}
    • POST /api/tts {text, lang}
    • GET /api/examples[?random=true]
    • GET /audio/{name}
    • GET / (serves the custom frontend)

Ownership boundary

  • The frontend (static/*) is owned by a separate coding agent and must not be edited by anyone else. Application source files (*.py, *.sh, requirements.txt, etc.) are likewise out of scope for spec/doc work β€” only files under openspec/ are edited here.

Testing

  • No formal test suite yet. Validation is empirical: the decompose+align prompt was tested across 7 cases and passed 7/7 both at full precision (HF Inference Providers) and at Q4 locally. Ad-hoc test scripts (_modeltest.py, _q4test.py) exist at repo root.

Important Constraints

  • Hackathon model-size rule: each model must be ≀32B parameters per model (not summed); multiple models are allowed.
  • Languages: exactly 10 (the Qwen3-TTS supported set): English, Spanish, French, Italian, Portuguese, German, Russian, Japanese, Korean, Chinese. Hindi was dropped because Qwen3-TTS does not support it.
  • Cost guards on Modal: min_containers=0 (scale-to-zero), max_containers=1, scaledown_window=120; dev budget cap $50.
  • Currently on T4 GPU; moving to L4 (needed for Qwen3-TTS / FlashAttention-2, also speeds up the LLM).
  • llama-cpp-python is installed from a prebuilt CUDA wheel (cu125 index) on a CUDA runtime base image β€” compiling from source on a GPU-less builder fails.

Targeted Bonus Quests

  • Off-Brand β€” fully custom UI (no Gradio).
  • Llama Champion β€” llama.cpp.
  • Field Notes β€” blog write-up (BLOG.md).
  • Sharing is Caring β€” agent trace.
  • Tiny Titan β€” ≀4B per model (both models qualify).

External Dependencies

  • Hugging Face Hub (model download), llama-cpp-python cu125 prebuilt wheel index, kokoro-onnx + onnxruntime, qwen-tts (pins transformers==4.57.3, accelerate==1.12.0; optional flash-attn), Three.js (vendored locally under static/vendor/three), Modal.com.
  • Live URL: https://uiharu-kazari--lingo-bridge-web.modal.run