Files
cescobar 2f6b5340f5 Commit inicial: gr-locutor (Locutor IA - GRP)
Locuciones de radio con voz IA local (XTTS-v2) integradas a G Radio
Player: interfaz Rust/GTK4 de configuración, motor de generación y
enriquecimiento de texto en Python, daemon de monitoreo que dispara
locuciones sin pausar playlist-refill. Requiere radio-player >= 0.4.11.
2026-08-23 01:58:56 -05:00

61 lines
1.5 KiB
Bash

#!/bin/bash
# Genera una locución de introducción para un tema musical
# Uso: ./generar-intro.sh "/ruta/al/tema.mp3"
# Imprime la ruta del MP3 generado en stdout
#
# 1. Lee metadata ID3 del tema + enriquece con Wikipedia/MusicBrainz
# 2. Sintetiza con el motor instalado (~/.gradio/locutor/gr-locutor.sh),
# usando la voz de referencia configurada (genérica de GRP o la propia
# de la estación si fue reemplazada)
set -e
cd "$(dirname "$0")"
TEMA="$1"
LOCUTOR_BIN="$HOME/.gradio/locutor-venv/gr-locutor.sh"
ENRIQUECER="enriquecer-locucion.py"
SALIDA_DIR="$HOME/.gradio/data/locutor-ia/salida"
if [ -z "$TEMA" ]; then
echo "Uso: $0 \"/ruta/al/tema.mp3\""
exit 1
fi
if [ ! -f "$TEMA" ]; then
echo "Error: no existe el archivo $TEMA"
exit 1
fi
if [ ! -x "$LOCUTOR_BIN" ]; then
echo "Error: no está instalado el motor de voz ($LOCUTOR_BIN)."
echo "Ejecuta primero el instalador (instalar-locutor-amd64.sh)."
exit 1
fi
TEXTO=""
if [ -f "$ENRIQUECER" ]; then
TEXTO=$(python3 "$ENRIQUECER" "$TEMA" 2>/dev/null || true)
fi
if [ -z "$TEXTO" ]; then
BASENAME=$(basename "$TEMA" .mp3)
BASENAME="${BASENAME%.*}"
ARTISTA=""
TITULO="$BASENAME"
if echo "$BASENAME" | grep -q " - "; then
ARTISTA=$(echo "$BASENAME" | sed 's/ - .*//')
TITULO=$(echo "$BASENAME" | sed 's/.* - //')
fi
if [ -n "$ARTISTA" ]; then
TEXTO="Y ahora, disfruta de ${TITULO} de ${ARTISTA}."
else
TEXTO="Y ahora, disfruta de ${TITULO}."
fi
fi
NOMBRE="intro_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$SALIDA_DIR"
MP3=$("$LOCUTOR_BIN" "$TEXTO" "$NOMBRE")
echo "$MP3"