Files
speech2text/app/Services/OllamaService.php
2026-06-02 17:35:45 +08:00

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;
}
}
}