Developer guide

It types its answer. Act on match.

Plug a detector in and it behaves like a USB keyboard: every time somebody says something, it types one flat JSON object wherever your cursor is. No port to open, no driver, no code. When you want software to act on it instead, the same line is on the serial port — and when you want no computer at all, there is a pin.

Open a text editor, put the cursor in it, and say something. This is what lands:

{"n":4,"match":false,"keyword":"stop","score":0.2731,"length_ms":170,"latched":true,"uptime_ms":640527}
FieldTypeMeaning
match bool The answer. true means the keyword was heard and the detector has asserted its stop. Both microphones feed this: either one hearing it makes it true.
scorefloat 0–1How confident it was. Useful for logs and graphs — the operating point is already applied, so do not threshold it yourself.
keywordstringThe model’s configured keyword label. This binary detector does not identify the spoken language, dialect or exact word.
length_msintHow long the utterance was.
latchedbooltrue while a stop is being held. Send Z\n to clear it.
nintUtterance counter since power-on. A gap means you missed a line.
uptime_msintMilliseconds since the detector booted. Device clock, not wall clock.

Language and dialect coverage

RobotStop’s expansion goal is every spoken language and dialect. The worldwide catalog is a reference inventory; entries do not automatically become available on a detector. Current development word lists cover English, Mandarin Chinese and Korean, and coverage depends on the installed model.

Use the coverage and qualification record for your unit’s model version. A language result does not establish coverage for all its dialects. The existing JSON reports a binary stop match; it cannot tell you which language or dialect triggered it.

Three ways out

All three are live at once. Pick whichever suits what you are building — you do not configure anything to choose.

Way outNeedsUse it when
USB keyboard
the default
Nothing. It types. You want the data now — into a spreadsheet, a text file, a log window, a form. Send H0\n to stop it typing, H1\n to resume.
USB-C serial A serial port at 921600 Software has to react to it. Same JSON, same moment.
Stop pin Two wires No computer in the loop. HIGH while ready, LOW while stopped, so a cut wire or a dead board reads as stopped. Drive an optocoupler or a relay coil from it — not a machine directly.

Read it from code

import json, serial   # pip install pyserial

with serial.Serial("/dev/cu.usbmodem101", 921600) as detector:
    for line in detector:
        event = json.loads(line)
        if event["match"]:
            stop_the_robot()
// npm install serialport
import { SerialPort } from "serialport";
import { ReadlineParser } from "@serialport/parser-readline";

new SerialPort({ path: "COM4", baudRate: 921600 })
  .pipe(new ReadlineParser())
  .on("data", (line) => {
    const event = JSON.parse(line);
    if (event.match) stopTheRobot();
  });

Port names: /dev/cu.usbmodem* on macOS, COM* on Windows, /dev/ttyACM* on Linux. No driver, no SDK. Lines that do not start with { are human-readable notes — skip them.

USB is telemetry, not the safety path

A host can be busy, an operating system can buffer, a cable can be unplugged, and a window can lose focus. Neither the keyboard output nor the serial line belongs in a safety path. That is what the stop pin is for: wire it into the machine’s protective-stop circuit and use the JSON to log, display and react. RobotStop is a supplementary protective measure and is not an emergency stop device.

If something looks wrong

It is typing into the wrong windowThat is what a keyboard does. Send H0\n to stop it typing and read the serial port instead.
Nothing gets typedSome hosts ignore a new keyboard until you click into a text field. Check the serial port is still showing lines — if it is, the detector is fine.
No port appearsCharge-only USB-C cable. Swap it.
GibberishWrong baud. It is 921600.
Nothing arrivesNormal when the room is quiet — lines come when somebody speaks. Also check nothing else has the port open.
One stop, then never againlatched is true. Send Z\n.
Always match:falseSend ?\n and mail us what it prints, with a few of these lines.

Anything else

Paste us the lines and tell us what you are building.