Spaces:
Running
Running
채널톡 하나1.1 TTS 인증 및 stream 엔드포인트 적용 (#6)
Browse files- 채널톡 하나1.1 TTS 인증 및 stream 엔드포인트 적용 (e8a362422024e64abe85250fda114e687bb6c6d6)
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 318 |
|
| 319 |
response = requests.post(
|
| 320 |
url,
|
| 321 |
-
headers={
|
| 322 |
-
|
|
|
|
|
|
|
|
|
|
| 323 |
timeout=30,
|
| 324 |
)
|
| 325 |
response.raise_for_status()
|
| 326 |
|
| 327 |
-
#
|
| 328 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as f:
|
| 329 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|