cd /news/artificial-intelligence/i-tackled-the-planet-of-lana-languag… Β· home β€Ί topics β€Ί artificial-intelligence β€Ί article
[ARTICLE Β· art-124648] src=dev.to β†— pub= topic=artificial-intelligence verified=true sentiment=↑ positive

I Tackled the Planet of Lana Language Challenge by Building an AI Translator & Voice Synthesizer

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.

by read6 min views2 publishedSep 9, 2026

I tackled the challenge in a different way, and created this project as my answer.

When 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:

"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.

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!"

Most 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.

I couldn't stop there.

The 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?

Instead of just posting a one-line tweet, I asked myself:

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?

That question led to NovoGen β€” an open-source, full-stack conlang translator, speech synthesizer, and dictionary manager for Planet of Lana.

Here 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.

In 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.

Before writing a single line of backend code, I extracted and analyzed every rule documented in the booklet:

                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                  β”‚          NOVO TERALI PHONOTACTICS            β”‚
                  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                  β”‚  Vowels:      a [ah], e [eh], i [ee],        β”‚
                  β”‚               o [oh], u [oo] (pure Italian)  β”‚
                  β”‚  Diphthongs:  ai, ia, ea, oa, ui (unclipped) β”‚
                  β”‚  Consonants:  t/d aspirated, rolled 'r',     β”‚
                  β”‚               'h' voiced, no silent letters  β”‚
                  β”‚  Stress:      Light stress on first syllable β”‚
                  β”‚  Rhythm:      Calm, melodic, even pacing     β”‚
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

-em: Plural/verbal inflection (-ari: Agent/actor noun suffix ( oti-: Honorific or co-prefix ( One 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.

                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚       Next.js App Router      β”‚
                     β”‚    Tailwind / Vanilla CSS     β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
                        POST /api/translate
                                     β”‚
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚   In-Memory Rate Limiter      β”‚
                     β”‚  (Sliding-Window, 30 req/min) β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚  Multi-Tier Translation Engine β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚                           β”‚                           β”‚
 1. Exact SQLite Match      2. Rule Agglutination       3. LLM Extrapolation
    (Canonical Lore DB)        (Suffixes & Modifiers)       (Gemini 3.1 / Ollama)
         β”‚                           β”‚                           β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚  Phonotactic Quarantine Guard β”‚
                     β”‚ (Anti-Gibberish Verification) β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚      ElevenLabs Voice API     β”‚
                     β”‚    (Gigi Voice Model Tuning)  β”‚
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Because the canonical dictionary has only ~80 terms, users translating sentences like "Look at the ancient machine in the forest" require new vocabulary.

If you give an LLM free rein, it will hallucinate English words with random accents or invent sounds that violate the fictional world's phonotactics.

To solve this, I designed a multi-tier fallback system:

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:

// System instruction excerpt enforced during translation
const CONLANG_PROMPT = `
You are the official linguistic translator for Novo Terali from Planet of Lana.
Follow these inviolable phonotactic constraints:
1. Every vowel is strictly: a [ah], e [eh], i [ee], o [oh], u [oo].
2. No consonant clusters exceeding 2 consonants; never use 'x', 'q', or 'z'.
3. Extrapolated roots MUST use open syllables (CV or CVC patterns like 'talo', 'suni', 'kora').
4. Compound from known roots where possible (e.g., 'machine' -> 'meka-fata').
5. Canonical vocabulary is SACRED: Never overwrite 'Tiai' (Hello), 'Cora' (Child/Leaf), etc.
Return strictly structured JSON containing translation, IPA phonetics, and grammar breakdown.
`;

When an extrapolated word is generated, it is tagged as extrapolated and cached in SQLite so that subsequent translations remain 100% consistent across sessions.

Once the app went online, a new vulnerability emerged: cache pollution via keyboard mashing.

If 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.

To combat this without adding perceptible latency, I built a two-stage Linguistic Quarantine Layer (src/lib/validator.ts):

/([a-z])\1{2,}/i)./[bcdfghjklmnpqrstvwxz]{4,}/i, exempting valid sequences like Set<string>. data/quarantine_log.json.

export function validateQuery(query: string): ValidationResult {
  const tokens = query.trim().toLowerCase().split(/\s+/);
  for (const token of tokens) {
    if (isImpossibleCluster(token) || isRepetitiveMash(token)) {
      return { isValid: false, reason: "Phonotactic violation detected" };
    }
  }
  return { isValid: true };
}

To 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.

A conlang only feels alive when you can hear it spoken.

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.

To 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:

const voiceSettings = {
  voice_id: "Qd7hDo3tdwmASCs5vLEB", // Gigi
  model_id: "eleven_multilingual_v2",
  voice_settings: {
    stability: 0.82,          // High stability keeps Italianate vowels consistent
    similarity_boost: 0.85,   // Accurately locks to the vocal timbre
    style: 0.0,               // Neutral expressive base prevents over-dramatization
    speed: 0.85               // 15% reduction matches the calm, unhurried Novo pace
  }
};

When 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.

To make NovoGen accessible worldwide, I packaged it as a multi-stage Docker container and deployed it to Google Cloud Run:

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. Here is what the translation engine can do.

To the team at Wishfully (@planetoflana): You asked us for a shoutout in Novo Terali.

Instead, I built an entire engine so the whole world can speak it:

"Ite fatum tia, Wishfully. Tiai Novo Terali!"

(We believe in you, Wishfully. Long live Novo Terali!)

── more in #artificial-intelligence 4 stories Β· sorted by recency
── more on @novogen 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/i-tackled-the-planet…] indexed:0 read:6min 2026-09-09 Β· β€”