mirror of
https://github.com/decolua/9router.git
synced 2026-05-08 12:01:28 +00:00
31 lines
1.1 KiB
JavaScript
31 lines
1.1 KiB
JavaScript
// OpenAI TTS — model format: "tts-model/voice"
|
|
import { Buffer } from "node:buffer";
|
|
|
|
export default {
|
|
async synthesize(text, model, credentials) {
|
|
if (!credentials?.apiKey) throw new Error("No OpenAI API key configured");
|
|
|
|
let ttsModel = "gpt-4o-mini-tts";
|
|
let voice = "alloy";
|
|
if (model && model.includes("/")) {
|
|
const parts = model.split("/");
|
|
if (parts.length === 2) [ttsModel, voice] = parts;
|
|
} else if (model) {
|
|
voice = model;
|
|
}
|
|
|
|
const baseUrl = (credentials.baseUrl || "https://api.openai.com").replace(/\/+$/, "");
|
|
const res = await fetch(`${baseUrl}/v1/audio/speech`, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json", "Authorization": `Bearer ${credentials.apiKey}` },
|
|
body: JSON.stringify({ model: ttsModel, voice, input: text }),
|
|
});
|
|
if (!res.ok) {
|
|
const err = await res.json().catch(() => ({}));
|
|
throw new Error(err?.error?.message || `OpenAI TTS failed: ${res.status}`);
|
|
}
|
|
const buf = await res.arrayBuffer();
|
|
return { base64: Buffer.from(buf).toString("base64"), format: "mp3" };
|
|
},
|
|
};
|