| --- |
| title: Vernacular |
| emoji: π» |
| colorFrom: gray |
| colorTo: purple |
| sdk: gradio |
| sdk_version: 6.16.0 |
| python_version: '3.10' |
| app_file: app.py |
| pinned: false |
| license: mit |
| short_description: Translate games. Keep every character's voice |
| --- |
| |
| # Vernacular |
|
|
| Vernacular is a Gradio review tool and character-aware translation pipeline for |
| *An Elmwood Trail*, a narrative mystery mobile game, developed by our friends at **Techyonic** <https://www.techyonic.co/>. It translates source strings, |
| uses character voice wikis to rewrite dialogue in the speaker's style, and lets |
| a reviewer approve, reject, or edit every final line. |
|
|
| The current app workflow also supports direct uploads: users can upload `.docx`, |
| `.xlsx`, `.json`, `.txt`, or `.csv` files, build/update character wikis, download |
| or re-upload the wiki JSON bundle, then press **Refresh** to send the uploaded |
| file through the normal translation and tone workflow. |
|
|
|
|
| Demo post: [LinkedIn showcase](https://www.linkedin.com/posts/sarthak-bhardwaj-_buildabrsmallabrhackathon-share-7472425190627512320-V6Sb/?utm_source=share&utm_medium=member_desktop&rcm=ACoAADPVRw4BotVBCyPE4DpwbuFzkKqoaQNohis) |
| Video demo: [YouTube walkthrough](https://youtu.be/Lmw0X4opf6M) |
|
|
| ``` |
| Uploaded doc/xlsx ββΊ converter/docs.py or converter/sheets.py ββΊ English_JSON/Uploaded/ |
| Uploaded wiki JSON ββββββββββββββββββββββββββββββββββββββββββββΊ character_wikis/*.md |
| Uploaded source ββΊ wiki builder ββΊ character_wikis/*.md ββΊ character_wikis.json |
| |
| English_JSON/Uploaded/ ββΊ TranslateGemma ββΊ Gemma tone pass + character wiki |
| β |
| translations/<lang>/ review records |
| β |
| app.py review: approve / reject / edit |
| ``` |
|
|
| ## Setup |
|
|
| Install the runtime dependencies: |
|
|
| ```bash |
| pip install -r requirements.txt |
| ``` |
|
|
| The app uses Hugging Face Transformers in-process, not local llama.cpp or Ollama |
| servers. The model IDs are configured in `config.py`: |
|
|
| ```python |
| TRANSLATE_MODEL_ID = "google/translategemma-12b-it" |
| TONE_MODEL_ID = "google/gemma-4-12B-it" |
| ``` |
|
|
| For Hugging Face Spaces, add an `HF_TOKEN` secret for reliable downloads and for |
| access to gated Google Gemma models. The account behind that token must have |
| accepted the model terms. |
|
|
| Run the app locally: |
|
|
| ```bash |
| python app.py |
| ``` |
|
|
| ## App Workflow |
|
|
| 1. Open the Gradio app. |
| 2. In **Character wiki builder**, upload one or more source files. |
| 3. Optionally upload an existing `character_wikis.json`. |
| 4. Click **Build / update wiki JSON**. |
| 5. Download the generated wiki JSON if you want to keep or reuse it later. |
| 6. Click the existing **Refresh** button. |
| 7. Select the uploaded file from the file dropdown and review its translated |
| strings as usual. |
|
|
| For `.docx` and `.xlsx` uploads, the app uses the same converter modules as the |
| original pack conversion: |
|
|
| | Upload type | Conversion path | |
| |---|---| |
| | `.docx` | `converter/docs.py` via `readLocalDoc()` | |
| | `.xlsx` | `converter/sheets.py` via `readLocalSheet()` | |
| | `.json`, `.txt`, `.csv` | Plain-text fallback wrapped as uploaded chat rows | |
|
|
| If a converted doc/sheet produces no translatable strings, the app falls back to |
| plain extracted text so the upload still enters the workflow. |
|
|
| ## What Uploads Create |
|
|
| Uploaded files are stored in app-managed paths: |
|
|
| | Path | Purpose | |
| |---|---| |
| | `uploaded_wiki_sources/` | Plain text JSON used to build/update character wikis | |
| | `English_JSON/Uploaded/Filler Chats/` | Converted source JSON used by translation/review | |
| | `character_data/` | Character index entries pointing to uploaded files | |
| | `character_wikis/*.md` | Per-character markdown wikis used by the tone pass | |
| | `character_wikis/character_wikis.json` | Downloadable/uploadable wiki bundle | |
| | `translations/<lang>/Uploaded/Filler Chats/` | Review records produced after Refresh | |
|
|
| ## Existing Batch Workflow |
|
|
| The original full-pack workflow is still available: |
|
|
| ```bash |
| python convert.py |
| python build_character_data.py |
| python build_character_wikis.py |
| python -m pipeline.build_file_context |
| python -m pipeline.translate_pack |
| python app.py |
| python -m pipeline.export_pack |
| ``` |
|
|
| `pipeline.translate_pack` remains resumable and supports targeted runs: |
|
|
| ```bash |
| python -m pipeline.translate_pack --dry-run |
| python -m pipeline.translate_pack --filter Initial/ |
| python -m pipeline.translate_pack --stage translate |
| python -m pipeline.translate_pack --stage tone |
| ``` |
|
|
| Note: `build_character_wikis.py` is the older batch wiki builder and still uses |
| its original local Ollama path. The Gradio upload workflow builds wikis through |
| the in-process Hugging Face Gemma client instead. |
|
|
| ## Changing The Target Language |
|
|
| Edit the target values in `config.py`: |
|
|
| ```python |
| TARGET_LANG_CODE = "de" |
| TARGET_LANG_NAME = "German" |
| PACK_NAME = "German_JSON" |
| ``` |
|
|
| Then rerun the translation/review/export workflow. TranslateGemma supports many |
| language pairs, but the selected Hugging Face model and token access must be |
| available in the runtime. |
|
|
| ## Repository Map |
|
|
| | Path | Purpose | |
| |---|---| |
| | `app.py` | Gradio app: wiki upload/build, refresh, review UI | |
| | `requirements.txt` | Space/local Python runtime dependencies | |
| | `config.py` | Target language, paths, Hugging Face model settings | |
| | `converter/` | `.docx` / `.xlsx` to structured JSON conversion | |
| | `English_JSON/` | Source-of-truth JSON files, including uploaded files | |
| | `character_data/` | Per-character file indexes | |
| | `character_wikis/` | Markdown wikis and downloadable wiki JSON bundle | |
| | `pipeline/clients.py` | In-process TranslateGemma and Gemma tone inference | |
| | `pipeline/translate_pack.py` | Batch translation/tone driver | |
| | `translations/<lang>/` | Review records used by the app | |
| | `pipeline/export_pack.py` | Exports approved/edited translations to final pack | |