File size: 2,566 Bytes
1501522 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | <?php
namespace App\Http\Controllers;
use App\Services\EdgeTtsService;
use App\Services\OpenAiImageService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class AiToolsController extends Controller
{
public function index(EdgeTtsService $tts): View
{
return view('tools.index', [
'ttsLanguages' => $tts->languageOptions(),
'ttsGenders' => $tts->genderOptions(),
]);
}
public function generateImage(Request $request, OpenAiImageService $openAiImage): RedirectResponse
{
$data = $request->validate([
'prompt' => ['required', 'string', 'max:1000'],
'aspect' => ['nullable', 'in:landscape,square,portrait'],
'image_count' => ['nullable', 'in:1,2,4,6'],
]);
$aspect = $data['aspect'] ?? 'landscape';
$imageCount = (int) ($data['image_count'] ?? 1);
try {
$imageUrls = $openAiImage->generate($data['prompt'], $aspect, $imageCount);
return redirect()->route('tools.index')->with([
'tool_image_urls' => $imageUrls,
'tool_image_url' => $imageUrls[0] ?? null,
'tool_image_prompt' => $data['prompt'],
'tool_image_aspect' => $aspect,
'tool_image_count' => $imageCount,
]);
} catch (\Throwable $e) {
return redirect()->route('tools.index')->with('tool_error', $e->getMessage())->withInput();
}
}
public function textToVoice(Request $request, EdgeTtsService $tts): RedirectResponse
{
$languageKeys = implode(',', array_keys($tts->languageOptions()));
$genderKeys = implode(',', array_keys($tts->genderOptions()));
$data = $request->validate([
'text' => ['required', 'string', 'max:2000'],
'language' => ['required', 'string', "in:{$languageKeys}"],
'gender' => ['required', 'string', "in:{$genderKeys}"],
]);
try {
$audioUrl = $tts->synthesize($data['text'], $data['language'], $data['gender']);
return redirect()->route('tools.index')->with([
'tool_audio_url' => $audioUrl,
'tool_audio_text' => $data['text'],
'tool_audio_language' => $data['language'],
'tool_audio_gender' => $data['gender'],
]);
} catch (\Throwable $e) {
return redirect()->route('tools.index')->with('tool_error', $e->getMessage())->withInput();
}
}
}
|