Implement Gemini audio voice note replies

This commit is contained in:
Hamza-Ayed
2026-05-22 15:10:13 +03:00
parent 395c8ee8eb
commit 2e7cd11f85
5 changed files with 264 additions and 13 deletions

View File

@@ -318,6 +318,7 @@ class WhatsAppController extends BaseController
}
$replyText = null;
$replyAudio = null;
if ($rule['trigger_type'] === 'keyword') {
if (empty($incomingText)) {
@@ -372,7 +373,15 @@ class WhatsAppController extends BaseController
if (strpos($mimeType, ';') !== false) {
$mimeType = trim(explode(';', $mimeType)[0]);
}
$replyText = \App\Services\GeminiService::generateResponseFromAudio($apiKey, $systemPrompt, $msgData['audio'], $mimeType);
// Try generating native audio response first
$audioResponse = \App\Services\GeminiService::generateAudioResponseFromAudio($apiKey, $systemPrompt, $msgData['audio'], $mimeType);
if ($audioResponse && !empty($audioResponse['audio'])) {
$replyAudio = $audioResponse['audio'];
$replyText = '[صوت من الذكاء الاصطناعي]';
} else {
// Fallback to text output from audio
$replyText = \App\Services\GeminiService::generateResponseFromAudio($apiKey, $systemPrompt, $msgData['audio'], $mimeType);
}
} elseif ($hasImage) {
$mimeType = $msgData['imageMimeType'];
if (strpos($mimeType, ';') !== false) {
@@ -388,9 +397,9 @@ class WhatsAppController extends BaseController
}
}
if (!empty($replyText)) {
if (!empty($replyText) || !empty($replyAudio)) {
// Check if the reply contains [PAYMENT_RECEIPT: { ... }] tag from Gemini
if (preg_match('/\[PAYMENT_RECEIPT:\s*(\{.*?\})\]/s', $replyText, $matches)) {
if (!empty($replyText) && preg_match('/\[PAYMENT_RECEIPT:\s*(\{.*?\})\]/s', $replyText, $matches)) {
$jsonStr = $matches[1];
// Strip the tag from the final reply sent to user
$replyText = trim(str_replace($matches[0], '', $replyText));
@@ -410,11 +419,16 @@ class WhatsAppController extends BaseController
$sendUrl = $gatewayUrl . '/api/messages/send';
}
$payload = json_encode([
$payloadData = [
'session_key' => $session['session_key'],
'phone' => $msgData['phone'],
'message' => $replyText
]);
'phone' => $msgData['phone']
];
if (!empty($replyAudio)) {
$payloadData['audio'] = $replyAudio;
} else {
$payloadData['message'] = $replyText;
}
$payload = json_encode($payloadData);
$ch = curl_init($sendUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@@ -450,7 +464,7 @@ class WhatsAppController extends BaseController
'session_id' => $session['id'],
'contact_phone' => $msgData['phone'],
'direction' => 'outbound',
'message_type' => 'text',
'message_type' => !empty($replyAudio) ? 'audio' : 'text',
'message_body' => $replyText,
'whatsapp_message_id' => $waMsgId,
'status' => $status,