Update app.py
Browse files
app.py
CHANGED
|
@@ -2,49 +2,65 @@ import os
|
|
| 2 |
import logging
|
| 3 |
import builtins
|
| 4 |
|
|
|
|
| 5 |
builtins.input = lambda prompt="": "y"
|
| 6 |
logging.basicConfig(level=logging.INFO)
|
| 7 |
-
logger = logging.getLogger("
|
|
|
|
|
|
|
| 8 |
os.environ["GENIE_DATA_DIR"] = "/app/GenieData"
|
| 9 |
|
| 10 |
def prepare_environment():
|
|
|
|
| 11 |
from huggingface_hub import snapshot_download
|
| 12 |
|
| 13 |
-
logger.info("📦
|
| 14 |
if not os.path.exists("/app/GenieData/G2P"):
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
def start_service():
|
|
|
|
| 23 |
prepare_environment()
|
| 24 |
|
| 25 |
-
logger.info("🚀
|
| 26 |
-
import genie_tts
|
| 27 |
|
| 28 |
-
#
|
| 29 |
-
|
| 30 |
-
genie.load_character(
|
| 31 |
-
character_name="default",
|
| 32 |
-
onnx_model_dir="/app",
|
| 33 |
-
language="zh"
|
| 34 |
-
)
|
| 35 |
-
logger.info("✅ 模型加载成功!")
|
| 36 |
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
if __name__ == "__main__":
|
| 50 |
start_service()
|
|
|
|
| 2 |
import logging
|
| 3 |
import builtins
|
| 4 |
|
| 5 |
+
# 1. 基础设置:强制静默输入,防止部署卡住
|
| 6 |
builtins.input = lambda prompt="": "y"
|
| 7 |
logging.basicConfig(level=logging.INFO)
|
| 8 |
+
logger = logging.getLogger("GenieTTS_Final")
|
| 9 |
+
|
| 10 |
+
# 设置环境变量指向核心数据目录
|
| 11 |
os.environ["GENIE_DATA_DIR"] = "/app/GenieData"
|
| 12 |
|
| 13 |
def prepare_environment():
|
| 14 |
+
"""下载并准备 G2P、HuBERT 等必要权重"""
|
| 15 |
from huggingface_hub import snapshot_download
|
| 16 |
|
| 17 |
+
logger.info("📦 校验/下载 GenieData 核心依赖...")
|
| 18 |
if not os.path.exists("/app/GenieData/G2P"):
|
| 19 |
+
try:
|
| 20 |
+
snapshot_download(
|
| 21 |
+
repo_id="High-Logic/Genie",
|
| 22 |
+
allow_patterns=["GenieData/*"],
|
| 23 |
+
local_dir="/app",
|
| 24 |
+
local_dir_use_symlinks=False
|
| 25 |
+
)
|
| 26 |
+
logger.info("✅ GenieData 下载完毕")
|
| 27 |
+
except Exception as e:
|
| 28 |
+
logger.error(f"❌ 下载 GenieData 失败: {e}")
|
| 29 |
|
| 30 |
def start_service():
|
| 31 |
+
"""启动服务并预加载模型"""
|
| 32 |
prepare_environment()
|
| 33 |
|
| 34 |
+
logger.info("🚀 启动 Genie-TTS 服务...")
|
| 35 |
+
import genie_tts
|
| 36 |
|
| 37 |
+
# 模型文件在仓库根目录,因此路径为 /app
|
| 38 |
+
model_path = "/app"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
+
try:
|
| 41 |
+
# Step 1: 加载角色模型
|
| 42 |
+
logger.info(f"⚡ 正在内存中加载模型: {model_path}")
|
| 43 |
+
genie_tts.load_character("default", model_path, "zh")
|
| 44 |
+
|
| 45 |
+
# Step 2: 关键!启动时自动设置默认参考音频
|
| 46 |
+
# 即使你以后通过 API 换,这里设置一个初始值能保证 Space 启动即完成“上膛”
|
| 47 |
+
logger.info("🎤 设置默认参考音频...")
|
| 48 |
+
genie_tts.set_reference_audio(
|
| 49 |
+
character_name="default",
|
| 50 |
+
audio_path="/app/ref.wav",
|
| 51 |
+
audio_text="我今天就不写了!开干!烦死了,哎呀干不完的活",
|
| 52 |
+
language="zh"
|
| 53 |
+
)
|
| 54 |
+
logger.info("✅✅✅ 模型与音频全部就绪!")
|
| 55 |
+
|
| 56 |
+
# Step 3: 启动 FastAPI 服务器
|
| 57 |
+
# HF Space 必须使用 7860 端口
|
| 58 |
+
genie_tts.start_server(host="0.0.0.0", port=7860, workers=1)
|
| 59 |
+
|
| 60 |
+
except Exception as e:
|
| 61 |
+
logger.error(f"❌ 启动报错: {e}")
|
| 62 |
+
import traceback
|
| 63 |
+
traceback.print_exc()
|
| 64 |
|
| 65 |
if __name__ == "__main__":
|
| 66 |
start_service()
|