[[ 'role' => 'user', 'parts' => [['text' => $testMsg]] ]], 'systemInstruction' => [ 'parts' => [['text' => $systemPrompt]] ], 'generationConfig' => [ 'responseModalities' => ['AUDIO'], 'speechConfig' => [ 'voiceConfig' => [ 'prebuiltVoiceConfig' => [ 'voiceName' => 'Puck' ] ] ] ] ]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_TIMEOUT, 15); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200) { $errorData = json_decode($response, true); $errMsg = $errorData['error']['message'] ?? 'Unknown error'; echo "❌ Failed (HTTP {$httpCode}: {$errMsg})\n"; } else { $data = json_decode($response, true); $part = $data['candidates'][0]['content']['parts'][0] ?? null; if ($part && isset($part['inlineData'])) { $audioResponse = [ 'audio' => $part['inlineData']['data'], 'mimeType' => $part['inlineData']['mimeType'] ?? 'audio/mp4' ]; $successfulModel = $model; echo "✅ SUCCESS!\n"; break; // Stop at first successful model } else { echo "❌ Failed (No inlineData in response)\n"; } } } if ($successfulModel && $audioResponse && !empty($audioResponse['audio'])) { echo "\n✅ [Gemini] Successfully generated voice note using model: models/{$successfulModel}\n"; echo "ℹ️ [Gemini] Audio MimeType: " . $audioResponse['mimeType'] . "\n"; echo "ℹ️ [Gemini] Audio Size: " . strlen($audioResponse['audio']) . " base64 chars\n"; // 3. Test Audio-to-Audio conversion using the successful model echo "\n--- Testing Audio-to-Audio (Speech-to-Speech) ---\n"; $startTime = microtime(true); // We temporarily override the model inside GeminiService for this test, but since GeminiService is not updated yet, // we'll run a direct curl call for testing audio-to-audio: $url = 'https://generativelanguage.googleapis.com/v1beta/models/' . $successfulModel . ':generateContent?key=' . $apiKey; $payload2 = json_encode([ 'contents' => [ [ 'role' => 'user', 'parts' => [ [ 'inlineData' => [ 'mimeType' => $audioResponse['mimeType'], 'data' => $audioResponse['audio'] ] ], [ 'text' => "استمع إلى التسجيل الصوتي المرفق وأجب عليه مباشرة بصوتك بناءً على الإرشادات المحددة." ] ] ] ], 'systemInstruction' => [ 'parts' => [['text' => $systemPrompt]] ], 'generationConfig' => [ 'responseModalities' => ['AUDIO'], 'speechConfig' => [ 'voiceConfig' => [ 'prebuiltVoiceConfig' => [ 'voiceName' => 'Puck' ] ] ] ] ]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload2); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $response2 = curl_exec($ch); $httpCode2 = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $elapsedTime2 = round(microtime(true) - $startTime, 2); if ($httpCode2 === 200) { $data2 = json_decode($response2, true); $part2 = $data2['candidates'][0]['content']['parts'][0] ?? null; if ($part2 && isset($part2['inlineData'])) { echo "✅ [Gemini] Successfully generated Audio-to-Audio response in {$elapsedTime2} seconds!\n"; echo "ℹ️ [Gemini] Audio MimeType: " . ($part2['inlineData']['mimeType'] ?? 'audio/mp4') . "\n"; echo "ℹ️ [Gemini] Audio Size: " . strlen($part2['inlineData']['data']) . " base64 chars\n"; } else { echo "❌ [Gemini] Audio-to-Audio response did not contain inlineData.\n"; } } else { $errorData2 = json_decode($response2, true); $errMsg2 = $errorData2['error']['message'] ?? 'Unknown error'; echo "❌ [Gemini] Audio-to-Audio generation failed. HTTP {$httpCode2}: {$errMsg2}\n"; } } else { echo "\n❌ [Gemini] All model trials for audio response generation failed.\n"; } // 4. Check Node.js WhatsApp Gateway Status echo "\n--- Checking Node.js Gateway Status ---\n"; $gatewayUrl = rtrim(getenv('WHATSAPP_GATEWAY_URL') ?: 'http://localhost:3722', '/'); echo "Gateway URL: {$gatewayUrl}\n"; $ch = curl_init($gatewayUrl . '/health'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 5); $healthResponse = curl_exec($ch); $healthHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $healthError = curl_error($ch); curl_close($ch); if ($healthHttpCode === 200) { echo "✅ [Gateway] Gateway is ONLINE and healthy.\n"; echo "ℹ️ [Gateway] Response: {$healthResponse}\n"; } else { echo "❌ [Gateway] Gateway is OFFLINE or returning error. HTTP Code: {$healthHttpCode}. Error: {$healthError}\n"; } echo "\n=== Diagnostics Complete ===\n";