XSayATC
Lokalny asystent ATC dla X-Plane 12, podłączony do własnego serwera llama.cpp.
Wtyczka pobiera kontekst lotu z datarefów (pozycja, wysokość, prędkość, heading, squawk, częstotliwości, służba ATC, ruch w pobliżu), wysyła Twoją wiadomość do lokalnego modelu LLM i streamuje odpowiedź ATC do okna widocznego także w VR.
Funkcje
- Push-to-talk głosowe — przytrzymaj PTT, mów, puść; whisper transkrybuje, model odpowiada.
- Tekstowe PTT — wpisujesz w pole i wysyłasz (przycisk, Enter lub komenda
xsayatc/ptt). - Głos wyjściowy (TTS) — odpowiedź ATC czytana głosem (Piper).
- Streaming odpowiedzi na żywo w oknie.
- Okno widoczne w VR — automatycznie przełącza się między trybem monitora a
WindowVR. - Kontekst lotu doklejany do promptu z datarefów X-Plane.
- Wykrywanie służby ATC (
sim/atc/com1_tuned_facility) — model przyjmuje rolę Delivery / Ground / Tower / Tracon / Center, w zależności na co jesteś nastrojony. - Wykrywanie ruchu — lista pobliskiego ruchu (TCAS) z namiarem zegarowym i dystansem.
- Plan lotu — z natywnego FMS/GPS lub z pliku (dla samolotów z własnym FMC).
- Procedury ATC — katalog
procedures/z plikami globalnymi i per-lotnisko. - Konfigurowalny GUI — adres serwera, model, temperatura, max tokenów, system prompt, głos.
Wymagania
- X-Plane 12
- XPPython3 v4.x (dostarcza własny Python 3.12 +
imgui+requests) - działający serwer llama.cpp z endpointem OpenAI-compat (
/v1/chat/completions) - Głos (opcjonalnie):
whisper-cli(STT) +piper(TTS) + PipeWire (pw-record/pw-play)
Instalacja
- Zainstaluj XPPython3 do
X-Plane 12/Resources/plugins/XPPython3/. - Skopiuj zawartość katalogu
PythonPlugins/z tego repozytorium do:X-Plane 12/Resources/plugins/PythonPlugins/ - (Opcjonalnie) skopiuj
config.example.jsonjakoconfig.jsoni dopasuj ustawienia. - Uruchom X-Plane. W menu
Plugins → XSayATCznajdziesz okno i konfigurację.
Użycie (krok po kroku)
- Uruchom serwer llama.cpp (np. na porcie
8081). - Uruchom X-Plane 12 — wtyczka ładuje się automatycznie.
- Przypisz klawisz push-to-talk: Settings → Keyboard → Plugins → XSayATC → push-to-talk. (Opcjonalnie przypisz też toggle window, żeby pokazywać/chować okno.)
- Mów lub wysyłaj:
- Głosowo: przytrzymaj PTT → mów → puść. Whisper transkrybuje, ATC odpowie tekstem i głosem.
- Tekstowo: otwórz okno (menu Plugins → XSayATC → Pokaz/ukryj okno) → wpisz tekst → „Wyslij".
- Konfigurację zmienisz w oknie (przycisk Konfiguracja) lub w menu.
Konfiguracja
Ustawienia trzymane są w config.json obok pliku wtyczki. Można je edytować
w GUI (przycisk Konfiguracja) lub ręcznie.
Kluczowe opcje:
| Klucz | Opis |
|---|---|
base_url |
Adres serwera llama.cpp (np. http://localhost:8081) |
model |
Nazwa modelu; puste = auto-wykrycie z /v1/models |
temperature |
Temperatura próbkowania |
max_tokens |
Maksymalna liczba tokenów odpowiedzi |
system_prompt |
Instrukcje / osobowość ATC |
include_flight_context |
Czy doklejać kontekst lotu do promptu |
no_think |
Dodaje token /no_think (wyłącza myślenie w modelach Qwen3) |
voice_enabled |
Włącza głos wejściowy (STT / whisper) |
tts_enabled |
Włącza głos wyjściowy (TTS / piper) |
whisper_model |
Ścieżka do modelu whisper (ggml-*.bin) |
piper_model |
Ścieżka do modelu piper (.onnx) |
flightplan_file |
Plik planu lotu (fallback dla samolotów z własnym FMC) |
procedures_dir |
Katalog procedur (puste = procedures/ obok wtyczki) |
use_procedures |
Włącza/wyłącza wczytywanie procedur |
Głos (STT + TTS)
- STT (Twój głos): przytrzymaj PTT → mów → puść. Wtyczka nagrywa przez
pw-recordi transkrybuje przezwhisper-cli. Domyślny trybhold. - TTS (głos ATC): po odpowiedzi modelu, tekst syntetyzowany przez
piperi odtwarzany przezpw-play.
Uwaga: Piper potrzebuje angielskiego głosu (en_US-*). Dlatego naturalnie
działa, gdy mówisz/odpowiadasz po angielsku (frazeologia lotnicza i tak jest po angielsku).
Procedury ATC
Wtyczka czyta procedury z katalogu procedures/ (obok PI_XSayATC.py):
procedures/
├── _global.txt ← zasady globalne (zawsze ładowane)
├── EPWA.txt ← procedury per-lotnisko (ładowane, gdy najbliższe = EPWA)
└── LKPR.txt ← kolejne lotniska...
_global.txtdoklejany zawsze.<ICAO>.txtdoklejany, gdy najbliższe lotnisko (z natywnej bazy navaidów) ma ten kod ICAO.- Linie zaczynające się od
#to komentarze (nie wysyłane do modelu). - Możesz używać nagłówków (
## Ground,## Toweritd.) — model czyta to naturalnie.
Dodajesz plik ICAO.txt i wtyczka automatycznie go podchwyci, gdy będziesz w pobliżu.
Plan lotu
- Natywny FMS/GPS (defaultowe samoloty): wtyczka czyta go automatycznie.
- Samoloty z własnym FMC (Toliss, Zibo itd.): nie zapisują planu do natywnego
FMS, więc podaj plik tekstowy w
flightplan_file. Format: jedna linia = jeden punkt, np.EPWA 350,EVINA 9000(nazwa + opcjonalna wysokość w stopach);#= komentarz.
Push-to-talk
Wtyczka rejestruje komendy:
xsayatc/ptt— push-to-talk (głos lub tekst),xsayatc/toggle_window— pokaż/ukryj okno.
Przypisz im klawisze w Settings → Keyboard → Plugins → XSayATC.
Uwagi techniczne
- Bezpieczeństwo wątków: odczyty datarefów (
xp.getData*) muszą działać na głównym wątku X-Plane. Wtyczka zbiera kontekst, plan lotu i procedury wsend()(główny wątek), a wątek roboczy wykonuje wyłącznie sieć (requests) i aktualizuje historię. - Modele Qwen3 (reasoning): token
/no_thinkwyłącza „myślenie". Flagithinking:false/enable_thinking:falsenie działają w niektórych buildach llama.cpp — stąd domyślny/no_think. Dla innych modeli myślących wyłącz myślenie po stronie modelu (np.enable_thinking: falsew configu llama.cpp). - Ruch lotniczy odczytywany jest z TCAS (
sim/cockpit2/tcas/...), więc działa z LiveTraffic oraz ruchem AI X-Plane. tuned_facilitydziała dla lotnisk z zdefiniowanym ATC w X-Plane.- Polskie znaki w oknie ImGui wyświetlają się jako
?(domyślny font nie ma polskich glifów). Głos (STT/TTS) i treść promptu działają poprawnie — w praktyce mów/odpowiadaj po angielsku.
Roadmap
- Głos wejściowy (Whisper /
whisper-cli) - Głos wyjściowy (Piper)
- Procedury ATC (katalog + dynamiczne wczytywanie)
- Polskie znaki w oknie ImGui (custom font)
Licencja
Do uzupełnienia.