This commit is contained in:
Saufi
2026-06-02 17:35:45 +08:00
commit 4ef99b1f81
148 changed files with 21134 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
<?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;
}
}
}