AI활용한 영작 첨삭 프로그램 만들기
구글 제미나이와 구글AI스튜디오 활용해 봤고
첫 코드는 제미나이가 구동은 AI스튜디오가 해줌
적용스크립트
파이썬과 제미니의 AI기능을 활용해서 작문첨삭 프로그램을 만들고싶어
랜덤으로 주제를 제공하고 사용자가 설정한 언어로 내용을 작성하면
AI프로그램이 작성한 내용이 문법에 맞는지, 단어가 적절한지 첨삭해주는 기능이 메인이야
한켠에는 생각이 나지않는 단어를 바로 검색할수있는 검색기능을 넣고 작문 첨삭이 끝나면
녹음기능으로 내가 작성한 문장을 녹음해보며 발음이나 인토네이션을 맞게 하고있는지
체크할수있는 기능도 있었으면 해
처음 스크립트는 이렇게 주었고 중간에
- 첨삭 피드백 상단에 온전히 고쳐진 문장들도 제시해줘
같은 기능을 추가로 넣어 보기도 함
원하는 기능
- 사용자가 생각하여 이야기를 쓸 수있도록 제공하는 적절한 주
- 작문하면 첨삭해주는기능
- 문법이나 어조가 적절한지 분석해주는 기능
- 하고싶은 말이 있으나 단어를 모를때 바로 검색할수있는 기능
- 녹음으로 내가 쓴 문장을 읽어보고 스스로 피드백할수있는 기능
코드 내용
import tkinter as tk
from tkinter import ttk, scrolledtext
class WritingApp:
def __init__(self, root):
self.root = root
self.root.title("AI 작문 첨삭 & 발음 교정 프로그램")
self.root.geometry("1000 axes 700")
# 메인 레이아웃 분할 (왼쪽: 입력 / 오른쪽: 결과)
main_paned = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL)
main_paned.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# --- 왼쪽 영역 (Input Section) ---
left_frame = ttk.Frame(main_paned)
main_paned.add(left_frame, weight=1)
# 1. 주제 제공 영역
self.topic_label = ttk.Label(left_frame, text="오늘의 주제: 여행 중 겪은 재미있는 에피소드", wraplength=400)
self.topic_label.pack(fill=tk.X, pady=5)
ttk.Button(left_frame, text="새 주제 가져오기").pack(anchor=tk.E)
# 2. 작문 입력창
ttk.Label(left_frame, text="작문 입력:").pack(anchor=tk.W, pady=(10, 0))
self.writing_area = scrolledtext.ScrolledText(left_frame, height=20)
self.writing_area.pack(fill=tk.BOTH, expand=True, pady=5)
# 3. 단어 검색창 (하단)
search_frame = ttk.LabelFrame(left_frame, text="실시간 단어 검색")
search_frame.pack(fill=tk.X, pady=10)
self.search_entry = ttk.Entry(search_frame)
self.search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5, pady=5)
ttk.Button(search_frame, text="검색").pack(side=tk.RIGHT, padx=5)
# --- 오른쪽 영역 (Output Section) ---
right_frame = ttk.Frame(main_paned)
main_paned.add(right_frame, weight=1)
# 4. AI 첨삭 결과창
ttk.Label(right_frame, text="AI 첨삭 피드백:").pack(anchor=tk.W)
self.result_area = scrolledtext.ScrolledText(right_frame, height=25, bg="#f0f0f0")
self.result_area.pack(fill=tk.BOTH, expand=True, pady=5)
# 5. 녹음 및 발음 체크 영역
record_frame = ttk.LabelFrame(right_frame, text="발음 연습 및 체크")
record_frame.pack(fill=tk.X, pady=10)
self.record_btn = ttk.Button(record_frame, text="🎤 녹음 시작")
self.record_btn.pack(side=tk.LEFT, padx=20, pady=10)
self.pronunciation_label = ttk.Label(record_frame, text="일치도: -- %")
self.pronunciation_label.pack(side=tk.RIGHT, padx=20)
# 하단 버튼
ttk.Button(self.root, text="AI 첨삭 시작하기", command=self.start_correction).pack(pady=10)
def start_correction(self):
# 여기에 Gemini API 호출 로직을 연결합니다.
print("첨삭 로직 가동...")
if __name__ == "__main__":
root = tk.Tk()
app = WritingApp(root)
root.mainloop()
구글AI스튜디오 적용
# 메인 레이아웃 분할
main_paned = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL)
main_paned.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# --- 왼쪽 영역 (Input Section) ---
left_frame = ttk.Frame(main_paned)
main_paned.add(left_frame, weight=1)
# 1. 주제 제공 영역
self.topic_label = ttk.Label(left_frame, text="주제를 불러오는 중...", wraplength=400, font=("Malgun Gothic", 10, "bold"))
self.topic_label.pack(fill=tk.X, pady=5)
ttk.Button(left_frame, text="새 주제 가져오기", command=self.get_new_topic).pack(anchor=tk.E)
# 2. 작문 입력창
ttk.Label(left_frame, text="작문 입력:").pack(anchor=tk.W, pady=(10, 0))
self.writing_area = scrolledtext.ScrolledText(left_frame, height=20, font=("Consolas", 11))
self.writing_area.pack(fill=tk.BOTH, expand=True, pady=5)
# 3. 단어 검색창
search_frame = ttk.LabelFrame(left_frame, text="실시간 단어 검색 (Gemini 사전)")
search_frame.pack(fill=tk.X, pady=10)
self.search_entry = ttk.Entry(search_frame)
self.search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5, pady=5)
ttk.Button(search_frame, text="검색", command=self.search_word).pack(side=tk.RIGHT, padx=5)
# --- 오른쪽 영역 (Output Section) ---
right_frame = ttk.Frame(main_paned)
main_paned.add(right_frame, weight=1)
# 4. AI 첨삭 결과창
ttk.Label(right_frame, text="AI 첨삭 피드백:").pack(anchor=tk.W)
self.result_area = scrolledtext.ScrolledText(right_frame, height=25, bg="#f8f9fa", font=("Malgun Gothic", 10))
self.result_area.pack(fill=tk.BOTH, expand=True, pady=5)
# 5. 녹음 및 발음 체크 영역
record_frame = ttk.LabelFrame(right_frame, text="발음 연습 및 체크 (영어 기준)")
record_frame.pack(fill=tk.X, pady=10)
self.record_btn = ttk.Button(record_frame, text="🎤 녹음 시작", command=self.start_recording_thread)
self.record_btn.pack(side=tk.LEFT, padx=20, pady=10)
self.pronunciation_text = tk.StringVar(value="대기 중...")
self.pronunciation_label = ttk.Label(record_frame, textvariable=self.pronunciation_text)
self.pronunciation_label.pack(side=tk.LEFT, padx=20)
# 하단 메인 버튼
ttk.Button(self.root, text="AI 첨삭 시작하기", command=self.start_correction).pack(pady=10)
# 시작하자마자 주제 하나 가져오기
self.get_new_topic()
# --- 기능 메서드들 ---
def get_new_topic(self):
"""Gemini에게 새로운 작문 주제를 요청합니다."""
def task():
try:
resp = model.generate_content("영어 작문을 위한 일상적인 주제 1가지만 추천해줘. 한국어로.")
self.topic_label.config(text=f"오늘의 주제: {resp.text.strip()}")
except:
self.topic_label.config(text="주제를 불러오지 못했습니다.")
threading.Thread(target=task).start()
def start_correction(self):
"""작성한 글을 Gemini에게 보내 첨삭을 받습니다."""
user_text = self.writing_area.get("1.0", tk.END).strip()
if not user_text:
messagebox.showwarning("경고", "작성된 내용이 없습니다.")
return
self.result_area.delete("1.0", tk.END)
self.result_area.insert(tk.END, "AI가 분석 중입니다... 잠시만 기다려주세요.\n")
def task():
try:
response = model.generate_content(f"다음 문장을 첨삭해줘:\n{user_text}")
self.result_area.delete("1.0", tk.END)
self.result_area.insert(tk.END, response.text)
except Exception as e:
self.result_area.insert(tk.END, f"\n에러 발생: {e}")
threading.Thread(target=task).start()
def search_word(self):
"""단어를 검색하여 결과를 피드백창 하단에 추가합니다."""
word = self.search_entry.get().strip()
if not word: return
def task():
resp = model.generate_content(f"단어 '{word}'의 뜻과 영어 번역, 그리고 예문 1개를 알려줘.")
self.result_area.insert(tk.END, f"\n\n--- 단어 검색 결과 ---\n{resp.text}")
self.result_area.see(tk.END)
threading.Thread(target=task).start()
def start_recording_thread(self):
"""녹음 중 GUI가 멈추지 않게 스레드로 실행합니다."""
self.record_btn.config(state=tk.DISABLED, text="🎤 듣는 중...")
threading.Thread(target=self.record_and_analyze).start()
def record_and_analyze(self):
"""마이크 음성을 인식하여 텍스트로 변환합니다."""
r = sr.Recognizer()
with sr.Microphone() as source:
try:
audio = r.listen(source, timeout=5, phrase_time_limit=10)
# 영어(en-US)로 인식하도록 설정
speech_text = r.recognize_google(audio, language='en-US')
self.pronunciation_text.set(f"인식 결과: {speech_text}")
self.result_area.insert(tk.END, f"\n\n[나의 발음 인식]: {speech_text}")
except Exception as e:
self.pronunciation_text.set("인식 실패")
finally:
self.record_btn.config(state=tk.NORMAL, text="🎤 녹음 시작")
결과



추가 사항
추가하면 좋을 것 같은 기능
- 오픽등 공식 말하기 시험들에서 자주 차용하는 주제
- 하루 일기처럼 작성한 작문을 저장할 수있는 시스템
- 작성자가 작성한 것보다 더 자연스러운 문장 추천
- 원어민 발음으로 완성된 문장을 읽어주는 시스템
- 영어 말고도 다른 나라 언어 적용
- AI분석기능으로 작성자가 버릇처럼 자주 쓰는 표현 정리와 자주쓰는 표현을 활용할 수 있는 문장 추천
- 다른 이용자들의 작성한 같은 주제에 대한 작문 공유
- 프로그램 운영자가 직접적으로 건들일수있는 토픽등의 DB
'심심해서 찔러보는 IT' 카테고리의 다른 글
| 위시캣PRD활용 - 영작첨삭 플랫폼 (0) | 2026.03.10 |
|---|---|
| 티스토리 자동 목차 및 이동링크 (0) | 2026.03.09 |
| 블로그내 하이퍼링크 만들기 (0) | 2026.02.23 |
| 온라인 뽑기 만들기(쿠지편) (0) | 2026.02.11 |
| 온라인 뽑기 만들기(가챠편) (0) | 2026.02.11 |