This workflow never flies the drone. The pilot flies manually on the RC; the
workflow only listens and raises alerts. We deliberately keep voice out of the
flight-control loop — a spoken command should never move an aircraft.
The idea
Speech is a fast, hands-free way to file an incident while flying. The workflow transcribes what the pilot says, a model decides whether it’s actionable and classifies it, and only real observations become alerts — idle chatter is ignored. No loop, no controller, no drone command — the aircraft is never touched.Prerequisites
- A DJI Mini 3 twin, paired and streaming (see DJI Mini 3 Site Sweep · Phase 1). The pilot flies it manually on the RC as normal.
- A microphone twin that streams audio (a headset mic on the pilot is ideal).
Step 1: Create the workflow
Create a workflow (DJI Voice Alerts) and add the microphone and DJI Mini 3 twins. Wire nodes left to right; set inputs on the# (fixed) or </> (expression)
tabs using {node-name.output}.
Step 2: Capture the voice — Audio Track → Audio Assistant
| Node | Field | Value |
|---|---|---|
| Audio Track | Twin | your microphone twin |
| Audio Track | Buffer preset | speech-to-text |
| Audio Assistant | audio | {audio-track.audio} |
| Audio Assistant | Modality | voice_assistant |
Speak and open Executions — a run fires and Audio Assistant shows
is_speaking: true with a captured speech segment.Step 3: Transcribe — Call Model (speech-to-text)
| Field | Mode | Value |
|---|---|---|
audio | </> | {audio-assistant.audio} |
| Model | — | a speech-to-text model (e.g. Faster Whisper Small EN) |
result = the transcript.
Step 4: Classify the observation — Call Model (LLM)
Add a second Call Model node (an LLM). Set Prompt to</> and paste the
classifier below; the last line inlines the transcript. It decides whether the
utterance is a real observation worth alerting on, and structures it.
Observation classifier prompt
Observation classifier prompt
result = the JSON verdict.
Step 5: Read the verdict — JSON Parser
| Field | Mode | Value |
|---|---|---|
json_data | </> | {call-model-2.result} |
| LLM fix enabled | — | on |
Step 6: Alert only on real observations — Conditional
| Field | Mode | Value |
|---|---|---|
left_value | </> | {json-parser.json_data.should_alert} |
| operator | — | equal |
right_value | # | true |
Step 7: Raise the alert — Send Alert
Wire Conditional (true) → Send Alert on the DJI Mini 3 twin, mapping the classifier’s fields.| Field | Mode | Value |
|---|---|---|
| Twin | picker | DJI Mini 3 |
| Name | </> | {json-parser.json_data.title} |
| Severity | </> | {json-parser.json_data.severity} |
| Body | </> | {json-parser.json_data.summary} |
| Category | # | business |
Step 8: Test
You can test this fully without flying — it’s just voice in, alerts out.- Activate the workflow (Simulate or Live; the drone is never commanded either way).
- Speak a real observation: “there’s a toolbox left out by the loading dock.”
- Check Executions and the Alerts panel:
| Node | Expect |
|---|---|
| Call Model (STT) | result = your words |
| Call Model (classifier) | should_alert: true with a title, severity, summary |
| Conditional | condition_met: true |
| Send Alert | a warning alert appears on the twin |
- Speak idle chatter: “okay, battery looks fine.” →
should_alert: false, the Conditional blocks it, no alert fires.
Why voice stays out of flight
The pilot’s job is to fly and watch; the workflow’s job is to remember and report. Keeping voice on the reporting side means a misheard word can, at worst, create a spurious alert — never move the aircraft. The RC remains the only thing that flies the drone.Next steps
Autonomous site sweep
Let a VLM watch the feed and alert on its own — no pilot narration.
Send an email on alert
Chain an alert trigger to email or another integration.
Drones
Pairing, telemetry, and the full command set.
Workflow nodes
Every node used here, with inputs and outputs.