कंटेंट पर जाएं

टेक्स्ट टू स्पीच API इंटीग्रेशन: स्ट्रीमिंग, बैचिंग, रिट्राई

प्रकाशित
आखिरी बार अपडेट किया गया

सुनेंइस आर्टिकल को सुनें

टेक्स्ट टू स्पीच API को इंटीग्रेट करना आसान है… बशर्ते आप कुछ ठोस फैसले ले लें: कौन-सा ट्रांसफर मोड इस्तेमाल करना है, मॉडल और आउटपुट फ़ॉर्मैट कैसे चुनना है, स्ट्रीम कैसे करना है, concurrency limit पार किए बिना ज़्यादा वॉल्यूम कैसे संभालना है, कैश और रिट्राई कैसे करना है ताकि एक ही ऑडियो को रेंडर करने के लिए दो बार भुगतान न हो, और किसी दूसरे प्रोवाइडर के मुकाबले time-to-first-byte कैसे बेंचमार्क करना है।

टेक्स्ट टू स्पीच API इंटीग्रेशन में आपकी मदद के लिए, हमने इन सभी आर्किटेक्चर से जुड़े फैसलों और उन्हें लागू करने के तरीके को समझाया है। यह गाइड आपको ElevenLabs टेक्स्ट टू स्पीच API को इंटीग्रेट और स्केल करने में मदद करेगी। इसमें ऐसे कोड स्निपेट हैं जिन्हें आप सीधे प्रोडक्शन में पेस्ट करके काम शुरू कर सकते हैं।

यहां बताए गए कॉन्सेप्ट की विस्तृत जानकारी के लिए हमारे ऑडियो स्ट्रीमिंग को समझें, लेटेंसी ऑप्टिमाइज़ करना, और ElevenLabs मॉडल ओवरव्यू गाइड देखें। 

सारांश

  • ElevenLabs का एक टेक्स्ट टू स्पीच API endpoint है, जिसे आप तीन तरीकों से एक्सेस कर सकते हैं: batch convert, HTTP stream और stream-input WebSocket।
  • HTTP पर हर in-flight request आपकी concurrency limit में गिनी जाती है, जबकि WebSocket पर सिर्फ़ एक्टिव जनरेशन गिनी जाती है।
  • अपने parallelism को प्लान की limit से थोड़ा कम रखें और ऑडियो को प्रभावित करने वाले हर parameter का hash कैश करें, ताकि एक ही टेक्स्ट के लिए कभी दो बार बिल न हो।
  • concurrency wall तक पहुंचने से पहले गति कम करने के लिए 429 और 5xx को exponential backoff और full jitter के साथ रिट्राई करें।

टेक्स्ट टू स्पीच API को इंटीग्रेट करने के तीन तरीके

टेक्स्ट टू स्पीच का एक endpoint है, लेकिन आप उसे कैसे इंटीग्रेट करते हैं, यह आपकी लेटेंसी, जटिलता और लागत तय करता है। 

एक ही POST /v1/text-to-speech/{voice_id} call तीन रूपों में काम करती है और हर रूप थोड़ा अलग काम के लिए उपयुक्त है। टेक्स्ट टू स्पीच API को इंटीग्रेट करने के तीनों तरीकों का विवरण यहां है:

  • Batch (convert) सबसे आसान इंटीग्रेशन है: आप एक request भेजते हैं और बदले में एक ऑडियो response पाते हैं। यह सबसे कम जटिल विकल्प है और इसमें time-to-first-audio सबसे ज़्यादा होता है, क्योंकि कोई bytes लौटने से पहले पूरी क्लिप सिंथेसाइज़ होती है।
  • HTTP streaming (stream) में request वही रहती है, लेकिन response chunks में मिलता है: path में /stream जोड़ें, stream method कॉल करें और ऑडियो chunked response के रूप में वापस आता है। कोड लगभग एक जैसा रहता है, लेकिन महसूस होने वाली लेटेंसी काफी कम होती है।
  • WebSocket (stream-input) एक persistent connection बनाए रखता है: आप टेक्स्ट को धीरे-धीरे भेजते हैं और साथ-साथ ऑडियो chunks पाते हैं। यह interactive agents और LLM के tokens बनने के साथ ही उसके output को speech में बदलने के लिए बनाया गया है—वाक्य पूरा होने से पहले ही।

स्ट्रीमिंग से मॉडल ऑडियो तेज़ी से जनरेट नहीं करता; inference time में कोई बदलाव नहीं होता। स्ट्रीमिंग सिर्फ़ यह बदलती है कि आपको पहला chunk कब मिलता है: पूरी क्लिप तैयार होने से पहले ही वह भेज दिया जाता है, इसलिए कुल काम समान होने पर भी यूज़र को इंतज़ार कम लगता है।

Batch बनाम streaming बनाम WebSocket: निर्णय तालिका

इन तीन तरीकों में से चुनते समय कई बातों पर ध्यान देना चाहिए।

एक त्वरित गाइड: offline rendering के लिए batch चुनें, उस ज्ञात टेक्स्ट के लिए HTTP streaming चुनें जिसका यूज़र इंतज़ार कर रहा है, और agents व live LLM-to-speech के लिए WebSocket चुनें। 

नीचे दी गई तालिका उन पहलुओं के बीच trade-offs बताती है जो बड़े स्तर पर अहम होते हैं।

Batch (convert)
Time-to-first-audio
Highest (wait for full clip)
Implementation complexity
Lowest
Text known up front?
Required
Streaming LLM output into TTS
Awkward
Concurrency cost
Each request counts fully
Best for
Offline rendering, audiobooks, caching
HTTP streaming
Time-to-first-audio
Low
Implementation complexity
Low
Text known up front?
Required
Streaming LLM output into TTS
Awkward
Concurrency cost
Each request counts fully
Best for
Web/app playback of known text
WebSocket (stream-input)
Time-to-first-audio
Lowest
Implementation complexity
Highest (connection lifecycle, framing)
Text known up front?
Not required - send incrementally
Streaming LLM output into TTS
Native fit
Concurrency cost
Only active generation counts
Best for
Voice agents, live LLM to speech

HTTP पर, चाहे batch हो या streaming, हर in-flight request अपनी पूरी अवधि के लिए आपके प्लान की concurrency limit में गिनी जाती है। WebSocket पर सिर्फ़ वह समय गिना जाता है जब मॉडल ऑडियो जनरेट कर रहा हो; खुला लेकिन निष्क्रिय socket लगभग कोई लागत नहीं जोड़ता।

ऐसे cascaded voice agent के लिए, जो पूरी बातचीत के दौरान connection खुला रखता है लेकिन केवल agent की बारी पर ऑडियो जनरेट करता है, यह अंतर बड़ा होता है। agents बनाते समय WebSocket इस्तेमाल करने का यह मुख्य कारण है। पूरा protocol realtime टेक्स्ट टू स्पीच WebSocket गाइड में दिया गया है।

मॉडल और आउटपुट फ़ॉर्मैट चुनना

आपके TTS API इंटीग्रेशन से मिलने वाले ऑडियो को दो विकल्प तय करते हैं। पहला, मॉडल, जो क्वालिटी और स्पीड तय करता है। दूसरा, आउटपुट फ़ॉर्मैट, जो container, bitrate और sample rate तय करता है।

शुरू से ही इन दोनों को सही चुनने पर आगे की चीज़ें, जैसे लेटेंसी और टेलीफोनी compatibility, सही जगह बैठ जाती हैं।

मॉडल

हम कई टेक्स्ट टू स्पीच मॉडल उपलब्ध कराते हैं। वे सबसे अच्छे से सबसे खराब की रैंकिंग में नहीं हैं; हर मॉडल अलग trade-offs करता है।

Best for
eleven_flash_v2_5
Real-time, agents, bulk throughput (~75ms model inference)
eleven_flash_v2
Real-time, English only (~75ms)
eleven_multilingual_v2
Highest stable fidelity, narration
eleven_v3
Most expressive, widest language range
Languages
eleven_flash_v2_5
32
eleven_flash_v2
English
eleven_multilingual_v2
29
eleven_v3
70+
Character limit
eleven_flash_v2_5
40,000
eleven_flash_v2
30,000
eleven_multilingual_v2
10,000
eleven_v3
5,000

ध्यान दें कि ~75ms का आंकड़ा, network और application latency को छोड़कर, सामान्य परिस्थितियों में मॉडल inference का है। लंबे inputs और लोड में यह बढ़ता है। हमेशा अपने application से मापें, किसी benchmark number से नहीं।

Flash मॉडल छोटे होते हैं और inference time घटाने के लिए ज़्यादा आक्रामक approximations इस्तेमाल करते हैं। Eleven v3 और Multilingual v2 बड़े मॉडल हैं, जो बेहतर output के लिए हर character पर अधिक समय लेते हैं। कोई ऐसी setting नहीं है जो Flash की स्पीड पर Eleven v3 की क्वालिटी दे सके, क्योंकि उस क्वालिटी के लिए अतिरिक्त computation चाहिए।

real-time या agent path के लिए eleven_flash_v2_5 इस्तेमाल करें; यह सबसे कम लेटेंसी वाला multilingual विकल्प है। narration, ऑडियोबुक, या marketing voiceover के लिए, स्थिर और high-fidelity आउटपुट चाहिए तो eleven_multilingual_v2 चुनें; अधिकतम अभिव्यक्ति और भावनात्मक रेंज चाहिए तो eleven_v3 चुनें। 

जब उच्चारण अहम हो, जैसे फोन नंबर, तारीख या मुद्रा के लिए, टेक्स्ट API तक पहुंचने से पहले अपने application में नंबर normalization करें। जिस रूप में बोलवाना चाहते हैं, उसे लिखकर दें। 

खुद normalization करने से सभी मॉडलों में उच्चारण अनुमानित रहता है और ऐसे model-specific defaults पर निर्भरता नहीं रहती जो बदल सकते हैं।

आउटपुट फ़ॉर्मैट

output_format parameter आपके मिलने वाले ऑडियो का container, sample rate और bitrate नियंत्रित करता है। जिन values का आप सबसे ज़्यादा उपयोग करेंगे:

Use case
mp3_44100_128
General playback, downloads, highest mp3 quality shown here
mp3_22050_32
Lower-bandwidth playback, smaller files
pcm_24000 / pcm_16000
Raw PCM for your own audio pipeline or further processing
ulaw_8000
Telephony - the format used with Twilio and similar systems
Languages
mp3_44100_128
32
mp3_22050_32
English
pcm_24000 / pcm_16000
29
ulaw_8000
70+
Character limit
mp3_44100_128
40,000
mp3_22050_32
30,000
pcm_24000 / pcm_16000
10,000
ulaw_8000
5,000

वॉइस सेटिंग्स

नीचे दी गई settings तय करती हैं कि जनरेट की गई speech कैसी सुनाई देगी:

  • Stability: consistency और expressiveness नियंत्रित करता है। कम values ज़्यादा विविध और अभिव्यक्तिपूर्ण speech देती हैं, जबकि अधिक values स्थिर और अनुमानित delivery देती हैं।
  • SimilarityBoost: यह नियंत्रित करता है कि output reference voice से कितना मेल खाता है।
  • Style: बढ़ाने पर वॉइस की प्राकृतिक बोलने की शैली को और उभारता है।
  • useSpeakerBoost: कम लेटेंसी लागत पर मूल speaker से समानता बढ़ाता है।
  • Speed: 1.0 की default value के आसपास delivery की गति समायोजित करता है।

इन settings में Stability का महसूस होने वाली क्वालिटी पर आम तौर पर सबसे अधिक असर होता है। कम values ज़्यादा अभिव्यक्तिपूर्ण लेकिन कम consistent output देती हैं, जबकि अधिक values consistency और predictability को प्राथमिकता देती हैं।

वॉइस चुनते समय, सबसे कम लेटेंसी वाला संयोजन Flash के साथ Instant वॉइस क्लोन या default voice है; Professional Voice Clones बेहतरीन सुनाई देते हैं, लेकिन हर generation में अतिरिक्त overhead जोड़ते हैं, जिसका आपको हिसाब रखना चाहिए।

इस गाइड में sample voice id JBFqnCBsd6RMkjVDRZzb (George) है।

स्ट्रीमिंग इंटीग्रेशन (HTTP और WebSocket)

इस सेक्शन में हम टेक्स्ट टू स्पीच API इंटीग्रेशन के व्यावहारिक पहलुओं पर बात करेंगे। इसमें SDK इंस्टॉल करना, stream खोलना और आते हुए ऑडियो को इस्तेमाल करना शामिल है। HTTP path ज़्यादातर web और app playback के लिए है, जबकि WebSocket path agents और live LLM output के लिए है।

इन दोनों तरीकों के लिए यह माना गया है कि आपने नीचे दिया गया ElevenLabs client initialize कर लिया है।

npm install @elevenlabs/elevenlabs-js
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

const elevenlabs = new ElevenLabsClient({
  apiKey: process.env.ELEVENLABS_API_KEY,
});

streaming path एक stream खोलता है और chunks के आते ही उन्हें इस्तेमाल करता है। voiceId पहला positional argument है, जिसके बाद camelCase keys (modelId, outputFormat, voiceSettings) वाला options object आता है:

const stream = await elevenlabs.textToSpeech.stream("JBFqnCBsd6RMkjVDRZzb", {
  text,
  modelId: "eleven_flash_v2_5",
  outputFormat: "mp3_44100_128",
  voiceSettings: { stability: 0, similarityBoost: 1.0, style: 0, useSpeakerBoost: true, speed: 1.0 },
});

for await (const chunk of stream) {
  // chunk is a Buffer; feed it to the player as it arrives
}

WebSocket variant के लिए wss://api.elevenlabs.io/v1/text-to-speech/{voice_id}/stream-input से कनेक्ट करें, अपनी voice settings और शुरुआत में एक space वाला पहला message भेजें। फिर टेक्स्ट उपलब्ध होते ही उसके messages भेजें और ऐसे JSON frames पढ़ें जिनके audio field में base64-encoded chunks हों।

high throughput के लिए batching और concurrency limits

high-throughput इंटीग्रेशन को concurrency नियंत्रित करती है, यानी एक ही समय पर ऑडियो जनरेट करने वाली requests की संख्या। हर प्लान में model family के हिसाब से एक limit होती है। 

हर प्लान में अलग concurrency limit शामिल है:

  • Free: 4 concurrent Flash requests।
  • Starter: 6 concurrent Flash requests।
  • Creator: 10 concurrent Flash requests।
  • Pro: 20 concurrent Flash requests।
  • Scale और Business: 30 concurrent Flash requests; Enterprise limits कस्टम होती हैं।

Multilingual v2 की limits ऊपर दी गई limits की लगभग आधी हैं।

एक bounded pool एक समय में चलने वाली requests की संख्या सीमित करके इसे संभालता है:

// Set MAX_CONCURRENCY at or below your plan's Flash concurrency limit.
const MAX_CONCURRENCY = 8;

async function synthMany(texts: string[]): Promise<Buffer[]> {
  const results: Buffer[] = [];
  for (let i = 0; i < texts.length; i += MAX_CONCURRENCY) {
    const batch = texts.slice(i, i + MAX_CONCURRENCY);
    results.push(...(await Promise.all(batch.map(eachSingleRequest)))); // never more than MAX_CONCURRENCY in flight
  }
  return results;

MAX_CONCURRENCY को अपने प्लान की limit के ठीक बराबर रखने के बजाय उससे थोड़ा कम रखें। यह अतिरिक्त जगह उसी key का इस्तेमाल करने वाले दूसरे traffic को संभालती है और आपको उस threshold के नीचे रखती है जहां 429 मिलता है।

Character limits और लंबे टेक्स्ट को विभाजित करना

हर मॉडल एक request में स्वीकार किए जाने वाले characters की सीमा तय करता है। किसी भी long-form इंटीग्रेशन में टेक्स्ट को बांटना और ऑडियो को फिर से जोड़ना पड़ता है। 

हर मॉडल के लिए प्रति request character limits ये हैं:

  • Flash v2.5: प्रति request 40,000 characters तक स्वीकार करता है।
  • Flash v2: प्रति request 30,000 characters तक स्वीकार करता है।
  • Multilingual v2: प्रति request 10,000 characters तक स्वीकार करता है।
  • Eleven v3: प्रति request 5,000 characters तक स्वीकार करता है।

इससे लंबे टेक्स्ट को कई requests में बांटना होगा। वाक्य की सीमाओं पर बांटने की कोशिश करें, ताकि chunks के बीच की जोड़ पर prosody बनी रहे।

function splitText(text: string, maxChars: number): string[] {
  const sentences = text.trim().split(/(?<=[.!?])\s+/);
  const chunks: string[] = [];
  let current = "";
  for (let sentence of sentences) {
    if (current.length + sentence.length + 1 > maxChars) {
      if (current) chunks.push(current.trim());
      // A single sentence longer than the limit is hard-split.
      while (sentence.length > maxChars) {
        chunks.push(sentence.slice(0, maxChars));
        sentence = sentence.slice(maxChars);
      }
      current = sentence;
    } else {
      current = `${current} ${sentence}`.trim();
    }
  }
  if (current) chunks.push(current.trim());
  return chunks;
}

chunks को क्रम से रेंडर करें और ऑडियो को जोड़ दें। ऐसे long-form narration में जहां हर chunk स्वतंत्र है, ये दोनों हिस्से सीधे काम करते हैं: splitText output को ऊपर दिए bounded pool में डालें और बाकी काम उसे संभालने दें।

Caching और idempotency

टेक्स्ट टू स्पीच output इतना deterministic होता है कि एक ही टेक्स्ट को उसी voice, model और settings के साथ फिर से रेंडर करना बेकार है। ऑडियो को प्रभावित करने वाले inputs के hash को key बनाकर result कैश करें; यही key रिट्राई के दौरान idempotency token का भी काम करती है।

दोनों काम ऐसे करें।

import { createHash } from "node:crypto";

function cacheKey(text: string, voiceId: string, modelId: string,
                  outputFormat: string, settings: object): string {
  // Every parameter that changes the audio must be in the key.
  const payload = JSON.stringify({ text, voiceId, modelId, outputFormat, settings });
  return createHash("sha256").update(payload).digest("hex");
}

async function cachedSynth(text: string, voiceId: string, modelId: string,
                           outputFormat: string, settings: object): Promise<Buffer> {
  const key = cacheKey(text, voiceId, modelId, outputFormat, settings);
  const cached = await cacheGet(key);          // e.g. read from disk or S3
  if (cached) return cached;

  const audio = await elevenlabs.textToSpeech.convert(voiceId, { text, modelId, outputFormat });
  await cachePut(key, audio);                   // store the bytes under the key
  return audio;
}

इसे काम करने लायक बनाने का नियम यह है कि ऑडियो बदलने वाला हर parameter key में होना चाहिए, जिसमें outputFormat और voice settings भी शामिल हैं। सही तरीके से करने पर यही key idempotency token का काम करती है। जब client पहले से सफल request को फिर से रिट्राई करता है, तो दोबारा जनरेट करने के बजाय आप cached bytes लौटाते हैं।

Error handling और rate limits (429s)

प्रोडक्शन client में backoff और jitter के साथ retries, और status code के आधार पर अलग handling चाहिए, क्योंकि कुछ failures को रिट्राई करना सही है और कुछ को नहीं। 

नीचे दी गई तालिका हर status के लिए सही action बताती है और यह सेक्शन समझाता है कि 429 hard wall के बजाय soft limit क्यों है।

Meaning
401
Authentication failed
422
Invalid request
429
Concurrency exceeded
5xx
Transient server error
Action
401
Do not retry. Check the xi-api-key header and key validity.
422
Do not retry. Fix the payload (bad voice id, unsupported format, text over limit).
429
Retry with exponential backoff and jitter.
5xx
Retry with backoff.
Character limit
401
40,000
422
30,000
429
10,000
5xx
5,000

429 कोई hard wall नहीं है और इसका तरीका समझना मददगार है। concurrency limit पार होने पर requests पहले priority के आधार पर queue होती हैं, जिससे आम तौर पर करीब 50ms जुड़ता है। इसके बाद भी capacity से अधिक होने पर ही आपको 429 मिलता है। 

response में current-concurrent-requests और maximum-concurrent-requests headers भी होते हैं, जो आपकी मौजूदा उपलब्ध capacity दिखाते हैं। इन्हें पढ़कर आप limit तक पहुंचने से पहले गति कम कर सकते हैं।

const RETRYABLE = new Set([429, 500, 502, 503, 504]);

async function synthWithRetry(text: string, voiceId: string, maxRetries = 5): Promise<Buffer> {
  let delay = 500; // ms, base for exponential backoff
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await elevenlabs.textToSpeech.convert(voiceId, {
        text, modelId: "eleven_flash_v2_5", outputFormat: "mp3_44100_128",
      });
    } catch (err: any) {
      const status = err.statusCode;
      // 401/422 and exhausted retries are not recoverable here.
      if (!RETRYABLE.has(status) || attempt === maxRetries) throw err;
      // Exponential backoff with full jitter.
      await new Promise((r) => setTimeout(r, Math.random() * delay));
      delay = Math.min(delay * 2, 8000);
    }
  }
  throw new Error("unreachable");
}

बेहतर retry behavior के बजाय जब आपको अधिक capacity चाहिए, तो अपना प्लान अपग्रेड करें। Enterprise ग्राहक अपने account manager के ज़रिए अधिक limits का अनुरोध कर सकते हैं।

लेटेंसी और time-to-first-byte का बेंचमार्क

लेटेंसी आपके region, input और मौजूदा load पर निर्भर करती है। इसलिए भरोसे लायक लेटेंसी नंबर वही है जो आपने अपने environment से मापा हो। 

यह सेक्शन Flash streaming endpoint के लिए time-to-first-byte (TTFB) देता है और इसे इस तरह बनाया गया है कि आप उसी harness को किसी दूसरे प्रोवाइडर पर लगाकर समान परिस्थितियों में तुलना कर सकें।

इसे प्रकाशित नतीजा नहीं, एक methodology मानें। कोई एक run किसी चीज़ की गारंटी नहीं देता। 

टेक्स्ट टू स्पीच API इंटीग्रेशन की लेटेंसी बेंचमार्क करते समय ये बातें अहम हैं:

  • Network round-trip शामिल करें: TTFB आपकी भौगोलिक स्थिति और प्रोवाइडर के सबसे नज़दीकी cluster पर निर्भर करता है, इसलिए टेस्ट वहीं से चलाएं जहां आपके servers आमतौर पर चलते हैं।
  • Warmup run को हटाएं: cold connection पर पहली request धीमी होती है और आपके numbers को प्रभावित कर सकती है।
  • Inputs स्थिर रखें: input length, voice, model और load—सभी नतीजे बदलते हैं, इसलिए सभी प्रोवाइडर्स के लिए इन्हें एक जैसा रखें।
  • Distribution रिपोर्ट करें: हर run में numbers बदलते हैं, इसलिए एक value के बजाय median और p95 प्रकाशित करें।

इन बातों का ध्यान रखने के बाद, आप बेंचमार्क करने के लिए तैयार हैं।

const TEXT = "This is a fixed benchmark sentence used for every provider.";

async function measureElevenLabs(): Promise<number> {
  const start = performance.now();
  const res = await fetch(
    "https://api.elevenlabs.io/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb/stream?output_format=mp3_44100_128",
    {
      method: "POST",
      headers: { "xi-api-key": process.env.ELEVENLABS_API_KEY!, "Content-Type": "application/json" },
      body: JSON.stringify({ text: TEXT, model_id: "eleven_flash_v2_5" }),
    },
  );
  for await (const _ of res.body!) {
    return performance.now() - start; // first chunk received
  }
  throw new Error("no audio returned");
}

किसी दूसरे प्रोवाइडर से तुलना करने के लिए इसी रूप वाला एक function लिखें। फिर दोनों को एक छोटे runner से चलाएं, जो एक warm-up call को हटाता है, करीब ~20 timed samples के बीच अंतर रखता है ताकि वे आपस में टकराएं नहीं, और milliseconds में median व p95 रिपोर्ट करता है।

निष्पक्ष तुलना के लिए variables को नियंत्रित करना ज़रूरी है। 

दोनों प्रोवाइडर्स को एक ही मशीन और network से चलाएं। बेहतर होगा कि यह उस region का server हो जहां आप वास्तव में deploy करते हैं, न कि residential broadband वाला laptop। input text एक ही रखें और ऑडियो छोटा रखें, ताकि generation length के बजाय model inference का असर अधिक हो। कई runs में median और p95 रिपोर्ट करें, क्योंकि एक अकेला measurement केवल noise है। 

ध्यान रखें कि public internet पर TTFB में 20-200ms का network round-trip शामिल होता है, जिसका मॉडल से कोई संबंध नहीं है। हम North America, Europe और Southeast Asia के clusters से सेवा देते हैं और सबसे नज़दीकी cluster पर route करते हैं। इसलिए अपने test client को उसी के अनुसार co-locate करें, वरना आप मुख्य रूप से data center की दूरी का बेंचमार्क कर रहे होंगे।

आपके टेक्स्ट टू स्पीच API इंटीग्रेशन के मुख्य बिंदु

प्रोडक्शन टेक्स्ट टू स्पीच API इंटीग्रेशन कुछ अहम फैसलों पर निर्भर करता है।

इन फैसलों को सही करने पर बाकी सब चीज़ें सही जगह बैठ जाती हैं:

  • काम के अनुसार मॉडल चुनें: हर interactive काम के लिए Flash v2.5 इस्तेमाल करें और offline rendering के लिए, जहां लेटेंसी कम अहम हो, Multilingual v2 या Eleven v3 जैसे high-fidelity मॉडल चुनें।
  • यूज़र इंतज़ार कर रहा हो तो stream करें: ज्ञात टेक्स्ट के लिए HTTP streaming और agents के लिए WebSocket इस्तेमाल करें, ताकि निष्क्रिय समय आपके concurrency budget में न गिना जाए।
  • parallelism को अपने प्लान की limit तक सीमित रखें: concurrent requests को प्लान limit से थोड़ा कम रखें और ऑडियो को प्रभावित करने वाले हर parameter के hash पर कैश करें, ताकि एक ही ऑडियो के लिए कभी दो बार बिल न हो।
  • 429 और 5xx को exponential backoff व full jitter के साथ रिट्राई करें: 429 और 5xx मिलने पर full jitter के साथ back off करें और यह जानने के लिए concurrency headers देखें कि आप limit के कितने करीब हैं।
  • लंबे टेक्स्ट को वाक्य की सीमाओं पर बांटें: हर मॉडल की character limit के अंदर वाक्य की सीमाओं पर बांटें, ताकि prosody जोड़ पर बनी रहे।

और गहराई से जानने के लिए streaming how-to, ऑडियो स्ट्रीमिंग कॉन्सेप्ट, authentication, और client-side उपयोग के लिए single-use tokens देखें।

ElevenAPI के साथ अपना टेक्स्ट टू स्पीच इंटीग्रेशन बनाएं

इस गाइड को पढ़ने के बाद, आपके पास प्रोडक्शन टेक्स्ट टू स्पीच API इंटीग्रेशन के लिए जरूरी सभी patterns हैं। streaming, batching, caching, retries और बेंचमार्किंग—सबके लिए आप इसे लागू करने के लिए तैयार हैं। 

शुरू करने के लिए टेक्स्ट टू स्पीच API के बारे में और जानें या साइन अप करें और आज ही ElevenAPI के साथ अपनी पहली call करें।

टेक्स्ट टू स्पीच API इंटीग्रेशन: अक्सर पूछे जाने वाले सवाल

संबंधित लेख

उच्चतम गुणवत्ता वाले AI ऑडियो के साथ बनाएं