> 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.

# Sprecherdiarisierung

> **Note**
>
> **Anleitung** · Setzt voraus, dass Sie die Anleitung für
> [clientseitiges](/docs/de/eleven-api/guides/how-to/speech-to-text/realtime/client-side-streaming) oder
> [serverseitiges Streaming](/docs/de/eleven-api/guides/how-to/speech-to-text/realtime/server-side-streaming) abgeschlossen haben.

## Übersicht

Die Sprecherdiarisierung weist Wörtern Sprecher-IDs zu, damit Sie unterscheiden können, wer was gesagt hat. Bei aktivierter Diarisierung enthalten partielle Transkripte vorläufige Sprecherlabels, und auf jedes bestätigte Transkript folgt ein separates `diarized_transcript`-Ereignis. Sprecherlabels können sich ändern, wenn mehr Audio eingeht.

## Diarisierung aktivieren

Setzen Sie beim Öffnen einer WebSocket-Verbindung mit `model_id=scribe_v3_live` den booleschen Abfrageparameter `diarize=true`. Standardmäßig ist die Diarisierung auf `false` gesetzt.

Die folgenden serverseitigen Beispiele öffnen eine Verbindung und empfangen Ereignisse. Installieren Sie für Python `websockets` oder für TypeScript `ws` und die Entwicklungsabhängigkeit `@types/ws`. Setzen Sie `ELEVENLABS_API_KEY` in der Umgebung Ihres Servers; die Beispiele senden ihn im Header `xi-api-key`. Bewahren Sie diesen Schlüssel auf dem Server auf, nicht im Browsercode.

Diese Beispiele senden kein Audio. Integrieren Sie sie mit Ihrem Audio-Producer aus der Anleitung für [serverseitiges Streaming](/docs/de/eleven-api/guides/how-to/speech-to-text/realtime/server-side-streaming): Senden Sie `input_audio_chunk`-Nachrichten über dieselbe Verbindung, während Sie Ereignisse empfangen. Die Beispiele wählen `pcm_16000`, verwenden Sie also passendes Audio. Führen Sie in Python die Aufgabe zum Senden von Audio parallel zur Empfangsschleife aus; senden Sie in TypeScript Audio, nachdem die Verbindung geöffnet wurde.

```python
import asyncio
import json
import os

from websockets.asyncio.client import connect


async def main():
    url = (
        "wss://api.elevenlabs.io/v1/speech-to-text/realtime"
        "?model_id=scribe_v3_live&audio_format=pcm_16000&diarize=true"
    )
    headers = {"xi-api-key": os.environ["ELEVENLABS_API_KEY"]}

    async with connect(url, additional_headers=headers) as websocket:
        async for message in websocket:
            event = json.loads(message)
            print(event)


if __name__ == "__main__":
    asyncio.run(main())
```

```typescript
import WebSocket from "ws";

const apiKey = process.env.ELEVENLABS_API_KEY;
if (!apiKey) {
  throw new Error("Set ELEVENLABS_API_KEY in your server environment.");
}

const websocket = new WebSocket(
  "wss://api.elevenlabs.io/v1/speech-to-text/realtime" +
    "?model_id=scribe_v3_live&audio_format=pcm_16000&diarize=true",
  { headers: { "xi-api-key": apiKey } }
);

websocket.on("message", (message) => {
  const event = JSON.parse(message.toString());
  console.log(event);
});

websocket.on("error", (error) => {
  console.error(error);
});
```

## Ereignisse verarbeiten

### Partielle Transkripte

Bei aktivierter Diarisierung enthält jedes `partial_transcript` vorläufige `words` in derselben Wortstruktur wie die Batch-Transkription. Die `speaker_id` jedes Worts ist `speaker_0`, `speaker_1` und so weiter, sobald ein Sprecher erkannt wurde, oder `null`, solange sie nicht aufgelöst ist.

Behandeln Sie diese Wörter als vorläufig: Sprecher-IDs und Zeitstempel können sich mit weiterem Audio ändern. Wörter, die noch nicht ausgerichtet wurden, haben keine Zeitstempel (`start` und `end` sind `null` oder nicht vorhanden).

### Bestätigte und diarisiert Transkripte

Die Diarisierung verzögert `committed_transcript` nicht. Bei aktivierter Diarisierung fügt dieses Ereignis einen nullbasierten ganzzahligen `segment_index` hinzu:

```json
{
  "message_type": "committed_transcript",
  "segment_index": 0,
  "text": "Hello."
}
```

Auf jede Bestätigung folgt ein separates `diarized_transcript`-Ereignis mit dem passenden `segment_index`, `text` und `words`:

```json
{
  "message_type": "diarized_transcript",
  "segment_index": 0,
  "text": "Hello.",
  "words": [
    {
      "text": "Hello.",
      "speaker_id": "speaker_0"
    }
  ]
}
```

Das obige Wort zeigt nur den Text und das Sprecherlabel. Die vollständige Wortstruktur verwendet dieselben Felder `start`, `end`, `type`, `logprob` und `characters` wie die Batch-Transkription, zusätzlich zu `speaker_id`. Ein nicht aufgelöster Sprecher hat eine `null`-Sprecher-ID.

Diarisierte Transkripte werden in der Reihenfolge der Bestätigungen gesendet. Ordnen Sie sie mit `segment_index` den bestätigten Transkripten zu, nicht anhand des Texts oder des nächsten empfangenen Ereignisses. Für jede Bestätigung wird immer ein `diarized_transcript` gesendet, auch wenn die Sprecheridentifizierung fehlschlägt; in diesem Fall sind nicht aufgelöste Sprecher-IDs `null`.

### Sprecherzusammenführungen

Ein `speakers_merged`-Ereignis bedeutet, dass zwei Sprecher-IDs dieselbe Person bezeichnen:

```json
{
  "message_type": "speakers_merged",
  "from_speaker_id": "speaker_1",
  "to_speaker_id": "speaker_0"
}
```

Ersetzen Sie jede frühere Verwendung von `from_speaker_id` durch `to_speaker_id`, sowohl in partiellen als auch in diarisierten Transkripten. Sprecher-IDs werden nie wiederverwendet. Zusammenführungen können verkettet sein, wenden Sie sie daher in Empfangsreihenfolge an: Wenn `speaker_2` mit `speaker_1` zusammengeführt wird und anschließend `speaker_1` mit `speaker_0`, müssen alle früheren Wörter beider IDs letztlich mit `speaker_0` gekennzeichnet sein.

Rufen Sie beispielsweise diesen Handler für jedes empfangene Ereignis auf. Hier speichert `transcript_history` jedes von der Anwendung beibehaltene partielle und diarisiert Transkript, einschließlich früherer partieller Snapshots. Jede Zusammenführung aktualisiert alle gespeicherten Wörter direkt, sodass verkettete Zusammenführungen auch zuvor zusammengeführte Wörter aktualisieren. Rendern Sie Sprecherlabels aus diesem aktualisierten Speicher; `null`-Labels bleiben `null`.

```python
transcript_history = []


def handle_event(event):
    if event["message_type"] in ("partial_transcript", "diarized_transcript"):
        transcript_history.append(event)
    elif event["message_type"] == "speakers_merged":
        for transcript in transcript_history:
            for word in transcript.get("words") or []:
                if word.get("speaker_id") == event["from_speaker_id"]:
                    word["speaker_id"] = event["to_speaker_id"]
```

## Einschränkungen

* Die Diarisierung wird nur von `scribe_v3_live` unterstützt. Andere Modelle geben einen `invalid_request`-Fehler mit der Meldung `"The 'diarize' parameter is only supported by scribe_v3_live."` zurück und schließen dann die Verbindung.
* Die Diarisierung kann nicht mit `filter_background_audio` kombiniert werden. Diese Kombination gibt einen `invalid_request`-Fehler zurück, dessen Meldung `"cannot be combined with filter_background_audio"` enthält, und schließt dann die Verbindung.
* Sprecherlabels können nicht aufgelöst bleiben (`null`), und spätere `speakers_merged`-Ereignisse können frühere Labels ändern. Diese Zusammenführungsereignisse werden nur gesendet, wenn die Diarisierung aktiviert ist.