Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions BE/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@
app.include_router(chat.router, prefix="/api/v1/chat", tags=["AI Tutor Chat"])
app.include_router(learning.router, prefix="/api/v1/learning", tags=["Learning Mode"])

@app.on_event("startup")
async def startup_event():
from app.services.trocr_service import get_trocr_engine
print("[Startup] Menyiapkan Otak AI (TrOCR)...")
get_trocr_engine()
print("[Startup] Otak AI Siap!")

@app.get("/")
def read_root():
return {"status": "ok", "message": "DyslexiAI API is running in Anonymous Mode!"}
47 changes: 26 additions & 21 deletions FE/pages/latihan.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -553,39 +553,44 @@ export default function Latihan() {
<img src="/assets/duck.svg" alt="Duck" className={screeningStyles.duck} />
<h1 className={screeningStyles.title}>
{writingMode === 'listening'
? 'Dengarkan suara, lalu tulis di kertas!'
: 'Ambil foto tulisan mu'}
? 'Dengarkan lalu tulis di kertas'
: 'Ambil foto tulisanmu'}
</h1>
</div>
</div>

{writingMode === 'listening' ? (
<div className={screeningStyles.centerAction}>
<button className={screeningStyles.button} onClick={() => playLetterSound(currentTarget)}>
<img src="/assets/ear.svg" alt="Listen" className={screeningStyles.icon} />
Dengar
</button>
<p className={screeningStyles.instruction}>Tekan tombol untuk mendengar suara!</p>

<button
className={screeningStyles.button}
style={{ backgroundColor: '#2ed573', borderColor: '#26af5f', boxShadow: '0 4px 0 0 #26af5f', marginTop: '20px' }}
onClick={() => {
setWritingMode('camera');
startCamera();
}}
>
✅ Saya Siap
</button>
</div>
<>
<div className={screeningStyles.centerAction}>
<button
className={screeningStyles.listenCard}
onClick={() => playLetterSound(currentTarget)}
>
<img src="/assets/ear.svg" alt="Listen" className={screeningStyles.listenIcon} />
<span className={screeningStyles.listenText}>Dengarkan bunyinya</span>
</button>
<p className={screeningStyles.subTitle}>Tekan tombol untuk mendengar suara!</p>
</div>
<div className={screeningStyles.bottomContainer}>
<button
className={`${screeningStyles.continueButton} ${writingMode !== 'camera' ? '' : ''}`}
onClick={() => {
setWritingMode('camera');
startCamera();
}}
>
Lanjutkan
</button>
</div>
</>
) : (
<div className={screeningStyles.centerAction} style={{ justifyContent: 'flex-start' }}>
<div className={screeningStyles.cameraContainer}>
<video ref={videoRef} autoPlay playsInline className={screeningStyles.videoFeed} />
{isCapturing && (
<div className={screeningStyles.loadingOverlay}>
<div className={screeningStyles.spinner}></div>
<span>Sedang menganalisis tulisan mu...</span>
<span>Sedang menganalisis tulisanmu...</span>
</div>
)}
<button
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ Antarmuka "Dengarkan-Lalu-Tulis" yang intuitif dengan *feedback* visual untuk me
* **Risk Score Analysis:** Memberikan skor risiko 0-100 berdasarkan akurasi visi komputer.
* **Error Pattern Recognition:** Mendeteksi pola *reversal* (huruf terbalik seperti b/d, p/q) secara otomatis menggunakan AI.
* **Learning Roadmaps:** Merekomendasikan Level latihan **LEKSA** (1-5) yang harus diikuti anak berdasarkan hasil skrining.

### D. Sahabat LEKSA (AI Tutor Lokal)
* **Empathetic Interaction:** Chatbot yang didukung Ollama dengan *system prompt* khusus untuk memberikan motivasi dan perbaikan ejaan secara lembut tanpa menghakimi.
* **Local Inference:** Proses berpikir AI dilakukan sepenuhnya di perangkat (mesin ROG Zephyrus), menjamin privasi 100%.
Expand Down