独立依赖

This commit is contained in:
xsl
2026-04-08 14:38:04 +08:00
parent 760cf864eb
commit 64c894b673
36 changed files with 431 additions and 337 deletions
+23 -2
View File
@@ -4,7 +4,28 @@ set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT"
PY="/home/xsl/miniconda3/envs/MuseTalk/bin/python"
pick_python() {
if [[ -n "${VISUAL_CHAT_PYTHON:-}" && -x "${VISUAL_CHAT_PYTHON}" ]]; then
echo "${VISUAL_CHAT_PYTHON}"
return 0
fi
if [[ -n "${VIRTUAL_ENV:-}" && -x "${VIRTUAL_ENV}/bin/python" ]]; then
echo "${VIRTUAL_ENV}/bin/python"
return 0
fi
if [[ -x "$ROOT/.venv/bin/python" ]]; then
echo "$ROOT/.venv/bin/python"
return 0
fi
if command -v python3 >/dev/null 2>&1; then
command -v python3
return 0
fi
command -v python
}
PY="$(pick_python)"
if [[ -f ".env" ]]; then
set -a
@@ -17,7 +38,7 @@ SCHEME="http"
if [[ -n "${SSL_CERTFILE:-}" && -n "${SSL_KEYFILE:-}" ]]; then
SCHEME="https"
fi
BASE_URL="${BASE_URL:-${SCHEME}://127.0.0.1:${WEBRTC_PORT:-8080}}"
BASE_URL="${BASE_URL:-${SCHEME}://127.0.0.1:${HTTP_PORT:-8080}}"
echo "[1/6] service status"
bash scripts/service.sh status || true
+2 -2
View File
@@ -28,8 +28,8 @@ normalize_host() {
esac
}
HOST="$(normalize_host "${WEBRTC_HOST:-0.0.0.0}")"
PORT="${WEBRTC_PORT:-8018}"
HOST="$(normalize_host "${HTTP_HOST:-0.0.0.0}")"
PORT="${HTTP_PORT:-8018}"
SSL_CERTFILE="${SSL_CERTFILE:-$ROOT_DIR/certs/dev-cert.pem}"
SSL_KEYFILE="${SSL_KEYFILE:-$ROOT_DIR/certs/dev-key.pem}"
+1 -1
View File
@@ -28,7 +28,7 @@ start() {
# If stale process still binds configured port, stop it first.
local port
port="$(awk -F= '/^WEBRTC_PORT=/{print $2}' "$ROOT/.env" 2>/dev/null || true)"
port="$(awk -F= '/^HTTP_PORT=/{print $2}' "$ROOT/.env" 2>/dev/null || true)"
port="${port:-8080}"
local pids
pids="$(ss -ltnp 2>/dev/null | sed -n "s/.*:${port} .*users:((\"python\",pid=\([0-9]\+\),.*/\1/p" | tr '\n' ' ')"
+4 -4
View File
@@ -21,8 +21,8 @@ pick_python() {
echo "${VIRTUAL_ENV}/bin/python"
return 0
fi
if [[ -x "/home/xsl/miniconda3/envs/MuseTalk/bin/python" ]]; then
echo "/home/xsl/miniconda3/envs/MuseTalk/bin/python"
if [[ -x "$ROOT/.venv/bin/python" ]]; then
echo "$ROOT/.venv/bin/python"
return 0
fi
if command -v python3 >/dev/null 2>&1; then
@@ -44,8 +44,8 @@ normalize_host() {
esac
}
HOST="$(normalize_host "${WEBRTC_HOST:-0.0.0.0}")"
PORT="${WEBRTC_PORT:-8080}"
HOST="$(normalize_host "${HTTP_HOST:-0.0.0.0}")"
PORT="${HTTP_PORT:-8080}"
PY="$(pick_python)"
SCHEME="http"
ARGS=(main:app --host "$HOST" --port "$PORT")
+4 -4
View File
@@ -34,8 +34,8 @@ pick_python() {
echo "${VIRTUAL_ENV}/bin/python"
return 0
fi
if [[ -x "/home/xsl/miniconda3/envs/MuseTalk/bin/python" ]]; then
echo "/home/xsl/miniconda3/envs/MuseTalk/bin/python"
if [[ -x "$ROOT/.venv/bin/python" ]]; then
echo "$ROOT/.venv/bin/python"
return 0
fi
if command -v python3 >/dev/null 2>&1; then
@@ -46,8 +46,8 @@ pick_python() {
}
PY="$(pick_python)"
HOST="$(normalize_host "${WEBRTC_HOST:-0.0.0.0}")"
PORT="${WEBRTC_PORT:-8080}"
HOST="$(normalize_host "${HTTP_HOST:-0.0.0.0}")"
PORT="${HTTP_PORT:-8080}"
SCHEME="http"
ARGS=(main:app --host "$HOST" --port "$PORT")
+64
View File
@@ -0,0 +1,64 @@
#!/usr/bin/env python3
"""Populate ./models from local silero wheel + Hugging Face snapshots (ASR/TTS only; needs network for HF)."""
from __future__ import annotations
import argparse
import importlib.resources as ir
import sys
from pathlib import Path
_ROOT = Path(__file__).resolve().parent.parent
_DEFAULT_ASR = _ROOT / "models" / "asr" / "SenseVoiceSmall"
_DEFAULT_KOKORO = _ROOT / "models" / "tts" / "Kokoro-82M"
_VAD_JIT = _ROOT / "models" / "vad" / "silero_vad.jit"
def _copy_silero_vad() -> None:
_VAD_JIT.parent.mkdir(parents=True, exist_ok=True)
src = ir.files("silero_vad.data").joinpath("silero_vad.jit")
_VAD_JIT.write_bytes(src.read_bytes())
print(f"VAD -> {_VAD_JIT}")
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--asr-repo", default="FunAudioLLM/SenseVoiceSmall")
parser.add_argument("--kokoro-repo", default="hexgrad/Kokoro-82M")
parser.add_argument("--asr-dir", type=Path, default=_DEFAULT_ASR)
parser.add_argument("--kokoro-dir", type=Path, default=_DEFAULT_KOKORO)
parser.add_argument("--asr-only", action="store_true")
parser.add_argument("--kokoro-only", action="store_true")
parser.add_argument("--skip-hf", action="store_true", help="Only copy Silero VAD from installed wheel")
args = parser.parse_args()
try:
_copy_silero_vad()
except Exception as exc:
print(f"Silero VAD copy failed (pip install silero-vad): {exc}", file=sys.stderr)
return 1
if args.skip_hf:
print("Done (HF skipped).")
return 0
try:
from huggingface_hub import snapshot_download
except ImportError:
print("Install huggingface_hub for ASR/TTS downloads.", file=sys.stderr)
return 1
if not args.kokoro_only:
args.asr_dir.mkdir(parents=True, exist_ok=True)
print(f"ASR -> {args.asr_dir}")
snapshot_download(repo_id=args.asr_repo, local_dir=str(args.asr_dir))
if not args.asr_only:
args.kokoro_dir.mkdir(parents=True, exist_ok=True)
print(f"Kokoro -> {args.kokoro_dir}")
snapshot_download(repo_id=args.kokoro_repo, local_dir=str(args.kokoro_dir))
print("Done.")
return 0
if __name__ == "__main__":
raise SystemExit(main())