#!/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/.{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 [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\""