Skip to content
All work

Robotics & AI / XR & Digital Twins / In the Lab · 2026 · Prototype

Robot Voice Control

Talk to a real ROS 2 robot from Unreal Engine — push-to-talk speech, a local LLM on a DGX Spark, and rosbridge commands in about 0.4 s.

Role
Solo developer
Team
Solo
Context
Robots & Humans research
Timeline
2026
Status
Prototype
Unreal Engine · C++ · Python · ROS 2

Highlights

  • Push-to-talk in Unreal → faster-whisper + Ollama on a DGX Spark → /cmd_vel over rosbridge
  • Rules handle common commands in milliseconds; a schema-constrained LLM handles the rest
  • Layered safety — "stop" never waits for the AI, and the LLM can't invent a direction
voice → robot moving (rule path)
≈0.4 s
parser unit tests passing
64 / 64
randomized movement clips correct
40 / 40
moves from 80 "stop"-type clips
0

Overview

Hold a key, say "move forward for two seconds" or "turn left 90 degrees", and a Hiwonder ROSOrin Pro robot does it. Say "stop" and it stops. Speech recognition and language understanding run on an NVIDIA DGX Spark on the local network; Unreal Engine records the voice, sends it there, and drives the robot over rosbridge. Nothing goes to the cloud.

It applies the pattern from the Digital Twin Platform's assistant to physical hardware: the AI decides what, and the engine does it.

Architecture

UNREAL PCDGX SPARKROSORIN PROMic (hold T) or consoleCPP_AICommandComponentCPP_RosBridgeComponentserver.py :8002faster-whisperrules parserOllama gemma4:e4brosbridge :9090topic /cmd_velHTTP: text or WAVJSON commandWebSocket: publish /cmd_vel
Data flow — Unreal, the DGX Spark and the robot

Fast path, smart path

Common commands — distances, durations, angles, "turn around", "slide left slowly" — are parsed by rules in milliseconds; about 0.4 s from releasing the key to the robot moving, most of it speech recognition. Anything the rules don't cover ("scoot up a tiny bit", "don't go forward") goes to a local LLM that is forced to answer in a strict JSON schema, at around 1.5 s.

Safety first

A robot that mishears is a robot that drives into something, so safety is layered:

  • "stop" never waits for the AI — it's answered in 3 ms even while a slow LLM request is running.
  • Misheard or unknown commands stop the robot rather than guessing.
  • An emergency-stop key works with no AI involved, and manual driving always overrides the AI.
  • Stale answers are dropped, every move has a time limit, and the LLM can't invent a direction outside the schema.

Testing

The server was tested end to end on the DGX Spark with synthetic speech (Piper TTS) packed exactly the way the Unreal code packs microphone audio: 64/64 parser tests pass, 40/40 randomized movement clips are understood correctly, and 80 randomized "stop"-type clips (stop, halt, wait, freeze, no…) produced zero movements.

Repository

Talk to a ROSOrin Pro robot from Unreal Engine: push-to-talk voice → Whisper + local Ollama LLM on a DGX Spark → rosbridge /cmd_vel

  • C++54.8%
  • Python45.0%
Last push
Sep 2026