urfu-pe / run_api.py
kavlab
merged with github repo
1e7f40c
import os
import uvicorn
from fastapi import FastAPI
import mulyavin_aa.langdetector
import mulyavin_aa.translator
import mulyavin_aa.model.langdetector
import mulyavin_aa.model.translator
import base64
from kuznetsov_av.api import Request, Response
import kuznetsov_av.text_to_speech_converter as t2s
import requests
from zvereva_ev import get_description_image, develop_api_app
app = FastAPI()
# Представление проекта урлом по умолчанию
@app.get("/")
async def root():
"""Получение базовой информации об API"""
return {"message": "Проект ДЗ: Модуль 3. Разработка API для приложений искусственного интеллекта (vo_HW)",
"git": "https://github.com/kavlab/urfu_iml_2023_1_3_hw2",
"apis": [
{
"descr": "API для определения языка текста ",
"base_url": "/langdetector"
},
{
"descr": "API для перевода текста из Ru в En",
"base_url": "/translator"
},
{
"descr": "API преобразования текста в речь",
"base_url": "/text-to-speech"
},
{
"descr": "API для описания загруженного изображения",
"base_url": "/get_description_image/predict/"
}
]}
@app.post("/langdetector/detect")
def lang_detect(request: mulyavin_aa.model.langdetector.Request) \
-> mulyavin_aa.model.langdetector.Response:
"""Определение языка текста"""
pipe = mulyavin_aa.langdetector.load_text_detection_model()
langs = pipe(request.text, )
return mulyavin_aa.model.langdetector.Response(langs=langs)
@app.post("/translator/translate")
def lang_detect(request: mulyavin_aa.model.translator.Request) \
-> mulyavin_aa.model.translator.Response:
"""Перевод текста из Ru в En"""
pipe = mulyavin_aa.translator.load_text_translator_model()
text = mulyavin_aa.translator.translate_to_en(request.text, pipe)
return mulyavin_aa.model.translator.Response(text=text)
@app.post('/text-to-speech/convert/')
async def text_to_speech(entity: Request) -> Response:
"""
Text-to-audio generation method using text_to_speech_converter.
"""
synthesiser = t2s.load_model()
embeddings_dataset = t2s.load_speaker_dataset()
audio, sampling_rate = t2s.text_to_speech(entity.text, synthesiser, embeddings_dataset)
return Response(audio=base64.b32encode(audio), sampling_rate=sampling_rate)
@app.post("/get_description_image/predict/")
async def get_description_image_predict(item: develop_api_app.Url):
"""
Получение ссылки на изображение. Запись изображения под названием 'image_predict_test_image.png для получения его описания
"""
response = requests.get(item.url, stream=True)
# сохранение изображения для дальнейшей передачи в модель
with open(f"{os.path.dirname(__file__)}/zvereva_ev/image_predict_tmp.png", "wb") as f:
f.write(response.content)
return get_description_image.get_description_image()
# Запуск как приложения
if __name__ == '__main__':
uvicorn.run(app, port=8000, host='127.0.0.1')