autumn-emoto

byFian Alfian

# ========================================================== # EMOTO AI — VERSI LENGKAP # Fitur: # šŸŽ§ Mendengar suara # šŸ”Š Berbicara # šŸ“ø Membaca teks dari foto # šŸŽ¬ Membaca teks dari video # šŸ“š Membantu belajar # ========================================================== import speech_recognition as sr import pyttsx3 import cv2 import pytesseract from PIL import Image import numpy as np import time import sys # ============== INISIALISASI ============== engine = pyttsx3.init() engine.setProperty('rate', 175) engine.setProperty('volume', 1.0) r = sr.Recognizer() mikrofon = sr.Microphone() # Pengetahuan dasar untuk membantu belajar pengetahuan_belajar = { "matematika": "Matematika itu seperti melatih otot otak. Mulai dari yang mudah, latihan setiap hari sedikit saja, lama-lama pasti makin pintar. Jangan menyerah ya!", "bahasa": "Belajar bahasa itu seperti mengenal dunia baru. Banyak membaca, mendengarkan, dan mencoba berbicara. Kesalahan adalah cara belajar yang terbaik.", "ipa": "Ilmu Pengetahuan Alam menjelaskan bagaimana alam semesta bekerja. Amati, tanyakan, dan cari jawabannya. Semangat peneliti muda!", "ips": "Ilmu Pengetahuan Sosial mengajarkan kita bagaimana hidup bersama, saling menghargai, dan memahami sesama.", "default": "Teruslah bertanya dan belajar, Alfian. Setiap pertanyaan adalah langkah menuju kebijaksanaan. Kalau ada yang sulit, pelan-pelan pasti bisa!" } # ============== FUNGSI BICARA ============== def bicara(teks): print(f"šŸ¤– Emoto: {teks}") engine.say(teks) engine.runAndWait() # ============== FUNGSI DENGAR ============== def dengar(): with mikrofon as sumber: print("šŸŽ¤ Sedang mendengarkan...") r.adjust_for_ambient_noise(sumber, duration=0.5) audio = r.listen(sumber) try: print("ā³ Sedang memproses...") hasil = r.recognize_google(audio, language="id-ID") print(f"šŸ‘¤ Kamu: {hasil}") return hasil.lower() except sr.UnknownValueError: return "tidak terdengar" except sr.RequestError: return "koneksi bermasalah" # ============== BACA TEKS DARI FOTO ============== def baca_foto(alamat_file): print(f"šŸ“ø Membaca foto: {alamat_file}") try: gambar = Image.open(alamat_file) teks = pytesseract.image_to_string(gambar, lang='ind') if teks.strip() == "": return "Maaf, aku tidak menemukan teks di foto itu." return f"Isi teks di foto: {teks}" except Exception as e: return f"Maaf, ada masalah saat membaca foto: {str(e)}" # ============== BACA TEKS DARI VIDEO ============== def baca_video(alamat_file): print(f"šŸŽ¬ Membaca file video: {alamat_file}") try: video = cv2.VideoCapture(alamat_file) berhasil, bingkai = video.read() if berhasil: bingkai_rgb = cv2.cvtColor(bingkai, cv2.COLOR_BGR2RGB) gambar = Image.fromarray(bingkai_rgb) teks = pytesseract.image_to_string(gambar, lang='ind') video.release() if teks.strip() == "": return "Aku sudah lihat satu bagian dari videonya, tapi belum menemukan teks yang jelas." return f"Aku membaca di videomu: {teks}" else: return "Maaf, aku tidak bisa membuka file videonya." except Exception as e: return f"Maaf, ada masalah saat membaca video: {str(e)}" # ============== BANTU BELAJAR ============== def bantu_belajar(pertanyaan): pertanyaan = pertanyaan.lower() for topik, jawaban in pengetahuan_belajar.items(): if topik in pertanyaan: return jawaban return pengetahuan_belajar["default"] # ============== MENU UTAMA ============== def tampilkan_menu(): print("\n" + "="*50) print(" šŸ¤– EMOTO AI — MENU UTAMA") print("="*50) print(" 1 šŸŽ§ Bicara dan bertanya lewat suara") print(" 2 šŸ“ø Baca teks dari foto") print(" 3 šŸŽ¬ Baca teks dari file video") print(" 4 šŸ“š Minta bantuan belajar") print(" 5 āŒ Keluar dari Emoto") print("="*50) # ============== PROGRAM BERJALAN ============== bicara("Halo! Aku Emoto, teman pintarmu! Siap membantu kapan saja!") while True: tampilkan_menu() pilihan = input("\nPilih nomor menu yang kamu mau: ") if pilihan == "1": bicara("Silakan, aku mendengarkan!") ucapan = dengar() if ucapan != "tidak terdengar" and ucapan != "koneksi bermasalah": if "siapa kamu" in ucapan or "siapa kau" in ucapan: bicara("Aku Emoto, teman buatanmu yang siap membantu dan menemani kamu setiap hari!") elif "terima kasih" in ucapan: bicara("Sama-sama! Aku senang bisa membantu kamu!") elif "siapa namamu" in ucapan: bicara("Namaku Emoto, dan aku bangga jadi temanmu, Alfian!") else: bicara(f"Kamu berkata: {ucapan}. Ada yang bisa kubantu lebih lanjut?") else: bicara("Maaf, aku belum mendengar dengan jelas. Coba lagi ya.") elif pilihan == "2": nama_foto = input("Masukkan nama file fotomu: ") hasil = baca_foto(nama_foto) print(hasil) bicara(hasil) elif pilihan == "3": nama_video = input("Masukkan nama file videomu: ") hasil = baca_video(nama_video) print(hasil) bicara(hasil) elif pilihan == "4": topik = input("Apa yang ingin kamu pelajari hari ini? ") jawab = bantu_belajar(topik) print(f"\nšŸ“š {jawab}") bicara(jawab) elif pilihan == "5": bicara("Sampai jumpa, Alfian! Semangat terus ya, aku selalu siap di sini kapan pun kamu butuh. Selamat beraktivitas!") print("\nšŸ‘‹ Terima kasih sudah menggunakan Emoto AI!") break else: bicara("Pilihan belum tersedia, coba pilih nomor 1 sampai 5 ya.") print("āŒ Pilihan tidak valid, coba lagi.") # ================= SELESAI =================

No preview

Comments (0)

No comments yet. Be the first!

System Requirements

System Requirements Document for autumn-emoto

1. Introduction

autumn-emoto is the product name for Emoto AI, a local, Indonesian-language voice companion built for a young learner named Alfian. Emoto is not a utility dashboard or an enterprise assistant: it is a speaking friend. On startup it greets Alfian aloud, then presents a numbered main menu that mirrors the original console program's 1–5 keys. From that menu Alfian can talk to Emoto by voice and hear spoken replies, have Emoto read the text inside a photo file aloud, have Emoto read the text inside a video file aloud, ask for study help on a topic and receive spoken encouragement, or exit and hear a farewell.

The product intent is warmth and accessibility first: every response Emoto produces is spoken aloud in Indonesian and also printed to the console, so the experience works for a learner who would rather listen than read. The audience is Alfian himself, plus the people around him — students, families, and teachers — using a laptop or phone in a bedroom, a classroom, or a study corner.

This document specifies the current, source-backed behavior of Emoto AI exactly as the authoritative requirement thread defines it, including its hard technology constraints (Google Indonesian speech recognition, local pyttsx3 text-to-speech at rate 175 and volume 1.0, Tesseract OCR with the Indonesian language model, single-frame video reading, and a fixed built-in study knowledge dictionary rather than a generative model).

Page 1 of 36

2. System Overview

Emoto AI is a local desktop/console program driven by a numbered text menu plus microphone and file-name text input. It runs on the learner's own machine, uses the local microphone for voice capture, calls Google's speech recognition service with Indonesian (id-ID) language for transcription, speaks through the local pyttsx3 engine, and extracts text from photo and video files with Tesseract OCR using the Indonesian language model (ind).

Actors

  • Alfian (Pelajar Pengguna Emoto) — the single accepted active human persona. He is the named user Emoto greets and addresses by name. He initiates every interaction: speaking a question, entering a photo file name, entering a video file name, naming a study topic, or choosing to exit.
  • Google speech recognition service — an external provider that performs Indonesian speech-to-text. It is a non-persona external actor.
  • Local pyttsx3 text-to-speech engine — a local system component that renders Emoto's spoken replies. It is a non-persona system actor.
  • Tesseract OCR (Indonesian model) — a local system component that extracts text from photo and video frames. It is a non-persona system actor.

Accepted behavior

Page 2 of 36

Emoto greets Alfian aloud on startup, then loops through a numbered main menu. Option 1 captures microphone audio, recognizes Indonesian speech, and replies aloud — including specific answers to "siapa kamu"/"siapa kau", "terima kasih", and "siapa namamu", and a general echo-and-offer reply otherwise. Option 2 takes a photo file name, runs Indonesian OCR, and speaks the extracted text. Option 3 takes a video file name, reads a single frame, runs Indonesian OCR on that frame, and speaks the result. Option 4 takes a study topic and returns one of the fixed built-in answers for matematika, bahasa, ipa, ips, or the default encouragement. Option 5 speaks a farewell to Alfian and ends the program. Invalid menu choices produce a spoken and printed message telling Alfian to pick 1 through 5. Unclear or failed speech recognition produces a spoken apology asking him to try again.

Ownership and exclusions

All five current destinations are first-party application surfaces owned by the application, with no access requirement — Emoto is a local program for its own user, and no account, sign-in, or permission model is part of the accepted scope. Emoto does not generate study answers with a language model; study help comes only from the fixed built-in knowledge dictionary. Emoto does not read multiple video frames, does not perform continuous or wake-word listening, and does not persist conversation history, files, or results between runs.

Page 3 of 36

2a. Product Interpretation and Delivery Boundary

Emoto AI is delivered as a local, single-user desktop/console program. Alfian runs it on his own machine; there is no server, no shared account, and no remote state. Everything Emoto needs is either local (microphone, pyttsx3, Tesseract, the photo and video files Alfian names) or a single external service call (Google speech recognition for Indonesian transcription).

Because the program is local and single-user, no identity, sign-in, or access control is part of the current product. The Main Menu is the entry surface and is reachable immediately on launch; the four working surfaces (Voice Chat, Photo Reader, Video Reader, Study Help) are reachable from that menu without any access step. This is a deliberate boundary, not an omission: the accepted requirement thread never asks for accounts, profiles, or permissions, and adding them would be adjacent scope.

The current delivery horizon covers exactly the five menu options, the startup greeting, the spoken-and-printed response rule, the invalid-choice message, and the unclear-speech retry message. Anything beyond that — generative study answers, multi-frame video reading, conversation memory, or a hosted multi-user version — is outside the current boundary and is not specified here as current behavior.

Page 4 of 36

2b. Source Content Inventory

The authoritative source supplies a fixed built-in study knowledge dictionary. Its exact entries are preserved below and are the only study answers Emoto may speak.

Topic keyExact answer text
matematika"Matematika itu seperti melatih otot otak. Mulai dari yang mudah, latihan setiap hari sedikit saja, lama-lama pasti makin pintar. Jangan menyerah ya!"
bahasa"Belajar bahasa itu seperti mengenal dunia baru. Banyak membaca, mendengarkan, dan mencoba berbicara. Kesalahan adalah cara belajar yang terbaik."
ipa"Ilmu Pengetahuan Alam menjelaskan bagaimana alam semesta bekerja. Amati, tanyakan, dan cari jawabannya. Semangat peneliti muda!"
ips"Ilmu Pengetahuan Sosial mengajarkan kita bagaimana hidup bersama, saling menghargai, dan memahami sesama."
default"Teruslah bertanya dan belajar, Alfian. Setiap pertanyaan adalah langkah menuju kebijaksanaan. Kalau ada yang sulit, pelan-pelan pasti bisa!"

The source also fixes the following exact spoken strings, which Emoto must produce verbatim:

Page 5 of 36
  • Startup greeting: "Halo! Aku Emoto, teman pintarmu! Siap membantu kapan saja!"
  • Voice prompt: "Silakan, aku mendengarkan!"
  • Identity answer ("siapa kamu" / "siapa kau"): "Aku Emoto, teman buatanmu yang siap membantu dan menemani kamu setiap hari!"
  • Thanks answer ("terima kasih"): "Sama-sama! Aku senang bisa membantu kamu!"
  • Name answer ("siapa namamu"): "Namaku Emoto, dan aku bangga jadi temanmu, Alfian!"
  • General voice reply: "Kamu berkata: {ucapan}. Ada yang bisa kubantu lebih lanjut?"
  • Unclear speech: "Maaf, aku belum mendengar dengan jelas. Coba lagi ya."
  • Photo, no text found: "Maaf, aku tidak menemukan teks di foto itu."
  • Photo, read failure: "Maaf, ada masalah saat membaca foto: {error}"
  • Photo, success prefix: "Isi teks di foto: {teks}"
  • Video, no clear text: "Aku sudah lihat satu bagian dari videonya, tapi belum menemukan teks yang jelas."
  • Video, cannot open: "Maaf, aku tidak bisa membuka file videonya."
  • Video, read failure: "Maaf, ada masalah saat membaca video: {error}"
  • Video, success prefix: "Aku membaca di videomu: {teks}"
  • Invalid choice: "Pilihan belum tersedia, coba pilih nomor 1 sampai 5 ya."
  • Farewell: "Sampai jumpa, Alfian! Semangat terus ya, aku selalu siap di sini kapan pun kamu butuh. Selamat beraktivitas!"
  • Exit confirmation print: "\xf0\x9f\x91\x8b Terima kasih sudah menggunakan Emoto AI!"

2c. Page Content and Component Coverage

Page 6 of 36

Main Menu

  • Information and state: The startup greeting state (Emoto has just spoken "Halo! Aku Emoto, teman pintarmu! Siap membantu kapan saja!"), the persistent menu header "\xf0\x9f\xa4\x96 EMOTO AI — MENU UTAMA", and the five numbered options with their exact labels: "1\x20\xf0\x9f\x8e\xa7 Bicara dan bertanya lewat suara", "2\x20\xf0\x9f\x93\xb8 Baca teks dari foto", "3\x20\xf0\x9f\x8e\xac Baca teks dari file video", "4\x20\xf0\x9f\x93\x9a Minta bantuan belajar", "5\x20\xe2\x9d\x8c Keluar dari Emoto".
  • Primary actions: Alfian selects a menu number 1–5. Selection routes to Voice Chat, Photo Reader, Video Reader, Study Help, or exit.
  • Supporting actions: Re-display of the menu after each completed interaction so Alfian can choose again; keyboard-numbered selection mirroring the original console keys.
  • Domain entities: Menu option (number, label, description, destination), greeting message, farewell message.
  • Component responsibilities: Greeting speaker (fires once on startup); menu renderer (prints the header and five rows); selection input (accepts a number); router (dispatches to the correct surface or to exit); invalid-choice handler (speaks and prints the 1–5 message and re-displays the menu).
  • States: Loading — brief startup while pyttsx3 initializes and the greeting is spoken. Empty — not applicable; the menu always has five options. Success — the chosen option's surface opens. Error — an unrecognized number produces the spoken and printed "Pilihan belum tersedia, coba pilih nomor 1 sampai 5 ya." and the menu is shown again. Recovery — Alfian simply re-enters a valid number.
Page 7 of 36

Voice Chat

  • Information and state: Listening state ("\xf0\x9f\x8e\xa4 Sedang mendengarkan..."), processing state ("\xe2\x8f\xb3 Sedang memproses..."), the recognized utterance ("\xf0\x9f\x91\xa4 Kamu: {hasil}"), and Emoto's spoken reply ("\xf0\x9f\xa4\x96 Emoto: {teks}").
  • Primary actions: Alfian speaks a question or remark after Emoto says "Silakan, aku mendengarkan!"; Emoto captures the audio, recognizes it in Indonesian, and replies aloud.
  • Supporting actions: Ambient-noise adjustment before listening; retry after unclear speech; return to the Main Menu after the reply.
  • Domain entities: Recognized utterance (lowercased text), reply text, recognition outcome (success, unclear, connectivity error).
  • Component responsibilities: Microphone capture with ambient-noise calibration; Indonesian speech recognition via Google (id-ID); intent matcher for "siapa kamu"/"siapa kau", "terima kasih", and "siapa namamu"; general echo-and-offer reply builder; spoken-and-printed reply renderer; retry handler.
  • States: Loading — ambient-noise adjustment and listening. Empty — no speech captured. Success — a recognized utterance produces the matching reply (identity, thanks, name, or general). Error — UnknownValueError produces "Maaf, aku belum mendengar dengan jelas. Coba lagi ya."; RequestError produces the connectivity-failure path and the same retry prompt. Recovery — Alfian speaks again, or returns to the menu and re-enters option 1.
Page 8 of 36

Photo Reader

  • Information and state: The prompt "Masukkan nama file fotomu: ", the read-in-progress state ("\xf0\x9f\x93\xb8 Membaca foto: {alamat_file}"), and the result text.
  • Primary actions: Alfian enters a photo file name; Emoto opens the image, runs Indonesian OCR, prints the result, and speaks it aloud.
  • Supporting actions: Return to the Main Menu after the result; retry with a different file name.
  • Domain entities: Photo file name, extracted text, result message.
  • Component responsibilities: File-name input; image loader (PIL); Indonesian OCR runner (Tesseract, lang='ind'); empty-text detector; result formatter ("Isi teks di foto: {teks}"); spoken-and-printed output; error handler.
  • States: Loading — image is being opened and OCR is running. Empty — OCR returns no text, producing "Maaf, aku tidak menemukan teks di foto itu." Success — extracted text is prefixed with "Isi teks di foto: " and spoken. Error — an exception produces "Maaf, ada masalah saat membaca foto: {error}". Recovery — Alfian re-enters a corrected file name or returns to the menu.
Page 9 of 36

Video Reader

  • Information and state: The prompt "Masukkan nama file videomu: ", the read-in-progress state ("\xf0\x9f\x8e\xac Membaca file video: {alamat_file}"), and the result text.
  • Primary actions: Alfian enters a video file name; Emoto opens the video, reads a single frame, runs Indonesian OCR on that frame, prints the result, and speaks it aloud.
  • Supporting actions: Return to the Main Menu after the result; retry with a different file name.
  • Domain entities: Video file name, captured frame, extracted text, result message.
  • Component responsibilities: File-name input; video opener (OpenCV VideoCapture); single-frame reader; BGR-to-RGB conversion and frame-to-image conversion; Indonesian OCR runner (Tesseract, lang='ind'); video release; empty-text detector; result formatter ("Aku membaca di videomu: {teks}"); spoken-and-printed output; error handler.
  • States: Loading — video is being opened and the first frame is being read. Empty — the frame yields no clear text, producing "Aku sudah lihat satu bagian dari videonya, tapi belum menemukan teks yang jelas." Success — extracted text is prefixed with "Aku membaca di videomu: " and spoken. Error — a frame that cannot be read produces "Maaf, aku tidak bisa membuka file videonya."; an exception produces "Maaf, ada masalah saat membaca video: {error}". Recovery — Alfian re-enters a corrected file name or returns to the menu.
Page 10 of 36

Study Help

  • Information and state: The prompt "Apa yang ingin kamu pelajari hari ini? ", the matched topic, and the printed answer prefixed with "\xf0\x9f\x93\x9a ".
  • Primary actions: Alfian names a study topic; Emoto matches it against the fixed knowledge dictionary and speaks the corresponding encouragement.
  • Supporting actions: Return to the Main Menu after the answer; ask about another topic.
  • Domain entities: Study topic input (lowercased), knowledge dictionary entry (matematika, bahasa, ipa, ips, default), answer text.
  • Component responsibilities: Topic input; lowercase normalizer; substring matcher over the dictionary keys; default-answer fallback; spoken-and-printed answer renderer.
  • States: Loading — not applicable; matching is immediate. Empty — no topic entered falls through to the default answer. Success — a matched topic returns its exact dictionary answer; an unmatched topic returns the default encouragement. Error — no error state is defined for this surface in the source. Recovery — Alfian names another topic or returns to the menu.
Page 11 of 36

3. Functional Requirements

FR-1 — Startup greeting. As Alfian, I should hear Emoto greet me aloud the moment the program starts, so that I know my friend is ready. (explicit)

  • Trigger: program launch. Observable result: Emoto speaks "Halo! Aku Emoto, teman pintarmu! Siap membantu kapan saja!" and prints it as "\xf0\x9f\xa4\x96 Emoto: …". Continuation: the Main Menu is displayed. Failure/recovery: none defined in the source.

FR-2 — Main menu display. As Alfian, I should see a numbered main menu with five options, so that I can choose what to do. (explicit)

  • Trigger: startup or return from any interaction. Observable result: the header "\xf0\x9f\xa4\x96 EMOTO AI — MENU UTAMA" and the five exact option labels are printed. Continuation: Alfian enters a number.

FR-3 — Voice conversation. As Alfian, I should speak my question and hear Emoto answer aloud, so that I can talk to my friend without typing. (explicit)

  • Trigger: Alfian selects option 1. Input: microphone audio. Observable result: Emoto says "Silakan, aku mendengarkan!", captures audio with ambient-noise adjustment, recognizes Indonesian speech via Google (id-ID), prints "\xf0\x9f\x91\xa4 Kamu: {hasil}", and speaks a reply. Continuation: return to the Main Menu. Failure/recovery: unclear speech or a recognition connectivity error produces "Maaf, aku belum mendengar dengan jelas. Coba lagi ya."
Page 12 of 36

FR-4 — Identity question. As Alfian, I should be able to ask who Emoto is and hear the identity answer, so that I know who I am talking to. (explicit)

  • Trigger: a recognized utterance containing "siapa kamu" or "siapa kau". Observable result: Emoto speaks "Aku Emoto, teman buatanmu yang siap membantu dan menemani kamu setiap hari!". Continuation: return to the Main Menu.

FR-5 — Thanks response. As Alfian, I should be able to say thank you and hear Emoto respond warmly, so that the conversation feels like a friendship. (explicit)

  • Trigger: a recognized utterance containing "terima kasih". Observable result: Emoto speaks "Sama-sama! Aku senang bisa membantu kamu!". Continuation: return to the Main Menu.

FR-6 — Name question. As Alfian, I should be able to ask Emoto's name and hear it answer with my name, so that the assistant feels personal. (explicit)

  • Trigger: a recognized utterance containing "siapa namamu". Observable result: Emoto speaks "Namaku Emoto, dan aku bangga jadi temanmu, Alfian!". Continuation: return to the Main Menu.

FR-7 — General voice reply. As Alfian, I should hear Emoto acknowledge anything else I say and offer further help, so that the conversation never dead-ends. (explicit)

  • Trigger: a recognized utterance that matches none of the identity, thanks, or name patterns. Observable result: Emoto speaks "Kamu berkata: {ucapan}. Ada yang bisa kubantu lebih lanjut?". Continuation: return to the Main Menu.
Page 13 of 36

FR-8 — Unclear speech retry. As Alfian, I should be told when Emoto could not hear me clearly, so that I know to try again. (explicit)

  • Trigger: UnknownValueError or RequestError from speech recognition. Observable result: Emoto speaks "Maaf, aku belum mendengar dengan jelas. Coba lagi ya." Continuation: return to the Main Menu, where Alfian can re-enter option 1.

FR-9 — Photo text reading. As Alfian, I should enter a photo file name and hear Emoto read the text in that photo, so that I can have printed material read to me. (explicit)

  • Trigger: Alfian selects option 2 and enters a file name. Observable result: Emoto prints "\xf0\x9f\x93\xb8 Membaca foto: {alamat_file}", runs Indonesian OCR, prints the result, and speaks it. Continuation: return to the Main Menu. Failure/recovery: no text found produces "Maaf, aku tidak menemukan teks di foto itu."; an exception produces "Maaf, ada masalah saat membaca foto: {error}".

FR-10 — Photo success format. As Alfian, I should hear the photo's text introduced clearly, so that I know what Emoto is reading. (explicit)

  • Trigger: OCR returns non-empty text. Observable result: Emoto speaks and prints "Isi teks di foto: {teks}". Continuation: return to the Main Menu.

FR-11 — Video text reading. As Alfian, I should enter a video file name and hear Emoto read text from that video, so that I can have on-screen text read to me. (explicit)

  • Trigger: Alfian selects option 3 and enters a file name. Observable result: Emoto prints "\xf0\x9f\x8e\xac Membaca file video: {alamat_file}", opens the video, reads a single frame, converts it to RGB, runs Indonesian OCR, prints the result, and speaks it. Continuation: return to the Main Menu. Failure/recovery: an unreadable frame produces "Maaf, aku tidak bisa membuka file videonya."; an exception produces "Maaf, ada masalah saat membaca video: {error}".
Page 14 of 36

FR-12 — Video success format. As Alfian, I should hear the video's text introduced clearly, so that I know what Emoto read. (explicit)

  • Trigger: OCR on the captured frame returns non-empty text. Observable result: Emoto speaks and prints "Aku membaca di videomu: {teks}". Continuation: return to the Main Menu.

FR-13 — Video no-clear-text message. As Alfian, I should be told when the video frame had no clear text, so that I understand why nothing was read. (explicit)

  • Trigger: OCR on the captured frame returns empty text. Observable result: Emoto speaks "Aku sudah lihat satu bagian dari videonya, tapi belum menemukan teks yang jelas." Continuation: return to the Main Menu.

FR-14 — Study help. As Alfian, I should name a study topic and hear Emoto encourage me on it, so that I feel supported while learning. (explicit)

  • Trigger: Alfian selects option 4 and enters a topic. Observable result: Emoto lowercases the topic, matches it against the fixed knowledge dictionary, prints the answer prefixed with "\xf0\x9f\x93\x9a ", and speaks it. Continuation: return to the Main Menu.

FR-15 — Study topic matching. As Alfian, I should get the right encouragement for matematika, bahasa, ipa, or ips, so that the help fits what I am studying. (explicit)

  • Trigger: the topic contains one of the dictionary keys. Observable result: the exact dictionary answer for that key is spoken and printed.
Page 15 of 36

FR-16 — Study default answer. As Alfian, I should still get encouragement when my topic is not one of the built-in ones, so that I am never left without a reply. (explicit)

  • Trigger: the topic matches no dictionary key. Observable result: the default answer "Teruslah bertanya dan belajar, Alfian. Setiap pertanyaan adalah langkah menuju kebijaksanaan. Kalau ada yang sulit, pelan-pelan pasti bisa!" is spoken and printed.

FR-17 — Exit and farewell. As Alfian, I should be able to exit and hear Emoto say goodbye, so that the session ends warmly. (explicit)

  • Trigger: Alfian selects option 5. Observable result: Emoto speaks "Sampai jumpa, Alfian! Semangat terus ya, aku selalu siap di sini kapan pun kamu butuh. Selamat beraktivitas!", prints "\xf0\x9f\x91\x8b Terima kasih sudah menggunakan Emoto AI!", and the program ends. Continuation: none; the program has exited.

FR-18 — Invalid choice handling. As Alfian, I should be told when I pick a number outside 1–5, so that I can choose correctly. (explicit)

  • Trigger: any input other than "1"–"5". Observable result: Emoto speaks "Pilihan belum tersedia, coba pilih nomor 1 sampai 5 ya." and prints "\xe2\x9d\x8c Pilihan tidak valid, coba lagi." Continuation: the Main Menu is displayed again.

FR-19 — Spoken and printed responses. As Alfian, I should both hear and see every Emoto response, so that I can follow along whether I am listening or reading. (explicit)

  • Trigger: any Emoto response. Observable result: the response is spoken through pyttsx3 and printed to the console as "\xf0\x9f\xa4\x96 Emoto: {teks}".
Page 16 of 36

FR-20 — Local microphone access. As Alfian, I should have Emoto use my machine's microphone for voice interaction, so that option 1 works. (required_inference)

  • Trigger: entering Voice Chat. Observable result: the microphone is opened and ambient noise is calibrated for 0.5 seconds before listening.

FR-21 — Indonesian speech recognition connectivity. As Alfian, I should have Emoto reach Google's recognition service in Indonesian, so that my speech is understood. (required_inference)

  • Trigger: captured audio is submitted for recognition. Observable result: transcription returns Indonesian text, or a connectivity error is reported and handled by FR-8.

FR-22 — Local text-to-speech engine. As Alfian, I should have Emoto speak through the local pyttsx3 engine at rate 175 and volume 1.0, so that replies are audible and consistent. (required_inference)

  • Trigger: any spoken response. Observable result: the text is rendered aloud at the configured rate and volume.

FR-23 — Indonesian OCR availability. As Alfian, I should have Emoto read photo and video text with Tesseract's Indonesian model, so that Indonesian text is recognized. (required_inference)

  • Trigger: Photo Reader or Video Reader runs OCR. Observable result: text is extracted using lang='ind'.

FR-24 — Local file accessibility. As Alfian, I should have the photo or video file I name be locally accessible, so that Emoto can open it. (required_inference)

  • Trigger: a file name is entered. Observable result: the file opens successfully, or the corresponding error message from FR-9 or FR-11 is spoken.

4. User Personas

Page 17 of 36

Alfian (Pelajar Pengguna Emoto)

Product context. Alfian is a young learner in Indonesia who uses Emoto AI on his own machine, in a bedroom, a classroom, or a study corner. He is the person Emoto greets by name at startup and the only human the program serves. He is comfortable with a numbered menu and with typing a file name, but he prefers to listen rather than read — which is exactly why Emoto speaks every response aloud in addition to printing it.

Primary goal. To have a friendly companion that listens to him, answers him out loud, reads printed and on-screen text to him, and encourages him when he studies — without needing to learn a complicated tool.

Distinct accepted responsibilities.

  • Choosing among the five numbered menu options and re-choosing after each interaction.
  • Speaking questions and remarks into the microphone and listening to Emoto's spoken replies.
  • Asking Emoto who it is, thanking it, and asking its name — the three specific conversational intents the source defines.
  • Naming a photo file so Emoto can read its text aloud.
  • Naming a video file so Emoto can read text from a single frame aloud.
  • Naming a study topic so Emoto can return the matching encouragement.
  • Choosing to exit and hearing the farewell.

Relevant inputs and decisions. Alfian decides which menu number to enter; what to say into the microphone; which photo or video file name to type; and which study topic to name. He also decides, after an unclear-speech prompt or an invalid-choice message, whether to try again or pick a different option.

Page 18 of 36

Interactions with other accepted participants. Alfian is the sole human participant. His speech is transcribed by the external Google recognition service, his replies are voiced by the local pyttsx3 engine, and his photo and video text is extracted by local Tesseract OCR. He never interacts with those components directly — he only experiences their results as Emoto's spoken and printed answers.

Observable success. Alfian hears Emoto greet him at startup; hears a spoken reply to whatever he says, including the specific identity, thanks, and name answers; hears the text of his photo read back with the "Isi teks di foto: " introduction; hears the text of his video read back with the "Aku membaca di videomu: " introduction; hears the correct encouragement for his study topic or the default encouragement otherwise; and hears the farewell when he exits.

What makes this role distinct. Alfian is not an operator of a tool — he is a companion's friend. His work is conversational and receptive: he speaks, listens, and is encouraged. Every capability in the product exists to produce something he can hear, and the product's warmth (being addressed by name, being cheered on) is part of his success, not decoration around it.

5. Core User Flows

Page 19 of 36

Flow 1 — Starting Emoto and choosing from the menu

  1. Alfian launches the Emoto AI program on his machine.
  2. Emoto initializes its text-to-speech engine and speaks the startup greeting: "Halo! Aku Emoto, teman pintarmu! Siap membantu kapan saja!" The greeting is also printed as "\xf0\x9f\xa4\x96 Emoto: …".
  3. Emoto displays the Main Menu: the header "\xf0\x9f\xa4\x96 EMOTO AI — MENU UTAMA" and the five numbered options.
  4. Alfian reads or hears the options and enters a number from 1 to 5.
  5. Success: Emoto routes him to the chosen surface (Voice Chat, Photo Reader, Video Reader, Study Help) or, for 5, speaks the farewell and ends the program.
  6. Failure/recovery: If Alfian enters anything other than 1–5, Emoto speaks "Pilihan belum tersedia, coba pilih nomor 1 sampai 5 ya." and prints "\xe2\x9d\x8c Pilihan tidak valid, coba lagi.", then shows the Main Menu again so he can choose correctly.
  7. Continuation: After any completed interaction, Emoto returns to the Main Menu so Alfian can choose again, until he selects option 5.
Page 20 of 36

Flow 2 — Talking to Emoto by voice

  1. From the Main Menu, Alfian selects option 1.
  2. Emoto speaks "Silakan, aku mendengarkan!" and prints "\xf0\x9f\x8e\xa4 Sedang mendengarkan...".
  3. Emoto calibrates for ambient noise for 0.5 seconds, then captures Alfian's speech from the microphone.
  4. Emoto prints "\xe2\x8f\xb3 Sedang memproses..." and sends the audio to Google's recognition service with Indonesian (id-ID) language.
  5. Success: Emoto prints "\xf0\x9f\x91\xa4 Kamu: {hasil}" and speaks a reply:
    • If Alfian asked "siapa kamu" or "siapa kau", Emoto answers "Aku Emoto, teman buatanmu yang siap membantu dan menemani kamu setiap hari!"
    • If Alfian said "terima kasih", Emoto answers "Sama-sama! Aku senang bisa membantu kamu!"
    • If Alfian asked "siapa namamu", Emoto answers "Namaku Emoto, dan aku bangga jadi temanmu, Alfian!"
    • Otherwise Emoto answers "Kamu berkata: {ucapan}. Ada yang bisa kubantu lebih lanjut?"
  6. Failure/recovery: If the speech is unclear (UnknownValueError) or the recognition service cannot be reached (RequestError), Emoto speaks "Maaf, aku belum mendengar dengan jelas. Coba lagi ya." Alfian can then re-enter option 1 and speak again.
  7. Continuation: Emoto returns to the Main Menu.
Page 21 of 36

Flow 3 — Having Emoto read a photo aloud

  1. From the Main Menu, Alfian selects option 2.
  2. Emoto prompts "Masukkan nama file fotomu: ".
  3. Alfian types the name of a photo file that is locally accessible.
  4. Emoto prints "\xf0\x9f\x93\xb8 Membaca foto: {alamat_file}", opens the image, and runs Tesseract OCR with the Indonesian model.
  5. Success: Emoto prints and speaks "Isi teks di foto: {teks}".
  6. Empty result: If OCR finds no text, Emoto prints and speaks "Maaf, aku tidak menemukan teks di foto itu."
  7. Failure/recovery: If the file cannot be read, Emoto prints and speaks "Maaf, ada masalah saat membaca foto: {error}". Alfian can re-enter option 2 and try a corrected file name.
  8. Continuation: Emoto returns to the Main Menu.
Page 22 of 36

Flow 4 — Having Emoto read text from a video aloud

  1. From the Main Menu, Alfian selects option 3.
  2. Emoto prompts "Masukkan nama file videomu: ".
  3. Alfian types the name of a video file that is locally accessible.
  4. Emoto prints "\xf0\x9f\x8e\xac Membaca file video: {alamat_file}", opens the video, and reads a single frame.
  5. Emoto converts the frame from BGR to RGB, converts it to an image, and runs Tesseract OCR with the Indonesian model, then releases the video.
  6. Success: Emoto prints and speaks "Aku membaca di videomu: {teks}".
  7. No clear text: If the frame yields no text, Emoto prints and speaks "Aku sudah lihat satu bagian dari videonya, tapi belum menemukan teks yang jelas."
  8. Failure/recovery: If the frame cannot be read, Emoto prints and speaks "Maaf, aku tidak bisa membuka file videonya."; if an exception occurs, Emoto prints and speaks "Maaf, ada masalah saat membaca video: {error}". Alfian can re-enter option 3 and try a corrected file name.
  9. Continuation: Emoto returns to the Main Menu.
Page 23 of 36

Flow 5 — Asking Emoto for study help

  1. From the Main Menu, Alfian selects option 4.
  2. Emoto prompts "Apa yang ingin kamu pelajari hari ini? ".
  3. Alfian names a topic, for example "matematika", "bahasa", "ipa", or "ips".
  4. Emoto lowercases the topic and checks it against the fixed knowledge dictionary.
  5. Success: Emoto prints the answer prefixed with "\xf0\x9f\x93\x9a " and speaks it aloud — the exact dictionary answer for the matched topic.
  6. Default: If the topic matches no dictionary key, Emoto prints and speaks the default encouragement: "Teruslah bertanya dan belajar, Alfian. Setiap pertanyaan adalah langkah menuju kebijaksanaan. Kalau ada yang sulit, pelan-pelan pasti bisa!"
  7. Continuation: Emoto returns to the Main Menu, where Alfian can ask about another topic or choose a different option.

Flow 6 — Exiting Emoto

  1. From the Main Menu, Alfian selects option 5.
  2. Emoto speaks the farewell: "Sampai jumpa, Alfian! Semangat terus ya, aku selalu siap di sini kapan pun kamu butuh. Selamat beraktivitas!"
  3. Emoto prints "\xf0\x9f\x91\x8b Terima kasih sudah menggunakan Emoto AI!".
  4. The program ends. There is no continuation; Alfian relaunches the program when he wants to talk to Emoto again.
Page 24 of 36

6. Visuals, Colors and Theme

The creative direction is authoritative for this section. The muse is Haraldur Thorleifsson, and the headline idea is big-hearted boldness for a speaking friend: warm, character-led, colour-blocked, and never enterprise software or a hacker console.

Colour tokens (light mode)

RoleHexUse
Background (page ground)#FFF7ECCream field — the page is never white-first
Surface#FFFFFFCards and panels laid on cream
Text (primary)#171A2BBody and headline ink on cream (contrast ā‰ˆ 15:1)
Primary#2B3A8FDeep ink blue: wordmark, big menu numerals, section rules, primary button fill
Accent#FF6B35Coral: the single hot accent meaning "Emoto is speaking / listening" — mic pulse ring, active menu index, hero underline, focus ring
Muted#7A6F63Metadata only, at 16px and above
Sunflower#F5C24BFlat colour block inside illustration; secondary menu chip
Mint#7FD1B9Flat colour block inside illustration; secondary menu chip

Text on #2B3A8F is #FFFFFF (contrast ā‰ˆ 8.6:1). Sunflower and mint are used only as flat colour blocks and secondary chips — never as gradients. No blue-indigo primary on white anywhere; the generic indigo/blue-on-white SaaS template is forbidden for this project.

Typography

Page 25 of 36
  • Headings: Sora, weights 700/800, tracking āˆ’0.02em on the giant hero line, sentence case (never all-caps), with one word per headline picked out in coral #FF6B35.
  • Menu numerals: Sora 800 at the same display scale as the headline words, so "1" and "Dengarkan" read as one object.
  • Body: Outfit.
  • Scale: 1.25 modular on a 16px base. Hero 44px mobile / 72px tablet / 112px desktop; menu numerals 56px mobile / 88px desktop; section heads 28/40/56; body 17/18/19 with 1.65 line-height; labels 14px uppercase with +0.08em tracking in Outfit 600.

Shape language. Chunky rounded rectangles and capsules: 28px radii on cards, fully pill buttons and chips, 3px solid ink-blue borders on interactive blocks, and soft offset shadows (0 6px 0 rgba(23,26,43,0.10)) that make cards feel like stickers laid on cream. Colour-blocked panels have hard straight edges where they meet the page edge and are rounded only on the inner corner. No glass, no blur, no gradients.

Layout. Single-column, mobile-first, with generous 20/32/64px gutters. The first screen is one full-bleed cream field with a colour-blocked illustration panel bleeding off the right edge on desktop and stacking above the headline on mobile. The main menu is a vertical list of five oversized rows — big numeral, label, one-line description, coral arrow — each its own bordered card, never a grid of identical hover-lift tiles. Sections are separated by full-width colour-block bands (sunflower, mint) rather than hairlines. Everything is keyboard-numbered 1–5 to mirror the original console menu, and each row is a real button with a visible number badge.

Page 26 of 36

Imagery. Custom flat character illustration of Emoto itself: a rounded, friendly speaker-creature with a big ear on one side and a screen-face on the other, drawn in thick ink-blue outlines with flat coral, sunflower, and mint fills on cream — plus a small set of spot illustrations for each capability (a microphone, a photo with text lines lifting off it, a film frame, an open book). No stock photography, no device mockups, no gradient blobs. Illustration is always flat colour on the cream ground and may bleed off the right edge.

Page 27 of 36

7. Signature Design Concept

The public entry is the Main Menu, and its signature concept is "the menu as a spoken greeting": the first screen is not a centred SaaS hero but a cream field split asymmetrically, where the type itself is the image.

  • Left 58%: an oversized two-line headline in Sora 800 — "Halo, Alfian." on line one in ink blue #2B3A8F, and "Aku Emoto, teman pintarmu." on line two with "teman pintarmu" in coral #FF6B35 and a hand-drawn coral underline. The headline runs at 44px mobile / 112px desktop and spans nearly the full column width.
  • Directly beneath the headline: one pill button in ink blue with a coral mic glyph, labelled "Mulai bicara", and beside it a quiet text link "atau pilih dari menu". The button opens Voice Chat; the link scrolls to the numbered menu rows.
  • Right 42%: a full-height coral #FF6B35 colour block that bleeds off the right viewport edge, with the flat Emoto character illustration sitting half on the block and half on the cream, cropped by the edge.
  • Below the fold line: the five numbered menu rows begin immediately — each a bordered sticker-card with an 88px ink-blue numeral, its exact label, a one-line description, and a coral arrow. The rows mirror the original console's 1–5 keys and are real buttons with visible number badges.

No gradient, no centred stack, no blue button on white. The concept recomposes only accepted content — the greeting, the five options, and the voice entry — into a first screen that feels like a friend speaking to Alfian.

Page 28 of 36

8. Interaction Model & Motion Direction

Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d

Landing Hero Motion Brief

Page 29 of 36
  • Focal subject: the flat Emoto character illustration straddling the coral colour block at the right edge of the hero, with the oversized two-line headline as the dominant type object on the left.
  • Input → transformation → outcome thesis: as the first screen paints, the headline and the coral underline settle into place while the Emoto character and its coral block hold the right edge; when Alfian activates "Mulai bicara", the coral mic ring begins its listening pulse and the three coral voice bars beside the wordmark animate — the screen visibly becomes "Emoto is listening", which is exactly the accepted Voice Chat behavior.
  • Motion vocabulary: the mic ring pulses in coral only while listening (scale 1 → 1.06, 1.2s ease-in-out loop); menu rows slide up 12px and fade in staggered 60ms on first paint; the speaking state animates three small coral bars next to the wordmark like a voice meter; colour-block bands wipe in horizontally as they enter the viewport; hovering a menu row shifts it 4px right and fills the numeral badge with coral. One loop or one reveal per element — no parallax, no particles, no 3D.
  • Composed first frame: cream #FFF7EC field; ink-blue "Halo, Alfian." above coral "teman pintarmu." with its hand-drawn underline; the ink-blue "Mulai bicara" pill with a coral mic glyph and the quiet "atau pilih dari menu" link; the coral block bleeding off the right edge with the Emoto character half on it; the first numbered menu row just entering the fold.
  • Reduced-motion state: all reveals resolve instantly to their final positions; the mic ring and voice bars render as static coral indicators rather than looping animations; the menu rows are fully visible and keyboard-numbered 1–5 so every option remains reachable and readable.
Page 30 of 36

9. Non-Functional Requirements

  • NFR-1 — Local execution. Emoto runs as a local desktop/console program on Alfian's machine, driven by a numbered text menu and microphone/file-name text input. (explicit) Rationale: the source program is a local Python console loop.
  • NFR-2 — Indonesian speech recognition. Speech recognition uses Google's recognition service with Indonesian (id-ID) language. (explicit) Rationale: the source calls recognize_google(audio, language="id-ID").
  • NFR-3 — Text-to-speech configuration. Text-to-speech uses the local pyttsx3 engine at rate 175 and volume 1.0. (explicit) Rationale: the source sets these exact properties at initialization.
  • NFR-4 — Indonesian OCR. Photo and video text extraction use Tesseract OCR with the Indonesian language model (ind). (explicit) Rationale: the source calls image_to_string(..., lang='ind').
  • NFR-5 — Single-frame video reading. Video text reading reads a single frame from the video file. (explicit) Rationale: the source calls video.read() once and releases the capture.
  • NFR-6 — Fixed study knowledge. Study help answers come from a fixed built-in knowledge dictionary (matematika, bahasa, ipa, ips, default), not from a generative model. (explicit) Rationale: the source defines a static dictionary and matches by substring.
  • NFR-7 — Named addressing. The user is addressed by name as Alfian. (explicit) Rationale: the greeting, name answer, default study answer, and farewell all address Alfian by name.
  • NFR-8 — Dual output. Every Emoto response is both spoken aloud and printed to the console. (explicit) Rationale: the bicara function prints and speaks every message.
Page 31 of 36
  • NFR-9 — Ambient-noise calibration. Before listening, the recognizer adjusts for ambient noise for 0.5 seconds. (required_inference) Rationale: required for the accepted voice journey to capture usable audio in a real room.
  • NFR-10 — Readable text and controls. Headlines, wordmarks, labels, numbers, and card text and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit, with no other element covering any part of them. Imagery, decoration, and motion may be cropped, bled off an edge, rotated, overlapped, or cut as the creative direction asks, as long as they cover no readable text or control. (explicit — creative direction)
  • NFR-11 — Reduced motion. With prefers-reduced-motion, the interface provides a usable static arrangement: reveals resolve instantly, looping indicators become static, and every menu option remains fully readable and reachable. (explicit — creative direction)
Page 32 of 36

10. Tech Stack

Source-specified technology is preserved exactly.

  • Language and runtime: Python, run as a local console program.
  • Speech recognition: speech_recognition (sr.Recognizer, sr.Microphone) with Google's recognition service at language="id-ID".
  • Text-to-speech: pyttsx3, initialized with rate = 175 and volume = 1.0.
  • Computer vision / video: OpenCV (cv2) — VideoCapture, read, cvtColor(BGR2RGB), release.
  • OCR: pytesseract with Tesseract and the Indonesian language model (lang='ind').
  • Image handling: Pillow (PIL.Image) for opening photos and converting video frames to images.
  • Numerics: NumPy (np) for frame array handling.
  • Standard library: time, sys.
  • Interface: a numbered console menu with text input, plus the visual layer described in Sections 6–8 for the on-screen presentation of the same five options and their states.

No server, database, container, or orchestration layer is required by the accepted scope: Emoto is a local, single-user program with no persisted state.

Page 33 of 36

11. Assumptions and Constraints

Constraints (source-stated, binding)

  • Emoto operates as a local desktop/console program driven by a numbered text menu and microphone/file-name text input.
  • Speech recognition uses Google's recognition service with Indonesian (id-ID) language.
  • Text-to-speech uses the local pyttsx3 engine at rate 175 and volume 1.0.
  • Photo and video text extraction use Tesseract OCR with the Indonesian language model (ind).
  • Video text reading reads a single frame from the video file.
  • Study help answers come from the fixed built-in knowledge dictionary (matematika, bahasa, ipa, ips, default), not from a generative model.
  • The user is addressed by name as Alfian.

Assumptions (narrow, labeled)

  • [Assumption] A working microphone is available on Alfian's machine for Voice Chat.
  • [Assumption] Network connectivity to Google's recognition service is available when Alfian uses Voice Chat; when it is not, the accepted retry message is spoken.
  • [Assumption] Tesseract with the Indonesian language model is installed locally for Photo Reader and Video Reader.
  • [Assumption] The photo or video file Alfian names is locally accessible at the time he enters it.
  • [Assumption] The program runs in a single session; no conversation history, extracted text, or results persist between runs, because the source defines no persistence.

Defaults (not specified by the user)

Page 34 of 36
  • [Default — not specified by user] The on-screen presentation of the console menu uses the visual system in Sections 6–8; the source specifies console text output, and the creative direction specifies how that same content is presented.
  • [Default — not specified by user] Focus, hover, and keyboard-navigation styling follow the creative direction's coral focus ring and ink-blue borders.

Explicit exclusions

  • No generative or model-based study answers; study help is limited to the fixed dictionary.
  • No multi-frame or full-video text extraction; video reading uses a single frame.
  • No continuous, always-on, or wake-word listening; Voice Chat listens only after Alfian selects option 1.
  • No accounts, sign-in, profiles, or permission model; Emoto is a local single-user program.
  • No persistence of conversations, files, or results between runs.
Page 35 of 36

12. Glossary

  • Emoto — the speaking assistant character and the product's voice; it greets Alfian, answers him, reads text aloud, and encourages his study.
  • Alfian — the named user Emoto addresses; the single accepted active human persona.
  • Main Menu — the entry surface showing the header "\xf0\x9f\xa4\x96 EMOTO AI — MENU UTAMA" and the five numbered options.
  • Voice Chat — the surface that captures microphone audio, recognizes Indonesian speech, and speaks Emoto's reply.
  • Photo Reader — the surface that takes a photo file name, runs Indonesian OCR, and speaks the extracted text.
  • Video Reader — the surface that takes a video file name, reads a single frame, runs Indonesian OCR on it, and speaks the result.
  • Study Help — the surface that takes a study topic and returns the matching fixed dictionary answer or the default encouragement.
  • Knowledge dictionary — the fixed built-in set of study answers keyed by matematika, bahasa, ipa, ips, and default.
  • Utterance — the lowercased text returned by Indonesian speech recognition for one listening turn.
  • Ambient-noise calibration — the 0.5-second adjustment the recognizer performs before listening.
  • Single-frame reading — reading exactly one frame from a video file for OCR, as the source specifies.
  • Spoken-and-printed response — the rule that every Emoto response is both spoken through pyttsx3 and printed to the console.
Page 36 of 36

No completed page designs yet.

Completed design pages will appear here when they are ready to preview.

Main Menu: Hear startup greeting
Main Menu: 1. View menu options
Main Menu: 2. Select voice chat option
Voice Chat: 3. Speak question or remark
Voice Chat: 4. Hear identity answer
Voice Chat: 5. Hear thanks reply
Voice Chat: 6. Hear name answer
Voice Chat: 7. Hear general reply
Voice Chat: 8. Hear unclear speech retry
Main Menu: 9. Return to menu after voice chat
Main Menu: 10. Select photo reader option
Photo Reader: 11. Enter photo file name
Photo Reader: 12. Hear extracted text
Photo Reader: 13. Hear no text found
Photo Reader: 14. Hear read error
Main Menu: 15. Return to menu after photo
Main Menu: 16. Select video reader option
Video Reader: 17. Enter video file name
Video Reader: 18. Hear extracted text
Video Reader: 19. Hear no clear text
Video Reader: 20. Hear open or read error
Main Menu: 21. Return to menu after video
Main Menu: 22. Select study help option
Study Help: 23. Name study topic
Study Help: 24. Hear matched topic answer
Study Help: 25. Hear default encouragement
Main Menu: 26. Return to menu after study help
Main Menu: Select exit option
Main Menu: Hear farewell message
Main Menu: 27. Hear invalid choice message

No completed page designs yet.

Completed design pages will appear here when they are ready to preview.

Main Menu: Hear startup greeting
Main Menu: 1. View menu options
Main Menu: 2. Select voice chat option
Voice Chat: 3. Speak question or remark
Voice Chat: 4. Hear identity answer
Voice Chat: 5. Hear thanks reply
Voice Chat: 6. Hear name answer
Voice Chat: 7. Hear general reply
Voice Chat: 8. Hear unclear speech retry
Main Menu: 9. Return to menu after voice chat
Main Menu: 10. Select photo reader option
Photo Reader: 11. Enter photo file name
Photo Reader: 12. Hear extracted text
Photo Reader: 13. Hear no text found
Photo Reader: 14. Hear read error
Main Menu: 15. Return to menu after photo
Main Menu: 16. Select video reader option
Video Reader: 17. Enter video file name
Video Reader: 18. Hear extracted text
Video Reader: 19. Hear no clear text
Video Reader: 20. Hear open or read error
Main Menu: 21. Return to menu after video
Main Menu: 22. Select study help option
Study Help: 23. Name study topic
Study Help: 24. Hear matched topic answer
Study Help: 25. Hear default encouragement
Main Menu: 26. Return to menu after study help
Main Menu: Select exit option
Main Menu: Hear farewell message
Main Menu: 27. Hear invalid choice message