""" 네이버 클로바 음성인식(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) }