Spaces:
Paused
Paused
| """ | |
| ๋ค์ด๋ฒ ํด๋ก๋ฐ ์์ฑ์ธ์(STT) API ์ฐ๋ ๋ชจ๋ | |
| """ | |
| import os | |
| import json | |
| import requests | |
| import logging | |
| from typing import Dict, Any | |
| from dotenv import load_dotenv | |
| # .env ํ์ผ ๋ก๋ | |
| load_dotenv() | |
| # ๋ก๊น ์ค์ | |
| logger = logging.getLogger("ClovaSTT") | |
| class ClovaSTT: | |
| """ | |
| ๋ค์ด๋ฒ ํด๋ก๋ฐ ์์ฑ์ธ์(STT) API ํด๋์ค | |
| """ | |
| def __init__(self): | |
| """ | |
| ํด๋ก๋ฐ STT ํด๋ผ์ด์ธํธ ์ด๊ธฐํ | |
| """ | |
| # .env ํ์ผ์์ ์ค์ ๊ฐ์ ธ์ค๊ธฐ | |
| self.client_id = os.getenv("NAVER_CLIENT_ID", "") | |
| self.client_secret = os.getenv("NAVER_CLIENT_SECRET", "") | |
| # ํด๋ผ์ด์ธํธ ID์ Secret ๊ฒ์ฆ | |
| if not self.client_id or not self.client_secret: | |
| logger.warning("๋ค์ด๋ฒ ํด๋ก๋ฐ API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.") | |
| logger.warning(".env ํ์ผ์ NAVER_CLIENT_ID์ NAVER_CLIENT_SECRET๋ฅผ ์ค์ ํด์ฃผ์ธ์.") | |
| else: | |
| logger.info("๋ค์ด๋ฒ ํด๋ก๋ฐ STT API ์ค์ ์๋ฃ") | |
| def recognize(self, audio_bytes, language="Kor") -> Dict[str, Any]: | |
| """ | |
| ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ๋ก ๋ณํ | |
| Args: | |
| audio_bytes: ์ค๋์ค ํ์ผ ๋ฐ์ดํธ ๋ฐ์ดํฐ | |
| language: ์ธ์ด ์ฝ๋ (๊ธฐ๋ณธ๊ฐ: 'Kor') | |
| Returns: | |
| ์ธ์๋ ํ ์คํธ ๋๋ ์ค๋ฅ ๋ฉ์์ง | |
| """ | |
| if not self.client_id or not self.client_secret: | |
| logger.error("API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.") | |
| return {"success": False, "error": "API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค."} | |
| try: | |
| # API ์๋ํฌ์ธํธ URL | |
| url = f"https://naveropenapi.apigw.ntruss.com/recog/v1/stt?lang={language}" | |
| # ์์ฒญ ํค๋ ์ค์ | |
| headers = { | |
| "X-NCP-APIGW-API-KEY-ID": self.client_id, | |
| "X-NCP-APIGW-API-KEY": self.client_secret, | |
| "Content-Type": "application/octet-stream" | |
| } | |
| logger.info("๋ค์ด๋ฒ ํด๋ก๋ฐ STT ์์ฒญ ์ ์ก ์ค...") | |
| # API ์์ฒญ ์ ์ก | |
| response = requests.post(url, headers=headers, data=audio_bytes, timeout=30) | |
| # ์๋ต ์ฒ๋ฆฌ | |
| if response.status_code == 200: | |
| result = response.json() | |
| recognized_text = result.get("text", "") | |
| logger.info(f"์ธ์ ์ฑ๊ณต: {recognized_text[:50]}...") | |
| return { | |
| "success": True, | |
| "text": recognized_text, | |
| "result": result | |
| } | |
| else: | |
| logger.error(f"API ์ค๋ฅ ์๋ต: {response.status_code}, {response.text}") | |
| return { | |
| "success": False, | |
| "error": f"API ์ค๋ฅ: {response.status_code}", | |
| "details": response.text | |
| } | |
| except Exception as e: | |
| logger.error(f"์์ฑ์ธ์ ์ฒ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}") | |
| return { | |
| "success": False, | |
| "error": "์์ฑ์ธ์ ์ฒ๋ฆฌ ์คํจ", | |
| "details": str(e) | |
| } |