JairoDanielMT's picture
Update app.py
a5d3012 verified
from fastapi import FastAPI, Depends, File, UploadFile
from fastapi.responses import FileResponse
from gtts import gTTS
from pydantic import BaseModel
from pydub import AudioSegment
from fastapi.middleware.cors import CORSMiddleware
import pandas as pd
import json
import os
import io
from typing import List
from datetime import datetime
app = FastAPI()
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
def root():
return {"mensaje": "API de C14r0 por Jairo Mendoza"}
@app.get("/texto2voz")
def texto_a_voz(
nombre_asesor: str,
nombre_cliente: str,
direccion_cliente: str,
distrito: str,
fecha: str,
franja_hora: str,
):
"""
Esta función convierte un texto en voz y lo devuelve como un archivo de audio en formato MP3.
Parámetros
* **nombre\_asesor** (str): Nombre y apellido del asesor que realiza la llamada.
* **nombre\_cliente** (str): Nombre y apellido completo del cliente al que se le realizará la visita.
* **direccion\_cliente** (str): Dirección completa donde se realizará la visita.
* **distrito** (str): Nombre del distrito donde se encuentra la dirección del cliente.
* **fecha** (str): Fecha en que se realizará la visita.
* **franja\_hora** (str): Franja horaria en que se realizará la visita.
La función devuelve un objeto de respuesta de archivo (FileResponse) con el archivo de audio en formato MP3 y el tipo de medio (media\_type) establecido en "audio/mpeg".
Descripción
~~~~~~~~~~~
La función toma los parámetros de entrada y los utiliza para crear un texto que será convertido a voz. El texto contiene información sobre la visita programada de Claro Hogar, incluyendo el nombre y apellido del asesor, el nombre y apellido del cliente, la dirección de la visita, el distrito, la fecha y la franja horaria. El texto es convertido a voz utilizando la librería gTTS (Google Text-to-Speech) con el idioma establecido en español. El archivo de audio resultante es guardado en formato MP3 con el nombre "salida.mp3". Posteriormente, el archivo de audio es cargado con la librería pydub y se aplica un filtro de paso bajo para suavizarlo. El filtro ayuda a eliminar cualquier ruido de fondo no deseado y mejora la calidad del audio final. El archivo de audio suavizado es guardado en formato MP3 con el nombre "salida_suavizada.mp3". Finalmente, la función devuelve un objeto de respuesta de archivo (FileResponse) con el archivo de audio suavizado y el tipo de medio establecido en "audio/mpeg". El archivo se puede reproducir directamente desde la respuesta de la API.
"""
texto_a_convertir = f"""
Buenos día, le saluda {nombre_asesor} del área de programaciones de Claro,
me comunico con el titular {nombre_cliente},
El motivo del mensaje de voz es para confirmar la visita de del servicio Claro Hogar,
solicitada para la dirección {direccion_cliente} en el distrito de {distrito}.
Le indicamos que su visita está programada para el {fecha} en la franja horaria de
{franja_hora}. ¿Nos podría confirmar su disponibilidad para esa fecha y hora? por favor.
"""
# Crear un objeto gTTS
tts = gTTS(text=texto_a_convertir, lang="es")
# Guardar el archivo de audio en formato mp3
tts.save("salida.mp3")
print("Texto convertido y guardado en formato MP3")
# Cargar el archivo de audio con pydub
audio = AudioSegment.from_mp3("salida.mp3")
# Aplicar el filtro de paso bajo para suavizar
audio_suavizado = audio.low_pass_filter(
20000
) # Ajustar el valor de cutoff según se requiera
# Guardar el nuevo archivo de audio suavizado en formato mp3
audio_suavizado.export("salida_suavizada.mp3", format="mp3")
file_path = "salida_suavizada.mp3"
return FileResponse(file_path, media_type="audio/mpeg")
@app.post("/excel_json/")
async def excel_json(file: UploadFile = File(...), sheet_name: str = "Nombre_hoja"):
"""
Convierte un archivo Excel a JSON.
Este endpoint acepta un archivo Excel como entrada y devuelve un archivo JSON con el contenido de la hoja especificada.
Si no se especifica ninguna hoja, se utilizará la hoja predeterminada "Nombre_hoja".
### Parámetros
- *file* (*UploadFile*): El archivo Excel que se desea convertir a JSON.
- *sheet_name* (*str*, opcional): El nombre de la hoja que se desea convertir a JSON. Si no se especifica ningún valor, se utilizará la hoja predeterminada "Nombre_hoja".
Respuesta:
* 200 OK: Un archivo JSON con el contenido de la hoja especificada.
Ejemplo:
```
curl -X POST "https://c14r0-e720dfe9241ece27e47c667bcc8a606.hf.space/excel_json/" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@/path/to/file.xlsx" -F "sheet_name=Hoja1"
```
"""
df = pd.read_excel(
io.BytesIO(await file.read()), engine="openpyxl", sheet_name=sheet_name
)
json_file = "output.json"
df.to_json(json_file, orient="records")
return FileResponse(
json_file, media_type="application/json", filename=json_file, background=None
)
def adaptar_a_formato_oracle(item):
nuevo_item = {"resourceId": item["resourceId"], "workSchedules": []}
for fecha, status in item.items():
if fecha != "resourceId":
record_type = "Descanso Semanal" if status == "Descanso Semanal" else "Ok"
nuevo_item["workSchedules"].append(
{
"recordType": record_type,
"startDate": fecha.strftime("%Y-%m-%d"),
"endDate": fecha.strftime(
"%Y-%m-%d"
), # Puedes ajustar esto según tu lógica
}
)
return nuevo_item
@app.post("/excel_json_formato_JSON_ORACLE/")
async def excel_json_especial_para_el_calendario(
file: UploadFile = File(...),
sheet_name: str = "Nombre_hoja"
):
"""
Función para convertir un archivo Excel en un archivo JSON adaptado al formato requerido por Oracle.
Esta función recibe un archivo Excel y una cadena con el nombre de la hoja de cálculo deseada,
lee el archivo utilizando la librería pandas, lo convierte a un diccionario de Python y luego
transforma su formato para adaptarlo al formato requerido por Oracle. Finalmente, el JSON
resultante se guarda en un archivo y se devuelve como respuesta.
Ejemplo de request:
```
/excel_json_formato_JSON_ORACLE/
--file
file: archivo.xlsx; type=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
--sheet_name
Nombre_hoja
```
* :param file: Archivo Excel a convertir
* :type file: UploadFile
* :param sheet_name: Nombre de la hoja de cálculo a leer
* :type sheet_name: str
* :return: Archivo JSON adaptado al formato Oracle
* :rtype: FileResponse
"""
df = pd.read_excel(
io.BytesIO(await file.read()), engine="openpyxl", sheet_name=sheet_name
)
# Transformar el formato al deseado para Oracle
json_original = df.to_dict(orient="records")
json_adaptado = [adaptar_a_formato_oracle(item) for item in json_original]
# Guardar el JSON adaptado en un archivo
json_file = "output.json"
with open(json_file, "w") as output_file:
json_adaptado_str = str(json_adaptado).replace("'", '"')
output_file.write(json_adaptado_str)
# Devolver el archivo JSON adaptado como respuesta
return FileResponse(json_file, media_type="application/json", filename=json_file)