Jeong-in commited on
Commit
b02f2bc
·
1 Parent(s): 68bb7da

채널톡 하나1.1 TTS 인증 및 stream 엔드포인트 적용 (#6)

Browse files

- 채널톡 하나1.1 TTS 인증 및 stream 엔드포인트 적용 (e8a362422024e64abe85250fda114e687bb6c6d6)

Files changed (1) hide show
  1. tts.py +21 -6
tts.py CHANGED
@@ -43,6 +43,8 @@ CHANNEL_HANA_1_1_URL = os.getenv(
43
  "CHANNEL_HANA_1_1_URL",
44
  "https://ch-hana-tts.channel.io"
45
  )
 
 
46
 
47
  ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
48
  ELEVENLABS_VOICE_ID = os.getenv("ELEVENLABS_VOICE_ID", "spzDnDXYekkOPfsxp0U3") # Olivia (기본)
@@ -313,20 +315,33 @@ def predict_channel_tts(text: str, voice: str = "hana") -> str:
313
 
314
 
315
  def predict_channel_hana_1_1_tts(text: str, voice: str = "hana") -> str:
316
- """채널톡 하나1.1 TTS API 호출"""
317
- url = f"{CHANNEL_HANA_1_1_URL}/v1/text-to-speech/{voice}"
 
 
 
 
 
 
318
 
319
  response = requests.post(
320
  url,
321
- headers={"Content-Type": "application/json"},
322
- json={"text": text, "output_format": "wav_24000"},
 
 
 
323
  timeout=30,
324
  )
325
  response.raise_for_status()
326
 
327
- # 임시 파일에 저장
328
  with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as f:
329
- f.write(response.content)
 
 
 
 
330
  return f.name
331
 
332
 
 
43
  "CHANNEL_HANA_1_1_URL",
44
  "https://ch-hana-tts.channel.io"
45
  )
46
+ # 채널톡 하나1.1 TTS API Key (Bearer 토큰)
47
+ CHANNEL_HANA_1_1_API_KEY = os.getenv("CHTTS_API_KEY")
48
 
49
  ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
50
  ELEVENLABS_VOICE_ID = os.getenv("ELEVENLABS_VOICE_ID", "spzDnDXYekkOPfsxp0U3") # Olivia (기본)
 
315
 
316
 
317
  def predict_channel_hana_1_1_tts(text: str, voice: str = "hana") -> str:
318
+ """채널톡 하나1.1 TTS API 호출
319
+
320
+ stream 엔드포인트는 raw PCM(s16le, 24kHz, mono)을 반환하므로 WAV로 감싼다.
321
+ """
322
+ if not CHANNEL_HANA_1_1_API_KEY:
323
+ raise ValueError("CHTTS_API_KEY 환경 변수가 설정되지 않았습니다.")
324
+
325
+ url = f"{CHANNEL_HANA_1_1_URL}/v1/text-to-speech/{voice}/stream"
326
 
327
  response = requests.post(
328
  url,
329
+ headers={
330
+ "Content-Type": "application/json",
331
+ "Authorization": f"Bearer {CHANNEL_HANA_1_1_API_KEY}",
332
+ },
333
+ json={"text": text, "output_format": "pcm_24000"},
334
  timeout=30,
335
  )
336
  response.raise_for_status()
337
 
338
+ # raw PCM(s16le, 24kHz, mono)을 WAV 컨테이너로 감싸 저장
339
  with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as f:
340
+ with wave.open(f, "wb") as wav:
341
+ wav.setnchannels(1)
342
+ wav.setsampwidth(2) # 16-bit
343
+ wav.setframerate(24000)
344
+ wav.writeframes(response.content)
345
  return f.name
346
 
347