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

  1. Zainstaluj XPPython3 do X-Plane 12/Resources/plugins/XPPython3/.
  2. Skopiuj zawartość katalogu PythonPlugins/ z tego repozytorium do:
    X-Plane 12/Resources/plugins/PythonPlugins/
    
  3. (Opcjonalnie) skopiuj config.example.json jako config.json i dopasuj ustawienia.
  4. Uruchom X-Plane. W menu Plugins → XSayATC znajdziesz okno i konfigurację.

Użycie (krok po kroku)

  1. Uruchom serwer llama.cpp (np. na porcie 8081).
  2. Uruchom X-Plane 12 — wtyczka ładuje się automatycznie.
  3. Przypisz klawisz push-to-talk: Settings → Keyboard → Plugins → XSayATC → push-to-talk. (Opcjonalnie przypisz też toggle window, żeby pokazywać/chować okno.)
  4. 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".
  5. 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-record i transkrybuje przez whisper-cli. Domyślny tryb hold.
  • TTS (głos ATC): po odpowiedzi modelu, tekst syntetyzowany przez piper i odtwarzany przez pw-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.txt doklejany zawsze.
  • <ICAO>.txt doklejany, 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, ## Tower itd.) — 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 w send() (główny wątek), a wątek roboczy wykonuje wyłącznie sieć (requests) i aktualizuje historię.
  • Modele Qwen3 (reasoning): token /no_think wyłącza „myślenie". Flagi thinking:false / enable_thinking:false nie 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: false w configu llama.cpp).
  • Ruch lotniczy odczytywany jest z TCAS (sim/cockpit2/tcas/...), więc działa z LiveTraffic oraz ruchem AI X-Plane.
  • tuned_facility dział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.

S
Description
No description provided
Readme
577 KiB
0 Stars 1 Watchers 0 Forks
Languages
Python 100%