59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
import os
|
|
from pathlib import Path
|
|
from dotenv import load_dotenv
|
|
import ptts
|
|
import sounddevice as sd
|
|
import numpy as np
|
|
import huggingface_hub as hf
|
|
|
|
#Load Token for HuggingFace.
|
|
load_dotenv(dotenv_path=Path(__file__).with_name(".env"))
|
|
|
|
if not os.environ.get("HF_TOKEN", "").strip():
|
|
raise RuntimeError(
|
|
"HF_TOKEN is not set. Add your Hugging Face token to a .env file."
|
|
)
|
|
|
|
def main():
|
|
print("Cargando el modelo Phonon TTS...")
|
|
|
|
# Inicializamos el modelo multilingue que incluye soporte para español.
|
|
# Nota: Si prefieres no usar el login de Hugging Face y hacer una prueba rapida,
|
|
# puedes cambiar el id a "hf://gradium/phonon-31m-en" y lang="en" (licencia Apache 2.0).
|
|
tts = ptts.TTS(model="hf://gradium/phonon-40m-es", lang="es")
|
|
tts.add_voice("MiVoz", "C:\\Users\\alcar\\Downloads\\TTS\\Phonon-40M-es\\x6lttij74JUPawTc.ba7a5a45@300.safetensors")
|
|
|
|
return tts
|
|
|
|
tts=main()
|
|
|
|
while True :
|
|
|
|
texto_prueba = input("Escribe el texto que quieres convertir a voz: ")
|
|
|
|
# 1. Guardar el resultado en un archivo WAV
|
|
archivo_salida = "audio_clonado.wav"
|
|
print(f"\nGenerando y guardando audio en {archivo_salida}...")
|
|
|
|
# Opcionalmente, puedes pasar el parametro voice="NombreVoz" si tienes voces descargadas.
|
|
# Sin este parametro, usara la voz por defecto del modelo.
|
|
tts.save("audio_clonado.wav", texto_prueba, voice="MiVoz")
|
|
print("Archivo WAV guardado exitosamente.")
|
|
|
|
# 2. Streaming en tiempo real (reproduccion simultanea a la generacion)
|
|
print("\nIniciando streaming de audio por los altavoces...")
|
|
|
|
# tts.stream devuelve un generador de chunks de audio
|
|
with tts.stream(texto_prueba, voice="MiVoz") as audio_generator:
|
|
# Abrimos el stream fisico de audio usando la frecuencia de muestreo nativa del modelo (usualmente 24 kHz)
|
|
with sd.OutputStream(samplerate=audio_generator.sample_rate, channels=1, dtype='float32') as stream_salida:
|
|
for pcm_chunk in audio_generator:
|
|
# Phonon entrega float32, lo preparamos como un array de numpy en 2D (frames, channels)
|
|
# para asegurar la maxima compatibilidad con sounddevice
|
|
datos_audio = np.array(pcm_chunk, dtype=np.float32).reshape(-1, 1)
|
|
|
|
# Escribimos el chunk directamente a la tarjeta de sonido
|
|
stream_salida.write(datos_audio)
|
|
|
|
print("\nStreaming finalizado correctamente.")
|