Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e95eacd11 | |||
| ece08f0f2f | |||
| 31fd0d7f7a | |||
| 263835ad74 |
@@ -79,8 +79,8 @@ android {
|
||||
applicationId "com.ariacockpit"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 10803
|
||||
versionName "0.1.8.3"
|
||||
versionCode 10805
|
||||
versionName "0.1.8.5"
|
||||
// Fallback fuer Libraries mit Product Flavors
|
||||
missingDimensionStrategy 'react-native-camera', 'general'
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "aria-cockpit",
|
||||
"version": "0.1.8.3",
|
||||
"version": "0.1.8.5",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"android": "react-native run-android",
|
||||
|
||||
@@ -1263,11 +1263,30 @@ const ChatScreen: React.FC = () => {
|
||||
return () => { unsubUpdate(); clearTimeout(timer); };
|
||||
}, []);
|
||||
|
||||
// Gespraechsmodus: Nach TTS-Wiedergabe automatisch Aufnahme starten
|
||||
// Gespraechsmodus: Nach TTS-Wiedergabe weiter im Multi-Turn (Conversation-
|
||||
// Window) oder zurueck zu armed (Wake-Word lauscht wieder)?
|
||||
//
|
||||
// Foreground → resume() oeffnet das Mikro fuer N Sekunden Follow-Up
|
||||
// (natuerlicher Dialog moeglich ohne erneutes "Computer")
|
||||
// Background → endConversation() — Wake-Word direkt wieder armed.
|
||||
//
|
||||
// Grund: der setTimeout(800ms) in resume() wird im Doze stark verzoegert
|
||||
// (siehe Wake-Detect-Bug von 0.1.7.0). Das hat zwei nervige Folgen:
|
||||
// 1) Wake-Word ist solange "tot" — User kann ARIA nicht mehr triggern
|
||||
// bis er die App vorholt
|
||||
// 2) Wenn er die App dann vorholt, oeffnet der verspaetete Timer das
|
||||
// Mikro — sieht aus wie ein Phantom-Wake-Word-Trigger
|
||||
// Background = User nutzt das Handy anderweitig, das Multi-Turn-Konzept
|
||||
// ist da eh nicht nuetzlich. Direkt re-armen ist robust und erwartungs-
|
||||
// konform.
|
||||
useEffect(() => {
|
||||
const unsubPlayback = audioService.onPlaybackFinished(() => {
|
||||
if (wakeWordService.isActive()) {
|
||||
if (!wakeWordService.isActive()) return;
|
||||
if (AppState.currentState === 'active') {
|
||||
wakeWordService.resume();
|
||||
} else {
|
||||
console.log('[Chat] TTS fertig im Background → endConversation (kein Multi-Turn)');
|
||||
wakeWordService.endConversation().catch(() => {});
|
||||
}
|
||||
});
|
||||
return () => unsubPlayback();
|
||||
|
||||
@@ -346,19 +346,34 @@ class WakeWordService {
|
||||
* Ohne: zurueck zu 'off'.
|
||||
*/
|
||||
async endConversation(): Promise<void> {
|
||||
if (this.state !== 'conversing') return;
|
||||
if (this.state !== 'conversing') {
|
||||
// Nicht in conversing — typ. nach App-Resume bevor Streaming endete.
|
||||
// Trotzdem loggen damit wir's im Diagnostic sehen.
|
||||
import('./logger').then(m => m.reportAppDebug('wake.end',
|
||||
`endConversation called but state=${this.state} → noop`)).catch(()=>{});
|
||||
return;
|
||||
}
|
||||
import('./logger').then(m => m.reportAppDebug('wake.end',
|
||||
`endConversation called, nativeReady=${this.nativeReady}, calling OpenWakeWord.start()`)).catch(()=>{});
|
||||
if (this.nativeReady && OpenWakeWord) {
|
||||
try {
|
||||
await OpenWakeWord.start();
|
||||
console.log('[WakeWord] Konversation zu Ende — zurueck zu armed');
|
||||
import('./logger').then(m => m.reportAppDebug('wake.end',
|
||||
`OpenWakeWord.start() OK → state=armed, keyword=${this.keyword}`)).catch(()=>{});
|
||||
ToastAndroid.show(`Lausche wieder auf "${KEYWORD_LABELS[this.keyword]}"`, ToastAndroid.SHORT);
|
||||
this.setState('armed');
|
||||
return;
|
||||
} catch (err) {
|
||||
} catch (err: any) {
|
||||
console.warn('[WakeWord] re-arm fehlgeschlagen:', err);
|
||||
import('./logger').then(m => m.reportAppDebug('wake.end',
|
||||
`OpenWakeWord.start() FAIL: ${err?.message || err} → state=off`,
|
||||
)).catch(()=>{});
|
||||
}
|
||||
}
|
||||
console.log('[WakeWord] Konversation zu Ende — Ohr aus');
|
||||
import('./logger').then(m => m.reportAppDebug('wake.end',
|
||||
`fallback: nativeReady=${this.nativeReady} → state=off`)).catch(()=>{});
|
||||
ToastAndroid.show('Mikro aus', ToastAndroid.SHORT);
|
||||
this.setState('off');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user