Files
html/api/lyria3-api.php
2026-04-12 22:57:03 +02:00

101 lines
3.1 KiB
PHP

<?php
/**
* WEVAL Lyria 3 API — Génération musique IA souveraine
* Endpoint: /api/lyria3-api.php
* Usage: POST {prompt:"upbeat jazz track", duration:"clip"|"pro"}
* GET ?k=WEVADS2026&action=status
*/
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }
$GEMINI_KEY = "AIzaSyCMbYKyTldlCjg2eSCtwNONX9mMomhmIM4";
// Status check
if (($_GET['action'] ?? '') === 'status') {
echo json_encode(["ok"=>true,"service"=>"WEVAL Lyria 3","models"=>["lyria-3-clip-preview","lyria-3-pro-preview"],"provider"=>"Google Gemini API","status"=>"active"]);
exit;
}
// POST: Generate music
$input = json_decode(file_get_contents('php://input'), true);
$prompt = $input['prompt'] ?? $_POST['prompt'] ?? '';
$model = ($input['duration'] ?? $_POST['duration'] ?? 'clip') === 'pro' ? 'lyria-3-pro-preview' : 'lyria-3-clip-preview';
if (!$prompt) {
echo json_encode(["ok"=>false,"error"=>"prompt required"]);
exit;
}
// Call Gemini API with Lyria 3
$url = "https://generativelanguage.googleapis.com/v1beta/models/{$model}:generateContent?key={$GEMINI_KEY}";
$payload = json_encode([
"contents" => [["parts" => [["text" => $prompt]]]],
"generationConfig" => ["responseModalities" => ["AUDIO", "TEXT"]]
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
CURLOPT_SSL_VERIFYPEER => false,
]);
$resp = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($resp, true);
if ($code !== 200 || !$data) {
echo json_encode(["ok"=>false,"error"=>"Lyria API error","http"=>$code,"details"=>$data['error']['message'] ?? substr($resp,0,200)]);
exit;
}
// Extract audio + lyrics from response
$audio = null;
$lyrics = null;
$parts = $data['candidates'][0]['content']['parts'] ?? [];
foreach ($parts as $part) {
if (isset($part['inlineData'])) {
$audio = [
"mime" => $part['inlineData']['mimeType'] ?? 'audio/mpeg',
"data" => $part['inlineData']['data'] ?? null, // base64
"size" => strlen($part['inlineData']['data'] ?? '')
];
}
if (isset($part['text'])) {
$lyrics = ($lyrics ? $lyrics . "\n" : '') . $part['text'];
}
}
if ($audio && $audio['data']) {
// Save audio file
$filename = 'lyria3_' . date('Ymd_His') . '_' . substr(md5($prompt), 0, 6) . '.mp3';
$path = "/var/www/html/audio/{$filename}";
@mkdir('/var/www/html/audio', 0755, true);
file_put_contents($path, base64_decode($audio['data']));
echo json_encode([
"ok" => true,
"model" => $model,
"prompt" => $prompt,
"audio_url" => "/audio/{$filename}",
"audio_size" => filesize($path),
"lyrics" => $lyrics,
"mime" => $audio['mime']
]);
} else {
echo json_encode([
"ok" => false,
"error" => "No audio in response",
"lyrics" => $lyrics,
"raw_parts" => count($parts)
]);
}