|
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() |
|
|
|
|
|
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. |
|
""" |
|
|
|
tts = gTTS(text=texto_a_convertir, lang="es") |
|
|
|
tts.save("salida.mp3") |
|
print("Texto convertido y guardado en formato MP3") |
|
|
|
audio = AudioSegment.from_mp3("salida.mp3") |
|
|
|
audio_suavizado = audio.low_pass_filter( |
|
20000 |
|
) |
|
|
|
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" |
|
), |
|
} |
|
) |
|
|
|
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 |
|
) |
|
|
|
|
|
json_original = df.to_dict(orient="records") |
|
json_adaptado = [adaptar_a_formato_oracle(item) for item in json_original] |
|
|
|
|
|
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) |
|
|
|
|
|
return FileResponse(json_file, media_type="application/json", filename=json_file) |
|
|
|
|