diff --git a/backend/app/Services/GeminiService.php b/backend/app/Services/GeminiService.php index 91e1d0e..0438219 100644 --- a/backend/app/Services/GeminiService.php +++ b/backend/app/Services/GeminiService.php @@ -218,7 +218,7 @@ class GeminiService */ public static function generateAudioResponse(string $apiKey, string $systemPrompt, string $userMessage, string $voiceName = 'Puck'): ?array { - $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent?key=' . $apiKey; + $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=' . $apiKey; $payload = json_encode([ 'contents' => [ @@ -280,7 +280,7 @@ class GeminiService */ public static function generateAudioResponseFromAudio(string $apiKey, string $systemPrompt, string $audioBase64, string $mimeType, string $voiceName = 'Puck'): ?array { - $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent?key=' . $apiKey; + $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=' . $apiKey; if (strpos($mimeType, ';') !== false) { $mimeType = trim(explode(';', $mimeType)[0]); diff --git a/backend/public/test_audio.php b/backend/public/test_audio.php index f6f5b89..28d180e 100644 --- a/backend/public/test_audio.php +++ b/backend/public/test_audio.php @@ -38,32 +38,77 @@ echo "\n--- Testing Gemini Audio Response ---\n"; $systemPrompt = "You are a friendly customer service assistant. Speak in a warm, welcoming tone."; $testMsg = "مرحبا، هل متجركم مفتوح اليوم؟"; -echo "Sending text prompt: '$testMsg'\n"; -$startTime = microtime(true); -$audioResponse = GeminiService::generateAudioResponse($apiKey, $systemPrompt, $testMsg, 'Puck'); -$elapsedTime = round(microtime(true) - $startTime, 2); + // Test via cURL directly to dump exact error + $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=' . $apiKey; + $payload = json_encode([ + 'contents' => [[ + 'role' => 'user', + 'parts' => [['text' => $testMsg]] + ]], + 'systemInstruction' => [ + 'parts' => [['text' => $systemPrompt]] + ], + 'generationConfig' => [ + 'responseModalities' => ['AUDIO'], + 'speechConfig' => [ + 'voiceConfig' => [ + 'prebuiltVoiceConfig' => [ + 'voiceName' => 'Puck' + ] + ] + ] + ] + ]); -if ($audioResponse && !empty($audioResponse['audio'])) { - echo "✅ [Gemini] Successfully generated voice note in {$elapsedTime} seconds!\n"; - echo "ℹ️ [Gemini] Audio MimeType: " . $audioResponse['mimeType'] . "\n"; - echo "ℹ️ [Gemini] Audio Size: " . strlen($audioResponse['audio']) . " base64 chars\n"; - - // 3. Test Audio-to-Audio conversion - echo "\n--- Testing Audio-to-Audio (Speech-to-Speech) ---\n"; - $startTime = microtime(true); - $audioResponse2 = GeminiService::generateAudioResponseFromAudio($apiKey, $systemPrompt, $audioResponse['audio'], $audioResponse['mimeType'], 'Puck'); - $elapsedTime2 = round(microtime(true) - $startTime, 2); - - if ($audioResponse2 && !empty($audioResponse2['audio'])) { - echo "✅ [Gemini] Successfully generated Audio-to-Audio response in {$elapsedTime2} seconds!\n"; - echo "ℹ️ [Gemini] Audio MimeType: " . $audioResponse2['mimeType'] . "\n"; - echo "ℹ️ [Gemini] Audio Size: " . strlen($audioResponse2['audio']) . " base64 chars\n"; + $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, 30); + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + echo "❌ [Gemini API Error] HTTP Status: " . $httpCode . "\n"; + echo "Response Payload: " . $response . "\n"; + $audioResponse = null; } else { - echo "❌ [Gemini] Audio-to-Audio generation failed. Check errors below:\n"; + $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' + ]; + } else { + echo "❌ [Gemini API Error] Response did not contain inlineData. Response: " . $response . "\n"; + $audioResponse = null; + } + } + + if ($audioResponse && !empty($audioResponse['audio'])) { + echo "✅ [Gemini] Successfully generated voice note!\n"; + echo "ℹ️ [Gemini] Audio MimeType: " . $audioResponse['mimeType'] . "\n"; + echo "ℹ️ [Gemini] Audio Size: " . strlen($audioResponse['audio']) . " base64 chars\n"; + + // 3. Test Audio-to-Audio conversion + echo "\n--- Testing Audio-to-Audio (Speech-to-Speech) ---\n"; + $startTime = microtime(true); + $audioResponse2 = GeminiService::generateAudioResponseFromAudio($apiKey, $systemPrompt, $audioResponse['audio'], $audioResponse['mimeType'], 'Puck'); + $elapsedTime2 = round(microtime(true) - $startTime, 2); + + if ($audioResponse2 && !empty($audioResponse2['audio'])) { + echo "✅ [Gemini] Successfully generated Audio-to-Audio response in {$elapsedTime2} seconds!\n"; + echo "ℹ️ [Gemini] Audio MimeType: " . $audioResponse2['mimeType'] . "\n"; + echo "ℹ️ [Gemini] Audio Size: " . strlen($audioResponse2['audio']) . " base64 chars\n"; + } else { + echo "❌ [Gemini] Audio-to-Audio generation failed.\n"; + } + } else { + echo "❌ [Gemini] Audio response generation failed.\n"; } -} else { - echo "❌ [Gemini] Audio response generation failed. Please check the logs.\n"; -} // 4. Check Node.js WhatsApp Gateway Status echo "\n--- Checking Node.js Gateway Status ---\n";