mirror of
https://github.com/zenlm/zen-translator.git
synced 2026-10-30 14:57:35 +00:00
143 lines
4.1 KiB
Python
143 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Download all required models for Zen Translator.
|
|
|
|
Models:
|
|
- Qwen3-Omni-30B-A3B-Instruct (~60GB)
|
|
- CosyVoice2-0.5B (~1GB)
|
|
"""
|
|
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from huggingface_hub import snapshot_download
|
|
from rich.console import Console
|
|
from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn
|
|
|
|
console = Console()
|
|
|
|
MODELS = {
|
|
"qwen3-omni": {
|
|
"repo_id": "Qwen/Qwen3-Omni-30B-A3B-Instruct",
|
|
"description": "Main translation model (30B MoE)",
|
|
"size": "~60GB",
|
|
},
|
|
"qwen3-omni-4bit": {
|
|
"repo_id": "cpatonn/Qwen3-Omni-30B-A3B-Instruct-AWQ-4bit",
|
|
"description": "Quantized translation model (4-bit)",
|
|
"size": "~15GB",
|
|
},
|
|
"cosyvoice": {
|
|
"repo_id": "FunAudioLLM/CosyVoice2-0.5B",
|
|
"description": "Voice cloning model",
|
|
"size": "~1GB",
|
|
},
|
|
}
|
|
|
|
|
|
def download_model(name: str, cache_dir: Path, quantized: bool = False):
|
|
"""Download a single model."""
|
|
if name == "qwen3-omni" and quantized:
|
|
name = "qwen3-omni-4bit"
|
|
|
|
if name not in MODELS:
|
|
console.print(f"[red]Unknown model: {name}[/red]")
|
|
return False
|
|
|
|
model_info = MODELS[name]
|
|
repo_id = model_info["repo_id"]
|
|
local_dir = cache_dir / name
|
|
|
|
console.print(f"\n[blue]Downloading {name}[/blue]")
|
|
console.print(f" Repository: {repo_id}")
|
|
console.print(f" Size: {model_info['size']}")
|
|
console.print(f" Destination: {local_dir}")
|
|
|
|
try:
|
|
snapshot_download(
|
|
repo_id,
|
|
local_dir=local_dir,
|
|
local_dir_use_symlinks=False,
|
|
)
|
|
console.print(f"[green]✓ {name} downloaded successfully[/green]")
|
|
return True
|
|
except Exception as e:
|
|
console.print(f"[red]✗ Failed to download {name}: {e}[/red]")
|
|
return False
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Download models for Zen Translator"
|
|
)
|
|
parser.add_argument(
|
|
"models",
|
|
nargs="*",
|
|
default=["all"],
|
|
help="Models to download (qwen3-omni, cosyvoice, or all)"
|
|
)
|
|
parser.add_argument(
|
|
"--cache-dir",
|
|
type=Path,
|
|
default=Path("./models"),
|
|
help="Directory to cache models"
|
|
)
|
|
parser.add_argument(
|
|
"--quantized",
|
|
action="store_true",
|
|
help="Download quantized models where available"
|
|
)
|
|
parser.add_argument(
|
|
"--list",
|
|
action="store_true",
|
|
help="List available models"
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
if args.list:
|
|
console.print("\n[bold]Available models:[/bold]\n")
|
|
for name, info in MODELS.items():
|
|
console.print(f" [cyan]{name}[/cyan]")
|
|
console.print(f" Repository: {info['repo_id']}")
|
|
console.print(f" Description: {info['description']}")
|
|
console.print(f" Size: {info['size']}")
|
|
console.print()
|
|
return
|
|
|
|
# Create cache directory
|
|
args.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Determine which models to download
|
|
if "all" in args.models:
|
|
models_to_download = ["qwen3-omni", "cosyvoice"]
|
|
else:
|
|
models_to_download = args.models
|
|
|
|
console.print("[bold]Zen Translator Model Downloader[/bold]")
|
|
console.print(f"Cache directory: {args.cache_dir}")
|
|
console.print(f"Models to download: {', '.join(models_to_download)}")
|
|
|
|
if args.quantized:
|
|
console.print("[yellow]Using quantized models where available[/yellow]")
|
|
|
|
# Download each model
|
|
success = True
|
|
for model in models_to_download:
|
|
if not download_model(model, args.cache_dir, args.quantized):
|
|
success = False
|
|
|
|
if success:
|
|
console.print("\n[green bold]All models downloaded successfully![/green bold]")
|
|
console.print("\nNext steps:")
|
|
console.print(" 1. Start the server: make serve")
|
|
console.print(" 2. Or translate a file: zen-translate video.mp4 -t spanish")
|
|
else:
|
|
console.print("\n[red]Some models failed to download.[/red]")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|