{"_id":"@duyquangnvx/tts-client","name":"@duyquangnvx/tts-client","dist-tags":{"latest":"0.1.0-alpha.2"},"versions":{"0.1.0-alpha.2":{"name":"@duyquangnvx/tts-client","version":"0.1.0-alpha.2","description":"Multi-provider TTS wrapper (cloud + local) built on the Vercel AI SDK","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./openai":{"types":"./dist/providers/openai/index.d.ts","import":"./dist/providers/openai/index.js"},"./edge":{"types":"./dist/providers/edge/index.d.ts","node":"./dist/providers/edge/index.js"},"./ai-sdk":{"types":"./dist/ai-sdk-bridge/index.d.ts","import":"./dist/ai-sdk-bridge/index.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","lint":"biome check .","format":"biome format --write .","typecheck":"tsc --noEmit","example:quickstart":"tsx examples/quickstart.ts","example:openai":"tsx examples/openai.ts","example:streaming":"tsx examples/streaming.ts","example:fallback":"tsx examples/fallback.ts","example:ai-sdk-bridge":"tsx examples/ai-sdk-bridge.ts","smoke":"tsx scripts/smoke/all.ts"},"engines":{"node":">=20"},"packageManager":"pnpm@9.15.0","peerDependencies":{"ai":"^5.0.0","@ai-sdk/openai":"^2.0.0","@ai-sdk/provider":"^2.0.0","msedge-tts":"^2.0.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@ai-sdk/openai":{"optional":true},"@ai-sdk/provider":{"optional":true},"msedge-tts":{"optional":true}},"devDependencies":{"@ai-sdk/openai":"^2.0.0","@ai-sdk/provider":"^2.0.0","@biomejs/biome":"1.9.0","@types/node":"^20.14.0","ai":"^5.0.0","msedge-tts":"^2.0.0","tsup":"^8.3.0","tsx":"^4.19.0","typescript":"^5.5.0","vitest":"^2.1.0"},"license":"MIT","_id":"@duyquangnvx/tts-client@0.1.0-alpha.2","gitHead":"ac2fc29e6f2f257dc20c8005c279639bccd496a8","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-TIfaQ7h6yMwiv3mYlQCkvi2z39eeAASPFzeV/+Vj/50KuGJKzDwwKJFGuoDurGBbwIdf6y4NEp/Bqi/z4bEECA==","shasum":"ede33b2fb0c36e3de25b369377ca77059b029139","tarball":"https://registry.npmjs.org/@duyquangnvx/tts-client/-/tts-client-0.1.0-alpha.2.tgz","fileCount":14,"unpackedSize":263063,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCuzuahYsGsI3/oF3cehY7bh1JSrFAI6fD8TAg5wgV1EwIhAIzJkhhA6Wm48E236KcuNWWlE2TcuLSZlWDKggl1lPDT"}]},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"directories":{},"maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tts-client_0.1.0-alpha.2_1777812145149_0.9726423719585038"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-03T12:42:25.028Z","0.1.0-alpha.2":"2026-05-03T12:42:25.327Z","modified":"2026-05-03T12:42:25.569Z"},"maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"description":"Multi-provider TTS wrapper (cloud + local) built on the Vercel AI SDK","license":"MIT","readme":"# @duyquangnvx/tts-client\n\nMulti-provider TTS wrapper (cloud + local) built on the Vercel AI SDK where\npossible, with first-class custom providers for backends the AI SDK does not\nship — Edge TTS today, Kokoro / sherpa coming.\n\n## Quickstart\n\n```bash\npnpm i @duyquangnvx/tts-client msedge-tts\n```\n\n```ts\nimport { writeFile } from \"node:fs/promises\";\nimport { createTTSClient } from \"@duyquangnvx/tts-client\";\nimport { edge } from \"@duyquangnvx/tts-client/edge\";\n\nconst tts = createTTSClient({ providers: [edge()] });\nconst r = await tts.speak({ text: \"Hello world\", voice: \"edge:en-US-AriaNeural\" });\nawait writeFile(\"out.mp3\", r.audio);\n```\n\n## Supported providers (v0.1)\n\n| Provider | Subpath | Runtime | Streaming | Voices | Install | Notes |\n|---|---|---|---|---|---|---|\n| Edge TTS | `@duyquangnvx/tts-client/edge` | Node | native (WS) | ~400 dynamic | `pnpm i msedge-tts` | No API key. Default for the Quickstart. |\n| OpenAI | `@duyquangnvx/tts-client/openai` | universal | sentence-chunk fallback | 9 (`tts-1` / `tts-1-hd`) · 13 (`gpt-4o-mini-tts`) | `pnpm i ai @ai-sdk/openai` | Requires `OPENAI_API_KEY`. |\n\nMore providers on the way: ElevenLabs (v0.2), Kokoro local model (v0.2),\nsherpa-onnx-node (v1).\n\n## Subpath imports\n\n```ts\nimport { createTTSClient, TTSError } from \"@duyquangnvx/tts-client\";\nimport { edge } from \"@duyquangnvx/tts-client/edge\";\nimport { openai } from \"@duyquangnvx/tts-client/openai\";\nimport { toSpeechModel, edgeSpeechModel } from \"@duyquangnvx/tts-client/ai-sdk\";\n```\n\n## AI SDK bridge\n\nPlug our backends into AI SDK's `experimental_generateSpeech`:\n\n```ts\nimport { experimental_generateSpeech as generateSpeech } from \"ai\";\nimport { edgeSpeechModel } from \"@duyquangnvx/tts-client/ai-sdk\";\n\nconst r = await generateSpeech({\n  model: edgeSpeechModel(\"en-US-AriaNeural\"),\n  text: \"Hello world\",\n});\n```\n\nOr wrap any `TTSProvider` (yours or one of ours) with `toSpeechModel(provider, voice)`.\n\n## Streaming\n\n```ts\nfor await (const chunk of tts.stream({\n  text: \"Streaming audio.\",\n  voice: \"edge:en-US-AriaNeural\",\n})) {\n  if (chunk.audio.byteLength > 0) audioElement.appendBuffer(chunk.audio);\n  if (chunk.isLast) console.log(\"done\");\n}\n```\n\n`AudioChunk.audio` may be empty when a chunk carries only word-boundary\nmetadata. See [DATA-MODEL.md](./docs/DATA-MODEL.md) for the full shape.\n\n## Fallback\n\n```ts\nconst tts = createTTSClient({\n  providers: [edge(), openai({ apiKey: process.env.OPENAI_API_KEY })],\n  fallback: [\"openai\"], // tries openai when edge throws retryable provider_unavailable\n});\n```\n\n## Examples\n\nRunnable scripts live in [`examples/`](./examples). Run any with:\n\n```bash\npnpm tsx examples/quickstart.ts\n```\n\n## Docs\n\n- [Architecture](./docs/ARCHITECTURE.md) — design + two-layer adapter pattern.\n- [Data model](./docs/DATA-MODEL.md) — every public type.\n- [Pipeline](./docs/PIPELINE.md) — request flow, fallback, voice resolution.\n- [Conventions](./docs/CONVENTIONS.md) — code style + things-we-don't-do.\n- [Roadmap](./docs/ROADMAP.md) — milestones.\n\n## License\n\nMIT.\n","readmeFilename":"README.md","_rev":"1-62411e2bf77edf33f5b5fd70d6475b8d"}