Spaces:
Sleeping
Sleeping
| import requests | |
| import gradio as gr | |
| import os | |
| import time | |
| # νκ²½ λ³μ μ΄κΈ°ν λ° κ²μ¦ | |
| def initialize_environment(): | |
| private_space_url = os.getenv("PRIVATE_SPACE_URL") | |
| hf_token = os.getenv("HF_TOKEN") | |
| if not private_space_url: | |
| raise EnvironmentError("PRIVATE_SPACE_URL νκ²½ λ³μκ° μ€μ λμ§ μμμ΅λλ€.") | |
| if not hf_token: | |
| raise EnvironmentError("HF_TOKEN νκ²½ λ³μκ° μ€μ λμ§ μμμ΅λλ€.") | |
| return private_space_url, hf_token | |
| PRIVATE_SPACE_URL, HF_TOKEN = initialize_environment() | |
| # Base URLλ‘ GET μμ² λ³΄λ΄λ ν¨μ | |
| def test_base_url(): | |
| headers = {"Authorization": f"Bearer {HF_TOKEN}"} | |
| print(f"[DEBUG] Sending GET request to base URL: {PRIVATE_SPACE_URL}") | |
| print(f"[DEBUG] HF Token: {HF_TOKEN}") | |
| try: | |
| response = requests.get(PRIVATE_SPACE_URL, headers=headers) | |
| print(f"[DEBUG] Base URL Response Status Code: {response.status_code}") | |
| except requests.exceptions.RequestException as e: | |
| print(f"[ERROR] Base URL μμ² μ€ μ€λ₯ λ°μ: {e}") | |
| # Actor ID μ‘°ν ν¨μ | |
| def fetch_actor_ids(): | |
| url = f"{PRIVATE_SPACE_URL}/api/actor" | |
| headers = {"Authorization": f"Bearer {HF_TOKEN}"} | |
| try: | |
| response = requests.get(url, headers=headers) | |
| response.raise_for_status() | |
| data = response.json() | |
| # Actor 리μ€νΈμμ μ΄λ¦κ³Ό ID μΆμΆ | |
| return { | |
| actor["name"]["en"]: actor["actor_id"] | |
| for actor in data.get("result", []) | |
| } | |
| except requests.exceptions.RequestException as e: | |
| print(f"[ERROR] Actor ID μ‘°ν μ€ μ€λ₯ λ°μ: {e}") | |
| return {} | |
| # URL μΉν ν¨μ | |
| def replace_speak_url(url): | |
| if not url: | |
| return None | |
| return url.replace("https://create-test.icepeak.ai", PRIVATE_SPACE_URL) | |
| # μμ± μμ± ν¨μ | |
| def generate_speech(text, actor_name, lang="en", speed_x=1.0, volume=100): | |
| actor_ids = fetch_actor_ids() | |
| if not actor_ids: | |
| return "Actor λͺ©λ‘μ κ°μ Έμ€λ λ° μ€ν¨νμ΅λλ€.", None | |
| actor_id = actor_ids.get(actor_name) | |
| if not actor_id: | |
| return "μ νν Actorλ₯Ό μ°Ύμ μ μμ΅λλ€.", None | |
| url = f"{PRIVATE_SPACE_URL}/api/speak" | |
| headers = { | |
| "Authorization": f"Bearer {HF_TOKEN}", | |
| "Content-Type": "application/json" | |
| } | |
| payload = { | |
| "actor_id": actor_id, | |
| "lang": lang, | |
| "text": text, | |
| "speed_x": speed_x, | |
| "volume": volume, | |
| "tts_mode": "actor" | |
| } | |
| print(f"[DEBUG] Sending speech generation request to: {url}") | |
| print(f"[DEBUG] Payload: {payload}") | |
| try: | |
| response = requests.post(url, json=payload, headers=headers) | |
| print(f"[DEBUG] Response Status Code: {response.status_code}") | |
| print(f"[DEBUG] Response Content: {response.text}") | |
| response.raise_for_status() | |
| data = response.json() | |
| print(f"[DEBUG] Response Data: {data}") | |
| speak_url = replace_speak_url(data.get("result", {}).get("speak_url")) | |
| if not speak_url: | |
| return "μ€λ₯: μ ν¨ν speak_urlμ λ°ννμ§ μμμ΅λλ€.", None | |
| # Polling for audio generation completion | |
| audio_url = poll_audio_url(speak_url) | |
| if not audio_url: | |
| return "μ€λ₯: μ€λμ€ λ€μ΄λ‘λ URLμ κ°μ Έμ¬ μ μμ΅λλ€.", None | |
| # Download the audio file | |
| audio_content = download_audio(audio_url) | |
| if not audio_content: | |
| return "μ€λ₯: μμ± νμΌμ λ€μ΄λ‘λν μ μμ΅λλ€.", None | |
| # Save the audio content to a temporary file | |
| audio_file_path = "temp_audio.wav" | |
| with open(audio_file_path, "wb") as audio_file: | |
| audio_file.write(audio_content) | |
| # Print debug information | |
| file_size = os.path.getsize(audio_file_path) | |
| print(f"[DEBUG] Saved audio file: {audio_file_path}, Size: {file_size} bytes") | |
| return "μμ±μ΄ μ±κ³΅μ μΌλ‘ μμ±λμμ΅λλ€.", audio_file_path | |
| except requests.exceptions.RequestException as e: | |
| print(f"[ERROR] μμ± μμ± μ€ μ€λ₯ λ°μ: {e}") | |
| return f"μ€λ₯: {str(e)}", None | |
| # Polling ν¨μ | |
| def poll_audio_url(speak_url, timeout=30, interval=2): | |
| headers = {"Authorization": f"Bearer {HF_TOKEN}"} | |
| start_time = time.time() | |
| while time.time() - start_time < timeout: | |
| try: | |
| print(f"[DEBUG] Polling speak URL: {speak_url}") | |
| response = requests.get(speak_url, headers=headers) | |
| response.raise_for_status() | |
| data = response.json() | |
| status = data.get("result", {}).get("status") | |
| if status == "done": | |
| audio_info = data.get("result", {}).get("audio", {}) | |
| audio_url = replace_speak_url(audio_info.get("url")) | |
| print(f"[DEBUG] Audio URL: {audio_url}") | |
| return audio_url | |
| except requests.exceptions.RequestException as e: | |
| print(f"[DEBUG] Polling attempt failed: {e}") | |
| time.sleep(interval) | |
| print("[ERROR] Polling timed out.") | |
| return None | |
| # Audio λ€μ΄λ‘λ ν¨μ | |
| def download_audio(audio_url): | |
| headers = {"Authorization": f"Bearer {HF_TOKEN}"} | |
| try: | |
| print(f"[DEBUG] Downloading audio from: {audio_url}") | |
| response = requests.get(audio_url, headers=headers, stream=True) | |
| response.raise_for_status() | |
| return response.content | |
| except requests.exceptions.RequestException as e: | |
| print(f"[ERROR] Audio λ€μ΄λ‘λ μ€ μ€λ₯ λ°μ: {e}") | |
| return None | |
| # Gradio μΈν°νμ΄μ€ ν¨μ | |
| def interface_function(text, actor_name, lang, speed_x, volume): | |
| result_message, audio_file_path = generate_speech(text, actor_name, lang, speed_x, volume) | |
| if audio_file_path: | |
| return result_message, audio_file_path | |
| return result_message, None | |
| # Fetch actors to populate dropdown | |
| actors = fetch_actor_ids() | |
| actor_names = list(actors.keys()) | |
| if not actor_names: | |
| print("[WARNING] Actor λͺ©λ‘μ κ°μ Έμ¬ μ μμ΄ κΈ°λ³Έ μ΅μ μ΄ μ€μ λ©λλ€.") | |
| # Base URL ν μ€νΈ | |
| test_base_url() | |
| # Gradio μΈν°νμ΄μ€ μμ± | |
| interface = gr.Interface( | |
| fn=interface_function, | |
| inputs=[ | |
| gr.Textbox(label="ν μ€νΈ μ λ ₯", placeholder="μ¬κΈ°μ μμ±μ ν©μ±ν ν μ€νΈλ₯Ό μ λ ₯νμΈμ."), | |
| gr.Dropdown(choices=actor_names, label="Actor μ ν", interactive=True), | |
| gr.Dropdown(choices=["en", "ko"], value="en", label="μΈμ΄"), | |
| gr.Slider(minimum=0.5, maximum=2.0, step=0.1, value=1.0, label="μλ"), | |
| gr.Slider(minimum=50, maximum=200, step=10, value=100, label="λ³Όλ₯¨"), | |
| ], | |
| outputs=[ | |
| gr.Textbox(label="κ²°κ³Ό λ©μμ§"), | |
| gr.Audio(label="μμ±λ μμ±"), | |
| ], | |
| title="μμ± μμ± λ°λͺ¨", | |
| description="쿼리 νλΌλ―Έν°κ° μ μ©λ Actor μ‘°ν ν μμ±μ μμ±ν©λλ€.", | |
| ) | |
| if __name__ == "__main__": | |
| interface.launch() | |