Universal Text-To-Speech TypeScript SDK with Multi-Provider Support.
翻译准备中
正在加载完整 README。
查看完整 README ↗The Universal SDK for text-to-speech across all major providers
A lightweight, provider-agnostic TypeScript SDK. Zero lock-in. Runs in Node.js, Edge runtimes, and the browser.
Created and maintained by Jellypod.
Docs · Quick start · Providers · Streaming · Conversations · Timestamps
generateSpeech() call across every supported provider.streamSpeech() returns a standard ReadableStream<Uint8Array>.generateConversation() produces multi-speaker audio from one or many providers.wav / mp3 / pcm output.npm install @speech-sdk/core
[!TIP] Using an AI coding assistant? Give it full knowledge of this library:
npx skills add Jellypod-Inc/speech-sdk --skill speech-sdk.
import { generateSpeech } from '@speech-sdk/core';
const result = await generateSpeech({
model: 'openai/gpt-4o-mini-tts',
text: 'Hello from speech-sdk!',
voice: 'alloy',
});
result.audio.uint8Array; // Uint8Array
result.audio.base64; // string (lazy)
result.audio.mediaType; // "audio/mpeg"
Set the provider's env var (e.g. OPENAI_API_KEY) or pass apiKey. A bare provider id ('openai') uses its default model.
Need a custom baseURL, fetch, or several configurations of one provider? Use a factory instead of a string:
import { createOpenAI } from '@speech-sdk/core/providers';
const openai = createOpenAI({ apiKey: 'sk-...', baseURL: 'https://my-proxy.com/v1' });
await generateSpeech({ model: openai('gpt-4o-mini-tts'), text: 'Hello!', voice: 'alloy' });
Use instructions for non-spoken delivery direction ('warm and measured') on models that support it. Provider-specific parameters pass through untouched via providerOptions.
| Provider | Prefix | Env var |
|---|---|---|
| OpenAI | openai | OPENAI_API_KEY |
| ElevenLabs | elevenlabs | ELEVENLABS_API_KEY |
| Google Gemini TTS | google | GOOGLE_API_KEY |
| Cartesia | cartesia | CARTESIA_API_KEY |
| Deepgram | deepgram | DEEPGRAM_API_KEY |
| HeyGen | heygen | HEYGEN_API_KEY |
| Hume | hume | HUME_API_KEY |
| Inworld | inworld | INWORLD_API_KEY |
| Fish Audio | fish-audio | FISH_AUDIO_API_KEY |
| Gradium | gradium | GRADIUM_API_KEY |
| Murf | murf | MURF_API_KEY |
| Resemble | resemble | RESEMBLE_API_KEY |
| fal |
Providers can also route through Vercel AI Gateway with createVercelAIGatewayClient(). See the docs for per-provider models, voices, and caveats.
import { streamSpeech } from '@speech-sdk/core';
const { audio, mediaType } = await streamSpeech({
model: 'cartesia/sonic-3.5',
text: 'Streaming straight to the client.',
voice: 'voice-id',
});
return new Response(audio, { headers: { 'Content-Type': mediaType } });
streamConversation() streams native two-speaker dialogue on models that support it (e.g. Gemini 3.8).
generateConversation() turns an ordered list of turns into one clip. Turns on a single multi-speaker model use its native dialogue endpoint; anything else is generated in parallel, level-matched, and stitched.
import { generateConversation } from '@speech-sdk/core';
const result = await generateConversation({
turns: [
{ model: 'openai/tts-1', voice: 'nova', text: "Hi, I'm hosted by OpenAI." },
{ model: 'elevenlabs/eleven_multilingual_v2', voice: 'JBFqnCBsd6RMkjVDRZzb', text: "And I'm hosted by ElevenLabs." },
],
});
result.metadata.path; // 'native' | 'native-split' | 'stitch'
Pass timestamps: true, splitTurns: true to also get one sample-accurate clip per turn in result.turns.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗
fal-aiFAL_API_KEY |
| Mistral | mistral | MISTRAL_API_KEY |
| xAI | xai | XAI_API_KEY |
| MiniMax | minimax | MINIMAX_API_KEY |
| Speechify | speechify | SPEECHIFY_API_KEY |