> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# क्लाइंट-साइड स्ट्रीमिंग

> **Note**
>
> **कैसे करें गाइड** · मानता है कि आपने [स्पीच टू टेक्स्ट क्विकस्टार्ट](/docs/hi/eleven-api/guides/cookbooks/speech-to-text) पूरा कर लिया है।

## ओवरव्यू

ElevenLabs Realtime स्पीच टू टेक्स्ट API आपको Scribe Realtime v2 मॉडल के साथ बेहद कम लेटेंसी में रियल-टाइम ऑडियो स्ट्रीम ट्रांसक्राइब करने देता है। चाहे आप वॉइस असिस्टेंट, ट्रांसक्रिप्शन सर्विस या लाइव स्पीच रिकग्निशन की ज़रूरत वाले किसी भी ऐप्लिकेशन पर काम कर रहे हों, यह WebSocket-आधारित API आपके बोलते समय आंशिक ट्रांसक्रिप्ट और स्पीच सेगमेंट पूरा होने पर कमिट किए गए ट्रांसक्रिप्ट देता है।

Scribe v2 Realtime को क्लाइंट साइड पर लागू करके माइक्रोफ़ोन के ज़रिए या ऑडियो को मैन्युअली चंक्स में बांटकर, रियल-टाइम में ऑडियो ट्रांसक्राइब किया जा सकता है।

क्लाइंट साइड इम्प्लीमेंटेशन सर्वर साइड से कुछ मायनों में अलग है:

* इसके लिए सिंगल-यूज़ टोकन चाहिए — यह एक अस्थायी टोकन है, जिससे आप अपनी API key एक्सपोज़ किए बिना API से कनेक्ट कर सकते हैं।
* माइक्रोफ़ोन से मिले ऑडियो को ट्रांसक्राइब करने के लिए सीधे API पर पाइप किया जा सकता है; ऑडियो को मैन्युअली चंक्स में बांटने की ज़रूरत नहीं होती।

URL से ऑडियो स्ट्रीम करने के लिए, [सर्वर-साइड स्ट्रीमिंग](/docs/hi/eleven-api/guides/how-to/speech-to-text/realtime/server-side-streaming) गाइड देखें।

## क्विकस्टार्ट

> **Note**
>
> यह गाइड मानती है कि आपने [अपनी API key सेट अप कर ली है](/docs/hi/eleven-api/quickstart)। अगर नहीं की है, तो पहले
> क्विकस्टार्ट पूरा करें।

#### SDK इंस्टॉल करें

**`React`**

```bash title="React"
npm install @elevenlabs/react @elevenlabs/elevenlabs-js
```

**`JavaScript`**

```bash title="JavaScript"
npm install @elevenlabs/client @elevenlabs/elevenlabs-js
```

#### टोकन बनाएं

क्लाइंट साइड SDK इस्तेमाल करने के लिए, आपको सिंगल-यूज़ टोकन बनाना होगा। यह एक अस्थायी टोकन है, जिससे आप अपनी API key एक्सपोज़ किए बिना API से कनेक्ट कर सकते हैं। इसे सर्वर साइड पर ElevenLabs API के ज़रिए किया जा सकता है।

> **Warning**
>
> अपनी API key कभी भी क्लाइंट के सामने एक्सपोज़ न करें।

```typescript
// Node.js server
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";

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

app.get("/scribe-token", yourAuthMiddleware, async (req, res) => {
  const token = await elevenlabs.tokens.singleUse.create("realtime_scribe");

  res.json(token);
});
```

> **Info**
>
> सिंगल-यूज़ टोकन 15 मिनट बाद अपने-आप एक्सपायर हो जाता है।

#### ट्रांसक्रिप्शन सेशन शुरू करें

ट्रांसक्रिप्शन माइक्रोफ़ोन के ज़रिए या अपने ऑडियो को मैन्युअली चंक्स में बांटकर किया जा सकता है। आपका ऑडियो फ़ाइल या स्ट्रीम हो सकता है।

> **Info**
>
> API में उपलब्ध सभी पैरामीटर्स और विकल्पों की सूची के लिए, [API रेफरेंस](/docs/hi/api-reference/speech-to-text/v-1-speech-to-text-realtime) देखें।

#### माइक्रोफ़ोन

**`React`**

```typescript title="React"
import { useScribe } from "@elevenlabs/react";

function MyComponent() {
  const scribe = useScribe({
    modelId: "scribe_v2_realtime",
    onPartialTranscript: (data) => {
      console.log("Partial:", data.text);
    },
    onCommittedTranscript: (data) => {
      console.log("Committed:", data.text);
    },
    onCommittedTranscriptWithTimestamps: (data) => {
      console.log("Committed with timestamps:", data.text);
      console.log("Timestamps:", data.words);
    },
  });

  const handleStart = async () => {
    // Fetch a single use token from the server
    const token = await fetchTokenFromServer();

    await scribe.connect({
      token,
      microphone: {
        echoCancellation: true,
        noiseSuppression: true,
      },
    });
  };

  return (
    <div>
      <button onClick={handleStart} disabled={scribe.isConnected}>
        Start Recording
      </button>
      <button onClick={scribe.disconnect} disabled={!scribe.isConnected}>
        Stop
      </button>

      {scribe.partialTranscript && <p>Live: {scribe.partialTranscript}</p>}

      <div>
        {scribe.committedTranscripts.map((t) => (
          <p key={t.id}>{t.text}</p>
        ))}
      </div>
    </div>
  );
}
```

**`JavaScript`**

```typescript title="JavaScript"
// Client side
import { Scribe, RealtimeEvents } from "@elevenlabs/client";

// Ensure you have authentication headers set up
const response = await fetch("/scribe-token", yourAuthHeaders);
const { token } = await response.json();

const connection = Scribe.connect({
  token,
  modelId: "scribe_v2_realtime",
  includeTimestamps: true,
  microphone: {
    echoCancellation: true,
    noiseSuppression: true,
    autoGainControl: true,
  },
});

// Set up event handlers

// Session started
connection.on(RealtimeEvents.SESSION_STARTED, () => {
  console.log("Session started");
});

// Partial transcripts (interim results), use this in your UI to show the live transcript
connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
  console.log("Partial:", data.text);
});

// Committed transcripts
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
  console.log("Committed:", data.text);
});

// Committed transcripts with word-level timestamps. Only received when includeTimestamps is set to true.
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS, (data) => {
  console.log("Committed:", data.text);
  console.log("Timestamps:", data.words);
});

// Errors - will catch all errors, both server and websocket specific errors
connection.on(RealtimeEvents.ERROR, (error) => {
  console.error("Error:", error);
});

// Connection opened
connection.on(RealtimeEvents.OPEN, () => {
  console.log("Connection opened");
});

// Connection closed
connection.on(RealtimeEvents.CLOSE, () => {
  console.log("Connection closed");
});

// When you are done, close the connection
connection.close();
```

#### मैन्युअल ऑडियो चंकिंग

**`React`**

```typescript title="React"
import { useScribe, AudioFormat } from "@elevenlabs/react";

function FileTranscription() {
  const [file, setFile] = useState<File | null>(null);
  const scribe = useScribe({
    modelId: "scribe_v2_realtime",
    audioFormat: AudioFormat.PCM_16000,
    sampleRate: 16000,
  });

  const transcribeFile = async () => {
    if (!file) return;

    // Fetch a single use token from the server
    const token = await fetchToken();
    await scribe.connect({ token });

    // Decode audio file
    const arrayBuffer = await file.arrayBuffer();
    const audioContext = new AudioContext({ sampleRate: 16000 });
    const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);

    // Convert to PCM16
    const channelData = audioBuffer.getChannelData(0);
    const pcmData = new Int16Array(channelData.length);

    for (let i = 0; i < channelData.length; i++) {
      const sample = Math.max(-1, Math.min(1, channelData[i]));
      pcmData[i] = sample < 0 ? sample * 32768 : sample * 32767;
    }

    // Send in chunks
    const chunkSize = 4096;
    for (let offset = 0; offset < pcmData.length; offset += chunkSize) {
      const chunk = pcmData.slice(offset, offset + chunkSize);
      const bytes = new Uint8Array(chunk.buffer);
      const base64 = btoa(String.fromCharCode(...bytes));

      scribe.sendAudio(base64);
      await new Promise((resolve) => setTimeout(resolve, 50));
    }

    // Commit transcription
    scribe.commit();
  };

  return (
    <div>
      <input
        type="file"
        accept="audio/*"
        onChange={(e) => setFile(e.target.files?.[0] || null)}
      />
      <button onClick={transcribeFile} disabled={!file || scribe.isConnected}>
        Transcribe
      </button>

      {scribe.committedTranscripts.map((transcript) => (
        <div key={transcript.id}>{transcript.text}</div>
      ))}
    </div>
  );
}
```

**`JavaScript`**

```typescript title="JavaScript"
import { Scribe, AudioFormat, RealtimeEvents, CommitStrategy } from "@elevenlabs/client";

// Ensure you have authentication headers set up
const response = await fetch("/scribe-token", yourAuthHeaders);
const { token } = await response.json();

const connection = Scribe.connect({
  token,
  modelId: "scribe_v2_realtime",
  includeTimestamps: true,
  audioFormat: AudioFormat.PCM_16000,
  sampleRate: 16000,
  commitStrategy: CommitStrategy.MANUAL,
});

// Set up event handlers
connection.on(RealtimeEvents.SESSION_STARTED, () => {
  console.log("Session started");
  sendAudio();
});

connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
  console.log("Partial:", data.text);
});

connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
  console.log("Committed:", data.text);
});

connection.on(RealtimeEvents.ERROR, (error) => {
  console.error("Error:", error);
});

// Committed transcripts with word-level timestamps. Only received when includeTimestamps is set to true.
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS, (data) => {
  console.log("Committed:", data.text);
  console.log("Timestamps:", data.words);

  // Committed transcript received, close the connection
  connection.close();
});

async function sendAudio() {
  // Get file from input element
  const fileInput = document.querySelector('input[type="file"]');
  const audioFile = fileInput.files[0];

  // Read file as ArrayBuffer
  const arrayBuffer = await audioFile.arrayBuffer();
  const audioData = new Uint8Array(arrayBuffer);

  // Convert to base64 and send in chunks
  const chunkSize = 8192; // 8KB chunks
  for (let i = 0; i < audioData.length; i += chunkSize) {
    const chunk = audioData.slice(i, i + chunkSize);
    const base64 = btoa(String.fromCharCode(...chunk));

    // Send audio chunk
    connection.send({ audioBase64: base64 });

    // Optional: Add delay to simulate real-time streaming
    await new Promise((resolve) => setTimeout(resolve, 100));
  }

  // Signal end of audio segment
  connection.commit();
}
```

## अगले चरण

#### [सर्वर-साइड स्ट्रीमिंग](/docs/hi/eleven-api/guides/how-to/speech-to-text/realtime/server-side-streaming)

उसी WebSocket API के साथ सर्वर साइड पर ऑडियो स्ट्रीम ट्रांसक्राइब करें।

#### [ट्रांसक्रिप्ट और कमिट स्ट्रैटेजी](/docs/hi/eleven-api/guides/how-to/speech-to-text/realtime/transcripts-and-commit-strategies)

तय करें कि ट्रांसक्रिप्ट कब कमिट हों और आंशिक नतीजों को कैसे संभालें।