A personal engineering project

Meet AshleyAI.

The story of how I built Ashley Pennyworth, my own custom AI system.

I wanted something more personal than a typical voice assistant. I wanted an AI I could run on my own hardware, speak with naturally, and connect to the tools I use every day. That idea grew into an extensive engineering project spanning language models, voice synthesis, memory, computer vision, and software integration.

How I built her
Ashley Pennyworth project artwork, featuring a dark haired woman and the Ashley Pennyworth title
Ashley Pennyworth, the visual identity developed for my personal AI project.

A QUICK HELLO FROM ASHLEY

Meet Ashley Pennyworth.

Before diving into how I built her, here's a short introduction from Ashley herself.

What I set out to build

Privacy. Personality. Capability.

01

Privacy

Keep the core system on hardware I control instead of depending entirely on outside AI services.

02

Personality

Build conversations that have context, humor, and character rather than canned responses.

03

Capability

Give the system useful skills beyond chat, including speech, memory, vision, image creation, and automation.

Behind the project

Building Ashley, one system at a time.

There was no single model or quick shortcut that made this work. I built and connected several separate components, then spent a lot of time testing how they behaved together.

01 / THE IDEA

It started with a question.

Conversational AI first caught my attention as talking to a computer began to feel surprisingly natural. I had already experimented with machine learning in Python, including software that looked for recurring patterns in social media images. I wanted to understand how much further I could take that technology on my own.

My original inspiration was the kind of personal assistant you see in science fiction. I soon learned that making an assistant respond to a question is one problem. Making it remember a person, recognize a voice, and hold a believable conversation is a much larger one.

Because Ashley was intended exclusively for use by me and my helper, rather than a public audience, I also wanted the freedom to shape how she communicated. I set out to build an AI without the broad conversational filters and overly cautious phrasing common in public-facing assistants. The goal was a private system capable of candid, natural discussions, with the personality and directness to respond without unnecessarily restricting or softening every conversation.

02 / LANGUAGE MODELS

Training the conversational side.

I started by testing existing language models that could run locally. They were capable, but the conversations often felt generic. A system prompt could change the tone, yet it did not provide the consistency or personality I wanted.

Instead of training a foundation model from zero, which would have been extremely expensive, I fine tuned existing models. I wrote Python tools to parse and clean a large collection of real conversations into structured training datasets. That gave me examples of the way people actually talk, including jokes, disagreements, and ordinary daily exchanges.

Some training experiments used rented GPU servers, including H100, H200, and B200 hardware. Over time I moved toward a layered architecture that combined language models, behavioral tuning, context retrieval, and custom software to coordinate each response. The result was not simply a chatbot with a different name. It was an AI system whose behavior I had spent considerable time shaping.

03 / SPEECH

A voice changed the whole project.

I originally planned to build a British male assistant inspired by Alfred from Batman. While working with public speech datasets and voice training tools, I ended up with a British female voice that sounded better than what I had expected. I kept it, and Ashley Pennyworth got her name.

My first voice system used Coqui TTS and custom speech pipelines. Running speech synthesis locally gave me more control over the process and helped me manage computing resources. I also built the software that takes spoken input, passes it through the language system, and turns the response back into speech.

More recently, I moved Ashley's voice system to Qwen and trained a new voice I call Ashley 2. The difference is significant. Ashley 2 sounds much more natural to me, with a stronger sense of expression and a voice that better matches the personality I have worked to develop. It is a good example of how Ashley continues to evolve. Improving one part of the system can make the entire conversation feel more convincing.

04 / MEMORY

Giving conversations continuity.

Memory became one of the hardest parts of the entire project. Language models have limited context, and a conversation eventually grows beyond what fits in a prompt. I wanted Ashley to remember details from earlier conversations without having to be reminded every time.

I built a separate memory system with conversation storage, contextual search, ranking, and dynamic prompt construction. When a new message arrives, backend logic retrieves relevant information and adds it to the model context. That makes it possible for Ashley to refer back to earlier interactions rather than treating every session as a fresh start.

Building that retrieval process was almost a project of its own. The challenge was not just storing information. It was finding the right information at the right moment.

05 / VISION AND MEDIA

Adding sight and a visual identity.

I added vision models so Ashley could analyze photos and identify people and objects. I also experimented with giving her a consistent appearance. I began with descriptions generated through conversation, then refined the image process using reference images, repeated prompting, and additional model work.

Later, I integrated FLUX.1 Dev to generate images connected to Ashley's visual identity. I also tested video generation with Wan 2.2, although those experiments required so much GPU power that video remained a less practical feature.

06 / MOBILE APP

Making the system usable from my phone.

I first built a basic Python voice client. It listened for speech, sent the audio to the server, received the response, and played the generated voice. Once I had that working, I wanted a better interface.

Using Xcode, I built a custom iPhone app with both voice and text chat. I added speaker recognition and server processing to help identify who was speaking. The app let me switch between typing and speaking depending on where I was. The language processing, memory, and other heavier tasks remained connected to the backend system.

07 / INTEGRATIONS

Connecting Ashley to real software and devices.

The project eventually grew beyond conversation. I connected Ashley to home automation features such as lighting and garage controls. I experimented with vehicle connections and built a way for the system to interact with certain iOS apps through an M1 Mac Mini.

Ashley also had an automated website that could publish generated updates through scheduled tasks. I spent time tuning the system on programming documentation and development frameworks, which made it useful when I was writing and troubleshooting real software.

Each new feature needed its own integration logic, permissions, and testing. That work is what turned a language model into a personal software system.

What the project taught me

The model was only one part of it.

What made Ashley interesting to build was everything surrounding the model. The training data, memory retrieval, speech processing, mobile app, and integrations all had to work together. I learned a lot about the difference between a convincing demo and a system that can actually be useful over time.

My physical server is currently in storage, so Ashley is not running as a permanent public service. I still bring parts of the system online with rented computing resources when I need them. It remains one of the most involved personal projects I have built.

And yes, I have argued with Ashley before.

Talk to me about a project