@mobileai/react-native 0.4.6 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -4
- package/lib/module/components/AIAgent.js +179 -38
- package/lib/module/components/AIAgent.js.map +1 -1
- package/lib/module/components/AgentChatBar.js +53 -29
- package/lib/module/components/AgentChatBar.js.map +1 -1
- package/lib/module/components/Icons.js +337 -0
- package/lib/module/components/Icons.js.map +1 -0
- package/lib/module/core/AgentRuntime.js +74 -3
- package/lib/module/core/AgentRuntime.js.map +1 -1
- package/lib/module/core/systemPrompt.js +66 -39
- package/lib/module/core/systemPrompt.js.map +1 -1
- package/lib/module/index.js +3 -9
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/AudioInputService.js +73 -2
- package/lib/module/services/AudioInputService.js.map +1 -1
- package/lib/module/services/AudioOutputService.js +58 -5
- package/lib/module/services/AudioOutputService.js.map +1 -1
- package/lib/module/services/VoiceService.js +281 -275
- package/lib/module/services/VoiceService.js.map +1 -1
- package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
- package/lib/typescript/src/components/AgentChatBar.d.ts.map +1 -1
- package/lib/typescript/src/components/Icons.d.ts +43 -0
- package/lib/typescript/src/components/Icons.d.ts.map +1 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts +12 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts.map +1 -1
- package/lib/typescript/src/core/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/services/AudioInputService.d.ts +13 -0
- package/lib/typescript/src/services/AudioInputService.d.ts.map +1 -1
- package/lib/typescript/src/services/AudioOutputService.d.ts.map +1 -1
- package/lib/typescript/src/services/VoiceService.d.ts +38 -29
- package/lib/typescript/src/services/VoiceService.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/AIAgent.tsx +192 -39
- package/src/components/AgentChatBar.tsx +44 -25
- package/src/components/Icons.tsx +253 -0
- package/src/core/AgentRuntime.ts +70 -3
- package/src/core/systemPrompt.ts +66 -39
- package/src/index.ts +8 -8
- package/src/services/AudioInputService.ts +77 -2
- package/src/services/AudioOutputService.ts +59 -5
- package/src/services/VoiceService.ts +278 -290
|
@@ -45,6 +45,23 @@ export class AudioOutputService {
|
|
|
45
45
|
}
|
|
46
46
|
const sampleRate = this.config.sampleRate || GEMINI_OUTPUT_SAMPLE_RATE;
|
|
47
47
|
|
|
48
|
+
// Configure audio session for duplex audio (simultaneous mic + speaker)
|
|
49
|
+
// BEFORE creating AudioContext. This enables hardware-level AEC, AGC,
|
|
50
|
+
// and noise suppression through the OS — no extra library needed.
|
|
51
|
+
try {
|
|
52
|
+
const {
|
|
53
|
+
AudioManager
|
|
54
|
+
} = audioApi;
|
|
55
|
+
AudioManager.setAudioSessionOptions({
|
|
56
|
+
iosCategory: 'playAndRecord',
|
|
57
|
+
iosMode: 'voiceChat',
|
|
58
|
+
iosOptions: ['defaultToSpeaker', 'allowBluetoothHFP']
|
|
59
|
+
});
|
|
60
|
+
logger.info('AudioOutput', '🔊 Audio session configured: playAndRecord + voiceChat (hardware AEC enabled)');
|
|
61
|
+
} catch (sessionErr) {
|
|
62
|
+
logger.warn('AudioOutput', `⚠️ AudioManager setup failed: ${sessionErr?.message || sessionErr} — continuing with default session`);
|
|
63
|
+
}
|
|
64
|
+
|
|
48
65
|
// Create AudioContext at Gemini's output sample rate
|
|
49
66
|
this.audioContext = new audioApi.AudioContext({
|
|
50
67
|
sampleRate
|
|
@@ -59,6 +76,13 @@ export class AudioOutputService {
|
|
|
59
76
|
this.queueSourceNode = this.audioContext.createBufferQueueSource();
|
|
60
77
|
this.queueSourceNode.connect(this.gainNode);
|
|
61
78
|
logger.info('AudioOutput', `Initialized (${sampleRate}Hz, AudioBufferQueueSourceNode)`);
|
|
79
|
+
|
|
80
|
+
// CRITICAL: Resume AudioContext — it starts in 'suspended' state.
|
|
81
|
+
// Per Web Audio API spec, audio won't render until context is 'running'.
|
|
82
|
+
if (this.audioContext.state === 'suspended') {
|
|
83
|
+
await this.audioContext.resume();
|
|
84
|
+
logger.info('AudioOutput', `AudioContext resumed: state=${this.audioContext.state}`);
|
|
85
|
+
}
|
|
62
86
|
return true;
|
|
63
87
|
} catch (error) {
|
|
64
88
|
logger.error('AudioOutput', `Failed to initialize: ${error.message}`);
|
|
@@ -71,7 +95,14 @@ export class AudioOutputService {
|
|
|
71
95
|
|
|
72
96
|
/** Add a base64-encoded PCM chunk from Gemini to the playback queue */
|
|
73
97
|
enqueue(base64Audio) {
|
|
74
|
-
|
|
98
|
+
// LOG EVERY CALL — we need full visibility
|
|
99
|
+
if (this.chunkCount < 5 || this.chunkCount % 50 === 0) {
|
|
100
|
+
logger.info('AudioOutput', `📥 enqueue() called #${this.chunkCount + 1}: b64len=${base64Audio.length}, muted=${this.muted}, ctx=${!!this.audioContext}, ctxState=${this.audioContext?.state || 'null'}, queue=${!!this.queueSourceNode}, started=${this.isStarted}, gain=${this.gainNode?.gain?.value}`);
|
|
101
|
+
}
|
|
102
|
+
if (this.muted || !this.audioContext || !this.queueSourceNode) {
|
|
103
|
+
logger.warn('AudioOutput', `⚠️ enqueue() SKIPPED #${this.chunkCount}: muted=${this.muted}, ctx=${!!this.audioContext}, queue=${!!this.queueSourceNode}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
75
106
|
try {
|
|
76
107
|
this.chunkCount++;
|
|
77
108
|
|
|
@@ -79,25 +110,38 @@ export class AudioOutputService {
|
|
|
79
110
|
const float32Data = base64ToFloat32(base64Audio);
|
|
80
111
|
const sampleRate = this.config.sampleRate || GEMINI_OUTPUT_SAMPLE_RATE;
|
|
81
112
|
|
|
113
|
+
// Diagnostic on first 3 chunks
|
|
114
|
+
if (this.chunkCount <= 3) {
|
|
115
|
+
let peakAmp = 0;
|
|
116
|
+
for (let i = 0; i < float32Data.length; i++) {
|
|
117
|
+
const abs = Math.abs(float32Data[i] || 0);
|
|
118
|
+
if (abs > peakAmp) peakAmp = abs;
|
|
119
|
+
}
|
|
120
|
+
logger.info('AudioOutput', `🔍 Chunk #${this.chunkCount}: ${base64Audio.length} b64 → ${float32Data.length} samples, peakAmp=${peakAmp.toFixed(4)}, rate=${sampleRate}`);
|
|
121
|
+
}
|
|
122
|
+
|
|
82
123
|
// Create an AudioBuffer and fill it with PCM data
|
|
83
124
|
const audioBuffer = this.audioContext.createBuffer(1, float32Data.length, sampleRate);
|
|
84
125
|
audioBuffer.copyToChannel(float32Data, 0);
|
|
85
126
|
|
|
86
127
|
// Enqueue the buffer for gapless playback
|
|
87
128
|
this.queueSourceNode.enqueueBuffer(audioBuffer);
|
|
129
|
+
if (this.chunkCount <= 3) {
|
|
130
|
+
logger.info('AudioOutput', `✅ Buffer enqueued #${this.chunkCount}`);
|
|
131
|
+
}
|
|
88
132
|
|
|
89
133
|
// Start playback on first enqueue
|
|
90
134
|
if (!this.isStarted) {
|
|
91
135
|
this.queueSourceNode.start();
|
|
92
136
|
this.isStarted = true;
|
|
93
137
|
this.config.onPlaybackStart?.();
|
|
94
|
-
logger.info('AudioOutput',
|
|
138
|
+
logger.info('AudioOutput', `▶️ Playback started — ctxState=${this.audioContext?.state}`);
|
|
95
139
|
}
|
|
96
140
|
if (this.chunkCount % 20 === 0) {
|
|
97
|
-
logger.
|
|
141
|
+
logger.info('AudioOutput', `Queued chunk #${this.chunkCount}`);
|
|
98
142
|
}
|
|
99
143
|
} catch (error) {
|
|
100
|
-
logger.error('AudioOutput',
|
|
144
|
+
logger.error('AudioOutput', `❌ Enqueue error #${this.chunkCount}: ${error.message}\n${error.stack?.substring(0, 300)}`);
|
|
101
145
|
}
|
|
102
146
|
}
|
|
103
147
|
|
|
@@ -131,8 +175,17 @@ export class AudioOutputService {
|
|
|
131
175
|
}
|
|
132
176
|
this.isStarted = false;
|
|
133
177
|
this.chunkCount = 0;
|
|
178
|
+
|
|
179
|
+
// Web Audio API: once a source node is stopped, it CANNOT be restarted.
|
|
180
|
+
// We must create a fresh AudioBufferQueueSourceNode for the next session.
|
|
181
|
+
if (this.audioContext && this.gainNode) {
|
|
182
|
+
this.queueSourceNode = this.audioContext.createBufferQueueSource();
|
|
183
|
+
this.queueSourceNode.connect(this.gainNode);
|
|
184
|
+
logger.info('AudioOutput', 'Playback stopped — fresh queue node created for next session');
|
|
185
|
+
} else {
|
|
186
|
+
logger.info('AudioOutput', 'Playback stopped');
|
|
187
|
+
}
|
|
134
188
|
this.config.onPlaybackEnd?.();
|
|
135
|
-
logger.info('AudioOutput', 'Playback stopped');
|
|
136
189
|
} catch (error) {
|
|
137
190
|
logger.error('AudioOutput', `Stop error: ${error.message}`);
|
|
138
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["logger","base64ToFloat32","GEMINI_OUTPUT_SAMPLE_RATE","AudioOutputService","audioContext","queueSourceNode","gainNode","muted","isStarted","chunkCount","constructor","config","initialize","audioApi","require","msg","error","onError","sampleRate","AudioContext","createGain","gain","value","connect","destination","createBufferQueueSource","
|
|
1
|
+
{"version":3,"names":["logger","base64ToFloat32","GEMINI_OUTPUT_SAMPLE_RATE","AudioOutputService","audioContext","queueSourceNode","gainNode","muted","isStarted","chunkCount","constructor","config","initialize","audioApi","require","msg","error","onError","sampleRate","AudioManager","setAudioSessionOptions","iosCategory","iosMode","iosOptions","info","sessionErr","warn","message","AudioContext","createGain","gain","value","connect","destination","createBufferQueueSource","state","resume","enqueue","base64Audio","length","float32Data","peakAmp","i","abs","Math","toFixed","audioBuffer","createBuffer","copyToChannel","enqueueBuffer","start","onPlaybackStart","stack","substring","mute","unmute","isMuted","stop","clearBuffers","onPlaybackEnd","cleanup","close"],"sourceRoot":"../../../src","sources":["services/AudioOutputService.ts"],"mappings":"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","ignoreList":[]}
|