from fastapi import FastAPI, Query from fastapi.staticfiles import StaticFiles from kokoro import KPipeline import soundfile as sf from pydub import AudioSegment import os from fastapi.responses import JSONResponse from pydantic import BaseModel import uuid import time app = FastAPI() # 挂载 static 目录 os.makedirs("static", exist_ok=True) app.mount("/static", StaticFiles(directory="static"), name="static") class AudioResponse(BaseModel): audio_url: str time: float # 初始化KPipeline pipeline = KPipeline(lang_code='z') @app.get("/generate_audio/", response_model=AudioResponse) async def generate_audio(text: str = Query(..., description="输入要转换为语音的文本"), voice: str = Query("zf_xiaoxiao", description="选择语音类型")): per=time.time() # 生成音频 generator = pipeline(text, voice=voice, speed=1, split_pattern=r'\n+') # 保存每个音频片段 audio_files = [] for i, (gs, ps, audio) in enumerate(generator): audio_filename = f"static/temp_{i}.wav" sf.write(audio_filename, audio, 24000) audio_files.append(audio_filename) # 合并音频片段 combined_audio = AudioSegment.empty() for audio_file in audio_files: audio_segment = AudioSegment.from_wav(audio_file) combined_audio += audio_segment # 生成唯一的音频文件名 unique_filename = f"audio_{uuid.uuid4().hex}.wav" combined_filepath = os.path.join("static", unique_filename) # 保存合并后的音频文件 combined_audio.export(combined_filepath, format="wav") # 清理临时音频文件 for audio_file in audio_files: os.remove(audio_file) end=time.time() # 返回合并后的音频文件URL audio_url = f"/static/{unique_filename}" return {"audio_url": audio_url,"time": end-per} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)