Spaces:
Running
Running
from fastapi import FastAPI as FastAPIApp, HTTPException | |
from fastapi.middleware.cors import CORSMiddleware | |
from pydantic import BaseModel | |
import uvicorn | |
import os | |
from hand import Hand | |
from typing import List, Optional | |
app = FastAPIApp() | |
hand = Hand() | |
class InputData(BaseModel): | |
text: str | |
bias: Optional[float] = 0.75 | |
style: Optional[int] = 9 | |
stroke_colors: Optional[List[str]] = ['black'] | |
stroke_widths: Optional[List[float]] = [2] | |
def validate_input(data: InputData): | |
if len(data.text) > 75: | |
raise ValueError("Text must be 75 characters or less") | |
if not (0.5 <= data.bias <= 1.0): | |
raise ValueError("Bias must be between 0.5 and 1.0") | |
if not (0 <= data.style <= 12): | |
raise ValueError("Style must be between 0 and 12") | |
if len(data.stroke_colors) != len(data.text.split('\n')): | |
raise ValueError("Number of stroke colors must match number of lines") | |
if len(data.stroke_widths) != len(data.text.split('\n')): | |
raise ValueError("Number of stroke widths must match number of lines") | |
def synthesize(data: InputData): | |
try: | |
validate_input(data) | |
lines = data.text.split('\n') | |
biases = [data.bias] * len(lines) | |
styles = [data.style] * len(lines) | |
hand.write( | |
filename='img/output.svg', | |
lines=lines, | |
biases=biases, | |
styles=styles, | |
stroke_colors=data.stroke_colors, | |
stroke_widths=data.stroke_widths | |
) | |
return {"result": "Handwriting synthesized successfully", "output_file": "img/output.svg"} | |
except ValueError as e: | |
raise HTTPException(status_code=400, detail=str(e)) | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=8000) | |