Panagiotis (Panos) Gkilis

AI & Backend Engineer • Applied AI • Automation • Speech Systems • Backend Products

I build production AI, speech, and backend systems end to end.

AI engineer and solo builder of BedVibe Studio and related products, spanning multilingual TTS datasets, model workflows, inference APIs, audiobook tools, avatars, backend services, subscriptions, authentication, and production deployment. Creator of ttsproof and trainproof — open-source Python libraries for automated TTS evaluation and ML training-run reliability — and author of four research reports with DOIs.

Python FastAPI Node.js PostgreSQL / SQL JavaScript TypeScript React HTML / CSS Custom game engine (no framework) Web Audio API Supabase Rust ONNX Linux / Nginx Stripe Security Telemetry Speech AI Datasets / Metadata Model Integration Model Training n8n LangChain LangGraph LLM Orchestration Multimodal LLM Gemini API RAG / Retrieval Workflow Automation Docker

Selected Projects

Each project card shows a live product or documented system, the technical scope behind it, and the business or product function it serves. The goal is clarity: what was built, which technologies were used, and how the work can be checked when a public verification link is available.

From-Scratch Speech Model & Training-Data Engine

Built the lower-level ML and training infrastructure behind the speech system: a 730M-parameter AR + NAR neural-codec speech model trained from scratch on consumer GPUs, covering 13 languages, 17 speakers, and 6 emotional states with metadata conditioning. To make a 108,000-sample corpus trainable on limited hardware, I designed a custom memory-mapped binary dataset format for zero-copy loading and a Rust metadata pipeline for fast, validated data preparation — backed by an automated verification suite with ablation probes to catch silent training failures before they reach production.

Key results
  • 730M-parameter AR + NAR neural-codec model trained from scratch on consumer GPUs
  • 108,000-sample multilingual corpus — 13 languages, 17 speakers, 6 emotional states
  • Published engineering report with a citable DOI (Zenodo)
What I built
730M AR + NAR model Trained from scratch ML training infrastructure Custom binary dataset format Memory-mapped data loader Rust metadata pipeline Verification & ablation suite
Stack
Python PyTorch Rust EnCodec / DAC codec SentencePiece ECAPA-TDNN embeddings

Grounded RAG Portfolio Agent — a Chatbot That Validates Itself

The chat button on this page is a live, grounded assistant that answers questions about my papers and projects from an indexed, provenance-tracked corpus only — every answer cites its sources, and a Retrieval X-ray exposes the raw retrieved chunks with their real relevance scores. It ships behind a 48-case adversarial eval gate (answerability, refusal, prompt injection, credential traps), and a self-maintaining pipeline re-validates and redeploys it only when it still passes.

Key results
  • 48/48 on the adversarial eval suite; retrieval hit@6 27/27 (hybrid retrieval: static embeddings + BM25)
  • Self-maintaining — an eval-gated pipeline detects drift, re-tests, and redeploys only on a green suite; a red eval blocks the deploy
  • The eval suite caught a real prompt-injection breach and a factual error in a published paper — both fixed pre-launch (paper republished as Zenodo v2)
What I built
Grounded RAG pipeline Hybrid retrieval (embeddings + BM25) Adversarial eval harness Self-maintaining sync (eval-gated) Injection hardening Retrieval X-ray UI Provenance-tracked corpus
Stack
Python FastAPI Static embeddings (model2vec) BM25 Gemini API Vanilla JS nginx + systemd

GEO Observatory — Live AI-Crawler Observability Platform

A deployed observability platform that records how AI crawlers and search engines discover my sites. A daily collector pulls crawler events from Cloudflare’s GraphQL Analytics API into an append-only SQLite event ledger (raw payloads preserved, deterministic dedup hashing, hourly buckets), and a public dashboard exposes live per-crawler timelines — ClaudeBot, GPTBot, PerplexityBot, Googlebot — under a strict honesty policy: sampled aggregates labeled as such, temporal association only, no fabricated causation or confidence scores.

Key results
  • Live in production — public dashboard with real data, collected automatically every day (systemd timer, hardened non-root service)
  • Probe-gated integration — the Cloudflare GraphQL provider was built only after a verification probe confirmed the exact datasets and fields available on the plan
  • Day-one catch — logged a spoofed “Googlebot” (a Google-Cloud scanner hunting for leaked .env files) within hours of the subdomain’s TLS certificate appearing in transparency logs
What I built
Provider architecture Append-only event ledger Cloudflare GraphQL ingestion Bot classification (AI / search / SEO) Public dashboard + llms.txt Daily automated collection
Stack
Python Flask SQLite Cloudflare GraphQL API nginx + systemd Hetzner
BedVibe TTS platform screenshot

BedVibe TTS Platform

Built and deployed the user-facing BedVibe TTS product layer: authenticated accounts, token accounting, Stripe checkout and subscriptions, proprietary multi-voice speech generation endpoints, voice/language/emotion selection, custom voice support, token-aware generation, and production backend services for real user traffic. The product exposes creative speech controls such as Flow/Chaos generation parameters, voice warmth, equalizer and reverb, HD enhancement/denoise, an inline library of ~60 per-speaker expressive vocal effects (laughs — sarcastic, sinister, hysterical, escalating — gasps, breaths, coughs, throat-clears, wheezes, hiccups and shivers, and more) inserted by right-click, background ambience mixing, optional viseme timing output, and long-form audiobook/project workflows. Voices are proprietary models trained on curated datasets, and on a target-language change the product offers automatic text translation (for example English → Japanese) or keeps the original text to be spoken in the chosen language's accent. This card represents the deployed application and business system around the speech models — not the from-scratch model-training work itself.

Key results
  • 13 languages with per-language accent synthesis and optional automatic translation
  • ~60 inline expressive vocal effects per speaker, inserted directly into text
  • In production: Stripe checkout + subscriptions with token-aware generation
Generation, Audio & Multilingual Controls

The interface exposes direct generation and audio controls rather than a single opaque “generate” button. Flow controls speaking pace, allowing users to move delivery faster or slower. Chaos controls sampling temperature, allowing more stable or more varied output. Brightness is an EQ-driven tone control: lowering it emphasizes lower-frequency body, while increasing it reduces low-frequency weight and increases high-frequency presence; this can also help tame sharp sibilance. Space controls reverberation amount for a drier or more spacious voice presentation.

HD mode combines spectral and psychoacoustic enhancement with DeepFilterNet cleanup to improve perceived clarity and reduce unwanted noise. A separate diffusion enhancement path exists for further output-quality improvement, but it is disabled in the current interactive path because its latency is not suitable for live generation.

Each available voice can be auditioned through sample playback by selecting the performer portrait. The product supports 13 languages and, when a user changes the target language, asks whether to translate the text into that language or keep the original text and synthesize it with the selected language accent. Translation uses a local Argos Translate path, with a Google-based translation option available for paid subscription workflows where higher-quality translation is requested. Custom voice cloning is not enabled as open self-service; it is handled only for rights-cleared, permissioned requests.

What I built
Deployed TTS SaaS layer Proprietary generation API Voice / language / emotion selection Custom voice support Flow / Chaos controls Warmth / EQ / reverb HD denoise / enhancement 60+ inline vocal effects Background ambience mixing Viseme timing output Auth / token wallet system Stripe checkout + subscriptions Production backend APIs Auto text translation Curated-dataset voices Author intake + rights attestation
Stack
Python FastAPI Supabase PostgreSQL / SQL Stripe FFmpeg DeepFilter / df.exe NumPy / SoundFile JavaScript Linux / Nginx

Production Backend Infrastructure — Auth, Billing & Device Licensing

Architected and operate the full backend behind BedVibe's products: a fleet of independent services handling user authentication and registration, Stripe billing and webhook processing, device-bound (MAC-ID) software licensing, subscription and entitlement management, a TTS inference job queue, and security telemetry integrations. Runs on a self-managed Linux server behind nginx, with each service isolated as its own systemd unit and PostgreSQL as the shared data layer — provisioned and maintained at the operating-system level.

Key results
  • 10 independent services, each isolated as its own systemd unit behind nginx
  • Self-managed Linux server: PostgreSQL data layer, TLS, OS-level provisioning
  • Replay-safe Stripe webhooks and MAC-ID device licensing running in production
What I built
Authentication & registration Stripe billing + webhooks MAC-ID device licensing Subscription management PostgreSQL data layer TTS inference job queue Security telemetry integration Self-managed Linux ops Compliance-aware intake workflow
Stack
Rust (Axum / Actix-web) PostgreSQL 16 nginx systemd ufw Certbot / TLS Stripe Linux (self-managed VPS)

BookProof — AI Book Summary Auditor

Built a reproducible workflow for auditing AI-generated book summaries and answers against long manuscripts. BookProof checks evidence grounding, missing details, unsupported claims, answer-term coverage, and evidence-term coverage. The underlying LongBook Verifier research package is published on Zenodo and includes retrieval baselines, model-output scoring, plots, reports, and a 240,767-word long-form stress-test benchmark, while excluding private manuscript text from the public release. A follow-up ablation study (Experiment C) diagnoses why hierarchical book RAG underperformed chapter-summary retrieval on this corpus — isolating first-stage chapter selection and neighbor-expansion dilution as the two failure modes — and is published as a separate Zenodo record.

Key results
  • 240,767-word long-form stress-test benchmark
  • Two published Zenodo records — research package + Experiment C retrieval ablation
  • Evidence-grounding and retrieval-baseline scoring, fully reproducible
What I built
Long-book benchmark Evidence-grounding evaluator Retrieval baselines Model-output scoring Research package Zenodo DOI release Hierarchical ablation (Exp. C)
Stack
Python JSONL CSV metrics Matplotlib Retrieval evaluation Long-document QA
How I build a RAG system, end to end

Built the workflow as a complete RAG/evaluation pipeline: ingestion, structure-aware chunking, retrieval baselines, citation-grounded generation checks, gold-question scoring, and controlled ablations across retrieval strategies.

Automated Failure-Mode QA Framework for Neural TTS — Published Technical Report

A backend-only, fully automated quality-assurance framework for a reference-based neural text-to-speech system. For each edge-case input it normalizes the text, runs ASR-independent structural audio checks (empty / short / long audio, long silence, clipping, loop/repeat, end-of-clip artifact), scores pronunciation with equivalence-aware WER/CER, and — where ASR is itself unreliable — isolates the case for review instead of guessing. Evaluated on 130 edge cases across 3 neutral voices (390 samples): zero structural audio-integrity defects. A one-time blinded human validation of the 42 ASR-uncertain cases (with 15 ASR-passed controls; controls 15/15) showed the quarantined zone is a genuine 45/55 mix — 19 real TTS mispronunciations and 23 ASR false-negatives — confirming quarantine-for-review is the correct design, and localizing the synthesizer's weak spot to short letters/acronyms. Published as a citable technical report with an explicit claims-and-limitations statement.

Key results
  • 390 samples (130 edge cases × 3 voices) — zero structural audio-integrity defects
  • Blinded human validation — 15/15 controls correct; quarantine design confirmed
  • Published as a citable technical report (Zenodo DOI, CC-BY-4.0)
What I built
Automated TTS QA harness Edge-case text normalization ASR-independent audio checks Silence / clipping / loop / tail-artifact detection Equivalence-aware WER / CER ASR-uncertainty quarantine Blinded human validation (controls 15/15) Failure-mode taxonomy CI threshold gate Reproducibility scripts Zenodo DOI release (CC-BY-4.0)
Stack
Python faster-whisper (ASR) numpy / soundfile Reference-based neural TTS

ttsproof — Open-Source TTS QA & Benchmark Library (PyPI)

Published the QA-framework method above as an installable open-source library: pip install ttsproof. It stress-tests any TTS engine through a one-command benchmark — structural audio checks that need no model (loops, silences, clipping, duration explosions), equivalence-aware WER/CER on canonical spoken form, and an ASR-uncertainty quarantine — then renders a self-contained HTML report with per-category score bars, waveforms, and audio players for every failure. Engines plug in via a command template or a Python callable; a regress command gates CI on category-level quality drops.

Key results
  • Live on PyPIpip install ttsproof (MIT, sole author)
  • Benchmark Corpus 1.0 — 817 curated edge cases across 39 categories, versioned independently of the tool so published scores stay comparable
  • Closed-source engines supported — documented SpeechSDK integration benchmarks commercial models (OpenAI, ElevenLabs, 17+ providers); shipped within a day of the request from the SpeechSDK team at Jellypod
  • CI regression gate + self-contained HTML failure reports; method backed by a published technical report (DOI)
What I built
Built-in benchmark corpus (817 cases) Policy-based scoring (strict / keywords / structural) Structural audio checks Equivalence-aware WER / CER ASR-uncertainty quarantine HTML reports (waveforms + audio) Engine compare + CI regression gate PyPI packaging + CLI
Stack
Python numpy / soundfile faster-whisper (optional) pytest setuptools / twine

trainproof — Deterministic Reliability Layer for ML Training (PyPI)

pip install trainproof. A linter for ML training runs that catches broken fine-tunes across the whole lifecycle — before training (dataset + tokenizer pre-flight), during (a live HuggingFace callback with step-time telemetry that can abort a doomed run), after (divergence / dead-run / overfitting / NaN / gradient-spike detection from log files), and against a baseline (N-way ratio rules that catch failures a single loss curve can't see). The flagship trainproof doctor . auto-discovers every training log in a directory and prints a triage-sorted autopsy. Every rule is a deterministic threshold with a stable ID (TP-DIVERGE, …) and cited evidence — no inferred causes, no invented confidence scores. Sibling of ttsproof (which it reuses for speech-dataset checks).

Key results
  • Live on PyPIpip install trainproof (MIT, sole author); fifteen published releases behind a 228-test suite, exposing 84 stable rule IDs, with its rules validated against real training runs from three frameworks (HuggingFace, Coqui XTTS, PyTorch Lightning) rather than synthetic fixtures alone. It judges a run before it starts as well as after: an environment preflight imports the training stack in a subprocess and inspects checkpoints as ZIP archives without ever unpickling them, because torch.load executes arbitrary code by design. CONTRACTS.md pins exit codes, JSON schema policy, rule-ID stability and a verdict-stability guarantee, so downstream CI can depend on this tool without reading its source.
  • A PASS that states what it did not check (v0.12) — an audit found a run whose loss was exactly zero on every step passed silently, because every loss-shape check was guarded against dividing by zero and skipped, while the report went on to name those same three checks as having run. A PASS now lists each check that executed and each that did not, with its reason, exposed as structured data. A skipped check is not a passed check.
  • SARIF 2.1.0 output--sarif on every judging command turns findings into GitHub PR annotations, so a doomed fine-tune is flagged inline on the diff that caused it. Exit 2 now means “trainproof could not judge” and is never conflated with 1, a real FAIL verdict about your run — CI can tell a broken run from an unreadable log.
  • Live-abort proof — the guardian stopped a real diverging QLoRA fine-tune at step 20 of 300, so 93% of the scheduled GPU steps never ran
  • Overfitting detection (TP-OVERFIT) — flags a run whose eval-loss climbs past 1.2× its minimum while train-loss keeps falling, naming the run whose best checkpoint has already gone by
  • Regression-locked by construction — every gallery verdict and its complete rule-ID set is frozen in tests/golden/; a rule that stops firing and one that starts firing spuriously both fail the build. All 38 snapshots are byte-identical across v0.11 and v0.12, so “no existing verdict changed” is a checkable claim rather than a promise.
  • Fault-injection study shipped as evidence — six controlled QLoRA configurations (Qwen2.5-3B, RTX 5080) at three seeds each: all 18 real logs are committed, not just a representative one, and every verdict is locked in tests/golden/. A nineteenth log ships alongside them — a 9.8-hour Coqui XTTS fine-tune that diverged on its own, the first shipped failure nobody injected
  • Documented honest limitation — proved loss curves can't detect corrupted data (a shuffled-labels run cut its loss 62%); the compare command exists to close exactly that gap
What I built
Zero-config doctor (directory autopsy) Pre-flight dataset + tokenizer linter Live guardian (HF TrainerCallback, opt-in auto-abort, step-time telemetry) Log-based run verdicts (HF / Coqui / JSONL / CSV) Reference comparison engine Overfitting detection (TP-OVERFIT) Deterministic rules + 57 stable finding IDs SARIF 2.1.0 (GitHub PR annotations) Published contract (CONTRACTS.md) Golden-locked regression suite CI exit codes + HTML reports Multi-seed evidence matrix PyPI packaging + CLI
Stack
Python numpy transformers (optional) pytest setuptools / twine
n8n workflow: a Schedule Trigger feeding an HTTP Request node that drives the AI content pipeline

AI Content Automation Pipeline — n8n · LangChain · LangGraph

Built an end-to-end content-automation system on the same open-source AI stack used in production teams. A self-hosted n8n workflow fires on a daily schedule and calls a decoupled FastAPI service over HTTP (via host.docker.internal, bridging Docker to the host). That service runs a LangGraph state machine: pick an unused image → caption it with a multimodal LLM (Gemini, structured output enforced by a Pydantic schema) → a validate → retry loop that regenerates any caption failing length, keyword, or tag rules. Per-folder context files keep names and lore accurate (no hallucination), and per-folder link overrides deep-link each item to the right page. Output: validated, SEO-optimised, ready-to-publish content packages — fully decoupled and orchestrated.

Key results
  • Runs unattended on a daily schedule, fully decoupled over HTTP (Docker-to-host bridge)
  • Schema-enforced structured output (Pydantic) with a validate → retry loop
  • Public repository on GitHub
What I built
n8n scheduled orchestration Self-hosted in Docker Decoupled FastAPI service host.docker.internal bridge LangGraph state machine Validate → retry loop LangChain structured output Multimodal image captioning Pydantic schema enforcement Hallucination guardrails Per-folder deep-linking Rotating de-duplicated picker
Stack
n8n LangChain LangGraph FastAPI Gemini (multimodal) Docker Python Pydantic REST / HTTP
Bed Vibe AI Companion running in the interactive room environment

Bed Vibe AI Companion — Hybrid Local AI Desktop Runtime

Built and shipped a hybrid AI-companion app in Unity HDRP: a downloadable, installable desktop product run locally on the user's machine behind paid subscription access. Unity launches and supervises a fleet of local subprocesses — a Rust voice-activity gateway, a Whisper ASR server, a Rust local server, and a llama.cpp wrapper serving a custom GGUF model — with hardware-aware LLaMA build selection, CPU/GPU Whisper selection, TCP port health checks, and clean shutdown handling. At startup, the runtime profiles CPU capability, GPU availability, RAM, VRAM, model size, quantization, and context-window fit so it can select a reliable local Whisper and LLaMA/GGUF configuration for the machine. Authentication, MAC-address device licensing, and Stripe-webhook subscriptions run on backend services I operate. Speech-provider credentials remain server-side: the Unity client sends only the bounded synthesis request, while the backend performs the authenticated provider call and returns generated audio plus lip-sync timing data. The real-time conversation loop is microphone → Rust VAD → Whisper → local LLaMA/GGUF → AWS Polly TTS → FFmpeg conversion → OVRLipSync lip-synced avatar playback, bridged over local HTTP/TCP IPC with mute/unmute coordination so the character does not transcribe its own generated voice. Each LLM request is assembled from the character backstory, personality rules, selected model settings, the user profile, relevant prior conversation history, and the newly transcribed utterance. The character is autonomous and conversation-aware through a hand-built locomotion/idle state machine, spoken-cue behavior, talking-gated eye contact, Animation-Rigging head look-at, and a cinematic physical-camera rig. Users configure the AI's name, backstory, personality, temperature, and token limit per profile, inside a production shell with SHA-256/HTTPS login, file-integrity anti-tamper checks, server-synced gold economy, in-app store, and chat-history export.

Behavior, World & Product Layer

Beyond the speech pipeline, I built the companion as a persistent interactive character inside a real-time environment. A behavior state machine controls first-contact greeting, engagement, idle activity, movement, sitting, sleeping, spoken-cue reactions, and talking-gated attention. On first greeting or when the user calls her, the character turns toward the user, establishes eye contact, performs a wave animation, and presents a positive engagement response before entering the normal conversation loop. When the user is inactive, the character can transition through autonomous behaviors rather than remaining frozen: after idle time she may move through the room, sit on the couch, and later sleep according to the environment state.

The environment includes time-based presentation such as changing daylight outside the room, while the avatar uses camera-aware eye contact, animation-rigging head tracking, locomotion, idle animations, and cinematic camera behavior to create a continuous social presence. The product layer also includes a server-synced in-app gold economy, shop and unlock flow, room and furniture customization, character/personality configuration, selectable voice and language options, and user-facing personalization such as placing a user photo inside the virtual space. The goal was not only to make an LLM answer, but to combine AI conversation, avatar behavior, environment state, customization, and product systems into one interactive desktop experience.

What I built
Hybrid local-AI desktop product Shipped subscription app Unity HDRP runtime Unity-orchestrated subprocesses Hardware-aware LLaMA build selection CPU/GPU Whisper server selection Rust voice-activity gateway Mic → Whisper → LLaMA → TTS loop HTTP/TCP IPC bridge Mute/unmute feedback control TCP port health checks Clean subprocess shutdown OVRLipSync lip sync FFmpeg audio conversion Autonomous behavior state machine Talking-gated eye contact Cinematic camera rig AI personality/backstory config Stripe-webhook billing MAC-ID device licensing File-integrity anti-tamper Gold economy + store Chat-history export
Stack
Unity HDRP C# Rust llama.cpp / GGUF Whisper ASR AWS Polly FFmpeg OVRLipSync Animation Rigging Stripe HTTP/TCP IPC SHA-256

BedVibe Security Telemetry Lab

Built a defensive security telemetry lab around BedVibe’s production infrastructure: an isolated HTTP honeypot on a self-managed Linux VPS, event capture into JSONL and SQLite, hourly/daily human-readable reports, honeytoken tracking, scanner fingerprinting, and safe pull-only local report mirroring so the home machine remains unexposed.

What I built
Isolated HTTP honeypot JSONL event logging SQLite collector database Hourly security reports Honeytoken tracking Scanner fingerprinting Safe pull-only report mirroring Linux service monitoring
Stack
Linux VPS Rust Axum / Tokio SQLite systemd timers JSONL SSH read-only inspection Defensive security telemetry

BookProof — Production API & MCP Server

Shipped the deterministic LongBook retrieval-evaluation engine for real use, two ways. (1) A deployed HTTP API on a self-managed Linux server — Cloudflare → nginx → FastAPI/uvicorn, Let's Encrypt TLS, systemd service — exposing a token-gated developer API (/api/bookproof/v1/verify) and a free public demo (/api/bookproof/public/verify) with per-IP daily rate limiting keyed on the real Cloudflare visitor IP, strict text/claim caps, a one-run concurrency lock, and ephemeral processing (uploaded text and results deleted immediately after each run). Deterministic local retrieval only — no external model calls. (2) An MCP server (Model Context Protocol) over stdio that exposes the same engine as allowlisted tools with sandboxed read/write paths, including a diagnosed transport bug where the child process inherited the MCP stdio channel, fixed with stdin isolation.

What I built
Deployed FastAPI backend Cloudflare → nginx → uvicorn Let's Encrypt TLS systemd service Token-gated developer API Free public demo endpoint Per-IP daily rate limiting (real Cloudflare IP) Strict text / claim caps One-run concurrency lock Ephemeral processing (inputs deleted) Deterministic retrieval, no model calls MCP server (Model Context Protocol) MCP stdio transport Allowlisted MCP tools Sandboxed read/write paths Subprocess-under-stdio debugging fix
Stack
Python FastAPI uvicorn MCP (Model Context Protocol) nginx systemd Cloudflare Let's Encrypt Linux
Audio Drama Studio — browser multitrack timeline with voice channels, SFX and music lanes

Audio Drama Studio — Browser Multitrack Production Editor

Built a full multitrack production editor that runs entirely in the browser: a script parser auto-casts dialogue lines onto 8 voice channels plus SFX and music lanes; clips drag between channels to recast; per-clip volume, pan, and reverb run through a Web Audio API node graph with canvas-rendered waveforms; final mixdown renders offline via OfflineAudioContext through a hand-written PCM WAV encoder with peak normalization; projects save and reload as JSON with full audio rehydration. A working demo project loads automatically — no account needed.

What I built
Script parser auto-casting Drag-to-recast timeline Web Audio node graph Offline mixdown rendering Custom PCM WAV encoder Canvas waveforms
Stack
Web Audio API OfflineAudioContext Canvas 2D TTS REST API Token billing

All voices are contracted, rights-cleared voice performers, generated through BedVibe's proprietary TTS pipeline — no scraped or third-party audio.

BedVibe Story Parser interface converting tagged story text into structured narrator and speaker blocks

BedVibe Story Parser — Tagged Text → Audiobook & Audio Drama Projects

Built a deterministic browser-based text-to-project parser that converts pasted novels, scripts, dialogue, or TXT files into structured production JSON. It detects named speakers, narrator passages, optional emotion tags, and tag-only speaker declarations; untagged text is assigned to NARRATOR. The parser supports formats such as [Name] text, [Name|angry] text, (Name|happy) text, Name: text, Name|angry: text, S1: text, and Speaker 1: text.

The output is a structured JSON project containing a title, speaker list, and ordered blocks with block ID, speaker, emotion, and text. Users can download the project JSON or hand it directly to either Audiobook Studio Editor or Audio Drama Studio through an in-browser project-transfer flow. This creates one shared ingestion layer for converting raw writing into long-form narration or multitrack dramatized production.

What I built
Tagged-text parser Narrator fallback Speaker detection Emotion-tag preservation Tag-only speaker state Structured JSON project output JSON download Audiobook Studio handoff Audio Drama Studio handoff Long-form production ingestion
Stack
JavaScript Regex parsing JSON sessionStorage transfer Browser download API HTML / CSS
Audiobook Studio Editor screenshot

Audiobook Studio Editor

Built a multi-block editor for long-form speech generation with voice selection, emotion controls, project save and load, UI logic, cost estimation, and API-connected generation workflows for spoken content production.

Block-Level Generation & Project Control

The editor turns a parsed or manually written audiobook into an editable sequence of generation blocks. Each block can receive its own voice, language, emotion, text, and production settings. Users can include or exclude individual blocks before generation, generate only the selected material, regenerate a specific block after editing, and review estimated token cost before committing a larger project run.

The production workflow supports project save and load, imported Story Parser projects, speaker-to-voice mapping, inline expressive effects embedded in text, and post-generation controls for warmth and space. Global production settings and per-block choices allow the same project to move from clean narration to more stylized audiobook delivery without rebuilding the structure from scratch.

What I built
Frontend editor logic Project workflows Voice / emotion controls Token-aware generation API integration Story Parser project import Per-block voice / language / emotion Include / skip generation control Generate selected blocks Per-block regeneration Pre-generation cost estimation Speaker-to-voice mapping Inline expressive effects Global production controls Warmth / space post-effects Project save / load
Stack
JavaScript HTML / CSS Python APIs Supabase auth Browser data flow
The Mirelands battle screen The Mirelands character selection screen The Mirelands inventory and profile screen The Mirelands tower ballista upgrade screen

The Mirelands — Fantasy Card Game / Interactive Web Game

Built a custom browser game engine in JavaScript from scratch — no framework, no external game library — with deterministic turn logic, combat resolution, AI opponent behavior, persistent state, deck validation, tower/projectile systems, and backend sync. Includes row-level security on the PostgreSQL backend, cloud-save sync, and replay-safe Stripe purchase handling through an idempotent webhook flow.

What I built
Hero selection flow Profile / inventory UI Deckbuilding systems Battlefield combat logic Tower / projectile systems Persistent progression
Stack
Custom JavaScript game engine HTML / CSS AI opponents Supabase PostgreSQL (RLS) Stripe webhooks Offline-first sync
Fantasy talking avatars screenshot

Fantasy Talking Avatars

Built a fantasy multi-character avatar stage where transparent PNG characters can speak alone or together using BedVibe TTS with aligned lip sync. Supports one to four visible avatars on the same screen, dialogue sequencing, debate-style scenes, and creator-focused workflows for comics, animated storytelling, fantasy scenes, and game-style character presentation.

What I built
Multi-avatar scene system 1–4 character layouts TTS-aligned lip sync Fantasy character pipeline Dialogue / debate scenes Transparent PNG avatar workflow
Use cases
Talking comics Fantasy animations Story scenes Game dialogue mockups Character debates Creator content
Norwegian puzzle and exercise book factory

Book-Publishing Automation Factories

Built two content-generation factories that turn structured data into print-ready books: a published puzzle-book series (crosswords, word-hunts, matching) on Amazon KDP, and a Norwegian exam-prep exercise engine (trinn 1–3: verb conjugation, noun declension, adjective agreement, possessives and word order). Each generates exercises from CSV data pools, rendered through HTML/CSS into 6×9 KDP-print PDFs — with correctness machine-verified by construction (every crossword reconstructs, every hidden word is findable, every answer key is right) and automated KDP preflight for page count, bleed and margins.

What I built
Deterministic content generators Machine-verified correctness CSV data pools → generators HTML / CSS → 6×9 print PDF Automated answer keys KDP preflight (bleed / margins / page count) Norwegian grammar-rule engines Multi-agent workflow + QA gates
Stack
Python CSV data pipelines HTML / CSS Headless Chrome → PDF pypdf preflight Amazon KDP publishing
Datasets page screenshot

Speech Datasets & Curation

Designed and curated multilingual speech datasets with structured metadata, controlled emotion labels, speaker coverage, studio-grade recordings, and training-oriented organization for TTS and speech model workflows.

What I built
Dataset design Metadata schema Tokenization workflow Speaker embeddings Training preparation
Scope
100+ hours curated recordings Multilingual speech Emotion labels Trait recordings Studio-quality capture
Speech Dataset Toolkit and Recorder screenshot

Speech Dataset Recorder & Audio Toolkit

Built a Unity-based speech dataset recorder for profile-driven collection workflows, with language and emotion session setup, guided text recording, countdown flow, and organized output for large-scale dataset creation. In parallel, built an 11-tool batch-processing and QA toolkit to complement RX11 for mass curation workflows, including trimming, duration scanning, RMS and peak checks, onset / pre-post checks, clipping detection, noise screening, and dataset-wide analysis.

What I built
Unity dataset recorder 11-tool bundle Rust utilities Batch dataset QA Mass curation workflow
Toolkit coverage
Language / emotion sessions Recorder UI workflow Batch audio QA / cleanup tools Folder-level analysis Large dataset processing

The Mirelands Audiobooks & Lore Pipeline

Built a connected dark fantasy audiobook line that introduces the core world, characters, creatures, and lore behind The Mirelands. The audiobooks function as both standalone content and a worldbuilding pipeline tied directly to the game’s cards, factions, character identity, voice continuity, and long-form story systems.

What I built
Fantasy worldbuilding Character continuity Lore-to-game pipeline Long-form audio production Voice identity system Narrative content design
Connected game elements
Legendary characters Creature factions Card inspiration Story-driven game world The Mirelands setting

BedVibe Author Intake & Rights Authorization Workflow

Built a serverless production-intake workflow for managed audiobook and digital voice projects. The system collects author metadata, book details, narration requirements, voice preferences, manuscript/material links, rights declarations, content-policy attestations, privacy consent, and electronic signature before production begins. It validates required fields server-side, rejects incomplete submissions before email processing, stores the submission record, generates a signed authorization PDF, and routes one internal BedVibe notification with the PDF attached and the submitted author email set as Reply-To. The workflow also includes SEO metadata, sitemap integration, and a noindex confirmation page.

What I built
Public author intake page Rights/content attestation Content-policy gating Electronic signature capture Server-side validation Signed PDF generation Internal notification routing Reply-To author routing Netlify Forms storage Netlify Functions workflow Email deliverability hardening SEO metadata Sitemap integration Noindex confirmation page
Stack
HTML / CSS JavaScript Netlify Forms Netlify Functions Serverless workflow PDF generation Email routing Server-side validation JSON-LD Sitemap management

Real-Time Voice-Activity Detection — custom-built

Built a custom Rust voice-activity gateway for a real-time Unity avatar pipeline. The tool selects a named microphone device, captures live audio through cpal, detects speech using dB thresholding, finalizes an utterance after 1.2 seconds of silence, writes the captured segment as a temporary WAV, sends it as multipart audio to a local Whisper transcription server, forwards the transcription back to Unity over localhost TCP, and deletes the temporary file after processing. Unity can also control the gateway with local start/mute commands.

What I built
Named microphone selection Real-time audio capture dB-threshold speech detection Silence-based utterance finalization Temporary WAV segmentation Multipart Whisper upload Unity TCP transcription bridge Start / mute control port Temp-file cleanup
Stack
Rust cpal hound WAV writer reqwest multipart Whisper ASR TCP localhost bridge Unity integration
Reception AI screenshot

Reception AI / Lead Intake System

Built a hosted reception and lead-capture flow with live deployment, form handling, email routing, persistence, and business-facing web intake connected to backend services.

What I built
Hosted web flow Form / webhook handling Email routing Data persistence Server deployment
Stack
Python Linux server Nginx SMTP / email flow Static + API deployment
Business talking avatar screenshot

Business Talking Avatars

Built a business-facing talking avatar system for reception, presentations, ads, e-learning, and instruction flows. Users can generate speech with BedVibe TTS or upload their own audio, then drive branded character lip sync with natural breathing, blinking, positioning, mirroring, and on-character company logo placement.

What I built
Talking avatar workflow TTS-driven lip sync Own-audio lip sync Logo placement on avatar Screen positioning / mirroring Business presentation use cases
Use cases
Receptionists Secretaries E-learning Instruction videos Ad creatives Branded spokesperson avatars
Norwegian grammar book English edition cover Norwegian grammar book Polish edition cover Norwegian grammar book Ukrainian edition cover

Norwegian Grammar Books — Multi-language Editions

Developed Norwegian grammar material from 14 years of teaching experience and published full-length editions for English, Polish, and Ukrainian readers. The books span the complete CEFR range — A1 beginner through C2 proficiency — from basic structures all the way to advanced and specialised grammar, not just introductory material. They combine structured explanations, exercises, and practical grammar presentation for foreign learners of Norwegian.

What I built
Norwegian grammar Language teaching Multilingual editions Educational content Structured explanations Published books
Languages
English edition Polish edition Ukrainian edition Norwegian grammar CEFR A1–C2 (full proficiency)
Polly Rust Server repository screenshot

Polly Rust Server

Built a Rust-based HTTP server for Amazon Polly TTS generation with async request handling, AWS SDK integration, configurable voice selection, and deployable API structure for speech-serving workflows.

What I built
Rust backend service Amazon Polly integration Async request handling HTTP API endpoints Configurable voice flow
Stack
Rust Axum Tokio AWS SDK dotenv HTTP / JSON

Technical Scope

These are the technical areas demonstrated across the projects above. The portfolio is organized by shipped systems, not by isolated code snippets, because the strongest proof is working product ownership.

Backend & APIs

Built backend services with Python and FastAPI for TTS generation, authenticated account flows, token accounting, checkout and subscription handling, webhooks, admin logic, email routing, and production debugging. Worked across Supabase and PostgreSQL persistence, JWT/auth flows, payment-linked state changes, and API-connected product systems. Also built a Node.js serverless function (Netlify Functions, CommonJS) for the author-intake workflow — server-side validation, signed-PDF generation with pdf-lib, and transactional email routing via Brevo on form submission.

Speech & ML Systems

Worked across dataset curation, metadata schema design, tokenization, speaker conditioning, emotion labeling, evaluation splits, training workflows, vocoder paths, inference integration, and deployment of multilingual speech systems. Experience spans proprietary neural speech production systems, custom voice-conditioning research, multilingual neural-codec and audio-token pipelines, speaker-embedding conditioning, and custom encoder-decoder architectures.

Product & Infrastructure

Built interactive browser products with hand-written JavaScript and HTML/CSS — including a framework-free game engine, Web Audio production tooling, and canvas-rendered interfaces — with Supabase-backed persistence, PostgreSQL data models, Linux hosting, Nginx reverse proxy, and production deployment. Comfortable owning the full path from UI and game/application logic to backend services and public release.

AI Systems & LLM Orchestration

Built LLM-powered systems beyond single prompts: retrieval-augmented generation (RAG) with hierarchical retrieval and claim grounding, multimodal image-to-structured-output captioning, and schema-enforced structured output (Pydantic). Orchestrated multi-step AI pipelines with LangChain, LangGraph (stateful validate/retry graphs), and self-hosted n8n on Docker — wiring Gemini and local LLMs (llama.cpp / GGUF) behind decoupled HTTP services.

QA & Evaluation

Systematic evaluation of ML and retrieval systems — precision, recall, F1, and accuracy alongside task-specific metrics, evaluation splits, baselines, and ablations. Built an automated failure-mode QA framework for neural TTS (ASR-based, reproducible scoring across voices and sample sets) and a retrieval-evaluation and claim-grounding toolkit for long-document RAG (multiple retrieval methods, coverage and grounding scoring, deterministic and model-free). Findings published as technical reports with DOIs.

Technical Q&A / Evaluation Notes

This section is included for technical reviewers who want to see how I think about model evaluation, dataset curation, training quality, and production tradeoffs. It summarizes applied practices from the systems and datasets behind the projects above.

How do I evaluate an ML or speech model?

I evaluate models across data quality, held-out performance, robustness, and production behavior. For speech systems, I combine offline checks with perceptual evaluation because many real failures are audible before they are visible in a single metric.

  • Data quality: clean transcripts, correct speaker/emotion labels, trimmed audio, consistent metadata, and separation of train / validation / test sets.
  • Held-out evaluation: I keep dedicated validation and test data so the model is not judged on material it has already seen during training.
  • Task behavior: intelligibility, speaker consistency, emotional fidelity, pronunciation, multilingual robustness, and failure cases on long or difficult inputs.
  • Production behavior: latency, memory, stability, repetition, drift, clipping, and degradation under real user prompts.

Example: dataset splitting and validation discipline

In large speech datasets, I work with explicit held-out sets rather than trusting training loss alone. In one large multilingual workflow, the total corpus scale was on the order of one hundred thousand samples, with dedicated validation and test subsets kept separate from training material.

  • Typical split logic: the majority of samples remain in training, with smaller held-out subsets reserved for validation and final test.
  • No leakage: I avoid overlap of duplicated clips, near-duplicate text/audio pairs, or reused evaluation material across splits.
  • Why it matters: a model can look strong if evaluated on data that is too similar to training material, but then fail in real deployment.

How do I avoid overfitting?

I do not assume lower training loss means better real performance. I look for generalization.

  • Track validation behavior instead of training loss alone.
  • Stop or revise runs when validation stalls while training continues improving.
  • Use held-out speakers, languages, texts, or styles where appropriate to test real generalization.
  • Inspect qualitative failures: metallic artifacts, unstable prosody, repetition, emotional drift, or speaker collapse.

How do I think about data quality, noise, and distribution shift?

Data problems often matter more than architecture changes. I check whether the training data actually represents the way the system will be used.

  • Noise: clipping, bad denoising, wrong transcripts, inconsistent loudness, wrong language tags, poor trims, or mislabeled emotion/speaker metadata.
  • Balance: avoiding a dataset that is dominated by one language, one emotion, or one speaker profile while claiming broader performance.
  • Distribution shift: for example, training mostly on short clean studio phrases but deploying on long-form narration, dialogue, or multilingual edge cases.

Training and model scope I have worked across

My work is not limited to one model family. The portfolio reflects hands-on experimentation, training, integration, and evaluation across multiple speech and AI systems.

  • Proprietary neural speech production systems, neural-codec language-model and audio-token pipelines, and multilingual narration tooling.
  • Large neural vocoder paths, mel-spectrogram and audio-token workflows, speaker-embedding conditioning, and custom encoder-decoder architecture.
  • LLM-side work including local model orchestration and AI companion / product integration.

What I optimize for in real systems

I care about the full path from data to deployed behavior, not just isolated benchmark numbers.

  • Model quality relative to real user tasks
  • Inference cost, memory footprint, and GPU practicality
  • Reliability of the API or product flow around the model
  • Whether the improvement is meaningful enough to justify deployment complexity

Credentials / Education

Officially confirmed university coursework and laboratory training in the natural sciences.

Officially confirmed university-level coursework in Natural Sciences — Hellenic Open University

Current academic status. Completed 11 of the 12 required modules and all laboratory requirements for the Natural Sciences programme at the Hellenic Open University (222 ECTS completed). One module remains before the Bachelor's degree can be awarded. Plans to complete the remaining module beginning in September 2026.

222 ECTS of university coursework completed (registry-confirmed): Mathematics I–II, Physics I–II, General & Inorganic Chemistry, Physical Chemistry, Organic Chemistry, Cell Structure & Function, Genetics, Introduction to Natural Sciences, and Science Education — plus six completed laboratory courses.

Completed laboratory courses
  • Physics Laboratory Course I & II
  • Chemistry Laboratory Course I & II
  • Biology Laboratory Course I & II

Profiles & Public Links

Public profiles and repositories that support the live products and technical work shown above.