(text, options = {})
| 567 | |
| 568 | // Generate speech/audio — GET /audio/{text}?voice=... |
| 569 | export const generateAudio = async (text, options = {}) => { |
| 570 | const { voice = "nova", model = "openai-audio" } = options; |
| 571 | |
| 572 | const params = new URLSearchParams({ voice, model }); |
| 573 | const url = `${BASE_URL}/audio/${encodeURIComponent(text)}?${params}`; |
| 574 | const token = getApiToken(); |
| 575 | const headers = token ? { Authorization: `Bearer ${token}` } : {}; |
| 576 | const response = await fetch(url, { headers }); |
| 577 | if (!response.ok) throw await parseApiError(response); |
| 578 | |
| 579 | const blob = await response.blob(); |
| 580 | const mimeType = blob.type || "audio/mpeg"; |
| 581 | return new Promise((resolve, reject) => { |
| 582 | const reader = new FileReader(); |
| 583 | reader.onloadend = () => |
| 584 | resolve({ url: reader.result, text, voice, model, mimeType }); |
| 585 | reader.onerror = reject; |
| 586 | reader.readAsDataURL(blob); |
| 587 | }); |
| 588 | }; |
no test coverage detected