Lee-Soft

// Side project

I took Alexa out of an Echo Show and put Claude in it

Posted 5 August 2026

There's an Echo Show 5 in my house that spent years being mediocre at everything I asked it. It has a decent far-field microphone array, a screen, a speaker, and a quad-core ARM chip — and it used all of that to mishear me and then read out a shopping result. So I rooted it, disabled Amazon's speech stack, and wired the microphone up to Claude instead.

It works. You say the wake word, it beeps, you talk, and a couple of seconds later a British voice answers you out of the Echo's own speaker. Alexa is gone from the device entirely. The whole thing is on GitHub, and this is the story of the three problems that actually made it hard.

Problem one: Amazon owns the microphone

The obvious approach — ask Android for the microphone — returns perfect, beautiful silence. Amazon routes the far-field array to a private audio source that their always-on wake word service holds open, so a normal recording API gets nothing. Everyone who hits this concludes the mic is locked and gives up. I did too, for a bit.

It isn't locked, it's just somewhere else. The real microphones sit on ALSA card 0, device 22 — packed 24-bit, four channels, 16kHz. Two of those channels are silent, because the Show 5 physically has two mics. The standard capture tool can't open it, which is what makes it look impossible, and the reason is gloriously stupid: that tool's "24-bit" means four bytes per sample, and this device wants three. Wrong number of bytes, no audio, no explanation.

Write your own capture using the packed format and the audio is right there, clean. Better still, you don't have to fight Amazon's audio server for it — kill just the one service holding the wake word open and the device is released, while audio output keeps working through the normal Android path. So the speaker still works, which is the whole point of a talking box.

Problem two: the wake word has to run on the device

Streaming audio to a server so it can decide whether you said the magic word is both rude and slow. The wake word runs locally, natively, on the Show's own chip — a small ONNX pipeline that turns the mic feed into a spectrogram, into an embedding, into a single score, about twice a second. Idle it reads 0.001. When it hears the phrase it jumps to 0.99.

Getting there involved a day of the score sitting at 0.001 no matter what I shouted. The model wanted audio scaled to 16-bit integer values — but held as floating point numbers, ±32768. I gave it the tidy, normalised -1 to 1 range every audio library on earth hands you. Same waveform, same shape, factor of 32768 too quiet, and a neural net that politely reported hearing nothing at all. No error, no warning, just a number that never moved.

Then the fun part. I trained a custom "hey Claude" model. It worked great — for me. My girlfriend could not activate it at all, which is a fairly serious defect in a thing that lives in a shared kitchen. The obvious theory was that I'd trained it on my own voice. Wrong twice over: the training set was entirely synthetic, hundreds of voices, none of them mine — and when I finally measured properly, it scored her higher than me.

What actually happened is worse and more interesting. The model only fired for a narrow band of cadence, and I had spent weeks unconsciously learning to say the phrase the one way that worked, because I'd tuned the detection threshold on myself. I had trained the human. She hadn't been taught the trick, so for her the thing was simply broken. I swapped in a pretrained "hey Jarvis" model off the shelf and it scores 0.99 for both of us, first try, every time. My handcrafted model is retired. If you take one thing from this: never tune a threshold on the same person whose problem you're debugging — it hides exactly the fragility you're looking for.

Problem three: starting at boot without weakening the device

My favourite bit. The assistant needs root to reach the mic. Android's init system, under enforcing SELinux, cannot launch a root service — it's denied the transition, and the enforcing flag comes from the bootloader, not from anything I can edit. The usual answer is to turn SELinux off, which I didn't want to do to a microphone that lives in my house.

The way through: init can launch a service in the lowly "shell" domain. That shell-domain process connects over the loopback interface to the device's own debug daemon — which is already running, on the device, listening to itself — and the debug daemon hands back a root shell. Root shell starts the assistant. The Echo Show boots itself into privilege by phoning itself up and asking nicely, and SELinux stays fully enforcing the entire time.

The voice

The wake word is on the device; the brain is a Claude agent I run on a little server, so it keeps its own memory across conversations and reboots. The Show is a thin client: one utterance up, one reply down, speak it, shut up.

That last part turned out to be a design problem rather than a coding one. Everything the model says gets read aloud to a room, and a chat assistant's instincts are all wrong for that — no lists, no markdown, no file paths, no "is there anything else I can help with?". The persona is Jarvis from Iron Man, mostly because that register enforces the constraint I actually needed: answer in one sentence, be precise, then stop.

And it has to genuinely stop, because the microphone reopens only when the model marks its reply as expecting an answer. The failure mode this produced was my favourite bug of the whole project. The most Jarvis-sounding line in the world is "will that be all, sir?" — and it's a question, so the mic dutifully opened, at an empty room, and the silence timed out, and it asked again. Politeness is an infinite loop. The rule now is: if you're finished, stop talking. Silence is in character.

The hardware, for scale

All of this runs on a 2019 Echo Show 5: a quad-core A53, about a gigabyte of RAM with roughly 430MB free once my stack is up, and a 5.5-inch screen. The screen isn't wasted either — there's a small heads-up display showing whether it's listening, thinking or speaking, plus the wake score and the last exchange, because a black screen tells you nothing when the thing has silently died.

It is a genuinely nice piece of hardware that was being wasted, which is roughly the same feeling that produced every other app on this site.

Have it

The source is at github.com/lee-soft/echo-show-claude — the C and C++ services, the exact cross-compilation scripts, the boot service, the on-screen display app, and a long pile of notes covering the things that don't work and why. You'll need a rooted first-gen Echo Show 5 and a tolerance for the phrase "remount /system".

It's not a product and there's no installer. It's a working assistant and a fairly detailed map of a device Amazon would rather you didn't wander around inside. Take it apart.

Back to Lee-Soft