from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from pydantic import BaseModel import torch import sentencepiece as spm from model import RapformerLangModel app = FastAPI(title="Rapformer API") app.mount("/static", StaticFiles(directory="static"), name="static") device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') print("Loading tokenizer...") sp = spm.SentencePieceProcessor(model_file='tokrap.model') print("Loading Rapformer weights...") model = RapformerLangModel() model.load_state_dict(torch.load('rapformer_v0.pth', map_location=device)) model.to(device) model.eval() class GenerateRequest(BaseModel): start_phrase: str temperature: float = 0.8 top_k: int = 50 @app.get("/") def read_root(): return FileResponse("static/index.html") @app.post("/generate") def generate_lyrics(req: GenerateRequest): start_text = req.start_phrase if req.start_phrase else "Yeah" context_tokens = sp.encode(start_text, out_type=int) context = torch.tensor([context_tokens], dtype=torch.long, device=device) with torch.no_grad(): generated_tokens = model.generate( idx=context, max_new_tokens=300, temperature=req.temperature, top_k=req.top_k )[0].tolist() decoded_text = sp.decode(generated_tokens) return {"lyrics": decoded_text}