indonesianTTSService = new IndonesianTTSService(); } /** * Show Indonesian TTS settings page */ public function index(): View { return view('admin.indonesian-tts.index'); } /** * Generate TTS audio for queue call */ public function generateQueueCall(Request $request): JsonResponse { $request->validate([ 'poli_name' => 'required|string', 'queue_number' => 'required|string' ]); $poliName = $request->input('poli_name'); $queueNumber = $request->input('queue_number'); $result = $this->indonesianTTSService->generateQueueCall($poliName, $queueNumber); return response()->json($result); } /** * Create complete audio sequence for queue call */ public function createAudioSequence(Request $request): JsonResponse { $request->validate([ 'poli_name' => 'required|string', 'queue_number' => 'required|string' ]); $poliName = $request->input('poli_name'); $queueNumber = $request->input('queue_number'); $audioSequence = $this->indonesianTTSService->createCompleteAudioSequence($poliName, $queueNumber); return response()->json([ 'success' => true, 'audio_sequence' => $audioSequence, 'poli_name' => $poliName, 'queue_number' => $queueNumber ]); } /** * Check Indonesian TTS status */ public function checkStatus(): JsonResponse { $status = [ 'indonesian_tts_available' => $this->indonesianTTSService->isIndonesianTTSAvailable(), 'coqui_tts_installed' => $this->indonesianTTSService->isCoquiTTSInstalled(), 'model_files_exist' => file_exists(storage_path('app/tts/models/checkpoint.pth')) && file_exists(storage_path('app/tts/models/config.json')), 'available_speakers' => $this->indonesianTTSService->getAvailableSpeakers(), 'installation_instructions' => $this->indonesianTTSService->installIndonesianTTS() ]; return response()->json($status); } /** * Test Indonesian TTS with sample text */ public function testTTS(Request $request): JsonResponse { $request->validate([ 'text' => 'required|string|max:500' ]); $text = $request->input('text'); try { $result = $this->indonesianTTSService->generateWithIndonesianTTS($text, 'test', 'Test'); return response()->json([ 'success' => true, 'message' => 'TTS test berhasil', 'audio_url' => $result['audio_url'] ?? null, 'tts_type' => $result['tts_type'] ?? 'fallback' ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'TTS test gagal: ' . $e->getMessage() ]); } } /** * Get installation instructions */ public function getInstallationInstructions(): JsonResponse { $instructions = $this->indonesianTTSService->installIndonesianTTS(); return response()->json([ 'success' => true, 'instructions' => $instructions ]); } /** * Download Indonesian TTS model files */ public function downloadModelFiles(): JsonResponse { $modelUrls = [ 'checkpoint.pth' => 'https://github.com/Wikidepia/indonesian-tts/releases/download/v1.2/checkpoint.pth', 'config.json' => 'https://github.com/Wikidepia/indonesian-tts/releases/download/v1.2/config.json' ]; $downloadInfo = [ 'title' => 'Download Indonesian TTS Model Files', 'description' => 'Download file model yang diperlukan untuk Indonesian TTS', 'files' => $modelUrls, 'manual_steps' => [ '1. Kunjungi: https://github.com/Wikidepia/indonesian-tts/releases', '2. Download file checkpoint.pth dan config.json', '3. Buat folder: ' . storage_path('app/tts/models/'), '4. Simpan file di folder tersebut', '5. Pastikan permission file dapat dibaca oleh web server' ] ]; return response()->json([ 'success' => true, 'download_info' => $downloadInfo ]); } }