{"id":211315,"date":"2026-09-25T10:35:16","date_gmt":"2026-09-25T10:35:16","guid":{"rendered":"https:\/\/sinch.com\/blog\/ki-agent-telefonanrufe-voice-api-relay\/"},"modified":"2026-09-25T10:35:16","modified_gmt":"2026-09-25T10:35:16","slug":"ki-agent-telefonanrufe-voice-api-relay","status":"publish","type":"blog","link":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/","title":{"rendered":"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Einen KI-Agenten mit einem Live-Telefonanruf zu verbinden, bedeutet eine Br\u00fccke zwischen dem Telefonnetz und dem Agenten zu schlagen. Dies kann eine SIP-Integration oder einen direkten Medienpfad \u00fcber einen WebSocket sowie Speech-to-Text, Text-to-Speech und die Verwaltung der Konversationswechsel zwischen der anrufenden Person und dem Agenten umfassen. Das ist eine Menge Telefonie- und Medieninfrastruktur, die rund um einen KI-Agenten aufgebaut und betrieben werden muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/overview\">Sinch Voice-API v2<\/a> nimmt Ihnen diese Arbeit ab. Das Voice Relay-Ziel verbindet einen Live-Anruf mit Ihrem WebSocket-Endpunkt, Sinch f\u00fchrt Speech-to-Text sowie Text-to-Speech aus und Ihre Anwendung tauscht reinen Text aus. Die Voice-API v2 f\u00fcgt zudem Voice Streams hinzu. Das ist ein direkter bidirektionaler Audiopfad f\u00fcr F\u00e4lle, in denen Sie die Medien selbst verarbeiten m\u00f6chten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie befindet sich in der \u00f6ffentlichen Vorschau. Daher k\u00f6nnen sich Funktionen, Limits, Dokumentation und Verhalten noch \u00e4ndern und es gilt kein SLA, aber sie ist f\u00fcr Tests, Evaluierungen und fr\u00fchen Produktionsdatenverkehr offen. Wir haben den gesamten Pfad durchgehend mit dem <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">Tutorial-Beispiel<\/a>ausgef\u00fchrt: Ein LangChain-Agent beantwortet einen echten Telefonanruf, einschlie\u00dflich Unterbrechungen.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-9490\"><p class=\"h5 m-0\" id=\"toc-title-9490\">Inhaltsverzeichnis<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#warum-voice-relay-wichtig-ist\">Warum Voice Relay wichtig ist<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#das-voice-api-v2-modell\">Das Voice-API v2-Modell<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#sie-benoetigen-folgendes\">Sie ben\u00f6tigen Folgendes:<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#einen-agenten-mit-voice-relay-verbinden\">Einen Agenten mit Voice Relay verbinden<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#so-sieht-der-erfolg-aus\">So sieht der Erfolg aus<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#wo-sich-ihre-anwendung-befindet\">Wo sich Ihre Anwendung befindet<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">07<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#voice-relay-oder-direktes-audio-streaming\">Voice Relay oder direktes Audio-Streaming?<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">08<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#ueberlegungen-zur-produktion\">\u00dcberlegungen zur Produktion<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">09<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#fehlerbehebung\">Fehlerbehebung<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">10<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#vorschau-status\">Vorschau-Status<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">11<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#die-naechsten-schritte\">Die n\u00e4chsten Schritte<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">12<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#zusaetzliche-ressourcen\">Zus\u00e4tzliche Ressourcen<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Warum Voice Relay wichtig ist<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein KI-Agent beginnt normalerweise als Textanwendung. Er nimmt eine Nachricht an, ruft ein Modell auf und gibt eine Textantwort zur\u00fcck. Voice Relay verlagert die Audiogrenze in die Sinch-Plattform. So behalten Sie den Agenten, seine Tools, Prompts und seinen Status und arbeiten mit Text statt mit direkten Audiodaten. Unterbrechungen sind inbegriffen, sodass Anrufende dazwischenreden k\u00f6nnen, w\u00e4hrend eine Antwort abgespielt wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das macht Voice Relay zu einem praktischen Einstiegspunkt f\u00fcr eine KI-Rezeption, einen Produktdemo-Bot und einen internen Helpdesk.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das Voice-API v2-Modell<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Voice-API v2 organisiert eine Interaktion anhand von drei Ressourcen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine <strong>Sitzung<\/strong> gruppiert zugeh\u00f6rige Anrufe und Verbindungen. Sie bleibt aktiv, bis die zugeh\u00f6rigen Anrufe beendet sind.<\/li>\n\n\n\n<li>Ein <strong>Anruf<\/strong> stellt die Verbindung einer teilnehmenden Person dar, beispielsweise ein Telefon-, SIP- oder Streaming-Abschnitt.<\/li>\n\n\n\n<li>Eine <strong>Br\u00fccke<\/strong> verbindet Anrufe innerhalb einer Sitzung, wenn mehrere Teilnehmende kommunizieren m\u00fcssen.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">SVAML, die Sinch Voice-API Markup Language, beschreibt, was w\u00e4hrend der Interaktion geschieht. Ein <code>dial<\/code>-Befehl kann einen Anrufabschnitt erstellen. Verschachtelte Ereignisse k\u00f6nnen definieren, was passiert, wenn der Anruf entgegengenommen wird, besetzt ist, eine Zeit\u00fcberschreitung auftritt oder fehlschl\u00e4gt. Ein Webhook kann \u00fcbernehmen, wenn die Anwendung eine dynamische Entscheidung treffen muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Modell ist f\u00fcr KI-Agenten wichtig, da die Konversation und der Anruf zwar zusammenh\u00e4ngen, aber nicht dasselbe sind. Der KI-Agent verwaltet die Konversation. SVAML und die Voice-API verwalten den Call-Flow. Diese Trennung erm\u00f6glicht es Ihnen, eine Weiterleitung an eine reale Person, einen weiteren Anrufabschnitt oder einen anderen Medienpfad hinzuzuf\u00fcgen, ohne diese gesamte Logik im Modell-Prompt unterbringen zu m\u00fcssen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sie ben\u00f6tigen Folgendes:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ein Sinch-Konto mit Voice-API v2-Zugang, auf der <a href=\"https:\/\/dashboard.sinch.com\">Sinch Build Dashboard<\/a><\/li>\n\n\n\n<li>Eine Sinch-Projekt-ID, eine Access-Key-ID und ein Access-Key-Secret<\/li>\n\n\n\n<li>Eine aktivierte virtuelle Nummer von Sinch<\/li>\n\n\n\n<li>Eine  <a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/voice\">Voice-API v2 Service-ID<\/a>, unter Voice &gt; Programmable Voice &gt; Services im Dashboard<\/li>\n\n\n\n<li>Python 3.10 oder neuer<\/li>\n\n\n\n<li>Einen API-Schl\u00fcssel f\u00fcr OpenAI, Anthropic Claude oder Google Gemini<\/li>\n\n\n\n<li><code>ngrok<\/code> mit einem registrierten Authtoken oder eine andere M\u00f6glichkeit, einen lokalen Server \u00fcber <code>wss:\/\/<\/code> bereitzustellen<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Anleitung verwendet das <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\"><code>sinch-voice-tutorials<\/code><\/a> -Repository. Das Tutorial <code>4.1-voice-relay<\/code> ist ein von LangChain unterst\u00fctzter Python-WebSocket-Server, der seine Konfiguration aus Umgebungsvariablen liest und OpenAI, Anthropic Claude sowie Google Gemini unterst\u00fctzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einen Agenten mit Voice Relay verbinden<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Klonen Sie das Tutorials-Repository und wechseln Sie in das Voice Relay-Beispiel:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>git clone https:\/\/github.com\/sinch\/sinch-voice-tutorials.git<br>cd sinch-voice-tutorials\/4.1-voice-relay<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen Sie eine Umgebung und installieren Sie die Abh\u00e4ngigkeiten des Beispiels:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>python3 -m venv .venv<br>source .venv\/bin\/activate<br>pip install -r requirements.txt<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Diese Befehle gelten f\u00fcr macOS und Linux. Verwenden Sie unter Windows <code>python<\/code> anstelle von <code>python3<\/code> und aktivieren Sie die Umgebung mit <code>.venv\\Scripts\\activate<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kopieren Sie die Beispielkonfiguration:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>cp .env.example .env<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Legen Sie einen Anbieter und seinen API-Schl\u00fcssel in der <code>.env<\/code> fest:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>PROVIDER=openai<br>API_KEY=YOUR_LLM_API_KEY<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>.env.example<\/code> des Repositorys verwendet <code>openai<\/code> als Standardanbieter. Das Beispiel unterst\u00fctzt au\u00dferdem <code>claude<\/code> f\u00fcr Anthropic Claude und <code>gemini<\/code> f\u00fcr Google Gemini. Die <code>requirements.txt<\/code> installiert die Pakete f\u00fcr alle drei. Ein Wechsel des Anbieters bedeutet also nur, <code>PROVIDER<\/code> und <code>API_KEY<\/code> zu \u00e4ndern. Sie k\u00f6nnen auch <code>MODEL<\/code>, <code>TEMPERATURE<\/code>, <code>MAX_TOKENS<\/code> und <code>PORT<\/code> festlegen. Deren Standardwerte werden im folgenden Startprotokoll angezeigt. Au\u00dferdem k\u00f6nnen Sie <code>GREETING<\/code> festlegen, um das <code>Hello!<\/code> zu \u00e4ndern, mit dem sich der Agent meldet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Starten Sie den lokalen Server:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>python server.py<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Der Server meldet den geladenen System-Prompt, danach seine Anbieter- und Modelleinstellungen und dann die lokale Adresse, auf der er lauscht:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>[*] Loaded system prompt (3424 chars)<br>[*] Provider: openai  Model: gpt-4o  Temp: 0.7  MaxTokens: 1024<br>[*] Agent Relay listening on ws:\/\/0.0.0.0:8765<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">\u00dcberpr\u00fcfen Sie diese Ausgabe, bevor Sie einen Anruf t\u00e4tigen. Ein fehlender Anbieterschl\u00fcssel oder eine fehlerhafte Abh\u00e4ngigkeit wird hier angezeigt und nicht erst mitten in einer Konversation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Verhalten des Agenten wird durch die <code>system_prompt.md<\/code> bestimmt. Bearbeiten Sie diese Datei, um Persona, Domain oder Anweisungen zu \u00e4ndern. Starten Sie dann die <code>server.py<\/code> neu, da der Prompt beim Start geladen wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sinch stellt eine eingehende Verbindung zu Ihrem Relay-Server her, daher wird eine \u00f6ffentliche Adresse ben\u00f6tigt. Lassen Sie die <code>server.py<\/code> im ersten Terminal laufen und \u00f6ffnen Sie ein zweites. Wenn Sie ngrok noch nicht haben, installieren Sie es und registrieren Sie ein Authtoken \u00fcber die Seite <a href=\"https:\/\/dashboard.ngrok.com\/get-started\/your-authtoken\">Your Authtoken<\/a> im ngrok-Dashboard. Die kostenlose Stufe reicht f\u00fcr diese Anleitung aus. ngrok startet keinen Tunnel, bevor nicht ein Token konfiguriert ist:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>brew install ngrok<br>ngrok config add-authtoken YOUR_NGROK_AUTHTOKEN<br>ngrok http 8765<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">ngrok \u00fcbernimmt das Terminal und gibt eine Statustabelle aus. Die entscheidende Zeile ist die Weiterleitungsadresse:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>Forwarding    https:\/\/YOUR_NGROK_ID.ngrok-free.dev -&gt; http:\/\/localhost:8765<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Nehmen Sie diese Adresse, \u00e4ndern Sie nur das Schema in <code>wss:\/\/<\/code> und verwenden Sie sie als Voice Relay-Endpunkt:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>ngrok address:  https:\/\/YOUR_NGROK_ID.ngrok-free.dev<br>Sinch endpoint: wss:\/\/YOUR_NGROK_ID.ngrok-free.dev<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Dieser <code>wss:\/\/<\/code>-Wert geh\u00f6rt in die Sinch-Servicekonfiguration und nicht in den Relay-Server, der weiterhin auf dem lokalen Port <code>8765<\/code> lauscht. Lassen Sie von nun an sowohl die <code>server.py<\/code> als auch ngrok laufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das minimale Voice Relay-Ziel sieht so aus:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    {\r\n  &quot;type&quot;: &quot;VOICE_RELAY&quot;,\r\n  &quot;voiceRelay&quot;: {\r\n    &quot;endpoint&quot;: &quot;wss:\/\/YOUR_NGROK_ID.ngrok-free.dev&quot;,\r\n    &quot;ttsVoice&quot;: &quot;Tiffany&quot;,\r\n    &quot;sttLanguage&quot;: &quot;en-US&quot;\r\n  }\r\n}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Feld\u00a0<\/td><td>Erforderlich\u00a0<\/td><td>Hinweise\u00a0<\/td><\/tr><tr><td><code>endpoint<\/code>\u00a0<\/td><td>Ja\u00a0<\/td><td>Die <code>wss:\/\/<\/code>-Adresse, mit der sich Sinch verbindet\u00a0<\/td><\/tr><tr><td><code>ttsVoice<\/code>\u00a0<\/td><td>Ja\u00a0<\/td><td><code>Tiffany<\/code> passt zu diesem Tutorial. Lesen Sie den <a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/text-to-speech-voices\" target=\"_blank\" rel=\"noreferrer noopener\">Referenz f\u00fcr unterst\u00fctzte Voice-Profile<\/a> bevor Sie diesen Wert \u00e4ndern\u00a0<\/td><\/tr><tr><td><code>sttLanguage\u00a0<\/code><\/td><td>Ja\u00a0<\/td><td>Ein BCP-47-Sprach-Tag\u00a0<\/td><\/tr><tr><td><code>enableInterruptions<\/code>\u00a0<\/td><td>Nein\u00a0<\/td><td>Standardwert ist <code>true<\/code>\u00a0<\/td><\/tr><tr><td><code>callHeaders\u00a0<\/code><\/td><td>Nein\u00a0<\/td><td>Bis zu 16 Schl\u00fcssel\/Wert-Paare, jeder Schl\u00fcssel und Wert mit maximal 255 Zeichen<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ihr Service ben\u00f6tigt die Nummer, bevor dies alles relevant wird. \u00d6ffnen Sie den Service im Dashboard, gehen Sie zu Voice-Kan\u00e4len, w\u00e4hlen Sie in der Zeile &#8222;Phone&#8220; die Option &#8222;Configure&#8220;, klicken Sie dann auf &#8222;Add numbers&#8220; und w\u00e4hlen Sie Ihre virtuelle Nummer aus. Eine Nummer geh\u00f6rt immer nur zu einem Service. Wenn sie also bereits einem anderen Service zugewiesen ist, bittet Sie das Dashboard, die Neuzuweisung zu best\u00e4tigen. Eingehende Anrufe an diese Nummer werden von da an an den neuen Service weitergeleitet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald die Nummer eingerichtet ist, routen Sie den Anruf, indem Sie dem Service ein statisches Anrufverhalten oder einen Webhook zuweisen, der SVAML zur\u00fcckgibt. Die statische Konfiguration erf\u00fcllt f\u00fcnf Aufgaben:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nimmt den eingehenden Anruf entgegen.<\/li>\n\n\n\n<li>F\u00fcgt den eingehenden Abschnitt zur <code>main-bridge<\/code> hinzu.<\/li>\n\n\n\n<li>Erstellt einen Anrufabschnitt mit einem <code>VOICE_RELAY<\/code>-Ziel.<\/li>\n\n\n\n<li>F\u00fcgt den Relay-Abschnitt bei Entgegennahme zur selben <code>main-bridge<\/code> hinzu.<\/li>\n\n\n\n<li>Beendet den Relay-Abschnitt, wenn der eingehende Abschnitt endet.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><code>server.py<\/code> und ngrok belegen nun beide ihre Terminals. \u00d6ffnen Sie daher f\u00fcr diesen Schritt ein drittes Terminal. F\u00fcllen Sie die f\u00fcnf Werte oben in der Anfrage aus und f\u00fchren Sie sie aus. Wenn Sie lieber das Dashboard verwenden m\u00f6chten, f\u00fcgen Sie den inneren SVAML-Body aus der <code>static.txt<\/code> stattdessen in dessen Editor f\u00fcr vordefiniertes Anrufverhalten ein.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    export PROJECT_ID=YOUR_PROJECT_ID\r\nexport KEY_ID=YOUR_ACCESS_KEY_ID\r\nexport SERVICE_ID=YOUR_SERVICE_ID\r\nexport VOICE_RELAY_ENDPOINT=wss:\/\/YOUR_NGROK_ID.ngrok-free.dev\r\n \r\n# prompts without echoing, so the secret stays out of shell history\r\nprintf &#039;Access key secret: &#039;\r\nread -rs KEY_SECRET\r\necho\r\nexport KEY_SECRET\r\n \r\ncurl -X PATCH \\\r\n  -u &quot;$KEY_ID:$KEY_SECRET&quot; \\\r\n  &quot;https:\/\/voice.api.sinch.com\/v2\/projects\/$PROJECT_ID\/services\/$SERVICE_ID&quot; \\\r\n  -H &quot;Content-Type: application\/json&quot; \\\r\n  -d @- &lt;&lt;JSON\r\n{\r\n  &quot;callBehavior&quot;: {\r\n    &quot;type&quot;: &quot;STATIC&quot;,\r\n    &quot;static&quot;: {\r\n      &quot;callName&quot;: &quot;caller&quot;,\r\n      &quot;commands&quot;: [\r\n        { &quot;command&quot;: &quot;answer&quot; },\r\n        { &quot;command&quot;: &quot;bridgeCall&quot;, &quot;bridgeName&quot;: &quot;main-bridge&quot; },\r\n        {\r\n          &quot;command&quot;: &quot;dial&quot;,\r\n          &quot;callName&quot;: &quot;voice_relay_call&quot;,\r\n          &quot;to&quot;: {\r\n            &quot;type&quot;: &quot;VOICE_RELAY&quot;,\r\n            &quot;voiceRelay&quot;: {\r\n              &quot;endpoint&quot;: &quot;$VOICE_RELAY_ENDPOINT&quot;,\r\n              &quot;ttsVoice&quot;: &quot;Tiffany&quot;,\r\n              &quot;sttLanguage&quot;: &quot;en-US&quot;\r\n            }\r\n          },\r\n          &quot;events&quot;: {\r\n            &quot;onAnswer&quot;: [\r\n              { &quot;command&quot;: &quot;bridgeCall&quot;, &quot;bridgeName&quot;: &quot;main-bridge&quot; }\r\n            ]\r\n          }\r\n        }\r\n      ],\r\n      &quot;events&quot;: {\r\n        &quot;onHangup&quot;: [\r\n          { &quot;command&quot;: &quot;hangup&quot;, &quot;callName&quot;: &quot;voice_relay_call&quot; }\r\n        ]\r\n      }\r\n    }\r\n  }\r\n}\r\nJSON\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ein erfolgreicher <code>PATCH<\/code> gibt den aktualisierten Service zur\u00fcck. So k\u00f6nnen Sie Ihren Endpunkt aus der Antwort ablesen und best\u00e4tigen, dass er \u00fcbernommen wurde:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/sinch.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    {\r\n  &quot;serviceId&quot;: &quot;YOUR_SERVICE_ID&quot;,\r\n  &quot;projectId&quot;: &quot;YOUR_PROJECT_ID&quot;,\r\n  &quot;name&quot;: &quot;voice-relay-test&quot;,\r\n  &quot;isDefault&quot;: true,\r\n  &quot;callBehavior&quot;: {\r\n    &quot;type&quot;: &quot;STATIC&quot;,\r\n    &quot;static&quot;: {\r\n      &quot;callName&quot;: &quot;caller&quot;,\r\n      &quot;commands&quot;: [\r\n        { &quot;command&quot;: &quot;answer&quot; },\r\n        { &quot;command&quot;: &quot;bridgeCall&quot;, &quot;bridgeName&quot;: &quot;main-bridge&quot; },\r\n        {\r\n          &quot;command&quot;: &quot;dial&quot;,\r\n          &quot;to&quot;: {\r\n            &quot;type&quot;: &quot;VOICE_RELAY&quot;,\r\n            &quot;voiceRelay&quot;: {\r\n              &quot;endpoint&quot;: &quot;wss:\/\/YOUR_NGROK_ID.ngrok-free.dev&quot;,\r\n              &quot;ttsVoice&quot;: &quot;Tiffany&quot;,\r\n              &quot;sttLanguage&quot;: &quot;en-US&quot;\r\n            }\r\n          },\r\n          &quot;events&quot;: {\r\n            &quot;onAnswer&quot;: [\r\n              { &quot;command&quot;: &quot;bridgeCall&quot;, &quot;bridgeName&quot;: &quot;main-bridge&quot; }\r\n            ]\r\n          },\r\n          &quot;callName&quot;: &quot;voice_relay_call&quot;\r\n        }\r\n      ],\r\n      &quot;events&quot;: {\r\n        &quot;onHangup&quot;: [\r\n          { &quot;command&quot;: &quot;hangup&quot;, &quot;callName&quot;: &quot;voice_relay_call&quot; }\r\n        ]\r\n      }\r\n    }\r\n  }\r\n}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Der innere SVAML-Body ist auch verf\u00fcgbar in der <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\/blob\/main\/4.1-voice-relay\/static.txt\"><code>static.txt<\/code><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">So sieht der Erfolg aus<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rufen Sie die mit dem Service verkn\u00fcpfte Sinch-Nummer an. Sie sollten <code>Hello!<\/code>h\u00f6ren, oder die Begr\u00fc\u00dfung, die Sie mit <code>GREETING<\/code> festgelegt haben. Stellen Sie dann eine Frage und warten Sie auf die Antwort des Agenten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Server-Terminal protokolliert beide Richtungen des WebSockets. Dieses Protokoll ist das n\u00fctzlichste Hilfsmittel auf dem Bildschirm w\u00e4hrend eines ersten Anrufs. Ein Beispielprotokoll, gek\u00fcrzt auf einen Austausch, sieht so aus:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>[+] Connected: ('127.0.0.1', 65438)<br>  WS &lt;&lt; {&quot;callHeaders&quot;:{},&quot;callId&quot;:&quot;01M25YACD3G61GH4Y0NQNWR4WD&quot;,&quot;interruptionsEnabled&quot;:true,...}<br>    connect  callId=01M25YACD3G61GH4Y0NQNWR4WD  serviceId=YOUR_SERVICE_ID<br>  WS &gt;&gt; {\"command\": \"answer\"}<br>  WS &gt;&gt; {\"command\": \"text\", \"text\": \"Hello!\", \"isLast\": true, \"isInterruptible\": true}<br>  WS &lt;&lt; {&quot;batchSequence&quot;:0,&quot;command&quot;:&quot;textPlaybackStart&quot;}<br>  WS &lt;&lt; {&quot;batchSequence&quot;:0,&quot;command&quot;:&quot;textPlaybackStop&quot;}<br>  WS &lt;&lt; {&quot;reason&quot;:&quot;speech-detected&quot;,&quot;command&quot;:&quot;interrupt&quot;}<br>  WS &lt;&lt; {&quot;sttLanguage&quot;:&quot;en-US&quot;,&quot;text&quot;:&quot;Hi.&quot;,&quot;isCorrection&quot;:false,&quot;command&quot;:&quot;text&quot;}<br>    STT \u2192 'Hi.'<br>    LLM \u2190 'Hey there! How can I assist you today? If it involves voice tech or a good dad j'\u2026<br>  WS &gt;&gt; {\"command\": \"text\", \"text\": \"Hey there! How can I assist you today?...\", \"isLast\": true}<br>  WS &lt;&lt; {&quot;batchSequence&quot;:1,&quot;command&quot;:&quot;textPlaybackStart&quot;}<br>  WS &lt;&lt; {&quot;batchSequence&quot;:1,&quot;command&quot;:&quot;textPlaybackStop&quot;}<br>[-] Connection closed (1006):<br>[-] Session ended  callId=01M25YACD3G61GH4Y0NQNWR4WD<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Zwei Dinge in diesem Protokoll sind vor Ihrem ersten Anruf wichtig. Die <code>connect<\/code>-Nachricht enth\u00e4lt <code>interruptionsEnabled<\/code>: true. Hier k\u00f6nnen Sie den Standardwert f\u00fcr Unterbrechungen \u00fcberpr\u00fcfen, anstatt ihn aus der Konfigurationsreferenz zu entnehmen. Und die Verbindung wird mit dem Code <code>1006<\/code> geschlossen, wenn die anrufende Person auflegt. Dies sieht wie eine abnormale Schlie\u00dfung aus, ist hier aber das normale Verhalten beim Auflegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <code>interrupt<\/code> mit <code>reason=speech-detected<\/code> erscheint bei jedem Wechsel, da Sinch einen sendet, sobald die anrufende Person geh\u00f6rt wird. Seine Position ist aussagekr\u00e4ftig: Nach <code>textPlaybackStop<\/code> markiert er lediglich den Beginn des Sprechanteils der anrufenden Person, w\u00e4hrend er zwischen <code>textPlaybackStart<\/code> und <code>textPlaybackStop<\/code> ein Dazwischenreden darstellt. Als ich w\u00e4hrend einer Antwort gesprochen habe, wurde die Wiedergabe gestoppt. Das n\u00e4chste Transkript enthielt das, was ich dazwischengerufen hatte:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>WS &lt;&lt; {&quot;batchSequence&quot;:5,&quot;command&quot;:&quot;textPlaybackStart&quot;}<br>  WS &lt;&lt; {&quot;reason&quot;:&quot;speech-detected&quot;,&quot;command&quot;:&quot;interrupt&quot;}<br>  WS &lt;&lt; {&quot;batchSequence&quot;:5,&quot;command&quot;:&quot;textPlaybackStop&quot;}<br>  WS &lt;&lt; {&quot;sttLanguage&quot;:&quot;en-US&quot;,&quot;text&quot;:&quot;I&#039;m going to stop you right there.&quot;,...,&quot;command&quot;:&quot;text&quot;}<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Das ist ein Voice-Interface vor einem textbasierten KI-Agenten, ohne dass Sie selbst auch nur einen einzigen Audio-Frame verarbeiten m\u00fcssen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wo sich Ihre Anwendung befindet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sinch und der WebSocket-Server tauschen ein kleines JSON-Protokoll mit einem Befehl pro Nachricht aus, was die <code>server.py<\/code> f\u00fcr Sie \u00fcbernimmt. Transkriptkorrekturen sind der Teil, den Sie verstehen sollten, bevor Sie auf dem Beispiel aufbauen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sinch sendet ein fr\u00fches Transkript und m\u00f6glicherweise danach ein korrigiertes Transkript f\u00fcr dieselbe \u00c4u\u00dferung mit <code>isCorrection: true<\/code>. Der korrigierte Text enth\u00e4lt den fr\u00fcheren Text, anstatt nur den ge\u00e4nderten Teil zu ersetzen. Es passierte einmal bei drei Anrufen: Auf <code>Thank you.<\/code> folgte <code>Thank you.\\nOh<\/code>, <code>that's nice.<\/code>, und beide wurden an das Modell gesendet, sodass der Agent auf dieselbe \u00c4u\u00dferung zweimal antwortete. Entscheiden Sie, ob Sie auf eine Korrektur warten, die laufende Anfrage abbrechen oder Korrekturen vollst\u00e4ndig ignorieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Anwendungsgrenze sieht so aus:<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-sand\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <p class=\"mb-0\"><code>Sprache der anrufenden Person<br>    |<br>Sinch Speech-to-Text<br>    |<br>Voice Relay-SMS<br>    |<br>KI-Agent<br>    |<br>Voice Relay-Textantwort<br>    |<br>Sinch Text-to-Speech<br>    |<br>Anrufende Person h\u00f6rt die Antwort<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Voice Relay oder direktes Audio-Streaming?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>W\u00e4hlen Sie\u00a0<\/td><td>Wenn\u00a0<\/td><\/tr><tr><td>Voice Relay\u00a0<\/td><td>Ihr Agent Text akzeptiert und Text zur\u00fcckgibt, und Sinch STT sowie TTS \u00fcbernimmt.\u00a0<\/td><\/tr><tr><td>Voice Streams\u00a0<\/td><td>Sie direkte Audiodaten ben\u00f6tigen und \u00fcber eine eigene STT\/TTS-Pipeline verf\u00fcgen.\u00a0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voice Streams eignet sich f\u00fcr eine benutzerdefinierte Sprach-Pipeline, einen spezialisierten Audioprozessor oder einen Anbieter, dessen Protokoll direkten Audiozugriff erfordert. Es bedeutet auch, dass Sie mehr Verantwortung f\u00fcr das Latenz- und Fehlerverhalten tragen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00dcberlegungen zur Produktion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voice-Interaktionen machen Latenz sp\u00fcrbar. Eine langsame Modellantwort f\u00fchrt zu Stille bei der anrufenden Person. Messen Sie daher die Zeit vom eingehenden Sprachereignis bis zur ersten Antwort und bis zur vollst\u00e4ndigen Antwort. Verwenden Sie ein Modell und einen Prompt, die f\u00fcr eine Telefonkonversation geeignet sind, anstatt nur auf maximale Antwortqualit\u00e4t zu optimieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Beispiel im Repository wartet auf die vollst\u00e4ndige Modellantwort, bevor es etwas zur\u00fccksendet. Anrufende h\u00f6ren also so lange nichts, bis das Modell die Generierung abgeschlossen hat. Das ist der erste Ansatzpunkt, wenn sich die Pausen zu lang anf\u00fchlen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Beispiel beh\u00e4lt zudem den Konversationsverlauf f\u00fcr jede WebSocket-Verbindung im Arbeitsspeicher. Das ist f\u00fcr einen ersten Test in Ordnung, aber kein dauerhafter Konversationsspeicher. Entscheiden Sie, welcher Status zu einem Anruf geh\u00f6rt, welcher zu einem Kunden und welcher eine erneute Verbindung \u00fcberdauern muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unterbrechungen erfordern eine explizite Verarbeitung. Wenn anrufende Personen sprechen, w\u00e4hrend eine Antwort abgespielt wird, k\u00f6nnen Sie ein Unterbrechungsereignis erhalten, w\u00e4hrend noch eine LLM-Anfrage ausgef\u00fchrt wird. Brechen Sie die Anfrage ab, wo dies m\u00f6glich ist, oder f\u00fcgen Sie jeder Antwort einen Turn-ID-Tag hinzu und verwerfen Sie veraltete Ausgaben, bevor Sie sie an Sinch zur\u00fccksenden. Dieselbe Turn-ID verarbeitet korrigierte Transkripte. Diese kommen als zweite <code>text<\/code>-Nachricht f\u00fcr eine \u00c4u\u00dferung an, die Sie bereits an das Modell gesendet haben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das lokale Beispiel erfordert vor dem produktiven Einsatz auch eine robustere Fehlerbehandlung:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Senden Sie eine kurze Fallback-Antwort, wenn der Modellanbieter ausf\u00e4llt.<\/li>\n\n\n\n<li>Speichern Sie den Konversationsstatus dauerhaft, wenn der Anruf einen Prozessneustart \u00fcberleben muss.<\/li>\n\n\n\n<li>Halten Sie den WebSocket-Endpunkt f\u00fcr die gesamte Lebensdauer des Anrufs verf\u00fcgbar.<\/li>\n\n\n\n<li>Protokollieren Sie Kennungen f\u00fcr Anrufe, Sitzungen, Verbindungen und Modell-Timing, ohne sensible Konversationsinhalte unn\u00f6tig zu speichern.<\/li>\n\n\n\n<li>Verwenden Sie OAuth 2.0-Client-Anmeldeinformationen f\u00fcr den produktiven API-Zugang. Die Basic-Authentifizierung ist f\u00fcr erste Tests n\u00fctzlich.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Fehlerbehebung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00dcberpr\u00fcfen Sie die Anbieterkonfiguration, bevor Sie einen Anruf t\u00e4tigen. Ein fehlerhafter oder fehlender LLM-Schl\u00fcssel f\u00fchrt zu einem stummen Anruf anstelle eines Fehlers, da das Modell erst beim ersten Wechsel aufgerufen wird. Stellen Sie daher sicher, dass <code>PROVIDER<\/code> und <code>API_KEY<\/code> in der <code>.env<\/code> \u00fcbereinstimmen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die kostenlose ngrok-URL \u00e4ndert sich, wenn der Tunnel neu startet. Aktualisieren Sie den <code>endpoint<\/code> in der Voice-API v2-Servicekonfiguration, wann immer dies geschieht, da Sinch sonst den aktuellen Server nicht erreichen kann. Die <code>server.py<\/code> muss daf\u00fcr nicht neu gestartet werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorschau-Status<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Vorschau-Bedingungen erlauben Tests, Evaluierung, fr\u00fche kommerzielle Nutzung sowie Live-Traffic und besagen, dass die Plattform darauf ausgelegt ist, Produktionsvolumina zu unterst\u00fctzen. Der Service wird \u201ewie besehen\u201c und \u201ewie verf\u00fcgbar\u201c bereitgestellt. Es k\u00f6nnen Nutzungslimits gelten und es greift kein SLA. Sinch kann Funktionen hinzuf\u00fcgen und potenziell inkompatible \u00c4nderungen (\u201ebreaking changes\u201c) k\u00f6nnen vor der allgemeinen Verf\u00fcgbarkeit nicht ausgeschlossen werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die n\u00e4chsten Schritte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voice Relay ist ein Weg in die Voice-API v2. Dasselbe Plattformmodell unterst\u00fctzt au\u00dferdem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ausgehende Voice-Warnungen mit Text-to-Speech<\/li>\n\n\n\n<li>Anrufbeantworter-Erkennung<\/li>\n\n\n\n<li>Batch-Anrufe mit Call Pacing<\/li>\n\n\n\n<li>Anrufaufzeichnung und Transkription<\/li>\n\n\n\n<li>Rufnummernmaskierung<\/li>\n\n\n\n<li>SIP-Verbindungen<\/li>\n\n\n\n<li>Direktes Audio-Streaming<\/li>\n\n\n\n<li>Live-Anrufsteuerung \u00fcber SVAML und Webhooks<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Die <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">Sinch Voice-API v2 Tutorials-Repository<\/a> enth\u00e4lt funktionierende Beispiele f\u00fcr diese Wege. Beginnen Sie mit dem Tutorial <code>4.1-voice-relay<\/code> f\u00fcr einen textbasierten Agenten und wechseln Sie dann zu <code>4.2-stream-audio<\/code>, wenn Sie direkten Zugriff auf den Audio-Stream ben\u00f6tigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Voice-API v2 bietet einem vorhandenen Textagenten ein Routing in eine Live-Voice-Interaktion, ohne diesen Agenten in ein audioverarbeitendes System zu verwandeln. Klonen Sie <code>4.1-voice-relay<\/code>, verweisen Sie in der <code>system_prompt.md<\/code> auf den Prompt Ihres eigenen Agenten und rufen Sie die Nummer an.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zus\u00e4tzliche Ressourcen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/overview\">\u00dcbersicht \u00fcber die Sinch Voice-API v2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/getting-started\">Erste Schritte mit der Voice-API v2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/voice\">Voice-API v2 API-Referenz<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/text-to-speech-voices\">Referenz f\u00fcr Text-to-Speech-Voice-Optionen<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">Voice-API v2 Tutorials-Repository<\/a><\/li>\n<\/ul>\n","protected":false},"author":93,"featured_media":211257,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"tags":[],"blog_category":[752],"class_list":["post-211315","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-entwickler"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden<\/title>\n<meta name=\"description\" content=\"Verbinden Sie KI-Agenten ohne Telekommunikationsinfrastruktur mit Live-Telefonanrufen \u00fcber die Sinch Voice-API v2 und Voice Relay. Schritt-f\u00fcr-Schritt-Anleitung vom Klonen bis zum funktionierenden Anruf.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden\" \/>\n<meta property=\"og:description\" content=\"Verbinden Sie KI-Agenten ohne Telekommunikationsinfrastruktur mit Live-Telefonanrufen \u00fcber die Sinch Voice-API v2 und Voice Relay. Schritt-f\u00fcr-Schritt-Anleitung vom Klonen bis zum funktionierenden Anruf.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/\" \/>\n<meta property=\"og:site_name\" content=\"Sinch\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/wearesinch\/\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1296\" \/>\n\t<meta property=\"og:image:height\" content=\"788\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@WeAreSinch\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/\"},\"author\":{\"name\":\"Gunnar Grosch\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\"},\"headline\":\"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden\",\"datePublished\":\"2026-09-25T10:35:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/\"},\"wordCount\":2215,\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/SI_NEB_Voice_API-V2.png\",\"inLanguage\":\"de-DE\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/\",\"name\":\"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/SI_NEB_Voice_API-V2.png\",\"datePublished\":\"2026-09-25T10:35:16+00:00\",\"description\":\"Verbinden Sie KI-Agenten ohne Telekommunikationsinfrastruktur mit Live-Telefonanrufen \u00fcber die Sinch Voice-API v2 und Voice Relay. Schritt-f\u00fcr-Schritt-Anleitung vom Klonen bis zum funktionierenden Anruf.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#primaryimage\",\"url\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/SI_NEB_Voice_API-V2.png\",\"contentUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/SI_NEB_Voice_API-V2.png\",\"width\":1296,\"height\":788,\"caption\":\"Two developers reviewing code on a laptop, branded \\\"Sinch Voice API v2\\\"\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/ki-agent-telefonanrufe-voice-api-relay\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sinch.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/sinch.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/sinch.com\\\/de\\\/\",\"name\":\"Sinch\",\"description\":\"SMS Messaging, Voice, E-Mail, Video & Verifizierungs-APIs | Sinch\",\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sinch.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de-DE\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#organization\",\"name\":\"Sinch\",\"url\":\"https:\\\/\\\/sinch.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/Thumbnail-Logo-Honey.png\",\"contentUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/Thumbnail-Logo-Honey.png\",\"width\":800,\"height\":496,\"caption\":\"Sinch\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/wearesinch\\\/\",\"https:\\\/\\\/x.com\\\/WeAreSinch\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/sinch\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCZZ2u_B2afTxA0v-xcgfsaw\",\"https:\\\/\\\/www.instagram.com\\\/wearesinch\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sinch.com\\\/de\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\",\"name\":\"Gunnar Grosch\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g\",\"caption\":\"Gunnar Grosch\"},\"description\":\"Gunnar Grosch is a Principal Developer Advocate at Sinch and an engineer with over 25 years of experience building software, scaling developer communities, and making complex technology accessible. He shares code, insights, and lessons through conference talks, blog posts, and open source.\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden","description":"Verbinden Sie KI-Agenten ohne Telekommunikationsinfrastruktur mit Live-Telefonanrufen \u00fcber die Sinch Voice-API v2 und Voice Relay. Schritt-f\u00fcr-Schritt-Anleitung vom Klonen bis zum funktionierenden Anruf.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/","og_locale":"de_DE","og_type":"article","og_title":"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden","og_description":"Verbinden Sie KI-Agenten ohne Telekommunikationsinfrastruktur mit Live-Telefonanrufen \u00fcber die Sinch Voice-API v2 und Voice Relay. Schritt-f\u00fcr-Schritt-Anleitung vom Klonen bis zum funktionierenden Anruf.","og_url":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/","og_site_name":"Sinch","article_publisher":"https:\/\/www.facebook.com\/wearesinch\/","og_image":[{"width":1296,"height":788,"url":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@WeAreSinch","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"10 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#article","isPartOf":{"@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/"},"author":{"name":"Gunnar Grosch","@id":"https:\/\/sinch.com\/de\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08"},"headline":"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden","datePublished":"2026-09-25T10:35:16+00:00","mainEntityOfPage":{"@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/"},"wordCount":2215,"publisher":{"@id":"https:\/\/sinch.com\/de\/#organization"},"image":{"@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","inLanguage":"de-DE"},{"@type":"WebPage","@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/","url":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/","name":"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden","isPartOf":{"@id":"https:\/\/sinch.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#primaryimage"},"image":{"@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","datePublished":"2026-09-25T10:35:16+00:00","description":"Verbinden Sie KI-Agenten ohne Telekommunikationsinfrastruktur mit Live-Telefonanrufen \u00fcber die Sinch Voice-API v2 und Voice Relay. Schritt-f\u00fcr-Schritt-Anleitung vom Klonen bis zum funktionierenden Anruf.","breadcrumb":{"@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/"]}]},{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#primaryimage","url":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","contentUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","width":1296,"height":788,"caption":"Two developers reviewing code on a laptop, branded \"Sinch Voice API v2\""},{"@type":"BreadcrumbList","@id":"https:\/\/sinch.com\/de\/blog\/ki-agent-telefonanrufe-voice-api-relay\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sinch.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/sinch.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"KI-Agenten mit Telefonanrufen \u00fcber die Sinch Voice-API v2 verbinden"}]},{"@type":"WebSite","@id":"https:\/\/sinch.com\/de\/#website","url":"https:\/\/sinch.com\/de\/","name":"Sinch","description":"SMS Messaging, Voice, E-Mail, Video & Verifizierungs-APIs | Sinch","publisher":{"@id":"https:\/\/sinch.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sinch.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de-DE"},{"@type":"Organization","@id":"https:\/\/sinch.com\/de\/#organization","name":"Sinch","url":"https:\/\/sinch.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/sinch.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/sinch.com\/wp-content\/uploads\/2024\/09\/Thumbnail-Logo-Honey.png","contentUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2024\/09\/Thumbnail-Logo-Honey.png","width":800,"height":496,"caption":"Sinch"},"image":{"@id":"https:\/\/sinch.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/wearesinch\/","https:\/\/x.com\/WeAreSinch","https:\/\/www.linkedin.com\/company\/sinch","https:\/\/www.youtube.com\/channel\/UCZZ2u_B2afTxA0v-xcgfsaw","https:\/\/www.instagram.com\/wearesinch\/"]},{"@type":"Person","@id":"https:\/\/sinch.com\/de\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08","name":"Gunnar Grosch","image":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/secure.gravatar.com\/avatar\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8f177695c01082754db3f0858d534fdaceedba31f74932d7de39991e5e9d7e8d?s=96&d=mm&r=g","caption":"Gunnar Grosch"},"description":"Gunnar Grosch is a Principal Developer Advocate at Sinch and an engineer with over 25 years of experience building software, scaling developer communities, and making complex technology accessible. He shares code, insights, and lessons through conference talks, blog posts, and open source."}]}},"_links":{"self":[{"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/blog\/211315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/users\/93"}],"version-history":[{"count":0,"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/blog\/211315\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/media\/211257"}],"wp:attachment":[{"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/media?parent=211315"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/tags?post=211315"},{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/sinch.com\/de\/wp-json\/wp\/v2\/blog_category?post=211315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}