from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager import os from app.db import Base, engine from app.routers import assistants, history, knowledge # 配置 PORT = int(os.getenv("PORT", 8100)) @asynccontextmanager async def lifespan(app: FastAPI): # 启动时创建表 Base.metadata.create_all(bind=engine) yield app = FastAPI( title="AI VideoAssistant API", description="Backend API for AI VideoAssistant", version="1.0.0", lifespan=lifespan ) # CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 路由 app.include_router(assistants.router, prefix="/api") app.include_router(history.router, prefix="/api") app.include_router(knowledge.router, prefix="/api") @app.get("/") def root(): return {"message": "AI VideoAssistant API", "version": "1.0.0"} @app.get("/health") def health(): return {"status": "ok"} # 初始化默认数据 @app.on_event("startup") def init_default_data(): from sqlalchemy.orm import Session from app.db import SessionLocal from app.models import Voice db = SessionLocal() try: # 检查是否已有数据 if db.query(Voice).count() == 0: # SiliconFlow CosyVoice 2.0 预设声音 (8个) # 参考: https://docs.siliconflow.cn/cn/api-reference/audio/create-speech voices = [ # 男声 (Male Voices) Voice(id="alex", name="Alex", vendor="SiliconFlow", gender="Male", language="en", description="Steady male voice.", is_system=True), Voice(id="benjamin", name="Benjamin", vendor="SiliconFlow", gender="Male", language="en", description="Deep male voice.", is_system=True), Voice(id="charles", name="Charles", vendor="SiliconFlow", gender="Male", language="en", description="Magnetic male voice.", is_system=True), Voice(id="david", name="David", vendor="SiliconFlow", gender="Male", language="en", description="Cheerful male voice.", is_system=True), # 女声 (Female Voices) Voice(id="anna", name="Anna", vendor="SiliconFlow", gender="Female", language="en", description="Steady female voice.", is_system=True), Voice(id="bella", name="Bella", vendor="SiliconFlow", gender="Female", language="en", description="Passionate female voice.", is_system=True), Voice(id="claire", name="Claire", vendor="SiliconFlow", gender="Female", language="en", description="Gentle female voice.", is_system=True), Voice(id="diana", name="Diana", vendor="SiliconFlow", gender="Female", language="en", description="Cheerful female voice.", is_system=True), # 中文方言 (Chinese Dialects) - 可选扩展 Voice(id="amador", name="Amador", vendor="SiliconFlow", gender="Male", language="zh", description="Male voice with Spanish accent."), Voice(id="aelora", name="Aelora", vendor="SiliconFlow", gender="Female", language="en", description="Elegant female voice."), Voice(id="aelwin", name="Aelwin", vendor="SiliconFlow", gender="Male", language="en", description="Deep male voice."), Voice(id="blooming", name="Blooming", vendor="SiliconFlow", gender="Female", language="en", description="Fresh and clear female voice."), Voice(id="elysia", name="Elysia", vendor="SiliconFlow", gender="Female", language="en", description="Smooth and silky female voice."), Voice(id="leo", name="Leo", vendor="SiliconFlow", gender="Male", language="en", description="Young male voice."), Voice(id="lin", name="Lin", vendor="SiliconFlow", gender="Female", language="zh", description="Standard Chinese female voice."), Voice(id="rose", name="Rose", vendor="SiliconFlow", gender="Female", language="en", description="Soft and gentle female voice."), Voice(id="shao", name="Shao", vendor="SiliconFlow", gender="Male", language="zh", description="Deep Chinese male voice."), Voice(id="sky", name="Sky", vendor="SiliconFlow", gender="Male", language="en", description="Clear and bright male voice."), Voice(id="ael西山", name="Ael西山", vendor="SiliconFlow", gender="Female", language="zh", description="Female voice with Chinese dialect."), ] for v in voices: db.add(v) db.commit() print("✅ 默认声音数据已初始化 (SiliconFlow CosyVoice 2.0)") finally: db.close()