Jeongsoo1975 commited on
Commit
ad0eadb
·
1 Parent(s): d0b3084

feat: 오디오 업로드 기능 추가

Browse files
Files changed (3) hide show
  1. README.md +45 -15
  2. app.py +172 -42
  3. requirements.txt +3 -0
README.md CHANGED
@@ -1,6 +1,6 @@
1
  ---
2
  title: 2인 대화 화자 분리기 (AI)
3
- emoji: 💬
4
  colorFrom: blue
5
  colorTo: purple
6
  sdk: gradio
@@ -8,34 +8,44 @@ sdk_version: 4.44.0
8
  app_file: app.py
9
  pinned: false
10
  license: mit
11
- short_description: Gemini 2.0 Flash AI를 사용한 텍스트 화자 분리 및 맞춤법 교정
12
  ---
13
 
14
- # 💬 2인 대화 화자 분리기 (AI)
15
 
16
- **Gemini 2.0 Flash AI를 사용한 한국어 2인 대화 텍스트 화자 분리 및 맞춤법 교정 서비스**
17
 
18
  ## 🚀 주요 기능
19
 
 
20
  - **🎯 정확한 화자 분리**: Google Gemini 2.0 Flash를 활용한 고정밀 화자 구분
21
  - **✏️ 맞춤법 교정**: AI 기반 한국어 맞춤법 및 오타 교정
22
  - **📊 결과 비교**: 원본, 화자 분리, 교정본 단계별 비교 가능
23
  - **👥 개별 화자 추출**: 각 화자의 발언만 따로 추출하여 분석 가능
24
  - **🌐 웹 인터페이스**: 사용하기 쉬운 Gradio 기반 웹 UI
 
25
 
26
  ## 📖 사용법
27
 
28
- 1. **텍스트 입력**: 2인 대화 텍스트를 입력창에 붙여넣기
29
- 2. **처리 시작**: '🚀 처리 시작' 버튼 클릭
30
- 3. **결과 확인**: 탭별로 다음 결과 확인:
31
- - 📝 원본 텍스트
 
 
32
  - 👥 화자 분리 (원본)
33
  - ✏️ 화자 분리 (교정)
34
  - 👤 화자1 대화
35
  - 👤 화자2 대화
36
 
 
 
 
 
 
37
  ## ⚙️ 기술 스택
38
 
 
39
  - **AI 모델**: Google Gemini 2.0 Flash
40
  - **웹 프레임워크**: Gradio
41
  - **언어**: Python
@@ -43,7 +53,7 @@ short_description: Gemini 2.0 Flash AI를 사용한 텍스트 화자 분리 및
43
 
44
  ## 🎯 사용 예시
45
 
46
- ### 입력 텍스트
47
  ```
48
  안녕하세요, 오늘 회의에 참석해주셔서 감사합니다. 네, 안녕하세요. 준비된 자료가 있나요? 네, 프레젠테이션 자료를 준비했습니다. 그럼 시작해볼까요?
49
  ```
@@ -55,12 +65,29 @@ short_description: Gemini 2.0 Flash AI를 사용한 텍스트 화자 분리 및
55
  [화자1] 네, 프레젠테이션 자료를 준비했습니다. 그럼 시작해볼까요?
56
  ```
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  ## ⚠️ 주의사항
59
 
60
- - 처리 시간은 텍스트 길이에 따라 30초~2분 소요
61
  - Google AI API 사용량 제한 있음
62
  - 2인 대화에 최적화됨
63
- - 대화 맥락이 명확할수록 정확도 향상
 
 
64
 
65
  ## 🔧 환경 설정
66
 
@@ -69,9 +96,12 @@ short_description: Gemini 2.0 Flash AI를 사용한 텍스트 화자 분리 및
69
 
70
  ### 의존성
71
  ```
72
- python-dotenv
73
- google-generativeai
74
- gradio
 
 
 
75
  ```
76
 
77
  ## 📝 License
@@ -84,4 +114,4 @@ MIT License
84
 
85
  ---
86
 
87
- **Made with ❤️ using Google Gemini 2.0 Flash**
 
1
  ---
2
  title: 2인 대화 화자 분리기 (AI)
3
+ emoji: 🎤
4
  colorFrom: blue
5
  colorTo: purple
6
  sdk: gradio
 
8
  app_file: app.py
9
  pinned: false
10
  license: mit
11
+ short_description: Whisper + Gemini 2.0 Flash AI를 사용한 음성 인식, 화자 분리 및 맞춤법 교정
12
  ---
13
 
14
+ # 🎤 2인 대화 화자 분리기 (AI)
15
 
16
+ **Whisper + Gemini 2.0 Flash AI를 사용한 음성 인식, 화자 분리 및 맞춤법 교정 서비스**
17
 
18
  ## 🚀 주요 기능
19
 
20
+ - **🎤 음성 인식**: OpenAI Whisper를 활용한 고정밀 다국어 음성-텍스트 변환
21
  - **🎯 정확한 화자 분리**: Google Gemini 2.0 Flash를 활용한 고정밀 화자 구분
22
  - **✏️ 맞춤법 교정**: AI 기반 한국어 맞춤법 및 오타 교정
23
  - **📊 결과 비교**: 원본, 화자 분리, 교정본 단계별 비교 가능
24
  - **👥 개별 화자 추출**: 각 화자의 발언만 따로 추출하여 분석 가능
25
  - **🌐 웹 인터페이스**: 사용하기 쉬운 Gradio 기반 웹 UI
26
+ - **📝 텍스트 입력**: 오디오 없이 텍스트만으로도 화자 분리 가능
27
 
28
  ## 📖 사용법
29
 
30
+ ### 🎤 오디오 파일 처리
31
+ 1. **오디오 업로드**: WAV, MP3, MP4 등의 오디오 파일을 업로드
32
+ 2. **처리 시작**: '🚀 오디오 처리 시작' 버튼 클릭
33
+ 3. **자동 처리**: 음성 인식 → 화자 분리 → 맞춤법 교정 순으로 자동 처리
34
+ 4. **결과 확인**: 탭별로 다음 결과 확인:
35
+ - 📝 원본 텍스트 (음성 인식 결과)
36
  - 👥 화자 분리 (원본)
37
  - ✏️ 화자 분리 (교정)
38
  - 👤 화자1 대화
39
  - 👤 화자2 대화
40
 
41
+ ### 📝 텍스트 직접 입력
42
+ 1. **텍스트 입력**: 2인 대화 텍스트를 입력창에 붙여넣기
43
+ 2. **처리 시작**: '🚀 텍스트 처리 시작' 버튼 클릭
44
+ 3. **결과 확인**: 화자 분리 및 맞춤법 교정 결과 확인
45
+
46
  ## ⚙️ 기술 스택
47
 
48
+ - **음성 인식**: OpenAI Whisper (다국어 지원)
49
  - **AI 모델**: Google Gemini 2.0 Flash
50
  - **웹 프레임워크**: Gradio
51
  - **언어**: Python
 
53
 
54
  ## 🎯 사용 예시
55
 
56
+ ### 입력 (오디오 또는 텍스트)
57
  ```
58
  안녕하세요, 오늘 회의에 참석해주셔서 감사합니다. 네, 안녕하세요. 준비된 자료가 있나요? 네, 프레젠테이션 자료를 준비했습니다. 그럼 시작해볼까요?
59
  ```
 
65
  [화자1] 네, 프레젠테이션 자료를 준비했습니다. 그럼 시작해볼까요?
66
  ```
67
 
68
+ ## 📁 지원 형식
69
+
70
+ ### 오디오 형식
71
+ - **WAV**: 무손실 고품질 (권장)
72
+ - **MP3**: 일반적인 압축 형식
73
+ - **MP4**: 비디오에서 오디오 추출
74
+ - **M4A**: Apple 기본 형식
75
+ - **FLAC**: 무손실 압축 형식
76
+
77
+ ### 권장 오디오 품질
78
+ - **샘플레이트**: 16kHz 이상
79
+ - **비트레이트**: 128kbps 이상
80
+ - **채널**: 모노 또는 스테레오
81
+ - **길이**: 30초 ~ 30분 (최적: 2-10분)
82
+
83
  ## ⚠️ 주의사항
84
 
85
+ - 처리 시간은 오디오 길이에 따라 1-5분 소요
86
  - Google AI API 사용량 제한 있음
87
  - 2인 대화에 최적화됨
88
+ - 음질이 좋을수록 정확한 결과
89
+ - 배경 소음이 적고 화자 구분이 명확한 오디오 권장
90
+ - 너무 긴 오디오는 처리 시간이 오래 걸릴 수 있음
91
 
92
  ## 🔧 환경 설정
93
 
 
96
 
97
  ### 의존성
98
  ```
99
+ python-dotenv==1.0.0
100
+ google-generativeai==0.8.3
101
+ gradio==4.44.0
102
+ openai-whisper==20240930
103
+ torch==2.0.1
104
+ torchaudio==2.0.2
105
  ```
106
 
107
  ## 📝 License
 
114
 
115
  ---
116
 
117
+ **Made with ❤️ using OpenAI Whisper + Google Gemini 2.0 Flash**
app.py CHANGED
@@ -1,6 +1,8 @@
1
  import gradio as gr
2
  import os
3
  import logging
 
 
4
  from datetime import datetime
5
  from stt_processor import TextProcessor
6
 
@@ -16,10 +18,11 @@ logger = logging.getLogger(__name__)
16
 
17
  # 전역 변수
18
  text_processor = None
 
19
 
20
- def initialize_processor():
21
- """텍스트 프로세서를 초기화합니다."""
22
- global text_processor
23
  try:
24
  # 환경 변수 또는 Hugging Face Secrets에서 API 키 읽기
25
  google_api_key = os.getenv("GOOGLE_API_KEY")
@@ -27,13 +30,106 @@ def initialize_processor():
27
  if not google_api_key:
28
  return False, "❌ Google API 키가 설정되지 않았습니다. Hugging Face Spaces의 Settings에서 GOOGLE_API_KEY를 설정해주세요."
29
 
 
 
 
 
 
 
30
  text_processor = TextProcessor(google_api_key)
31
- return True, "✅ 텍스트 프로세서가 초기화되었습니다."
32
 
33
  except Exception as e:
34
- logger.error(f"텍스트 프로세서 초기화 실패: {e}")
35
  return False, f"❌ 초기화 실패: {str(e)}"
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  def process_text_input(input_text, progress=gr.Progress()):
38
  """
39
  입력된 텍스트를 처리합니다.
@@ -51,10 +147,10 @@ def process_text_input(input_text, progress=gr.Progress()):
51
  return "❌ 처리할 텍스트를 입력해주세요.", "", "", "", "", ""
52
 
53
  try:
54
- # 텍스트 프로세서 초기화 (필요한 경우)
55
  if text_processor is None:
56
  progress(0.1, desc="텍스트 프로세서 초기화 중...")
57
- success, message = initialize_processor()
58
  if not success:
59
  return message, "", "", "", "", ""
60
 
@@ -89,7 +185,7 @@ def process_text_input(input_text, progress=gr.Progress()):
89
  progress(1.0, desc="처리 완료!")
90
 
91
  status_message = f"""
92
- **처리 완료!**
93
  - 텍스트명: {result['text_name']}
94
  - 처리 시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
95
  - 화자1 발언 수: {len(conversations.get('화자1', []))}개
@@ -127,31 +223,45 @@ def create_interface():
127
  # 헤더
128
  gr.HTML("""
129
  <div class="main-header">
130
- <h1>💬 2인 대화 화자 분리기 (AI)</h1>
131
- <p>Gemini 2.0 Flash AI를 사용한 텍스트 화자 분리 및 맞춤법 교정</p>
132
  </div>
133
  """)
134
 
135
  with gr.Row():
136
  with gr.Column(scale=1):
137
- # 텍스트 입력 섹션
138
- gr.Markdown("### 📝 텍스트 입력")
139
- text_input = gr.Textbox(
140
- label="2인 대화 텍스트를 입력하세요",
141
- placeholder="두 명이 나누는 대화 내용을 여기에 붙여넣기하세요...\n\n예시:\n안녕하세요, 오늘 회의에 참석해주셔서 감사합니다. 네, 안녕하세요. 준비된 자료가 있나요? 네, 프레젠테이션 자료를 준비했습니다.",
142
- lines=8,
143
- max_lines=15
144
- )
145
-
146
- process_btn = gr.Button(
147
- "🚀 처리 시작",
148
- variant="primary",
149
- size="lg"
150
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
  # 상태 표시
153
  status_output = gr.Markdown(
154
- "### 📊 처리 상태\n준비 완료. 2인 대화 텍스트를 입력하고 '처리 시작' 버튼을 클릭하세요.",
155
  elem_classes=["status-box"]
156
  )
157
 
@@ -160,7 +270,7 @@ def create_interface():
160
  with gr.Tabs():
161
  with gr.TabItem("📝 원본 텍스���"):
162
  original_output = gr.Textbox(
163
- label="입력된 원본 텍스트",
164
  lines=10,
165
  max_lines=20,
166
  placeholder="처리 후 원본 텍스트가 여기에 표시됩니다..."
@@ -201,35 +311,55 @@ def create_interface():
201
  # 사용법 안내
202
  gr.Markdown("""
203
  ### 📖 사용법
 
 
 
 
 
 
 
204
  1. **텍스트 입력**: 2인 대화 텍스트를 입력란에 붙여넣기하세요
205
- 2. **처리 시작**: '🚀 처리 시작' 버튼을 클릭하여 화자 분리를 시작하세요
206
- 3. **결과 확인**: 각 탭에서 원본 텍스트, 화자 분리 결과, 개별 화자 대화를 확인하세요
207
 
208
  ### ⚙️ 기술 정보
 
209
  - **화자 분리**: Google Gemini 2.0 Flash
210
  - **맞춤법 교정**: 고급 AI 기반 한국어 교정
211
- - **지원 언어**: 한국어 최적화
212
- - **최적 환경**: 2인 대화, 명확한 문맥
213
 
214
  ### ⚠️ 주의사항
215
- - 처리 시간은 텍스트 길이에 따라 달라집니다 (보통 30초-2분)
216
  - Google AI API 사용량 제한이 있을 수 있습니다
217
  - 2인 대화에 최적화되어 있습니다
218
- - 대화 맥락이 명확할수록 분리 정확도가 높아집니다
 
219
  """)
220
 
221
  # 이벤트 연결
222
- process_btn.click(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  fn=process_text_input,
224
  inputs=[text_input],
225
- outputs=[
226
- status_output,
227
- original_output,
228
- separated_output,
229
- corrected_output,
230
- speaker1_output,
231
- speaker2_output
232
- ],
233
  show_progress=True
234
  )
235
 
@@ -243,4 +373,4 @@ if __name__ == "__main__":
243
  app = create_interface()
244
 
245
  # 앱 실행 (Hugging Face Spaces용)
246
- app.launch()
 
1
  import gradio as gr
2
  import os
3
  import logging
4
+ import tempfile
5
+ import whisper
6
  from datetime import datetime
7
  from stt_processor import TextProcessor
8
 
 
18
 
19
  # 전역 변수
20
  text_processor = None
21
+ whisper_model = None
22
 
23
+ def initialize_models():
24
+ """모델들을 초기화합니다."""
25
+ global text_processor, whisper_model
26
  try:
27
  # 환경 변수 또는 Hugging Face Secrets에서 API 키 읽기
28
  google_api_key = os.getenv("GOOGLE_API_KEY")
 
30
  if not google_api_key:
31
  return False, "❌ Google API 키가 설정되지 않았습니다. Hugging Face Spaces의 Settings에서 GOOGLE_API_KEY를 설정해주세요."
32
 
33
+ # Whisper 모델 로드
34
+ logger.info("Whisper 모델을 로딩합니다...")
35
+ whisper_model = whisper.load_model("base")
36
+ logger.info("Whisper 모델 로딩 완료")
37
+
38
+ # 텍스트 프로세서 초기화
39
  text_processor = TextProcessor(google_api_key)
40
+ return True, "✅ 모든 모델이 초기화되었습니다."
41
 
42
  except Exception as e:
43
+ logger.error(f"모델 초기화 실패: {e}")
44
  return False, f"❌ 초기화 실패: {str(e)}"
45
 
46
+ def process_audio_file(audio_file, progress=gr.Progress()):
47
+ """
48
+ 업로드된 오디오 파일을 처리합니다.
49
+
50
+ Args:
51
+ audio_file: 업로드된 오디오 파일
52
+ progress: Gradio 진행률 객체
53
+
54
+ Returns:
55
+ tuple: (처리 상태, 원본 텍스트, 화자 분리 결과, 교정 결과, 화자1 대화, 화자2 대화)
56
+ """
57
+ global text_processor, whisper_model
58
+
59
+ if audio_file is None:
60
+ return "❌ 오디오 파일을 업로드해주세요.", "", "", "", "", ""
61
+
62
+ try:
63
+ # 모델 초기화 (필요한 경우)
64
+ if whisper_model is None or text_processor is None:
65
+ progress(0.05, desc="모델 초기화 중...")
66
+ success, message = initialize_models()
67
+ if not success:
68
+ return message, "", "", "", "", ""
69
+
70
+ # 오디오 파일 경로 확인
71
+ audio_path = audio_file.name if hasattr(audio_file, 'name') else audio_file
72
+ logger.info(f"오디오 파일 처리 시작: {audio_path}")
73
+
74
+ # 1단계: Whisper로 음성 인식
75
+ progress(0.1, desc="음성을 텍스트로 변환 중...")
76
+ logger.info("Whisper를 통한 음성 인식 시작")
77
+
78
+ result = whisper_model.transcribe(audio_path)
79
+ full_text = result['text'].strip()
80
+
81
+ if not full_text:
82
+ return "❌ 오디오에서 텍스트를 추출할 수 없습니다.", "", "", "", "", ""
83
+
84
+ language = result.get('language', 'unknown')
85
+ logger.info(f"음성 인식 완료. 언어: {language}, 텍스트 길이: {len(full_text)}")
86
+
87
+ # 2단계: AI 모델 로딩
88
+ progress(0.3, desc="AI 모델 로딩 중...")
89
+ if not text_processor.models_loaded:
90
+ text_processor.load_models()
91
+
92
+ # 진행 상황 콜백 함수
93
+ def progress_callback(status, current, total):
94
+ progress_value = 0.3 + (current / total) * 0.6 # 0.3~0.9 범위
95
+ progress(progress_value, desc=f"{status} ({current}/{total})")
96
+
97
+ # 3단계: 텍스트 처리 (화자 분리 + 맞춤법 교정)
98
+ progress(0.4, desc="AI 화자 분리 및 맞춤법 교정 중...")
99
+ text_result = text_processor.process_text(full_text, progress_callback=progress_callback)
100
+
101
+ if not text_result.get("success", False):
102
+ return f"❌ 텍스트 처리 실패: {text_result.get('error', 'Unknown error')}", full_text, "", "", "", ""
103
+
104
+ # 결과 추출
105
+ progress(0.95, desc="결과 정리 중...")
106
+ original_text = text_result["original_text"]
107
+ separated_text = text_result["separated_text"]
108
+ corrected_text = text_result["corrected_text"]
109
+
110
+ # 화자별 대화 추출
111
+ conversations = text_result["conversations_by_speaker_corrected"]
112
+ speaker1_text = "\n\n".join([f"{i+1}. {utterance}" for i, utterance in enumerate(conversations.get("화자1", []))])
113
+ speaker2_text = "\n\n".join([f"{i+1}. {utterance}" for i, utterance in enumerate(conversations.get("화자2", []))])
114
+
115
+ progress(1.0, desc="처리 완료!")
116
+
117
+ status_message = f"""
118
+ ✅ **오디오 처리 완료!**
119
+ - 파일명: {os.path.basename(audio_path)}
120
+ - 처리 시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
121
+ - 감지된 언어: {language}
122
+ - 텍스트 길이: {len(full_text)}자
123
+ - 화자1 발언 수: {len(conversations.get('화자1', []))}개
124
+ - 화자2 발언 수: {len(conversations.get('화자2', []))}개
125
+ """
126
+
127
+ return status_message, original_text, separated_text, corrected_text, speaker1_text, speaker2_text
128
+
129
+ except Exception as e:
130
+ logger.error(f"오디오 파일 처리 중 오류: {e}")
131
+ return f"❌ 처리 중 오류가 발생했습니다: {str(e)}", "", "", "", "", ""
132
+
133
  def process_text_input(input_text, progress=gr.Progress()):
134
  """
135
  입력된 텍스트를 처리합니다.
 
147
  return "❌ 처리할 텍스트를 입력해주세요.", "", "", "", "", ""
148
 
149
  try:
150
+ # 모델 초기화 (필요한 경우)
151
  if text_processor is None:
152
  progress(0.1, desc="텍스트 프로세서 초기화 중...")
153
+ success, message = initialize_models()
154
  if not success:
155
  return message, "", "", "", "", ""
156
 
 
185
  progress(1.0, desc="처리 완료!")
186
 
187
  status_message = f"""
188
+ **텍스트 처리 완료!**
189
  - 텍스트명: {result['text_name']}
190
  - 처리 시간: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
191
  - 화자1 발언 수: {len(conversations.get('화자1', []))}개
 
223
  # 헤더
224
  gr.HTML("""
225
  <div class="main-header">
226
+ <h1>🎤 2인 대화 화자 분리기 (AI)</h1>
227
+ <p>Whisper + Gemini 2.0 Flash AI를 사용한 음성 인식, 화자 분리 및 맞춤법 교정</p>
228
  </div>
229
  """)
230
 
231
  with gr.Row():
232
  with gr.Column(scale=1):
233
+ # 입력 섹션
234
+ with gr.Tabs():
235
+ with gr.TabItem("🎤 오디오 업로드"):
236
+ gr.Markdown("### 🎤 오디오 파일 업로드")
237
+ audio_input = gr.Audio(
238
+ label="2인 대화 오디오 파일을 업로드하세요",
239
+ type="filepath",
240
+ format="wav"
241
+ )
242
+ audio_process_btn = gr.Button(
243
+ "🚀 오디오 처리 시작",
244
+ variant="primary",
245
+ size="lg"
246
+ )
247
+
248
+ with gr.TabItem("📝 텍스트 입력"):
249
+ gr.Markdown("### 📝 텍스트 직접 입력")
250
+ text_input = gr.Textbox(
251
+ label="2인 대화 텍스트를 입력하세요",
252
+ placeholder="두 명이 나누는 대화 내용을 여기에 붙여넣기하세요...\n\n예시:\n안녕하세요, 오늘 회의에 참석해주셔서 감사합니다. 네, 안녕하세요. 준비된 자료가 있나요? 네, 프레젠테이션 자료를 준비했습니다.",
253
+ lines=8,
254
+ max_lines=15
255
+ )
256
+ text_process_btn = gr.Button(
257
+ "🚀 텍스트 처리 시작",
258
+ variant="primary",
259
+ size="lg"
260
+ )
261
 
262
  # 상태 표시
263
  status_output = gr.Markdown(
264
+ "### 📊 처리 상태\n준비 완료. 오디오 파일을 업로드하거나 텍스트를 입력하고 처리 버튼을 클릭하세요.",
265
  elem_classes=["status-box"]
266
  )
267
 
 
270
  with gr.Tabs():
271
  with gr.TabItem("📝 원본 텍스���"):
272
  original_output = gr.Textbox(
273
+ label="추출/입력된 원본 텍스트",
274
  lines=10,
275
  max_lines=20,
276
  placeholder="처리 후 원본 텍스트가 여기에 표시됩니다..."
 
311
  # 사용법 안내
312
  gr.Markdown("""
313
  ### 📖 사용법
314
+
315
+ **🎤 오디오 파일 처리:**
316
+ 1. **오디오 업로드**: WAV, MP3, MP4 등의 오디오 파일을 업로드하세요
317
+ 2. **처리 시작**: '🚀 오디오 처리 시작' 버튼을 클릭하세요
318
+ 3. **결과 확인**: 음성 인식 → 화자 분리 → 맞춤법 교정 순으로 처리됩니다
319
+
320
+ **📝 텍스트 직접 입력:**
321
  1. **텍스트 입력**: 2인 대화 텍스트를 입력란에 붙여넣기하세요
322
+ 2. **처리 시작**: '🚀 텍스트 처리 시작' 버튼을 클릭하세요
323
+ 3. **결과 확인**: 각 탭에서 화자 분리 결과를 확인하세요
324
 
325
  ### ⚙️ 기술 정보
326
+ - **음성 인식**: OpenAI Whisper (다국어 지원)
327
  - **화자 분리**: Google Gemini 2.0 Flash
328
  - **맞춤법 교정**: 고급 AI 기반 한국어 교정
329
+ - **지원 형식**: WAV, MP3, MP4, M4A 등
330
+ - **최적 환경**: 2인 대화, 명확한 음질
331
 
332
  ### ⚠️ 주의사항
333
+ - 처리 시간은 오디오 길이에 따라 달라집니다 (보통 1-5분)
334
  - Google AI API 사용량 제한이 있을 수 있습니다
335
  - 2인 대화에 최적화되어 있습니다
336
+ - 음질이 좋을수록 정확한 결과를 얻을 수 있습니다
337
+ - 배경 소음이 적고 화자 구분이 명확한 오디오를 권장합니다
338
  """)
339
 
340
  # 이벤트 연결
341
+ outputs = [
342
+ status_output,
343
+ original_output,
344
+ separated_output,
345
+ corrected_output,
346
+ speaker1_output,
347
+ speaker2_output
348
+ ]
349
+
350
+ # 오디오 처리 이벤트
351
+ audio_process_btn.click(
352
+ fn=process_audio_file,
353
+ inputs=[audio_input],
354
+ outputs=outputs,
355
+ show_progress=True
356
+ )
357
+
358
+ # 텍스트 처리 이벤트
359
+ text_process_btn.click(
360
  fn=process_text_input,
361
  inputs=[text_input],
362
+ outputs=outputs,
 
 
 
 
 
 
 
363
  show_progress=True
364
  )
365
 
 
373
  app = create_interface()
374
 
375
  # 앱 실행 (Hugging Face Spaces용)
376
+ app.launch()
requirements.txt CHANGED
@@ -1,3 +1,6 @@
1
  python-dotenv==1.0.0
2
  google-generativeai==0.8.3
3
  gradio==4.44.0
 
 
 
 
1
  python-dotenv==1.0.0
2
  google-generativeai==0.8.3
3
  gradio==4.44.0
4
+ openai-whisper==20240930
5
+ torch==2.0.1
6
+ torchaudio==2.0.2