Deploy: 2026-05-23 01:28:41
This commit is contained in:
@@ -67,6 +67,7 @@ class OTPController extends BaseController
|
||||
}
|
||||
|
||||
// 2. Check SaaS subscription quotas
|
||||
$useElevenLabs = false;
|
||||
if ($companyId !== 1) {
|
||||
$activeSub = CompanySubscription::findActiveByCompany($companyId);
|
||||
if (!$activeSub) {
|
||||
@@ -80,18 +81,18 @@ class OTPController extends BaseController
|
||||
}
|
||||
|
||||
if ($type === 'voice') {
|
||||
if (!CompanySubscriptionUsage::hasRemainingLimit($companyId, 'voice')) {
|
||||
$response->status(403)->json(['error' => 'Voice request quota exceeded. Please upgrade your plan.']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Starter plan doesn't support Voice Notes
|
||||
$features = json_decode($activeSub['features'] ?: '{}', true);
|
||||
if (isset($features['voice']) && !$features['voice']) {
|
||||
$response->status(403)->json(['error' => 'Voice OTP is not supported in your current subscription plan.']);
|
||||
return;
|
||||
$voiceFeatureEnabled = isset($features['voice']) ? (bool)$features['voice'] : false;
|
||||
$hasVoiceLimit = CompanySubscriptionUsage::hasRemainingLimit($companyId, 'voice');
|
||||
|
||||
if ($voiceFeatureEnabled && $hasVoiceLimit) {
|
||||
$useElevenLabs = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($type === 'voice') {
|
||||
$useElevenLabs = true;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Generate verification code
|
||||
@@ -99,19 +100,48 @@ class OTPController extends BaseController
|
||||
|
||||
// 4. Send Message
|
||||
try {
|
||||
$usedElevenLabs = false;
|
||||
if ($type === 'voice') {
|
||||
// Spacing the digits to force slow Arabic pronunciation: e.g. "1 2 3 4"
|
||||
$spacedCode = implode(' ', str_split($code));
|
||||
$textToRead = "رمز التحقق الخاص بك هو: {$spacedCode}. أكرر، رمز التحقق هو: {$spacedCode}.";
|
||||
|
||||
$audioBase64 = TTSService::textToSpeechArabic($textToRead);
|
||||
$audioBase64 = null;
|
||||
$mimeType = 'audio/mp3';
|
||||
|
||||
if ($useElevenLabs) {
|
||||
$rule = \App\Models\ChatbotRule::findActiveForRule($companyId, $session['id']);
|
||||
$configuredElKey = ($rule && !empty($rule['elevenlabs_api_key'])) ? $rule['elevenlabs_api_key'] : null;
|
||||
$elApiKey = \App\Services\GeminiService::getElevenLabsApiKey($configuredElKey);
|
||||
|
||||
$configuredVoiceId = ($rule && !empty($rule['elevenlabs_voice_id'])) ? $rule['elevenlabs_voice_id'] : null;
|
||||
$elVoiceId = \App\Services\GeminiService::getElevenLabsVoiceId($configuredVoiceId);
|
||||
|
||||
if (!empty($elApiKey)) {
|
||||
$elVoiceId = !empty($elVoiceId) ? $elVoiceId : 'pNInz6obpgDQGcFmaJgB'; // Default to Adam
|
||||
$audioData = \App\Services\GeminiService::generateAudioResponseWithElevenLabs($elApiKey, $textToRead, $elVoiceId);
|
||||
if ($audioData) {
|
||||
$audioBase64 = $audioData['audio'];
|
||||
$mimeType = $audioData['mimeType'];
|
||||
$usedElevenLabs = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$audioBase64) {
|
||||
// Fallback to Google Translate TTS
|
||||
$audioBase64 = TTSService::textToSpeechArabic($textToRead);
|
||||
$mimeType = 'audio/mp3';
|
||||
$usedElevenLabs = false;
|
||||
}
|
||||
|
||||
if (!$audioBase64) {
|
||||
$response->status(500)->json(['error' => 'Failed to generate voice OTP audio.']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Send voice note
|
||||
ConversationFlowEngine::sendReply($session, $phone, '', null, $audioBase64, 'audio/mp3');
|
||||
ConversationFlowEngine::sendReply($session, $phone, '', null, $audioBase64, $mimeType);
|
||||
} else {
|
||||
// Send text
|
||||
$textMsg = "رمز التحقق الخاص بك لمتجر نابه هو: *{$code}* \n الرجاء عدم مشاركته مع أي شخص.";
|
||||
@@ -121,7 +151,7 @@ class OTPController extends BaseController
|
||||
// Increment usage stats
|
||||
if ($companyId !== 1) {
|
||||
CompanySubscriptionUsage::incrementUsage($companyId, 'request');
|
||||
if ($type === 'voice') {
|
||||
if ($type === 'voice' && $usedElevenLabs) {
|
||||
CompanySubscriptionUsage::incrementUsage($companyId, 'voice');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user