Santiago Souto Ortega · Isaac González López
AI-powered Air Traffic Control training platform. Speak to AI pilots, receive realistic clearances, and watch aircraft move in X-Plane 12.
The training of air traffic controllers requires practice in simulators that reproduce situations as closely as possible to those encountered in a real control tower. In these exercises, the trainee issues radio instructions to the aircraft present at the airport and must receive coherent and realistic responses, just as would occur in real operations.
Currently, for this type of training to be possible, it is necessary to rely on a team of people known as pseudopilots, whose task is to simulate the crews of each aircraft. These operators respond to the controller's communications and manage the movement of aircraft within the simulated environment. However, this training model is costly, depends on the availability of qualified personnel, and limits the number of sessions that can be carried out.
This work presents AIrport, a system that replaces pseudopilots with agents capable of behaving like real pilots within a simulated airport. In the system, the aircraft are represented by agents that interpret the received instructions, respond over the radio using natural language, and manage aircraft movements following real operational procedures.
The controller interacts with the system through voice and can observe the result of their instructions in a three-dimensional representation of the airport. In this way, a single person can carry out realistic exercises with multiple aircraft simultaneously, without the need to mobilize a support team. This reduces training costs and enables practice with greater frequency, flexibility, and scalability.
Keywords: air traffic control · artificial intelligence · ATC training · aviation · simulation · virtual assistants
The pilot readback corpus used to fine-tune the readback model is publicly available on Hugging Face:
@misc{SoutoReadbackCorpus2024,
author = {Souto Ortega, Santiago},
title = {Pilot Readback Corpus},
year = {2024},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/datasets/santiisoutoo/pilot-readback-corpus}}
}The same agent-validation dataset is also available in audio form. The audio version is not publicly hosted -- to request access, contact Santiago Souto Ortega.
Speak into the mic. The system transcribes your voice with Whisper-ATC, routes the message to the correct ATC agent (DEL/GND/TWR), generates an ICAO-compliant readback, and moves the aircraft in X-Plane 12 -- voice to taxi clearance in under two seconds.
A central Orchestrator tracks each aircraft's lifecycle through DEL -> GND -> TWR and dispatches incoming transmissions to the matching phase agent.
All FastAPI services. Ports are host-side, exposed by Docker Compose. Other directories under services/ are placeholders and can be ignored.
| Service | Port | Responsibility |
|---|---|---|
| Controller HMI | 8005 | Web UI (flight strips, ground radar, chat) and API gateway |
| Flight Plan | 8003 | IFR flight plan generation (flightplandatabase.com) |
| Weather | 8004 | METAR, TAF, and ATIS generation |
| ASR | 8006 | Whisper transcription + callsign correction |
| Orchestrator | 8007 | Agent routing, aircraft state machine, dispatch |
| Arrival Simulator | 8008 | Spawns AI arrivals on ILS, drives vacate sequences |
| Component | Image | Port (host:container) |
|---|---|---|
| PostgreSQL | postgres:15-alpine |
5432:5432 |
| Redis | redis:7-alpine |
6379:6379 |
| InfluxDB | influxdb:2.7-alpine |
8087:8086 |
All three agents run on Google Cloud Run with Gemini and are stateless. The Orchestrator provides each agent with the relevant aircraft context (flight plan, clearances, weather) on every call. Source under agents/.
| Agent | Frequency | Responsibilities |
|---|---|---|
| DEL (Clearance Delivery) | DEL | Issues IFR clearances |
| GND (Ground Control) | GND | Pushback approval, taxi routes |
| TWR (Tower) | TWR | Takeoff / landing clearances, runway sequencing |
Controller: "Iberia 5471, taxi to holding point runway 25 via Charlie."
-> ASR (Whisper ATC) transcribes audio + corrects callsign -> IBE5471
-> Orchestrator routes to GND agent (current phase: GND)
-> GND agent (Gemini) validates route in taxi graph, drafts readback
-> X-Plane plugin drives aircraft along taxiway C, holds short of 25
Pilot (TTS): "Taxi to holding point runway 25 via Charlie, Iberia 5471."
| Layer | Technology |
|---|---|
| Runtime | Python 3.11, uv |
| Web framework | FastAPI + Uvicorn |
| Voice ASR | faster-whisper + Whisper fine-tuned for ATC |
| AI agents | google-adk + Gemini (gemini-3.1-flash-lite) on Cloud Run |
| Voice TTS | X-Plane 12 built-in |
| Graph routing | networkx (taxi route graphs) |
| Simulator | X-Plane 12 + XPPython3, xplane-airports |
| Data | PostgreSQL 15, Redis 7, InfluxDB 2.7 |
| Containerization | Docker Compose |
Local: Python 3.11, uv, Docker + Compose v2, X-Plane 12 with XPPython3.
Cloud: GCP project with Vertex AI enabled, service account JSON with Vertex AI User, three Cloud Run agents deployed (DEL / GND / TWR -- see agents/).
External APIs: flightplandatabase.com API key.
git clone https://github.com/Santisoutoo/AIrport.git
cd AIrport
uv sync
cp .env.example .env # fill credentials -- see docs/configuration.md
docker compose up --buildThe first run downloads the Whisper ATC model (~1.5 GB) into the asr_hf_cache Docker volume. Open the Controller HMI at http://localhost:8005.
Full walkthrough — verification steps and known .env gaps — in the wiki: Installation. Something failing? Troubleshooting.
The in-sim plugin is not installed automatically: install XPPython3, copy plugins/PI_spawn_obj.py and plugins/GND/ into <X-Plane 12>/Resources/plugins/PythonPlugins/, and install the pip dependencies into the simulator's bundled Python. Full walkthrough (scripted or manual): X-Plane Plugin Setup. Start the backend (Orchestrator on port 8007) before flying.
Full guides live in the project wiki:
| Guide | Covers |
|---|---|
| Installation | Zero → running stack, verification, known .env gaps |
| Cloud Agents Deployment | Deploying the DEL/GND/TWR pilots to Cloud Run |
| X-Plane Plugin Setup | XPPython3 + plugin install, scripted or manual |
| Quickstart | Your first ATC session end to end |
| Configuration | Complete environment-variable reference |
| Troubleshooting | Symptom → cause → fix, by area |
| System Overview | Every module, what it does, how they relate |
Wiki · License · Contributing · Dataset (Hugging Face)
This repository accompanies the paper "Pseudopilot Automation via LLM-Based Multi-Agent Systems for ATC Training in X-Plane 12".
Santiago Souto Ortega · soutoortegasantiago@gmail.com · taxitolearn.com
