import { existsSync, mkdirSync } from "node:fs"; import { writeFile } from "node:fs/promises"; import { NextRequest, NextResponse } from "next/server"; import { EdgeTTS } from "edge-tts-universal"; import { getAudioDirectory, getAudioFilePath, getAudioPublicPath } from "@/lib/audio"; import { findWord, getSettings, updateWordAudio } from "@/lib/db"; export const runtime = "nodejs"; export const dynamic = "force-dynamic"; type RouteContext = { params: Promise<{ id: string }>; }; export async function POST(_request: NextRequest, context: RouteContext) { try { const { id } = await context.params; const wordId = Number(id); const word = findWord(wordId); if (!word) { return NextResponse.json({ message: "词库不存在" }, { status: 404 }); } const audioDirectory = getAudioDirectory(); if (!existsSync(audioDirectory)) { mkdirSync(audioDirectory, { recursive: true }); } const safeEnglish = word.english.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, ""); const fileName = `${word.id}-${safeEnglish || "word"}.mp3`; const filePath = getAudioFilePath(fileName); const publicPath = getAudioPublicPath(fileName); const settings = getSettings(); const tts = new EdgeTTS(word.english, settings.ttsVoice, { rate: settings.ttsRate, }); const result = await tts.synthesize(); const audioBuffer = Buffer.from(await result.audio.arrayBuffer()); await writeFile(filePath, audioBuffer); const updatedWord = updateWordAudio(word.id, publicPath); return NextResponse.json({ word: updatedWord }); } catch (error) { const message = error instanceof Error ? error.message : "生成语音失败"; return NextResponse.json({ message }, { status: 500 }); } }