optim app.py

This commit is contained in:
Labmem-Zhouyx
2026-04-09 00:30:19 +08:00
parent 364eff6840
commit 5611bd08a0
3 changed files with 14 additions and 36 deletions
+2 -2
View File
@@ -238,8 +238,8 @@ voxcpm --help
### Web Demo ### Web Demo
```bash ```bash
python app.py --model-dir /path/to/VoxCPM2 --port 8808 # use a local model directory, open http://localhost:8808 python app.py --port 8808 # then open in browser: http://localhost:8808
``` ```
### 🚢 Production Deployment (Nano-vLLM) ### 🚢 Production Deployment (Nano-vLLM)
+1 -1
View File
@@ -238,7 +238,7 @@ voxcpm --help
### Web Demo ### Web Demo
```bash ```bash
python app.py --model-dir /path/to/VoxCPM2 --port 8808 # 指定本地模型路径,然后打开 http://localhost:8808 python app.py --port 8808 # 然后在浏览器打开 http://localhost:8808
``` ```
### 🚢 生产部署(Nano-vLLM ### 🚢 生产部署(Nano-vLLM
+11 -33
View File
@@ -9,8 +9,6 @@ from funasr import AutoModel
from pathlib import Path from pathlib import Path
os.environ["TOKENIZERS_PARALLELISM"] = "false" os.environ["TOKENIZERS_PARALLELISM"] = "false"
if os.environ.get("HF_REPO_ID", "").strip() == "":
os.environ["HF_REPO_ID"] = "openbmb/VoxCPM2"
import voxcpm import voxcpm
@@ -221,7 +219,7 @@ _APP_THEME = gr.themes.Soft(
# ---------- Model ---------- # ---------- Model ----------
class VoxCPMDemo: class VoxCPMDemo:
def __init__(self, model_dir: Optional[str] = None) -> None: def __init__(self, model_id: str = "openbmb/VoxCPM2") -> None:
self.device = "cuda" if torch.cuda.is_available() else "cpu" self.device = "cuda" if torch.cuda.is_available() else "cpu"
logger.info(f"Running on device: {self.device}") logger.info(f"Running on device: {self.device}")
@@ -234,36 +232,13 @@ class VoxCPMDemo:
) )
self.voxcpm_model: Optional[voxcpm.VoxCPM] = None self.voxcpm_model: Optional[voxcpm.VoxCPM] = None
self.explicit_model_dir = model_dir self._model_id = model_id
def _resolve_model_dir(self) -> str:
if self.explicit_model_dir and os.path.isdir(self.explicit_model_dir):
return self.explicit_model_dir
env_model_dir = os.environ.get("VOXCPM_MODEL_DIR", "").strip()
if env_model_dir and os.path.isdir(env_model_dir):
return env_model_dir
repo_id = os.environ.get("HF_REPO_ID", "").strip()
if len(repo_id) > 0:
target_dir = os.path.join("models", repo_id.replace("/", "__"))
if not os.path.isdir(target_dir):
try:
from huggingface_hub import snapshot_download
os.makedirs(target_dir, exist_ok=True)
logger.info(f"Downloading model from HF repo '{repo_id}' to '{target_dir}' ...")
snapshot_download(repo_id=repo_id, local_dir=target_dir, local_dir_use_symlinks=False)
except Exception as e:
logger.warning(f"HF download failed: {e}. Falling back to 'models'.")
return "models"
return target_dir
return "models"
def get_or_load_voxcpm(self) -> voxcpm.VoxCPM: def get_or_load_voxcpm(self) -> voxcpm.VoxCPM:
if self.voxcpm_model is not None: if self.voxcpm_model is not None:
return self.voxcpm_model return self.voxcpm_model
logger.info("Model not loaded, initializing...") logger.info(f"Loading model: {self._model_id}")
model_dir = self._resolve_model_dir() self.voxcpm_model = voxcpm.VoxCPM.from_pretrained(self._model_id, optimize=True)
logger.info(f"Using model dir: {model_dir}")
self.voxcpm_model = voxcpm.VoxCPM(voxcpm_model_path=model_dir, optimize=True)
logger.info("Model loaded successfully.") logger.info("Model loaded successfully.")
return self.voxcpm_model return self.voxcpm_model
@@ -507,9 +482,9 @@ def run_demo(
server_name: str = "0.0.0.0", server_name: str = "0.0.0.0",
server_port: int = 8808, server_port: int = 8808,
show_error: bool = True, show_error: bool = True,
model_dir: Optional[str] = None, model_id: str = "openbmb/VoxCPM2",
): ):
demo = VoxCPMDemo(model_dir=model_dir) demo = VoxCPMDemo(model_id=model_id)
interface = create_demo_interface(demo) interface = create_demo_interface(demo)
interface.queue(max_size=10, default_concurrency_limit=1).launch( interface.queue(max_size=10, default_concurrency_limit=1).launch(
server_name=server_name, server_name=server_name,
@@ -524,7 +499,10 @@ def run_demo(
if __name__ == "__main__": if __name__ == "__main__":
import argparse import argparse
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--model-dir", type=str, default=None, help="Path to VoxCPM2 checkpoint directory") parser.add_argument(
"--model-id", type=str, default="openbmb/VoxCPM2",
help="Local path or HuggingFace repo ID (default: openbmb/VoxCPM2)",
)
parser.add_argument("--port", type=int, default=8808, help="Server port") parser.add_argument("--port", type=int, default=8808, help="Server port")
args = parser.parse_args() args = parser.parse_args()
run_demo(model_dir=args.model_dir, server_port=args.port) run_demo(model_id=args.model_id, server_port=args.port)