Drei App-seitige Ursachen fuer 'erst beim zweiten Aufnehmen' (tsc --noEmit: 0 Fehler): 1) No-Speech-Watchdog: Der Aufrufer uebergibt die Sprechpausen-Toleranz (sttEndpointMs, Default 2400ms, per Setting bis 1000ms). Die misst ab dem ENDE des Sprechens, der Watchdog lief aber ab dem START der Aufnahme. Bis ein Zwischenergebnis zurueck sein KANN, vergehen realistisch 1,3-2,2s (600ms Mindestpuffer + 700ms Transkriptions-Takt + Netzweg). Schon kurzes Ueberlegen nach dem Gong brach die Aufnahme ab. Jetzt +2500ms Zuschlag. 2) stt_stream_start ging ERST NACH PcmStreamRecorder.start() raus — die ersten Chunks (200ms-Takt) trafen auf eine Bridge ohne Sitzung und wurden verworfen (Wortanfang weg; bei kurzen Kommandos blieb nichts uebrig). Jetzt davor. 3) recordingState wurde erst nach mehreren awaits auf 'recording' gesetzt. In diesem Fenster war isStreamingRecording() true, der Zustand aber 'idle': ein Abbruch dort liess den Start weiterlaufen, der Recorder blieb haengen und die NAECHSTE Aufnahme wurde abgelehnt. Zustand wird jetzt sofort gesetzt, plus Session-Guard nach den awaits. Zusaetzlich: ohne RVS-Verbindung wird gar nicht erst aufgenommen (send() verwirft still, kein Puffer) — nach App-Resume fiel sonst die erste Aufnahme komplett aus. Nachtraeglich gepuffertes Audio waere sinnlos, die STT-Sitzung laeuft in Echtzeit. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ARIA Cockpit — Android App
Stefans primäre Schnittstelle zu ARIA. Gebaut mit React Native + TypeScript.
Schnellstart
# 1. Abhängigkeiten installieren (einmalig)
./setup.sh
# 2. Release-APK bauen (standalone, kein Dev-Server nötig)
./build.sh
# 3. APK aufs Handy kopieren und installieren
adb install ARIA-Cockpit-release.apk
Fertig. APK liegt als ARIA-Cockpit-release.apk im Verzeichnis.
Debug vs Release — was ist der Unterschied?
| Debug | Release | |
|---|---|---|
| JS-Bundle | Wird von Metro Dev-Server geladen (localhost:8081) | In die APK eingebaut — läuft standalone |
| Verwendung | Entwicklung am PC mit Hot-Reload | Installation aufs Handy |
| Dev-Server nötig? | Ja — npx react-native start muss laufen |
Nein — App startet sofort |
| Größe | Kleiner (Code wird live geladen) | Größer (alles eingebaut) |
Für aufs Handy installieren immer Release bauen:
./build.sh release # oder einfach: ./build.sh
Debug nur zum Entwickeln am PC:
# Terminal 1: Metro Dev-Server starten
npx react-native start
# Terminal 2: Debug-APK bauen und auf verbundenes Gerät/Emulator deployen
./build.sh debug
Wenn du eine Debug-APK aufs Handy kopierst ohne Metro-Server, siehst du den roten "Could not connect to development server" Fehler. Das ist normal — Debug braucht den Server.
Scripts
setup.sh — Entwicklungsumgebung einrichten
Installiert automatisch alles was zum Bauen nötig ist:
| Was | Version | Details |
|---|---|---|
| Basis-Tools | — | curl, unzip, git |
| Node.js | >= 18 | Via NodeSource (falls nicht vorhanden) |
| JDK | 17 (vollständig) | OpenJDK mit jlink (nicht nur JRE!) |
| Android SDK | API 34 | Command Line Tools + Build Tools + Platform Tools |
| Metro-Config | — | metro.config.js, babel.config.js, .watchmanconfig (falls fehlend) |
| Node Packages | — | Räumt alte node_modules auf + npm install |
| Natives Android-Projekt | — | React Native Gradle-Projekt generieren |
| Gradle Config | — | compileSdk-Warning unterdrücken, Build-Cache aufräumen |
Das Script erkennt automatisch dein OS (Debian, Fedora, Arch, macOS) und benutzt den passenden Paketmanager.
ANDROID_HOME wird automatisch gesetzt und in dein Shell-Profil (.bashrc/.zshrc) eingetragen.
JDK-Hinweis: React Native 0.73 + Android Gradle Plugin 8.1 braucht exakt JDK 17 — nicht 21 oder neuer. Falls du JDK 21 als Standard hast, ist das kein Problem: build.sh setzt JAVA_HOME automatisch auf JDK 17 (wenn installiert).
./setup.sh
Nach dem Setup einmalig Shell neu starten oder
source ~/.bashrcausführen.
build.sh — APK bauen
Baut die Android APK in einem Schritt:
./build.sh # Release-APK (Standard) — fürs Handy
./build.sh release # Release-APK (explizit)
./build.sh debug # Debug-APK (nur mit Metro Dev-Server)
Was das Script macht:
- Prüft ob Node, npm, Java vorhanden sind (sonst Fehler mit Hinweis auf
setup.sh) - Erkennt automatisch JDK 21 und wechselt auf JDK 17 (inkl. jlink-Prüfung)
- Sucht automatisch nach dem Android SDK (typische Pfade)
- Prüft ob das native Android-Projekt existiert (sonst Hinweis auf
setup.sh) - Installiert/updated Node Dependencies falls nötig
- Baut die APK via Gradle
- Kopiert die fertige APK als
ARIA-Cockpit-<modus>.apkins Hauptverzeichnis
Ausgabe-Dateien:
ARIA-Cockpit-release.apk— fertige APK (Hauptverzeichnis)android/app/build/outputs/apk/release/app-release.apk— Original-Pfad
Auf dem Handy installieren
# Via ADB (USB-Kabel oder WiFi)
adb install ARIA-Cockpit-release.apk
# Oder: APK aufs Handy kopieren und dort öffnen
# Oder: Via Gitea Release herunterladen (siehe release.sh im Root)
Erstverbindung (Pairing)
- App starten
- Tab Einstellungen öffnen
- QR-Code scannen (vom RVS generiert) oder Token manuell eingeben
- Verbindungsstatus prüfen (grüner Punkt = verbunden)
Der QR-Code enthält alles was die App braucht:
{
"host": "rvs.hackersoft.de",
"port": 443,
"token": "a3f8b2c9d1e4..."
}
Einmal scannen, nie wieder manuell tippen.
Projektstruktur
android/
├── setup.sh ← Dev-Umgebung einrichten (einmalig)
├── build.sh ← APK bauen
├── index.js ← React Native Entry Point
├── app.json ← App-Name Konfiguration
├── App.tsx ← Haupt-Komponente, Navigation
├── package.json ← Dependencies
├── tsconfig.json ← TypeScript Config
├── metro.config.js ← Metro Bundler Config
├── babel.config.js ← Babel Transpiler Config
├── .watchmanconfig ← Watchman Config
│
├── src/
│ ├── services/
│ │ ├── rvs.ts ← WebSocket-Verbindung zum Rendezvous Server
│ │ └── audio.ts ← Mikrofon-Aufnahme und TTS-Wiedergabe
│ │
│ ├── screens/
│ │ ├── ChatScreen.tsx ← Hauptchat mit ARIA
│ │ └── SettingsScreen.tsx ← Verbindung, Modus, Logs
│ │
│ └── components/
│ ├── VoiceButton.tsx ← Push-to-Talk Button
│ ├── ModeSelector.tsx ← Betriebsmodus-Auswahl
│ ├── FileUpload.tsx ← Datei-Versand
│ └── CameraUpload.tsx ← Foto-Aufnahme / Galerie
│
└── android/ ← Generiertes Gradle-Projekt (nach setup)
├── gradlew ← Gradle Wrapper
├── gradle.properties ← Gradle Config (compileSdk etc.)
└── app/build.gradle ← App Build Config
Fehlerbehebung
| Problem | Lösung |
|---|---|
| "Could not connect to development server" | Das ist eine Debug-APK. Für standalone: ./build.sh release |
ANDROID_HOME nicht gesetzt |
./setup.sh ausführen, Shell neu starten |
gradlew: Permission denied |
chmod +x android/gradlew |
SDK not found |
./setup.sh — installiert Android SDK automatisch |
JDK nicht gefunden |
./setup.sh — installiert OpenJDK 17 |
jlink does not exist |
Nur JRE installiert, nicht voller JDK: sudo apt install openjdk-17-jdk |
JdkImageTransform Fehler |
JDK 21 aktiv, aber JDK 17 nötig — build.sh löst das automatisch |
BaseReactPackage Fehler |
react-native-screens Version zu neu — auf 3.27.0 pinnen |
react-native-camera Flavor-Fehler |
Paket entfernt (deprecated), wird nicht gebraucht |
EMFILE: too many open files |
build.sh setzt CI=true automatisch — Metro startet keinen File-Watcher |
No Metro config found |
./setup.sh erstellt metro.config.js, babel.config.js, .watchmanconfig automatisch |
Build hängt bei assembleRelease |
Signing Config prüfen (siehe React Native Docs) |
node_modules Probleme |
./setup.sh — räumt alles auf und installiert frisch |