{"slug": "i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator", "title": "I Tackled the Planet of Lana Language Challenge by Building an AI Translator & Voice Synthesizer", "summary": "A developer has built NovoGen, an open-source translator and speech synthesizer for the fictional language Novo Terali from the game Planet of Lana. The project combines linguistic rules extracted from the official Language Companion booklet with an LLM extrapolation engine and acoustic voice synthesis, and is designed to work offline or scale on serverless infrastructure.", "body_md": "I tackled the challenge in a different way, and created this project as my answer.\n\nWhen the indie studio Wishfully released the official **Language Companion** booklet (`PoL_LanguageCompanion.pdf`) for *Planet of Lana II: Children of the Leaf*, they ended it on page 13 with an irresistible invitation to the community:\n\n*\"Congratulations, you’ve reached the end of this intensive crash course in Novo Terali! We hope you’ve enjoyed learning a bit more about Lana’s native tongue, and that your understanding of Novo as a whole has deepened in the process.*\n\n*Now that you are completely fluent, we would love to hear from you in your best Novo Terali! Share a short (or long!) shoutout in your new favorite language on social media and tag us @planetoflana - we can’t wait to see it!\"*\n\nMost players reading that would string together three words from the mini-glossary—like *\"Tiai Lana!\"* (\"Hello Lana!\")—tweet it with a screenshot, and call it a day.\n\n**I couldn't stop there.**\n\nThe booklet provided around 80 canonical vocabulary words, basic commands, pronouns, numbers, and a handful of translated game scenes. But how can anyone truly be \"fluent\" when whole swathes of everyday vocabulary and grammar are still undiscovered?\n\nInstead of just posting a one-line tweet, I asked myself:\n\n*What if anyone could translate anything into Novo Terali? What if we could reverse-engineer the linguistic rules from the booklet, marry them with an LLM extrapolation engine, back it with an acoustic voice synthesizer, and build a living, self-healing codex that speaks the language in real time?*\n\nThat question led to **NovoGen** — an open-source, full-stack conlang translator, speech synthesizer, and dictionary manager for *Planet of Lana*. \n\nHere is the story of how it was engineered, the technical hurdles encountered along the way, and what it takes to bring a fictional language to life with modern web and AI technologies.\n\nIn the *Planet of Lana* universe, **Novo Terali** (literally *\"New Speak\"*) was created on Earth as an accessible auxiliary language designed to unite humanity during the multi-generational *Fata te Cora* (\"Seed and Leaf\") space mission. Centuries later, on the planet Novo, survivors preserved and evolved it into the melodic dialect spoken by Lana, her sister Elo, and the villagers of Tailo.\n\nBefore writing a single line of backend code, I extracted and analyzed every rule documented in the booklet:\n\n```\n                  ┌──────────────────────────────────────────────┐\n                  │          NOVO TERALI PHONOTACTICS            │\n                  ├──────────────────────────────────────────────┤\n                  │  Vowels:      a [ah], e [eh], i [ee],        │\n                  │               o [oh], u [oo] (pure Italian)  │\n                  │  Diphthongs:  ai, ia, ea, oa, ui (unclipped) │\n                  │  Consonants:  t/d aspirated, rolled 'r',     │\n                  │               'h' voiced, no silent letters  │\n                  │  Stress:      Light stress on first syllable │\n                  │  Rhythm:      Calm, melodic, even pacing     │\n                  └──────────────────────────────────────────────┘\n```\n\n`-em`: Plural/verbal inflection (`-ari`: Agent/actor noun suffix (` oti-`: Honorific or co-prefix (\nOne core design philosophy was that NovoGen must never depend exclusively on third-party cloud APIs. If a user runs it offline without an API key, it should function seamlessly using local compute. If deployed to production, it should scale on serverless infrastructure.\n\n```\n                     ┌───────────────────────────────┐\n                     │       Next.js App Router      │\n                     │    Tailwind / Vanilla CSS     │\n                     └───────────────┬───────────────┘\n                                     │\n                        POST /api/translate\n                                     │\n                     ┌───────────────▼───────────────┐\n                     │   In-Memory Rate Limiter      │\n                     │  (Sliding-Window, 30 req/min) │\n                     └───────────────┬───────────────┘\n                                     │\n                     ┌───────────────▼───────────────┐\n                     │  Multi-Tier Translation Engine │\n                     └───────────────┬───────────────┘\n                                     │\n         ┌───────────────────────────┼───────────────────────────┐\n         │                           │                           │\n 1. Exact SQLite Match      2. Rule Agglutination       3. LLM Extrapolation\n    (Canonical Lore DB)        (Suffixes & Modifiers)       (Gemini 3.1 / Ollama)\n         │                           │                           │\n         └───────────────────────────┼───────────────────────────┘\n                                     │\n                     ┌───────────────▼───────────────┐\n                     │  Phonotactic Quarantine Guard │\n                     │ (Anti-Gibberish Verification) │\n                     └───────────────┬───────────────┘\n                                     │\n                     ┌───────────────▼───────────────┐\n                     │      ElevenLabs Voice API     │\n                     │    (Gigi Voice Model Tuning)  │\n                     └───────────────────────────────┘\n```\n\nBecause the canonical dictionary has only ~80 terms, users translating sentences like *\"Look at the ancient machine in the forest\"* require new vocabulary.\n\nIf you give an LLM free rein, it will hallucinate English words with random accents or invent sounds that violate the fictional world's phonotactics.\n\nTo solve this, I designed a **multi-tier fallback system**:\n\n`novo_dictionary.db` (seeded directly from the companion booklet), return it immediately with `is_canonical = 1`.` llama3.2` or `mistral`) using an ironclad conlang system prompt:\n\n``` js\n// System instruction excerpt enforced during translation\nconst CONLANG_PROMPT = `\nYou are the official linguistic translator for Novo Terali from Planet of Lana.\nFollow these inviolable phonotactic constraints:\n1. Every vowel is strictly: a [ah], e [eh], i [ee], o [oh], u [oo].\n2. No consonant clusters exceeding 2 consonants; never use 'x', 'q', or 'z'.\n3. Extrapolated roots MUST use open syllables (CV or CVC patterns like 'talo', 'suni', 'kora').\n4. Compound from known roots where possible (e.g., 'machine' -> 'meka-fata').\n5. Canonical vocabulary is SACRED: Never overwrite 'Tiai' (Hello), 'Cora' (Child/Leaf), etc.\nReturn strictly structured JSON containing translation, IPA phonetics, and grammar breakdown.\n`;\n```\n\nWhen an extrapolated word is generated, it is tagged as `extrapolated` and cached in SQLite so that subsequent translations remain 100% consistent across sessions.\n\nOnce the app went online, a new vulnerability emerged: **cache pollution via keyboard mashing**.\n\nIf someone types `\"leftofkfmv\"` or `\"asdfghjkl\"`, the LLM would dutifully attempt to coin a poetic Novo Terali term for it, saving garbage into the shared SQLite dictionary.\n\nTo combat this without adding perceptible latency, I built a two-stage **Linguistic Quarantine Layer** (`src/lib/validator.ts`):\n\n`/([a-z])\\1{2,}/i`).`/[bcdfghjklmnpqrstvwxz]{4,}/i`, exempting valid sequences like `Set<string>`.` data/quarantine_log.json`.\n\n``` js\nexport function validateQuery(query: string): ValidationResult {\n  const tokens = query.trim().toLowerCase().split(/\\s+/);\n  for (const token of tokens) {\n    if (isImpossibleCluster(token) || isRepetitiveMash(token)) {\n      return { isValid: false, reason: \"Phonotactic violation detected\" };\n    }\n  }\n  return { isValid: true };\n}\n```\n\nTo give developers and administrators complete control, I added a dedicated **Quarantine Admin Panel** directly in the UI. Administrators authenticate using an `ADMIN_KEY` header, inspect suspicious inputs, approve verified terms into the canonical codex, or flush fraudulent entries with one click.\n\nA conlang only feels alive when you can hear it spoken.\n\n*Planet of Lana* features evocative, emotional voice acting. The developer notes highlighted that Italian voice actors captured the cadence best because of the open vowels and tapped consonants.\n\nTo reproduce this, I integrated the **ElevenLabs Text-to-Speech API**, selecting the **Gigi** voice model (a youthful, melodic tone) and meticulously calibrating its acoustic profile:\n\n``` js\nconst voiceSettings = {\n  voice_id: \"Qd7hDo3tdwmASCs5vLEB\", // Gigi\n  model_id: \"eleven_multilingual_v2\",\n  voice_settings: {\n    stability: 0.82,          // High stability keeps Italianate vowels consistent\n    similarity_boost: 0.85,   // Accurately locks to the vocal timbre\n    style: 0.0,               // Neutral expressive base prevents over-dramatization\n    speed: 0.85               // 15% reduction matches the calm, unhurried Novo pace\n  }\n};\n```\n\nWhen users click the speaker button next to any phrase, the server streams high-fidelity 44.1kHz audio in under 400ms. If ElevenLabs is not configured, the app gracefully falls back to the browser's native Web Speech API with an Italian phonetic voice profile.\n\nTo make NovoGen accessible worldwide, I packaged it as a multi-stage Docker container and deployed it to **Google Cloud Run**:\n\n`output: \"standalone\"`).`/tmp` upon startup, granting the SQLite engine full read-write capabilities during execution.`src/lib/rateLimit.ts`) enforcing 30 translations/min and 10 voice syntheses/min per IP to protect downstream APIs from quota abuse.\nHere is what the translation engine can do.\n\nTo the team at **Wishfully** (@planetoflana): You asked us for a shoutout in Novo Terali. \n\nInstead, I built an entire engine so the whole world can speak it:\n\n**\"Ite fatum tia, Wishfully. Tiai Novo Terali!\"**\n\n*(We believe in you, Wishfully. Long live Novo Terali!)*", "url": "https://wpnews.pro/news/i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator", "canonical_source": "https://dev.to/inushathathsara/i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator-voice-synthesizer-gdp", "published_at": "2026-09-09 14:26:05+00:00", "updated_at": "2026-09-09 14:41:33.637716+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "developer-tools"], "entities": ["NovoGen", "Planet of Lana", "Wishfully", "Novo Terali"], "alternates": {"html": "https://wpnews.pro/news/i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator", "markdown": "https://wpnews.pro/news/i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator.md", "text": "https://wpnews.pro/news/i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator.txt", "jsonld": "https://wpnews.pro/news/i-tackled-the-planet-of-lana-language-challenge-by-building-an-ai-translator.jsonld"}}