ESTO ES LO QUE HICE PARA QUE ME DEVOLVIERA LA RESPUESTA EN ARCHIVO DE AUDIO, AL IGUAL QUE LA
RESPUESTA EN TEXTO:
Esto está en CHAPGPT: "Chatbot Project Overview"
Primero instalo las librerías en el PATCH:
pip install pyttsx3
Esta función TTS la agrego al script de las funciones: "implementacion.py"
import pyttsx3
######################################################
###### TTS
######################################################
def text_to_speech(text: str, output_file: str = "output.mp3"):
"""
Function that converts text to speech and saves it as an audio file.
Parameters:
text (str): The text to be converted to speech.
output_file (str): The name of the output file where the audio will be saved.
"""
engine = pyttsx3.init()
engine.save_to_file(text, output_file)
engine.runAndWait()
Ahora vamos a agregar una nueva Ruta /question/{question} en api.py:
Esta nueva ruta manejará las preguntas para que, además de devolver la respuesta en formato de texto, también
convierta esa respuesta a un archivo de audio usando la función TTS.
#############################################################
# Audio Route (TTS)
#############################################################
@app.post("/tfm4/question_audio/{question}")
def llama_rag_audio(question: str):
try:
# Obtener la respuesta de la pregunta
result = tfm_rag_llama(question)
# Convertir la respuesta a voz y guardarla en un archivo MP3
audio_filename = "response.mp3"
text_to_speech(result, audio_filename)
# Devolver la respuesta en texto y el nombre del archivo de audio
return {"Response": result, "Audio file": audio_filename}
except Exception as e:
result = "files not loaded!!!"
return {"data": result, "error": str(e)}
2. Probar la Funcionalidad
Con esta modificación, cuando envíes una pregunta al servidor, recibirás como respuesta tanto el texto como
el nombre del archivo de audio que contiene la respuesta convertida a voz.
Aquí te explico cómo podrías probarlo:
1. Ejecuta el servidor: Asegúrate de que tu servidor esté corriendo con python -m uvicorn api:app.
2. Envía una pregunta: Ve a la ruta /docs en tu navegador o utiliza un cliente como Postman.
3. Obtén la respuesta: Al enviar una pregunta, deberías recibir una respuesta en formato JSON que
incluya tanto el texto de la respuesta como el nombre del archivo de audio generado.
4. Escucha la respuesta: El archivo de audio (response.mp3) debería estar guardado en la carpeta
desde donde ejecutaste tu servidor. Puedes reproducirlo para escuchar la respuesta.
Opciones Adicionales
Descarga de archivos: Podrías implementar una ruta adicional en la API que permita descargar el
archivo de audio generado.
Personalización de TTS: Podrías agregar opciones para que el usuario elija la voz, la velocidad del
habla, o incluso el nombre del archivo de salida.
Manejo de múltiples respuestas: Si planeas tener múltiples consultas, podrías generar un nombre de
archivo único para cada respuesta, como response_<timestamp>.mp3, para evitar sobrescribir
archivos.
Con esta implementación, cada vez que hagas una consulta al PDF, obtendrás la respuesta en texto y en audio
de manera automática, mejorando la interacción con tu chatbot.
genial, una consulta: se puede hacer que este archivo mp3 se le muestre al usuario en la parte frontend para que pueda
escuchar la respuesta además de leerla, verdad? Pero esto ya es en el frontend, además leí algo como para que no se
sobreescriba el archivo mp3 creado debo usar la opción que se guarde como timescap, así se conservan cada archivo y
no se borra el anterior?
Opciones Adicionales
Descarga de archivos: Podrías implementar una ruta adicional en la API que permita descargar el archivo de
audio generado.
Personalización de TTS: Podrías agregar opciones para que el usuario elija la voz, la velocidad del habla, o incluso
el nombre del archivo de salida.
Manejo de múltiples respuestas: Si planeas tener múltiples consultas, podrías generar un nombre de archivo
único para cada respuesta, como response_<timestamp>.mp3, para evitar sobrescribir archivos.
VEAMOS COMO QUEDA LA RUTA CON LA CREACIÓN DE UNA CARPETA DONDE SE GUARDEN
LOS AUDISO GENERADOS POR LA FUNCIÓN TTS, Y QUE ESTOS AUDIOS SE CREEN CON
NOMBRES DISTINTOS PARA QUE NO SE SOBREESCRIBAN…
En api.py ingreso estas líneas arriba: Las subrayadas se están anexando:
import os
import time
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
Así quedaría las modificaciones a la ruta de TTS:
app = FastAPI()
# Montar la carpeta de archivos estáticos donde se guardarán los MP3
app.mount("/audio", StaticFiles(directory="audio"), name="audio")
# Asegurarse de que la carpeta 'audio' existe
if not os.path.exists("audio"):
os.makedirs("audio")
@app.post("/tfm4/question_audio/{question}")
def llama_rag_audio(question: str):
try:
# Obtener la respuesta de la pregunta
result = tfm_rag_llama(question)
# Generar un nombre de archivo único con timestamp
timestamp = int(time.time())
audio_filename = f"response_{timestamp}.mp3"
audio_path = f"audio/{audio_filename}"
# Convertir la respuesta a voz y guardarla en un archivo MP3
text_to_speech(result, audio_path)
# Devolver la respuesta en texto y la URL del archivo de audio
audio_url = f"/audio/{audio_filename}"
return {"Response": result, "Audio file URL": audio_url}
except Exception as e:
result = "files not loaded!!!"
return {"data": result, "error": str(e)}
Explicación de los cambios:
1. Carpeta de almacenamiento de archivos MP3:
o Utilizo la función os.makedirs() para crear la carpeta audio en caso de que no exista. Esta
será la carpeta donde se guardarán todos los archivos MP3.
o Carpeta estática: La carpeta audio está montada como estática en el servidor, lo que permite
que los archivos MP3 sean accesibles públicamente a través de la URL
/audio/{archivo.mp3}.
2. Generación de nombres únicos:
o Para cada consulta, se genera un nombre de archivo único utilizando un timestamp
(response_<timestamp>.mp3). El timestamp asegura que no se sobrescriban archivos, ya que
cada consulta tendrá un nombre de archivo diferente.
o Esto te ayudará cuando implementes el frontend, ya que cada archivo de audio tendrá un
nombre único, lo que facilitará la carga y reproducción del archivo correspondiente a cada
consulta.
Beneficios de esta implementación:
Evitar sobrescribir archivos: Cada archivo MP3 tendrá un nombre único basado en el tiempo, lo que
evita conflictos y permite manejar múltiples consultas simultáneamente.
Facilitar la integración con el frontend: Con cada respuesta, el backend devolverá un archivo de
audio específico que puede ser reproducido en el frontend, ofreciendo una mejor experiencia al
usuario.
Con estos ajustes, cuando trabajes en el frontend, podrás fácilmente mostrar el archivo MP3 correspondiente
a cada consulta junto con la respuesta en texto.
Esto es para editar la ruta STT, haciendo que la transcripción de audio a texto pase a la
función TTS y que responda en texto y audio.
# Obtener la respuesta usando el texto generado
response = tfm_rag_llama(transcript)
# Generar el archivo de respuesta en audio (TTS)
audio_filename = generate_unique_filename()
text_to_speech(response, os.path.join(audio_directory, audio_filename))
return {
"Response": response,
"Audio file": audio_filename }