verbalcoding 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +98 -2
- package/README.es.md +134 -0
- package/README.fr.md +134 -0
- package/README.ja.md +134 -0
- package/README.ko.md +134 -0
- package/README.md +118 -74
- package/README.ru.md +134 -0
- package/README.zh.md +133 -0
- package/app-node/agent_adapters.mjs +37 -5
- package/app-node/agent_adapters.test.mjs +27 -1
- package/app-node/agent_detect.mjs +73 -0
- package/app-node/agent_detect.test.mjs +77 -0
- package/app-node/agent_routing.mjs +148 -0
- package/app-node/agent_routing.test.mjs +138 -0
- package/app-node/agent_turn.mjs +86 -0
- package/app-node/agent_turn.test.mjs +109 -0
- package/app-node/bridge_context.mjs +73 -0
- package/app-node/bridge_context.test.mjs +54 -0
- package/app-node/bridge_state.mjs +4 -0
- package/app-node/bridge_wireup.test.mjs +462 -0
- package/app-node/cli_install.test.mjs +31 -0
- package/app-node/cross_agent_routing.test.mjs +78 -0
- package/app-node/discord_command_router.mjs +204 -0
- package/app-node/discord_command_router.test.mjs +311 -0
- package/app-node/discord_voice_setup.mjs +251 -0
- package/app-node/discord_voice_setup.test.mjs +86 -0
- package/app-node/hermes_profiles.test.mjs +12 -1
- package/app-node/install_config.mjs +113 -3
- package/app-node/install_config.test.mjs +8 -0
- package/app-node/instance_doctor.test.mjs +9 -0
- package/app-node/instances.test.mjs +8 -1
- package/app-node/main.mjs +513 -1058
- package/app-node/mcp_tools.test.mjs +7 -0
- package/app-node/notification_handler.mjs +89 -0
- package/app-node/notification_handler.test.mjs +187 -0
- package/app-node/notify.mjs +73 -0
- package/app-node/notify.test.mjs +68 -0
- package/app-node/plan_dispatcher.mjs +215 -0
- package/app-node/plan_dispatcher.test.mjs +101 -0
- package/app-node/plan_mode.mjs +203 -0
- package/app-node/plan_mode.test.mjs +231 -0
- package/app-node/progress_handler.mjs +220 -0
- package/app-node/progress_handler.test.mjs +193 -0
- package/app-node/progress_speech.mjs +54 -32
- package/app-node/progress_speech.test.mjs +12 -3
- package/app-node/project_sessions.mjs +5 -2
- package/app-node/project_sessions.test.mjs +7 -0
- package/app-node/research_mode.mjs +282 -0
- package/app-node/research_mode.test.mjs +264 -0
- package/app-node/restart_notice.mjs +3 -0
- package/app-node/restart_notice.test.mjs +11 -0
- package/app-node/session_ontology.mjs +271 -0
- package/app-node/session_ontology.test.mjs +130 -0
- package/app-node/smart_progress.mjs +94 -0
- package/app-node/smart_progress.test.mjs +66 -0
- package/app-node/stream_sentencer.mjs +91 -0
- package/app-node/stream_sentencer.test.mjs +129 -0
- package/app-node/streaming_tts_queue.mjs +52 -0
- package/app-node/streaming_tts_queue.test.mjs +64 -0
- package/app-node/stt_whisper.mjs +24 -0
- package/app-node/stt_whisper.test.mjs +32 -0
- package/app-node/text_routing.mjs +22 -0
- package/app-node/text_routing.test.mjs +23 -1
- package/app-node/tts_backends.mjs +537 -3
- package/app-node/tts_backends.test.mjs +454 -0
- package/app-node/tts_player.mjs +164 -0
- package/app-node/tts_player.test.mjs +202 -0
- package/app-node/tts_runtime.mjs +134 -0
- package/app-node/tts_runtime.test.mjs +89 -0
- package/app-node/tts_settings.mjs +150 -3
- package/app-node/tts_settings.test.mjs +204 -0
- package/app-node/tts_voice_config.mjs +136 -2
- package/app-node/tts_voice_config.test.mjs +94 -0
- package/app-node/utterance_router.mjs +216 -0
- package/app-node/utterance_router.test.mjs +236 -0
- package/app-node/voice_autojoin.mjs +37 -0
- package/app-node/voice_autojoin.test.mjs +59 -0
- package/app-node/voice_io.mjs +272 -0
- package/app-node/voice_io.test.mjs +102 -0
- package/app-node/voice_turn_runner.mjs +449 -0
- package/app-node/voice_turn_runner.test.mjs +289 -0
- package/docs/CONFIGURATION.md +79 -96
- package/docs/FRESH_INSTALL.md +105 -63
- package/docs/HARNESSES.md +58 -0
- package/docs/HARNESS_AIDER.md +50 -0
- package/docs/HARNESS_CLAUDE.md +56 -0
- package/docs/HARNESS_CODEX.md +56 -0
- package/docs/HARNESS_CURSOR.md +45 -0
- package/docs/HARNESS_GEMINI.md +45 -0
- package/docs/HARNESS_HERMES.md +57 -0
- package/docs/HARNESS_OPENCLAW.md +44 -0
- package/docs/HARNESS_OPENCODE.md +44 -0
- package/docs/HERMES_VOICE.md +65 -0
- package/docs/MULTI_INSTANCE.md +16 -0
- package/docs/README.md +50 -0
- package/docs/RELEASE.md +42 -19
- package/docs/ROADMAP.md +53 -0
- package/docs/TROUBLESHOOTING.md +126 -0
- package/docs/TTS_BACKENDS.md +227 -0
- package/docs/USAGE.md +94 -40
- package/docs/assets/figures/verbalcoding-flow.svg +1 -1
- package/docs/i18n/AGENTS.es.md +34 -0
- package/docs/i18n/AGENTS.fr.md +34 -0
- package/docs/i18n/AGENTS.ja.md +34 -0
- package/docs/i18n/AGENTS.ko.md +34 -0
- package/docs/i18n/AGENTS.ru.md +34 -0
- package/docs/i18n/AGENTS.zh.md +34 -0
- package/docs/i18n/CONFIGURATION.es.md +25 -0
- package/docs/i18n/CONFIGURATION.fr.md +25 -0
- package/docs/i18n/CONFIGURATION.ja.md +25 -0
- package/docs/i18n/CONFIGURATION.ko.md +25 -0
- package/docs/i18n/CONFIGURATION.ru.md +25 -0
- package/docs/i18n/CONFIGURATION.zh.md +25 -0
- package/docs/i18n/FRESH_INSTALL.es.md +27 -2
- package/docs/i18n/FRESH_INSTALL.fr.md +27 -2
- package/docs/i18n/FRESH_INSTALL.ja.md +27 -2
- package/docs/i18n/FRESH_INSTALL.ko.md +27 -2
- package/docs/i18n/FRESH_INSTALL.ru.md +27 -2
- package/docs/i18n/FRESH_INSTALL.zh.md +27 -2
- package/docs/i18n/HARNESSES.es.md +58 -0
- package/docs/i18n/HARNESSES.fr.md +58 -0
- package/docs/i18n/HARNESSES.ja.md +58 -0
- package/docs/i18n/HARNESSES.ko.md +58 -0
- package/docs/i18n/HARNESSES.ru.md +58 -0
- package/docs/i18n/HARNESSES.zh.md +58 -0
- package/docs/i18n/HARNESS_AIDER.es.md +48 -0
- package/docs/i18n/HARNESS_AIDER.fr.md +48 -0
- package/docs/i18n/HARNESS_AIDER.ja.md +50 -0
- package/docs/i18n/HARNESS_AIDER.ko.md +50 -0
- package/docs/i18n/HARNESS_AIDER.ru.md +48 -0
- package/docs/i18n/HARNESS_AIDER.zh.md +48 -0
- package/docs/i18n/HARNESS_CLAUDE.es.md +55 -0
- package/docs/i18n/HARNESS_CLAUDE.fr.md +55 -0
- package/docs/i18n/HARNESS_CLAUDE.ja.md +56 -0
- package/docs/i18n/HARNESS_CLAUDE.ko.md +56 -0
- package/docs/i18n/HARNESS_CLAUDE.ru.md +55 -0
- package/docs/i18n/HARNESS_CLAUDE.zh.md +56 -0
- package/docs/i18n/HARNESS_CODEX.es.md +55 -0
- package/docs/i18n/HARNESS_CODEX.fr.md +55 -0
- package/docs/i18n/HARNESS_CODEX.ja.md +56 -0
- package/docs/i18n/HARNESS_CODEX.ko.md +56 -0
- package/docs/i18n/HARNESS_CODEX.ru.md +55 -0
- package/docs/i18n/HARNESS_CODEX.zh.md +56 -0
- package/docs/i18n/HARNESS_CURSOR.es.md +42 -0
- package/docs/i18n/HARNESS_CURSOR.fr.md +42 -0
- package/docs/i18n/HARNESS_CURSOR.ja.md +45 -0
- package/docs/i18n/HARNESS_CURSOR.ko.md +45 -0
- package/docs/i18n/HARNESS_CURSOR.ru.md +42 -0
- package/docs/i18n/HARNESS_CURSOR.zh.md +42 -0
- package/docs/i18n/HARNESS_GEMINI.es.md +44 -0
- package/docs/i18n/HARNESS_GEMINI.fr.md +44 -0
- package/docs/i18n/HARNESS_GEMINI.ja.md +45 -0
- package/docs/i18n/HARNESS_GEMINI.ko.md +45 -0
- package/docs/i18n/HARNESS_GEMINI.ru.md +44 -0
- package/docs/i18n/HARNESS_GEMINI.zh.md +45 -0
- package/docs/i18n/HARNESS_HERMES.es.md +54 -0
- package/docs/i18n/HARNESS_HERMES.fr.md +54 -0
- package/docs/i18n/HARNESS_HERMES.ja.md +57 -0
- package/docs/i18n/HARNESS_HERMES.ko.md +57 -0
- package/docs/i18n/HARNESS_HERMES.ru.md +54 -0
- package/docs/i18n/HARNESS_HERMES.zh.md +57 -0
- package/docs/i18n/HARNESS_OPENCLAW.es.md +41 -0
- package/docs/i18n/HARNESS_OPENCLAW.fr.md +41 -0
- package/docs/i18n/HARNESS_OPENCLAW.ja.md +44 -0
- package/docs/i18n/HARNESS_OPENCLAW.ko.md +44 -0
- package/docs/i18n/HARNESS_OPENCLAW.ru.md +41 -0
- package/docs/i18n/HARNESS_OPENCLAW.zh.md +42 -0
- package/docs/i18n/HARNESS_OPENCODE.es.md +41 -0
- package/docs/i18n/HARNESS_OPENCODE.fr.md +41 -0
- package/docs/i18n/HARNESS_OPENCODE.ja.md +44 -0
- package/docs/i18n/HARNESS_OPENCODE.ko.md +44 -0
- package/docs/i18n/HARNESS_OPENCODE.ru.md +41 -0
- package/docs/i18n/HARNESS_OPENCODE.zh.md +44 -0
- package/docs/i18n/HERMES_VOICE.es.md +46 -0
- package/docs/i18n/HERMES_VOICE.fr.md +46 -0
- package/docs/i18n/HERMES_VOICE.ja.md +46 -0
- package/docs/i18n/HERMES_VOICE.ko.md +65 -0
- package/docs/i18n/HERMES_VOICE.ru.md +46 -0
- package/docs/i18n/HERMES_VOICE.zh.md +46 -0
- package/docs/i18n/MULTI_INSTANCE.es.md +25 -0
- package/docs/i18n/MULTI_INSTANCE.fr.md +25 -0
- package/docs/i18n/MULTI_INSTANCE.ja.md +25 -0
- package/docs/i18n/MULTI_INSTANCE.ko.md +25 -0
- package/docs/i18n/MULTI_INSTANCE.ru.md +25 -0
- package/docs/i18n/MULTI_INSTANCE.zh.md +25 -0
- package/docs/i18n/README.es.md +20 -134
- package/docs/i18n/README.fr.md +20 -134
- package/docs/i18n/README.ja.md +20 -134
- package/docs/i18n/README.ko.md +20 -133
- package/docs/i18n/README.ru.md +20 -134
- package/docs/i18n/README.zh.md +20 -133
- package/docs/i18n/RELEASE.es.md +26 -1
- package/docs/i18n/RELEASE.fr.md +26 -1
- package/docs/i18n/RELEASE.ja.md +26 -1
- package/docs/i18n/RELEASE.ko.md +26 -1
- package/docs/i18n/RELEASE.ru.md +26 -1
- package/docs/i18n/RELEASE.zh.md +26 -1
- package/docs/i18n/TROUBLESHOOTING.es.md +39 -0
- package/docs/i18n/TROUBLESHOOTING.fr.md +39 -0
- package/docs/i18n/TROUBLESHOOTING.ja.md +39 -0
- package/docs/i18n/TROUBLESHOOTING.ko.md +39 -0
- package/docs/i18n/TROUBLESHOOTING.ru.md +39 -0
- package/docs/i18n/TROUBLESHOOTING.zh.md +39 -0
- package/docs/i18n/USAGE.es.md +25 -0
- package/docs/i18n/USAGE.fr.md +25 -0
- package/docs/i18n/USAGE.ja.md +25 -0
- package/docs/i18n/USAGE.ko.md +25 -0
- package/docs/i18n/USAGE.ru.md +25 -0
- package/docs/i18n/USAGE.zh.md +25 -0
- package/docs/superpowers/plans/2026-05-13-phase1-streaming-pipeline.md +122 -0
- package/docs/superpowers/plans/2026-05-13-phase10-push-notifications.md +152 -0
- package/docs/superpowers/plans/2026-05-13-phase2-agent-adapters.md +242 -0
- package/docs/superpowers/plans/2026-05-13-phase6-smart-progress.md +172 -0
- package/docs/superpowers/plans/2026-05-13-phase7-voice-plan-mode.md +108 -0
- package/docs/superpowers/plans/2026-05-14-cross-agent-voice-transfer.md +625 -0
- package/docs/superpowers/plans/2026-05-21-audio-overview-narrated-diffs.md +95 -0
- package/docs/superpowers/plans/2026-05-21-autoresearch-ontology.md +83 -0
- package/docs/superpowers/plans/2026-05-21-phase11-push-to-talk-wakeword-v2.md +77 -0
- package/docs/superpowers/plans/2026-05-21-phase12-multi-user-voice.md +147 -0
- package/docs/superpowers/plans/2026-05-21-phase14-verbalbench.md +136 -0
- package/docs/superpowers/plans/2026-05-21-phase15-phone-companion.md +72 -0
- package/integrations/fireredtts2/mlx_llm.py +183 -0
- package/integrations/fireredtts2/synth.py +156 -0
- package/integrations/fireredtts2/synth_mlx.py +196 -0
- package/integrations/mlxaudio/synth.py +74 -0
- package/integrations/neuttsair/synth.py +104 -0
- package/integrations/omnivoice/synth.py +110 -0
- package/package.json +7 -1
- package/scripts/cli.mjs +88 -3
- package/scripts/doctor.mjs +115 -4
- package/scripts/install.mjs +20 -2
- package/scripts/install_fireredtts2.sh +109 -0
- package/scripts/install_mlxaudio.sh +34 -0
- package/scripts/install_mossttsnano.sh +46 -0
- package/scripts/postinstall.mjs +34 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
5
|
+
cd "$ROOT"
|
|
6
|
+
|
|
7
|
+
ASSUME_YES=0
|
|
8
|
+
SKIP_MODEL=0
|
|
9
|
+
SKIP_PIP=0
|
|
10
|
+
for arg in "$@"; do
|
|
11
|
+
case "$arg" in
|
|
12
|
+
-y|--yes) ASSUME_YES=1 ;;
|
|
13
|
+
--skip-model) SKIP_MODEL=1 ;;
|
|
14
|
+
--skip-pip) SKIP_PIP=1 ;;
|
|
15
|
+
-h|--help)
|
|
16
|
+
cat <<'USAGE'
|
|
17
|
+
Usage: scripts/install_fireredtts2.sh [--yes] [--skip-model] [--skip-pip]
|
|
18
|
+
|
|
19
|
+
Installs FireRedTTS-2 for VerbalCoding:
|
|
20
|
+
- clones FireRedTeam/FireRedTTS2 under vendor/FireRedTTS2
|
|
21
|
+
- creates .venv-fireredtts2
|
|
22
|
+
- installs upstream Python dependencies
|
|
23
|
+
- downloads https://huggingface.co/FireRedTeam/FireRedTTS2 weights under pretrained_models/FireRedTTS2
|
|
24
|
+
- creates .local/bin/fireredtts2 wrapper used by TTS_BACKEND=fireredtts2
|
|
25
|
+
|
|
26
|
+
The model is large. Use --skip-model only if FIREREDTTS2_PRETRAINED_DIR points elsewhere.
|
|
27
|
+
USAGE
|
|
28
|
+
exit 0
|
|
29
|
+
;;
|
|
30
|
+
esac
|
|
31
|
+
done
|
|
32
|
+
|
|
33
|
+
log() { printf '==> %s\n' "$*"; }
|
|
34
|
+
warn() { printf 'Warning: %s\n' "$*" >&2; }
|
|
35
|
+
has_cmd() { command -v "$1" >/dev/null 2>&1; }
|
|
36
|
+
confirm() {
|
|
37
|
+
if [ "$ASSUME_YES" = "1" ]; then return 0; fi
|
|
38
|
+
printf '%s [y/N]: ' "$1" >&2
|
|
39
|
+
read -r answer
|
|
40
|
+
case "$answer" in y|Y|yes|YES) return 0 ;; *) return 1 ;; esac
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if [ "$ASSUME_YES" != "1" ]; then
|
|
44
|
+
confirm 'FireRedTTS-2 can download several GB of model/dependency data. Continue?' || exit 2
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
mkdir -p vendor .local/bin pretrained_models
|
|
48
|
+
|
|
49
|
+
if ! has_cmd git; then
|
|
50
|
+
warn 'git is required to install FireRedTTS-2.'
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
PYTHON_BIN=""
|
|
54
|
+
for candidate in python3.12 python3.11 python3; do
|
|
55
|
+
if has_cmd "$candidate"; then PYTHON_BIN="$candidate"; break; fi
|
|
56
|
+
done
|
|
57
|
+
if [ -z "$PYTHON_BIN" ]; then
|
|
58
|
+
warn 'Python >=3.11 is required to install FireRedTTS-2.'
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
PYTHON_VERSION="$($PYTHON_BIN - <<'PY'
|
|
62
|
+
import sys
|
|
63
|
+
print(f"{sys.version_info.major}.{sys.version_info.minor}")
|
|
64
|
+
PY
|
|
65
|
+
)"
|
|
66
|
+
case "$PYTHON_VERSION" in
|
|
67
|
+
3.11|3.12|3.13*) ;;
|
|
68
|
+
*) warn "FireRedTTS-2 requires Python >=3.11; found $PYTHON_VERSION at $PYTHON_BIN"; exit 1 ;;
|
|
69
|
+
esac
|
|
70
|
+
|
|
71
|
+
if [ ! -d vendor/FireRedTTS2/.git ]; then
|
|
72
|
+
log 'Cloning FireRedTTS-2'
|
|
73
|
+
git clone --depth 1 https://github.com/FireRedTeam/FireRedTTS2.git vendor/FireRedTTS2
|
|
74
|
+
else
|
|
75
|
+
log 'FireRedTTS-2 repo already exists'
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
if [ "$SKIP_PIP" != "1" ]; then
|
|
79
|
+
if [ ! -x .venv-fireredtts2/bin/python ]; then
|
|
80
|
+
log 'Creating .venv-fireredtts2'
|
|
81
|
+
"$PYTHON_BIN" -m venv .venv-fireredtts2
|
|
82
|
+
fi
|
|
83
|
+
log 'Installing FireRedTTS-2 Python dependencies'
|
|
84
|
+
.venv-fireredtts2/bin/python -m pip install --upgrade pip setuptools wheel
|
|
85
|
+
.venv-fireredtts2/bin/python -m pip install torch torchaudio huggingface_hub
|
|
86
|
+
.venv-fireredtts2/bin/python -m pip install -e vendor/FireRedTTS2
|
|
87
|
+
if [ -f vendor/FireRedTTS2/requirements.txt ]; then
|
|
88
|
+
.venv-fireredtts2/bin/python -m pip install -r vendor/FireRedTTS2/requirements.txt
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
if [ "$SKIP_MODEL" != "1" ]; then
|
|
93
|
+
if [ -d pretrained_models/FireRedTTS2 ] && [ "$(find pretrained_models/FireRedTTS2 -mindepth 1 -maxdepth 1 2>/dev/null | head -n 1)" ]; then
|
|
94
|
+
log 'FireRedTTS-2 pretrained model already exists'
|
|
95
|
+
else
|
|
96
|
+
log 'Downloading FireRedTTS-2 weights from https://huggingface.co/FireRedTeam/FireRedTTS2'
|
|
97
|
+
.venv-fireredtts2/bin/huggingface-cli download FireRedTeam/FireRedTTS2 --local-dir pretrained_models/FireRedTTS2 --local-dir-use-symlinks False
|
|
98
|
+
fi
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
cat > .local/bin/fireredtts2 <<'SH'
|
|
102
|
+
#!/usr/bin/env bash
|
|
103
|
+
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
104
|
+
exec "$ROOT/.venv-fireredtts2/bin/python" "$ROOT/integrations/fireredtts2/synth.py" "$@"
|
|
105
|
+
SH
|
|
106
|
+
chmod +x .local/bin/fireredtts2
|
|
107
|
+
|
|
108
|
+
log 'Installed .local/bin/fireredtts2 wrapper'
|
|
109
|
+
log 'Set FIREREDTTS2_COMMAND=./.local/bin/fireredtts2 and TTS_BACKEND=fireredtts2, then restart VerbalCoding.'
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
4
|
+
cd "$ROOT"
|
|
5
|
+
ASSUME_YES=0
|
|
6
|
+
for arg in "$@"; do
|
|
7
|
+
case "$arg" in -y|--yes) ASSUME_YES=1 ;; esac
|
|
8
|
+
done
|
|
9
|
+
log() { printf '==> %s\n' "$*"; }
|
|
10
|
+
confirm() {
|
|
11
|
+
if [ "$ASSUME_YES" = "1" ]; then return 0; fi
|
|
12
|
+
printf '%s [y/N]: ' "$1" >&2
|
|
13
|
+
read -r answer
|
|
14
|
+
case "$answer" in y|Y|yes|YES) return 0 ;; *) return 1 ;; esac
|
|
15
|
+
}
|
|
16
|
+
if ! confirm 'Install mlx-audio under this project?'; then
|
|
17
|
+
echo 'Cancelled mlx-audio install.' >&2
|
|
18
|
+
exit 2
|
|
19
|
+
fi
|
|
20
|
+
PYTHON_BIN="${PYTHON_BIN:-}"
|
|
21
|
+
if [ -z "$PYTHON_BIN" ]; then
|
|
22
|
+
for candidate in python3.12 python3.11 python3.10 python3; do
|
|
23
|
+
if command -v "$candidate" >/dev/null 2>&1; then PYTHON_BIN="$candidate"; break; fi
|
|
24
|
+
done
|
|
25
|
+
fi
|
|
26
|
+
[ -n "$PYTHON_BIN" ] || { echo 'python3 is required' >&2; exit 1; }
|
|
27
|
+
if [ ! -x .venv-mlxaudio/bin/python ]; then
|
|
28
|
+
log 'Creating .venv-mlxaudio'
|
|
29
|
+
"$PYTHON_BIN" -m venv .venv-mlxaudio
|
|
30
|
+
fi
|
|
31
|
+
log 'Installing mlx-audio for Apple Silicon'
|
|
32
|
+
.venv-mlxaudio/bin/python -m pip install --upgrade pip setuptools wheel >/dev/null
|
|
33
|
+
.venv-mlxaudio/bin/python -m pip install --pre mlx-audio
|
|
34
|
+
log 'mlx-audio installed. Set TTS_BACKEND=mlxaudio or run: vc tts backend mlx'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
4
|
+
cd "$ROOT"
|
|
5
|
+
ASSUME_YES=0
|
|
6
|
+
for arg in "$@"; do
|
|
7
|
+
case "$arg" in -y|--yes) ASSUME_YES=1 ;; esac
|
|
8
|
+
done
|
|
9
|
+
log() { printf '==> %s\n' "$*"; }
|
|
10
|
+
confirm() {
|
|
11
|
+
if [ "$ASSUME_YES" = "1" ]; then return 0; fi
|
|
12
|
+
printf '%s [y/N]: ' "$1" >&2
|
|
13
|
+
read -r answer
|
|
14
|
+
case "$answer" in y|Y|yes|YES) return 0 ;; *) return 1 ;; esac
|
|
15
|
+
}
|
|
16
|
+
if ! confirm 'Install MOSS-TTS-Nano code and Python environment under this project?'; then
|
|
17
|
+
echo 'Cancelled MOSS-TTS-Nano install.' >&2
|
|
18
|
+
exit 2
|
|
19
|
+
fi
|
|
20
|
+
command -v python3 >/dev/null 2>&1 || { echo 'python3 is required' >&2; exit 1; }
|
|
21
|
+
command -v git >/dev/null 2>&1 || { echo 'git is required' >&2; exit 1; }
|
|
22
|
+
mkdir -p vendor .local/bin
|
|
23
|
+
if [ ! -d vendor/MOSS-TTS-Nano/.git ]; then
|
|
24
|
+
log 'Cloning MOSS-TTS-Nano source'
|
|
25
|
+
git clone --depth 1 https://github.com/OpenMOSS/MOSS-TTS-Nano.git vendor/MOSS-TTS-Nano
|
|
26
|
+
else
|
|
27
|
+
log 'MOSS-TTS-Nano source already present'
|
|
28
|
+
fi
|
|
29
|
+
if [ ! -x .venv-mossttsnano/bin/python ]; then
|
|
30
|
+
log 'Creating .venv-mossttsnano'
|
|
31
|
+
python3 -m venv .venv-mossttsnano
|
|
32
|
+
fi
|
|
33
|
+
log 'Installing MOSS-TTS-Nano Python dependencies'
|
|
34
|
+
.venv-mossttsnano/bin/python -m pip install --upgrade pip >/dev/null
|
|
35
|
+
if [ -f vendor/MOSS-TTS-Nano/requirements.txt ]; then
|
|
36
|
+
.venv-mossttsnano/bin/python -m pip install -r vendor/MOSS-TTS-Nano/requirements.txt >/dev/null
|
|
37
|
+
else
|
|
38
|
+
.venv-mossttsnano/bin/python -m pip install torch torchaudio transformers accelerate soundfile huggingface_hub >/dev/null
|
|
39
|
+
fi
|
|
40
|
+
cat > .local/bin/mossttsnano <<'SH'
|
|
41
|
+
#!/usr/bin/env bash
|
|
42
|
+
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
43
|
+
exec "$ROOT/.venv-mossttsnano/bin/python" "$ROOT/vendor/MOSS-TTS-Nano/infer.py" "$@"
|
|
44
|
+
SH
|
|
45
|
+
chmod +x .local/bin/mossttsnano
|
|
46
|
+
log 'MOSS-TTS-Nano installed: ./.local/bin/mossttsnano'
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
|
|
7
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
8
|
+
if (process.env.VERBALCODING_SKIP_POSTINSTALL === '1') process.exit(0);
|
|
9
|
+
|
|
10
|
+
function log(message) {
|
|
11
|
+
console.log(`[verbalcoding] ${message}`);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function run(cmd, args, options = {}) {
|
|
15
|
+
return spawnSync(cmd, args, { cwd: ROOT, stdio: options.stdio || 'inherit', env: process.env });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
if (!fs.existsSync(path.join(ROOT, '.venv-tts', 'bin', 'edge-tts'))) {
|
|
20
|
+
const py = spawnSync('python3', ['--version'], { stdio: 'ignore' });
|
|
21
|
+
if (py.status === 0) {
|
|
22
|
+
log('installing local Edge TTS helper (.venv-tts)');
|
|
23
|
+
run('python3', ['-m', 'venv', path.join(ROOT, '.venv-tts')]);
|
|
24
|
+
run(path.join(ROOT, '.venv-tts', 'bin', 'python'), ['-m', 'pip', 'install', '--upgrade', 'pip'], { stdio: 'ignore' });
|
|
25
|
+
const result = run(path.join(ROOT, '.venv-tts', 'bin', 'python'), ['-m', 'pip', 'install', 'edge-tts']);
|
|
26
|
+
if (result.status !== 0) log('edge-tts helper install failed; run `vc setup` later');
|
|
27
|
+
} else {
|
|
28
|
+
log('python3 not found; skipping Edge TTS helper install');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
log('postinstall complete. Run `vc setup` for Discord tokens and heavier optional TTS backends.');
|
|
32
|
+
} catch (error) {
|
|
33
|
+
log(`postinstall skipped after error: ${error?.message || error}`);
|
|
34
|
+
}
|