Compare commits

...

2 Commits

Author SHA1 Message Date
duffyduck 4ba48940b9 release: bump version to 0.0.7.9 2026-05-06 23:00:32 +02:00
duffyduck 568ef9ed10 fix(audio): STT-Cleanup-Timeout skaliert mit Aufnahmedauer
Der pauschale 30s-Timeout vom Vorgaenger-Commit haette bei einer
5-Minuten-Aufnahme schon getriggert waehrend Whisper noch transkribiert
(Whisper braucht auf der Gamebox-GPU grob real-time/5, plus Bridge-
Roundtrip).

Neue Formel: 60s Buffer + 1x Aufnahmedauer.
- 5s Aufnahme → 65s Wait
- 5min Aufnahme → 6 min Wait
- 30min Aufnahme → 31 min Wait

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 22:59:20 +02:00
3 changed files with 15 additions and 11 deletions
+2 -2
View File
@@ -79,8 +79,8 @@ android {
applicationId "com.ariacockpit" applicationId "com.ariacockpit"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 708 versionCode 709
versionName "0.0.7.8" versionName "0.0.7.9"
// Fallback fuer Libraries mit Product Flavors // Fallback fuer Libraries mit Product Flavors
missingDimensionStrategy 'react-native-camera', 'general' missingDimensionStrategy 'react-native-camera', 'general'
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "aria-cockpit", "name": "aria-cockpit",
"version": "0.0.7.8", "version": "0.0.7.9",
"private": true, "private": true,
"scripts": { "scripts": {
"android": "react-native run-android", "android": "react-native run-android",
+12 -8
View File
@@ -535,7 +535,7 @@ const ChatScreen: React.FC = () => {
audioRequestId, audioRequestId,
...(location && { location }), ...(location && { location }),
}); });
scheduleStaleAudioCleanup(audioRequestId); scheduleStaleAudioCleanup(audioRequestId, result.durationMs);
// resume() wird durch onPlaybackFinished nach ARIAs Antwort getriggert. // resume() wird durch onPlaybackFinished nach ARIAs Antwort getriggert.
} else { } else {
// Kein Speech im Window → Konversation beenden (Ohr geht aus oder // Kein Speech im Window → Konversation beenden (Ohr geht aus oder
@@ -658,10 +658,13 @@ const ChatScreen: React.FC = () => {
// --- Nachricht senden --- // --- Nachricht senden ---
// Aufraeumen von "verarbeitet"-Placeholder die nie ein STT-Result bekommen // Aufraeumen von "verarbeitet"-Placeholder die nie ein STT-Result bekommen
// haben (leere Aufnahme, Wake-Word-Echo, STT-Fehler etc). Nach 30s werden // haben (leere Aufnahme, Wake-Word-Echo, STT-Fehler etc). Timeout skaliert
// sie automatisch entfernt damit nicht-erkannte Aufnahmen nicht den State // mit der Aufnahmedauer — Whisper braucht auf der Gamebox grob real-time/5,
// verstopfen + naechste echte Aufnahmen die richtige Bubble ersetzen koennen. // plus Bridge-Roundtrip + Network. Formel: 60s Buffer + 1x Aufnahmedauer.
const scheduleStaleAudioCleanup = useCallback((audioRequestId: string) => { // Bei 5min Aufnahme = 6 min Wait, bei 5s Aufnahme = 65s. Sicher genug damit
// langsame STTs nicht versehentlich aufgeraeumt werden.
const scheduleStaleAudioCleanup = useCallback((audioRequestId: string, recordingMs: number) => {
const timeoutMs = 60000 + recordingMs;
setTimeout(() => { setTimeout(() => {
setMessages(prev => { setMessages(prev => {
const idx = prev.findIndex(m => const idx = prev.findIndex(m =>
@@ -669,11 +672,12 @@ const ChatScreen: React.FC = () => {
m.text.includes('Spracheingabe wird verarbeitet') m.text.includes('Spracheingabe wird verarbeitet')
); );
if (idx < 0) return prev; if (idx < 0) return prev;
console.log('[Chat] Sprachnachricht ohne STT-Result entfernt: %s', audioRequestId); console.log('[Chat] Sprachnachricht ohne STT-Result nach %dms entfernt: %s',
timeoutMs, audioRequestId);
ToastAndroid.show('Sprachnachricht nicht erkannt — entfernt', ToastAndroid.SHORT); ToastAndroid.show('Sprachnachricht nicht erkannt — entfernt', ToastAndroid.SHORT);
return prev.filter((_, i) => i !== idx); return prev.filter((_, i) => i !== idx);
}); });
}, 30000); }, timeoutMs);
}, []); }, []);
const sendTextMessage = useCallback(async () => { const sendTextMessage = useCallback(async () => {
@@ -763,7 +767,7 @@ const ChatScreen: React.FC = () => {
audioRequestId, audioRequestId,
...(location && { location }), ...(location && { location }),
}); });
scheduleStaleAudioCleanup(audioRequestId); scheduleStaleAudioCleanup(audioRequestId, result.durationMs);
}, [getCurrentLocation, interruptAriaIfBusy, scheduleStaleAudioCleanup]); }, [getCurrentLocation, interruptAriaIfBusy, scheduleStaleAudioCleanup]);
// Datei auswaehlen → zur Pending-Liste hinzufuegen // Datei auswaehlen → zur Pending-Liste hinzufuegen