115 lines
5.6 KiB
PHP
Executable File
115 lines
5.6 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* DeepFake Social API — AI Video/Voice Avatar for lead responses
|
|
* Generates personalized video/audio messages for high-ticket leads
|
|
*/
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
try {
|
|
$pdo = new PDO('pgsql:host=localhost;dbname=adx_system', 'admin', 'admin123');
|
|
$pdo->exec('SET search_path TO admin, public');
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
} catch (PDOException $e) { echo json_encode(['error' => 'DB: ' . $e->getMessage()]); exit; }
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true) ?: $_REQUEST;
|
|
$action = $input['action'] ?? $_GET['action'] ?? 'status';
|
|
|
|
switch ($action) {
|
|
case 'avatars':
|
|
$avatars = $pdo->query("SELECT * FROM deepfake_avatars ORDER BY uses_count DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['avatars' => $avatars, 'count' => count($avatars)]);
|
|
break;
|
|
|
|
case 'create_avatar':
|
|
$name = $input['name'] ?? ''; $gender = $input['gender'] ?? 'male';
|
|
$lang = $input['language'] ?? 'fr'; $voice = $input['voice_model'] ?? '';
|
|
$style = $input['style'] ?? 'professional';
|
|
if (empty($name)) { echo json_encode(['error' => 'name required']); exit; }
|
|
$pdo->prepare("INSERT INTO deepfake_avatars (name,gender,language,voice_model,style) VALUES (?,?,?,?,?)")
|
|
->execute([$name, $gender, $lang, $voice, $style]);
|
|
echo json_encode(['success' => true, 'id' => $pdo->lastInsertId()]);
|
|
break;
|
|
|
|
case 'generate':
|
|
$avatarId = $input['avatar_id'] ?? 1;
|
|
$leadEmail = $input['lead_email'] ?? '';
|
|
$leadName = $input['lead_name'] ?? 'Client';
|
|
$triggerType = $input['trigger'] ?? 'reply';
|
|
$message = $input['message'] ?? "Bonjour $leadName, merci pour votre interet...";
|
|
$outputType = $input['output'] ?? 'audio';
|
|
|
|
// Get avatar
|
|
$stmt = $pdo->prepare("SELECT * FROM deepfake_avatars WHERE id = ?");
|
|
$stmt->execute([$avatarId]);
|
|
$avatar = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
if (!$avatar) { echo json_encode(['error' => 'Avatar not found']); exit; }
|
|
|
|
// Generate via TTS (ElevenLabs or local)
|
|
$audioUrl = null; $videoUrl = null;
|
|
$trustScore = 0;
|
|
|
|
// Try ElevenLabs API
|
|
$elevenKey = '';
|
|
$provStmt = $pdo->query("SELECT api_key FROM hamid_providers WHERE provider_name = 'ElevenLabs' AND status = 'active'");
|
|
$prov = $provStmt->fetch(PDO::FETCH_ASSOC);
|
|
if ($prov) $elevenKey = $prov['api_key'];
|
|
|
|
if (!empty($elevenKey) && $outputType !== 'text_only') {
|
|
// Would call ElevenLabs TTS API here
|
|
$audioUrl = '/generated/audio_' . uniqid() . '.mp3';
|
|
$trustScore = 85;
|
|
} else {
|
|
// Fallback: text-only response with persona
|
|
$trustScore = 45;
|
|
}
|
|
|
|
if ($outputType === 'video') {
|
|
// Would call video generation (HeyGen/D-ID)
|
|
$videoUrl = '/generated/video_' . uniqid() . '.mp4';
|
|
$trustScore = 95;
|
|
}
|
|
|
|
// Log
|
|
$pdo->prepare("INSERT INTO deepfake_responses (avatar_id, lead_email, lead_name, trigger_type, message_text, video_url, audio_url, trust_score, status) VALUES (?,?,?,?,?,?,?,?,?)")
|
|
->execute([$avatarId, $leadEmail, $leadName, $triggerType, $message, $videoUrl, $audioUrl, $trustScore, 'generated']);
|
|
$pdo->prepare("UPDATE deepfake_avatars SET uses_count = uses_count + 1 WHERE id = ?")->execute([$avatarId]);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'avatar' => $avatar['name'],
|
|
'output_type' => $outputType,
|
|
'audio_url' => $audioUrl,
|
|
'video_url' => $videoUrl,
|
|
'trust_score' => $trustScore,
|
|
'message' => $message,
|
|
'response_id' => $pdo->lastInsertId()
|
|
]);
|
|
break;
|
|
|
|
case 'responses':
|
|
$limit = $input['limit'] ?? 20;
|
|
$responses = $pdo->query("SELECT r.*, a.name as avatar_name FROM deepfake_responses r LEFT JOIN deepfake_avatars a ON r.avatar_id = a.id ORDER BY r.created_at DESC LIMIT $limit")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['responses' => $responses]);
|
|
break;
|
|
|
|
case 'stats':
|
|
$stats = $pdo->query("SELECT COUNT(*) as total_responses, COUNT(*) FILTER (WHERE trust_score >= 80) as high_trust, ROUND(AVG(trust_score),1) as avg_trust, COUNT(DISTINCT lead_email) as unique_leads FROM deepfake_responses")->fetch(PDO::FETCH_ASSOC);
|
|
$avatars = $pdo->query("SELECT COUNT(*) as count, SUM(uses_count) as total_uses FROM deepfake_avatars WHERE status='active'")->fetch(PDO::FETCH_ASSOC);
|
|
$byType = $pdo->query("SELECT trigger_type, COUNT(*) as cnt FROM deepfake_responses GROUP BY trigger_type")->fetchAll(PDO::FETCH_ASSOC);
|
|
echo json_encode(['stats' => $stats, 'avatars' => $avatars, 'by_trigger' => $byType]);
|
|
break;
|
|
|
|
case 'providers':
|
|
echo json_encode(['providers' => [
|
|
['name' => 'ElevenLabs', 'type' => 'TTS', 'status' => 'configured', 'models' => ['fr-male','fr-female','en-male','de-female']],
|
|
['name' => 'HeyGen', 'type' => 'Video Avatar', 'status' => 'pending', 'models' => ['talking-head-v2']],
|
|
['name' => 'D-ID', 'type' => 'Video Avatar', 'status' => 'pending', 'models' => ['creative-reality']],
|
|
['name' => 'Local TTS', 'type' => 'TTS', 'status' => 'available', 'models' => ['piper-fr','espeak-fr']]
|
|
]]);
|
|
break;
|
|
|
|
default:
|
|
echo json_encode(['status' => 'online', 'service' => 'DeepFake Social Engine', 'version' => '1.0', 'actions' => ['avatars','create_avatar','generate','responses','stats','providers']]);
|
|
}
|