aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/clonar-voz.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/clonar-voz.sh')
-rwxr-xr-xscripts/clonar-voz.sh47
1 files changed, 47 insertions, 0 deletions
diff --git a/scripts/clonar-voz.sh b/scripts/clonar-voz.sh
new file mode 100755
index 0000000..e68215d
--- /dev/null
+++ b/scripts/clonar-voz.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+# Extrae los latentes de una voz a partir de una grabación, para que el
+# asistente hable con ella.
+#
+# scripts/clonar-voz.sh grabacion.wav transcripcion.txt [nombre]
+#
+# Produce assets/voices/<nombre>.{spk,rvq,txt}, que es lo que el asistente
+# registra en tts-server al arrancar. Se hace una vez: en cada arranque se
+# mandan los latentes ya extraídos y no la grabación.
+set -euo pipefail
+
+cd "$(dirname "$0")/.."
+
+WAV="${1:?uso: clonar-voz.sh <grabacion.wav> <transcripcion.txt> [nombre]}"
+TXT="${2:?falta la transcripción de la grabación}"
+NOMBRE="${3:-asistente}"
+
+CODEC=vendor/qwentts.cpp/build/qwen-codec
+TOKENIZER=models/qwen-tokenizer-12hz-Q8_0.gguf
+
+for f in "$CODEC" "$TOKENIZER" "$WAV" "$TXT"; do
+ [ -e "$f" ] || { echo "falta: $f" >&2; exit 1; }
+done
+
+SALIDA="assets/voices"
+mkdir -p "$SALIDA"
+
+echo "Extrayendo la voz de $WAV…"
+# --talker produce el embedding del hablante (.spk) y los códigos de
+# referencia (.rvq); con la transcripción, el servidor activa el clonado ICL,
+# que se parece bastante más al original que sólo el embedding.
+"$CODEC" --model "$TOKENIZER" --talker \
+ --input "$WAV" \
+ -o "$SALIDA/$NOMBRE"
+
+cp "$TXT" "$SALIDA/$NOMBRE.txt"
+
+echo
+echo "Listo:"
+ls -la "$SALIDA/$NOMBRE".{spk,rvq,txt}
+echo
+echo "Apunta config/asistente.toml a esta voz:"
+echo " [tts.reference]"
+echo " name = \"$NOMBRE\""
+echo " speaker = \"../$SALIDA/$NOMBRE.spk\""
+echo " codes = \"../$SALIDA/$NOMBRE.rvq\""
+echo " transcript = \"../$SALIDA/$NOMBRE.txt\""