72 lines
2.0 KiB
PHP
72 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class OllamaService
|
|
{
|
|
private string $baseUrl;
|
|
private string $model;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->baseUrl = rtrim(config('speech2text.ollama.base_url'), '/');
|
|
$this->model = config('speech2text.ollama.model');
|
|
}
|
|
|
|
/**
|
|
* Clean and improve raw transcript text using a local Ollama model.
|
|
* Returns corrected text, or null if Ollama is unavailable.
|
|
*/
|
|
public function cleanTranscript(string $rawText, string $language = 'ms'): ?string
|
|
{
|
|
$langLabel = $language === 'ms' ? 'Bahasa Melayu' : 'English';
|
|
|
|
$prompt = <<<PROMPT
|
|
Anda adalah pembantu penyuntingan teks transkripsi automatik dalam {$langLabel}.
|
|
|
|
Tugas anda:
|
|
1. Betulkan ejaan dan tanda baca
|
|
2. Pisahkan ayat dengan betul
|
|
3. Kekalkan maksud asal — JANGAN tukar kandungan atau tambah maklumat baru
|
|
4. Kembalikan hanya teks yang telah diperbetulkan, tiada penjelasan tambahan
|
|
|
|
Teks transkripsi:
|
|
{$rawText}
|
|
PROMPT;
|
|
|
|
try {
|
|
$response = Http::timeout(120)
|
|
->post("{$this->baseUrl}/api/generate", [
|
|
'model' => $this->model,
|
|
'prompt' => $prompt,
|
|
'stream' => false,
|
|
]);
|
|
|
|
if (! $response->successful()) {
|
|
Log::warning("OllamaService: HTTP {$response->status()} dari {$this->baseUrl}");
|
|
return null;
|
|
}
|
|
|
|
$text = trim($response->json('response') ?? '');
|
|
|
|
return $text !== '' ? $text : null;
|
|
|
|
} catch (\Throwable $e) {
|
|
Log::warning("OllamaService tidak tersedia: {$e->getMessage()}");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public function isAvailable(): bool
|
|
{
|
|
try {
|
|
return Http::timeout(5)->get("{$this->baseUrl}/api/tags")->successful();
|
|
} catch (\Throwable) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|