101 lines
3.1 KiB
PHP
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)
|
|
]);
|
|
}
|