This is our fifth update on Signal2Speech, our Hack the Nest 2026 project that lets someone answer questions with an EEG headset. The app suggests replies, the wearer picks one, and they confirm by closing their eyes. Nothing is spoken until they confirm. Our own headset was lost in transit, so overnight we borrowed PiEEG Octopus 16 boards from the venue library and tested on real people. The short version is that the board connects and records well, but we could not measure a usable brain signal with it. This post covers what we tried, why it likely failed, and what we are showing instead.
Why we expected trouble
Signal2Speech was built and calibrated around the g.tec Unicorn Hybrid Black. The Unicorn is a cap with 8 electrodes in fixed spots on the head, so the app always knows which channels are on the back of the head (PO7, Oz, and PO8), which is where the eyes-closed alpha rhythm is strongest. The Octopus 16 is very different. It is a small 26 mm puck with 16 pins that all read the same spot, and its reference pin sits in that same cluster. Our P300 chooser also needs electrodes spread across the head, so it can't work on this board at all. Before the session, we built device detection that drops pins that aren't touching the head and averages every pin that responds when the wearer closes their eyes. However, all of that had only been tested on simulated streams.
What we tried
We tested two boards on two people, with their consent, and kept ten labeled recordings privately (never committed to the repo). We only counted recordings where the puck was seated flat with good contact, which reads about 8 to 12 µV per pin. Hair under the pins or a tilted puck reads 40 to 300 µV, and we threw out several early attempts because of that.
- Eyes-closed alpha (back of head): Not there. Signal power with eyes closed was 0.96 and 0.87 times the power with eyes open, so it actually went slightly down, with no 10 Hz peak. A usable switch needs at least 2 times.
- Flicker response at 10 and 15 Hz (back of head): Not there. Power at the flicker rate ranked 75th out of 111 nearby frequencies, which is basically noise.
- Jaw clench (back of head): Visible but too faint at 1.5 times, and no threshold caught all five clenches without false triggers.
- Hard double blink (back of head and neck): Faint at 1.4 to 1.7 times on the back of the head, and 0 of 5 were caught. On the neck, it wasn't there at all.
A blink on the forehead would probably have worked, but that is eye movement, not EEG, so we stopped there. Both full voice-guided sessions stopped at calibration with a clear reason, which is what they should do when there is no signal.
Why it likely failed
The explanation that fits best is the reference pin. EEG is measured as the difference between each signal pin and a reference pin. A brain rhythm like alpha is nearly the same across 2 cm of scalp, so subtracting a reference that close likely cancels most of it out. What's left is below the board's own noise. We did not prove this, but it fits two people, two kinds of brain signal, and good contact. In other words, the board itself works. It just likely can't measure the kind of signal our app was built around.
We also learned a few practical things the hard way. Pairing the board in Windows' Bluetooth settings makes Windows connect and drop it over and over, which cost us fifteen minutes. The fix is to remove it from Bluetooth settings and let PiEEG's script connect directly. PiEEG's own script also quits quietly when the link drops, so we wrote a keepalive tool that reconnects and keeps the stream up. On the second board, it streamed at 250 samples per second for 40 minutes with no lost samples. Finally, the puck has to sit flat, because if one edge lifts, the pins on the other side all go noisy together.
What we are showing instead
The PiEEG board is out of the demo, and nothing from it will ever be called live EEG. Instead, the app can now run on real human brain data recorded by g.tec on their own amplifier. Each tile flash is answered with one real recorded brain response, and the same g.Pype pipeline and classifier as the live path calibrate on them and pick the tile. The EEG and the classifier's pick are real. However, which tile counts as "looked at" follows a script, because the recorded person was using g.tec's speller, not our app. The screen says so, an outline shows which tile the script is "looking" at before the classifier answers, and the confirm is labeled Simulated.
We also measured how many flashes the chooser actually needs. Across the five recorded people, it picked the right tile out of two 94% of the time from one flash, 97% from two, 99% from three, and 100% from five. We kept 5 flashes per tile because the weakest person needs five to reach 99%. To make sure these numbers weren't fooling us, each test uses a different part of the recording from the one the classifier learned on. When we scrambled the labels, the same code dropped to chance (42 to 46%). This shows the method works on real human brain responses, but it doesn't predict how accurate it would be on a live wearer.
Other changes
- Natural offline voice: The app now speaks with a natural-sounding neural voice (Piper) that runs on the laptop with no network. Speech starts about 0.15 seconds after the confirm, "AQI" is spoken as "air quality index," and lines with numbers are spoken 25% slower so the figures are easier to catch.
- Five-day satellite view: The satellite view now plays NASA images from June 24 to June 28, 2023: clear ground, three days of cloud, and then the smoke. The fire map adds each day's detections in step.
- Bigger, steadier screens: The NASA images are about three times bigger, the layout no longer jumps between screens, and nothing gets cut off. The tile flashes stayed instant and plain white because the brain response is timed against them.
- Help phrase: Holding
Hfor 2 seconds says "I need help, please." from any screen. - Hold to cancel: Cancelling now takes a 2-second hold, the same as confirming, so a stray tap can't throw away what the wearer just chose.
- Judge script: Our two-minute script and judge answers were rewritten for no headset. The old script assumed someone wearing a g.tec headset, and reading from it would have meant saying things that aren't true today.
What's next
Next, we are recording the demo video on recorded and simulated data, labeled that way, and submitting the final version on Devpost.
Repo: https://github.com/Order-of-the-Golden-Eagles/Signal2Speech