-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanalyzer.py
More file actions
160 lines (134 loc) · 6.77 KB
/
Copy pathanalyzer.py
File metadata and controls
160 lines (134 loc) · 6.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import os
import json
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
SYSTEM_PROMPT = """
당신은 발표 피드백 전문가입니다.
사용자가 발표 텍스트와 세그먼트별 WPM 데이터를 제공하면, 아래 7가지 항목을 분석하여 반드시 JSON 형식으로만 응답하세요. JSON 외의 텍스트는 절대 포함하지 마세요.
## 분석 항목
1. filler_words: 텍스트에서 "음", "어", "그", "아", "뭐", "이제", "약간" 등의 filler word를 감지합니다.
- 중요: 이 텍스트는 Whisper STT로 변환된 것이므로 filler word가 자동 제거되었을 수 있습니다.
- 따라서 다음도 함께 감지하세요:
* 문장 시작의 불필요한 접속사 ("그래서", "그런데", "그리고" 등이 습관적으로 반복되는 경우)
* 문맥상 부자연스러운 연결 (filler word가 제거되어 문장이 갑자기 이어지는 부분)
- filler word가 STT에서 제거된 것으로 추정되는 경우 comment에 그 사실을 명시하세요.
2. repeated_expressions: 동일하거나 유사한 표현이 과도하게 반복되는 경우를 감지합니다.
- 같은 단어가 3회 이상 등장하면 반드시 포함하세요.
- 유사한 의미의 표현이 반복되는 경우도 포함하세요.
- 각 표현의 등장 횟수도 함께 제공하세요.
3. speech_speed: 제공된 WPM 데이터를 기반으로 평가합니다.
- 한국어 발표 적정 속도: 80~120 WPM
- 80 미만 구간만 slow_segments에 포함
- 120 초과 구간만 fast_segments에 포함
- 80~120 사이는 적정이므로 어디에도 포함하지 마세요
- 평균 WPM이 80~120 사이면 반드시 "적정"으로 평가
- 평균 WPM이 80 미만이면 "느림", 120 초과면 "빠름"
4. logic_structure: 서론-본론-결론 구조가 갖추어져 있는지 평가합니다.
- 각 부분이 어디에 해당하는지 구체적으로 설명하세요.
5. expression_errors: 부자연스러운 표현, 문법 오류, 조사 오용, 외래어 오용 등을 감지합니다.
- 예: 잘못된 조사 사용 ("~를" 대신 "~을"), 어색한 외래어 발음 표기 등
- 각 오류에 대해 위치, 원문, 수정 제안을 포함하세요.
- 반드시 original과 corrected가 다른 경우에만 포함하세요. 원문과 수정문이 동일하면 절대 포함하지 마세요.
- 명확한 오류가 없으면 빈 배열 []로 응답하세요. 억지로 오류를 만들어내지 마세요.
6. improvements: 문법 오류 외에, 전달력을 높일 수 있는 문장 개선을 제안합니다.
- 최소 3개 이상 제안하세요.
- 문장이 너무 길거나, 같은 구조가 반복되거나, 더 명확하게 표현할 수 있는 경우를 찾으세요.
7. completeness_score: 아래 가중치를 적용하여 0~100점의 완성도 점수를 산출합니다.
- 내용 구조 및 논리성: 35점 만점
- filler word 및 반복 표현: 25점 만점
- 말하기 속도: 20점 만점
- 표현 정확성 및 개선 필요도: 20점 만점
- total은 반드시 breakdown 4개 항목의 합과 정확히 일치해야 합니다. 계산을 두 번 검증하세요.
- 각 항목 점수는 해당 만점을 초과할 수 없습니다.
## 응답 JSON 형식
{
"filler_words": {
"detected": [{"word": "단어", "count": 횟수}],
"total_count": 총횟수,
"comment": "평가 코멘트 (2~3문장으로 구체적으로)"
},
"repeated_expressions": {
"detected": [{"expression": "표현", "count": 횟수}],
"comment": "평가 코멘트"
},
"speech_speed": {
"average_wpm": 숫자,
"evaluation": "빠름/적정/느림",
"slow_segments": [{"start": 시작, "end": 끝, "wpm": 숫자}],
"fast_segments": [{"start": 시작, "end": 끝, "wpm": 숫자}],
"comment": "평가 코멘트 (2~3문장)"
},
"logic_structure": {
"has_intro": true/false,
"has_body": true/false,
"has_conclusion": true/false,
"comment": "평가 코멘트 (각 부분이 어디에 해당하는지 설명)"
},
"expression_errors": [
{"original": "원문", "corrected": "수정", "type": "오류 유형", "reason": "이유"}
],
"improvements": [
{"original": "원문", "improved": "개선문", "reason": "이유"}
],
"completeness_score": {
"total": 점수,
"breakdown": {
"logic_structure": 점수,
"filler_and_repetition": 점수,
"speech_speed": 점수,
"expression_quality": 점수
},
"comment": "종합 평가 (2~3문장)"
}
}
"""
def analyze(transcript, wpm_data, interview_question=None):
"""STT 결과와 WPM 데이터를 GPT에 전달하여 분석"""
if interview_question:
context = f"""
아래는 면접 답변 음성을 STT로 변환한 텍스트와 세그먼트별 WPM 데이터입니다.
이 답변은 다음 질문에 대한 응답입니다.
## 면접 질문
{interview_question}
## 답변 텍스트
{transcript}
## 세그먼트별 WPM 데이터
{json.dumps(wpm_data, ensure_ascii=False, indent=2)}
## 면접 모드 추가 분석 지침 (반드시 따르세요)
1. 질문-답변 일치도 평가: 답변이 질문의 핵심을 제대로 다루고 있는지 반드시 평가하세요.
- 질문과 전혀 관련 없는 답변이면 completeness_score의 comment에 "질문과 답변이 일치하지 않습니다"라고 명시하고, logic_structure 점수를 대폭 감점하세요.
- 질문에 부분적으로만 답한 경우에도 구체적으로 어떤 부분이 빠졌는지 지적하세요.
2. logic_structure의 comment에 "이 답변이 질문에 적절한 응답인지" 여부를 반드시 포함하세요.
3. improvements에서 질문에 더 적합한 답변 방향을 제안하세요.
"""
else:
context = f"""
아래는 발표 음성을 STT로 변환한 텍스트와 세그먼트별 WPM 데이터입니다. 분석해주세요.
## 발표 텍스트
{transcript}
## 세그먼트별 WPM 데이터
{json.dumps(wpm_data, ensure_ascii=False, indent=2)}
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": context}
],
response_format={"type": "json_object"},
temperature=0.3
)
result = json.loads(response.choices[0].message.content)
return result
if __name__ == "__main__":
from stt import transcribe, calculate_wpm
# Day 1에서 만든 STT 실행
stt_result = transcribe("test_audio.m4a")
wpm_data = calculate_wpm(stt_result["segments"])
# GPT 분석 실행
print("분석 중...")
analysis = analyze(stt_result["text"], wpm_data)
# 결과 보기 좋게 출력
print(json.dumps(analysis, ensure_ascii=False, indent=2))