Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 91760dd2e1 | |||
| 3c2e537420 |
@@ -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 10801
|
versionCode 10802
|
||||||
versionName "0.1.8.1"
|
versionName "0.1.8.2"
|
||||||
// Fallback fuer Libraries mit Product Flavors
|
// Fallback fuer Libraries mit Product Flavors
|
||||||
missingDimensionStrategy 'react-native-camera', 'general'
|
missingDimensionStrategy 'react-native-camera', 'general'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aria-cockpit",
|
"name": "aria-cockpit",
|
||||||
"version": "0.1.8.1",
|
"version": "0.1.8.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
|
|||||||
@@ -390,15 +390,35 @@ class WakeWordService {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Nach ARIA-Antwort (TTS fertig): naechste Aufnahme im Conversation-Window starten */
|
/** Nach ARIA-Antwort (TTS fertig): naechste Aufnahme im Conversation-Window starten.
|
||||||
|
*
|
||||||
|
* WICHTIG: setTimeout(800ms) kann im Hintergrund (Display aus) verspaetet
|
||||||
|
* feuern — JS-Thread ist geparkt. Wenn der Timer >2s ueberfaellig ist,
|
||||||
|
* hat der User offensichtlich die App verlassen und kommt erst spaeter
|
||||||
|
* wieder — wir oeffnen das Mikro dann NICHT, sondern beenden die
|
||||||
|
* Konversation. Sonst sieht der User nach dem App-Resume "Mikro plus-
|
||||||
|
* aufnahme laeuft" obwohl er gar nichts gesagt hat → wirkt wie Phantom-
|
||||||
|
* Wake-Word. Klassische Doze-Throttling-Falle wie bei wake.detect frueher. */
|
||||||
async resume(): Promise<void> {
|
async resume(): Promise<void> {
|
||||||
if (this.state !== 'conversing') return;
|
if (this.state !== 'conversing') return;
|
||||||
|
const scheduledAt = Date.now();
|
||||||
// Kurze Pause damit TTS-Audio nicht ins Mikrofon geht
|
// Kurze Pause damit TTS-Audio nicht ins Mikrofon geht
|
||||||
await new Promise(resolve => setTimeout(resolve, 800));
|
await new Promise(resolve => setTimeout(resolve, 800));
|
||||||
if (this.state === 'conversing') {
|
if (this.state !== 'conversing') return;
|
||||||
console.log('[WakeWord] TTS fertig — naechste Aufnahme im Conversation-Window');
|
const delay = Date.now() - scheduledAt;
|
||||||
this.wakeCallbacks.forEach(cb => cb());
|
if (delay > 2800) {
|
||||||
|
// Timer war stark verspaetet — JS-Thread war im Hintergrund geparkt.
|
||||||
|
// Conversation als beendet behandeln statt das Mikro zu oeffnen.
|
||||||
|
console.log('[WakeWord] resume(): %dms statt ~800ms — App war im Background. endConversation statt mic-open', delay);
|
||||||
|
import('./logger').then(m => m.reportAppDebug('wake.resume',
|
||||||
|
`delayed ${delay}ms (>2800) — endConversation statt mic-open`)).catch(()=>{});
|
||||||
|
// Asynchroner Aufruf — endConversation ist async, kein await damit wir
|
||||||
|
// hier nicht in einem Promise-Chain haengen.
|
||||||
|
this.endConversation().catch(() => {});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
console.log('[WakeWord] TTS fertig — naechste Aufnahme im Conversation-Window (delay=%dms)', delay);
|
||||||
|
this.wakeCallbacks.forEach(cb => cb());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** True solange das Ohr aktiv ist (armed ODER conversing). */
|
/** True solange das Ohr aktiv ist (armed ODER conversing). */
|
||||||
|
|||||||
Reference in New Issue
Block a user