WERBEPLATZ VERFÜGBAR · PARTNERSCHAFTEN WILLKOMMEN

Sprach-Streaming und Konfiguration benutzerdefinierter Sprachparameter mit der Listnr TTS API

365Finds Editorial
11.430 Wiki-Artikel erfasst

365 Wiki mit deiner KI nutzen

Kopiere den Prompt unten, füge ihn in deine gewohnte KI ein und stelle direkt deine Frage.

Vollständigen Skill herunterladen

Probiere es zuerst mit dem Prompt aus. Wenn du 365 Wiki häufig nutzt, installiere den vollständigen 365Wiki Skill, damit du ihn nicht jedes Mal einfügen musst. Ohne bevorzugte KI funktionieren auch die Webversionen von Gemini oder Microsoft Copilot.

Die Integration von Echtzeit-Sprachsynthese (Text-to-Speech bzw. TTS) in moderne Webanwendungen erfordert eine präzise Balance zwischen minimaler Latenzzeit, natürlicher Stimmmodulation und robuster Absicherung sensibler API-Zugangsdaten. Listnr begegnet diesen Anforderungen mit einer zweigleisigen Architektur: Einerseits steht eine standardisierte V1-REST-Schnittstelle bereit, die Stimmen von Microsoft Azure, Google Cloud, AWS Polly und IBM Watson bündelt; andererseits bietet die V2-Streaming-Schnittstelle /stream-voice eine latenzoptimierte Pipeline für Ultra-Premium- und geklonte Stimmen (Cloned Voices).

Um synthetisierte Sprache ohne Gefährdung privater Tokens im Browser wiederzugeben, besteht das bewährte Muster darin, einen leichtgewichtigen Backend-Proxy einzusetzen. Dieser leitet eingehende Anfragen an den /stream-voice-Endpunkt von Listnr weiter, steuert akustische Feineinstellungen und leitet die binären Audiodaten direkt als Stream an das Web-Frontend weiter.

sequenceDiagram
    autonumber
    actor User as Webbrowser (Client)
    participant Server as Anwendungs-Backend (Proxy)
    participant Listnr as Listnr V2 Streaming API
    
    User->>Server: POST /api/tts (Text, voiceId, Einstellungen)
    Note over Server: Ergänzt x-listnr-token sicher
    Server->>Listnr: POST /api/v2/stream-voice
    Listnr-->>Server: Segmentierter Audio-Stream (WAV / MP3)
    Server-->>User: Durchgeleiteter Stream (Transfer-Encoding: chunked)
    Note over User: Sofortige Puffer-Wiedergabe via HTML5 / Web Audio API

1. Authentifizierung und Architektur-Grundlagen

Webanwendungen dürfen Produktionsschlüssel von Listnr niemals direkt im Frontend-Code hinterlegen. Listnr validiert Anfragen über den proprietären Header x-listnr-token. Da dieser Token unmittelbar an das Guthaben an synthetisierbaren Wörtern und den Abrechnungsplan Ihres Kontos gekoppelt ist, führt eine Offenlegung im Client-Bundle zu unbefugtem Kontingentverbrauch.

Schlüsselabsicherung und Backend-Proxying

Die empfohlene Integrationsarchitektur setzt eine Zwischenschicht im Server ein (beispielsweise via Next.js API Routes, Express, Fastify oder FastAPI).

API-KomponenteHost / EndpunktHauptfunktionSicherheitsanforderung
V2 Streaming APIhttps://cloning.listnr.tech/api/v2/stream-voiceBinäres Chunk-Streaming für Ultra-Premium- & KlonstimmenNur serverseitig; erfordert x-listnr-token
V2 Stimmenübersichthttps://cloning.listnr.tech/api/v2/available-voicesRuft Modell-IDs, vordefinierte Stimmen und Klonprofile abServerseitig cachen; per Proxy bereitstellen
V1 Multi-Provider RESThttps://bff.listnr.tech/api/tts/v1/convert-textStapelverarbeitung für Azure-, Google-, AWS- & IBM-StimmenNur serverseitig; unterstützt vollwertige SSML-Tags

2. Stimmen-Ermittlung: Abruf gültiger Voice IDs

Bevor ein Synthese-Request initiiert werden kann, benötigt die Anwendung eine gültige Modell-Kennung (voice_id). Es empfiehlt sich, die verfügbaren Stimmen beim Serverstart abzufragen und im Arbeitsspeicher oder in Redis zu hinterlegen.

# Verfügbare Standard- und Klonstimmen des Kontos abfragen
curl -X GET "https://cloning.listnr.tech/api/v2/available-voices" \
  -H "x-listnr-token: DEIN_LISTNR_API_KEY" \
  -H "Accept: application/json"

Die Antwort liefert ein Array von Objekten mit alphanumerischen IDs (wie z. B. 21m00Tcm4TlvDq8ikWAM). Das Frontend übergibt die ausgewählte ID an das Backend, um die Synthese gezielt auf das gewünschte Klangprofil zu lenken.


3. Streaming-Synthese und Parametrisierung

Der V2-Streaming-Endpunkt von Listnr verarbeitet ein JSON-Payload, das den Textinhalt, die Voice-ID und ein settings-Objekt zur akustischen Kalibrierung umfasst.

{
  "voice_id": "21m00Tcm4TlvDq8ikWAM",
  "text": "Systemmeldung: Verzögerung bei der Datenbankreplikation.<break time=\"0.4s\"/><break strength=\"strong\"/>Failover-Protokoll wird initiiert.",
  "settings": {
    "stability": 0.71,
    "similarity_boost": 0.50,
    "style": 0.05,
    "use_speaker_boost": false
  }
}

Richtlinien zur Parameter-Abstimmung

Die gezielte Abstimmung der Stellgrößen verhindert unnatürliche Klangschwankungen und minimiert Latenzen:

SSML-Pausen und Rhythmussteuerung

Im V2-Endpunkt /stream-voice müssen Entwickler keinen umschließenden <speak>-Tag definieren, sondern können Unterbrechungen direkt im Text platzieren:


4. Vollständige Web-Implementierung

Das folgende Beispiel demonstriert einen serverseitigen Streaming-Proxy in Node.js/Express sowie die clientseitige Entgegennahme und Wiedergabe über die Fetch-API im Browser.

Serverseitiger Streaming-Proxy (server.js)

import express from 'express';
import fetch from 'node-fetch';

const app = express();
app.use(express.json());

const LISTNR_API_KEY = process.env.LISTNR_API_KEY;
const STREAM_URL = 'https://cloning.listnr.tech/api/v2/stream-voice';

app.post('/api/tts/stream', async (req, res) => {
  try {
    const { text, voiceId, settings } = req.body;

    if (!text || !voiceId) {
      return res.status(400).json({ error: 'Parameter text oder voiceId fehlt.' });
    }

    const payload = {
      voice_id: voiceId,
      text: text,
      settings: {
        stability: settings?.stability ?? 0.71,
        similarity_boost: settings?.similarity_boost ?? 0.50,
        style: settings?.style ?? 0.0,
        use_speaker_boost: settings?.use_speaker_boost ?? false
      }
    };

    const upstreamResponse = await fetch(STREAM_URL, {
      method: 'POST',
      headers: {
        'x-listnr-token': LISTNR_API_KEY,
        'Content-Type': 'application/json',
        'Accept': '*/*'
      },
      body: JSON.stringify(payload)
    });

    if (!upstreamResponse.ok) {
      const errorText = await upstreamResponse.text();
      return res.status(upstreamResponse.status).json({
        error: `Listnr API-Fehler: ${upstreamResponse.statusText}`,
        details: errorText
      });
    }

    // Streaming-Header für segmentierte Datenübertragung setzen
    res.setHeader('Content-Type', 'audio/wav');
    res.setHeader('Transfer-Encoding', 'chunked');

    // Antwortdatenstrom direkt an den Client weiterleiten
    upstreamResponse.body.pipe(res);
  } catch (err) {
    console.error('Fehler beim TTS-Streaming:', err);
    res.status(500).json({ error: 'Interner Proxy-Serverfehler.' });
  }
});

app.listen(3000, () => console.log('Audio-Proxy aktiv auf Port 3000'));

Clientseitige Wiedergabe im Browser (client.js)

/**
 * Fordert den Audio-Stream an und startet die Wiedergabe unverzüglich
 */
async function streamAndPlayAudio(text, voiceId) {
  const response = await fetch('/api/tts/stream', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      text: text,
      voiceId: voiceId,
      settings: {
        stability: 0.65,
        similarity_boost: 0.60,
        style: 0.0
      }
    })
  });

  if (!response.ok) {
    throw new Error(`Audioabruf fehlgeschlagen: ${response.status}`);
  }

  // Binären Datenstrom in Blob umwandeln und via HTML5 Audio abspielen
  const audioBlob = await response.blob();
  const audioUrl = URL.createObjectURL(audioBlob);
  const audio = new Audio(audioUrl);
  
  audio.onended = () => URL.revokeObjectURL(audioUrl);
  await audio.play();
}

5. Architektur-Entscheidungen im Produktivbetrieb

Beim produktiven Einsatz der Listnr TTS API sind folgende Kernaspekte zu berücksichtigen:

  1. Abwägung zwischen REST V1 und Streaming V2: Nutzen Sie V1, wenn Ihre Anwendung auf bewährte Cloud-Stimmen von Azure oder Google setzt oder exakte Zeitstempel pro Wort (Word Timestamps) zur Synchronisation von Untertiteln benötigt. Greifen Sie zu V2, wenn minimale Latenz und organische Sprechdynamik im Vordergrund stehen.
  2. Kontingentschutz und Entprellung (Debounce): Jedes generierte Zeichen verbraucht Wortguthaben. Bei interaktiven Benutzeroberflächen sollte die Texteingabe entprellt werden. Bei erneuter Eingabe sind bestehende Streams über AbortController vorzeitig abzubrechen.
  3. Caching statischer Audiodaten am Edge: Feste Systemhinweise, Fehlermeldungen und statische Erklärungen sollten einmalig synthetisiert und in einem Objektspeicher (wie Amazon S3) hinter einem CDN abgelegt werden. Der Streaming-Endpunkt sollte dynamischen, personenspezifischen Texten vorbehalten bleiben.

Referenzen