{"id":211317,"date":"2026-09-25T10:35:22","date_gmt":"2026-09-25T10:35:22","guid":{"rendered":"https:\/\/sinch.com\/blog\/ai-agent-phone-calls-voice-api-relay-2\/"},"modified":"2026-09-25T10:35:22","modified_gmt":"2026-09-25T10:35:22","slug":"ai-agent-phone-calls-voice-api-relay","status":"publish","type":"blog","link":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/","title":{"rendered":"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Conectar un agente de IA a una llamada telef\u00f3nica en directo significa enlazar la red telef\u00f3nica y el agente. Esto puede implicar una integraci\u00f3n SIP o una ruta de medios sin procesar a trav\u00e9s de un WebSocket, adem\u00e1s de conversi\u00f3n de voz a texto, texto a voz y la gesti\u00f3n de los turnos de conversaci\u00f3n entre quien llama y el agente. Es mucha infraestructura de telefon\u00eda y medios para crear y gestionar en torno a un agente de IA.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/overview\">La API de voz de Sinch v2<\/a> te ahorra todo ese trabajo. Su destino Voice Relay conecta una llamada en directo a tu punto de conexi\u00f3n WebSocket, Sinch ejecuta la conversi\u00f3n de voz a texto y de texto a voz, y tu aplicaci\u00f3n intercambia texto sin formato. La API de voz v2 tambi\u00e9n a\u00f1ade Voice Streams, una ruta de audio bidireccional sin procesar para los casos en los que s\u00ed quieres gestionar los medios directamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Est\u00e1 en versi\u00f3n de previsualizaci\u00f3n p\u00fablica, por lo que las funciones, los l\u00edmites, la documentaci\u00f3n y el comportamiento a\u00fan pueden cambiar y no se aplica ning\u00fan SLA, pero est\u00e1 abierta para pruebas, evaluaci\u00f3n y tr\u00e1fico inicial de producci\u00f3n. He ejecutado toda la ruta de principio a fin con el <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">ejemplo del tutorial<\/a>: un agente de LangChain que responde a una llamada telef\u00f3nica real, interrupciones incluidas.<\/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-4213\"><p class=\"h5 m-0\" id=\"toc-title-4213\">\u00cdndice<\/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=\"#por-que-es-importante-voice-relay\">Por qu\u00e9 es importante Voice Relay<\/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=\"#el-modelo-de-la-api-de-voz-v2\">El modelo de la API de voz v2<\/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=\"#que-necesitas\">Qu\u00e9 necesitas<\/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=\"#conecta-un-agente-con-voice-relay\">Conecta un agente con Voice Relay<\/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=\"#aspecto-de-una-ejecucion-exitosa\">Aspecto de una ejecuci\u00f3n exitosa<\/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=\"#donde-se-situa-tu-aplicacion\">D\u00f3nde se sit\u00faa tu aplicaci\u00f3n<\/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-o-streaming-de-audio-sin-procesar\">\u00bfVoice Relay o streaming de audio sin procesar?<\/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=\"#consideraciones-para-la-produccion\">Consideraciones para la producci\u00f3n<\/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=\"#solucion-de-problemas\">Soluci\u00f3n de problemas<\/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=\"#estado-de-previsualizacion\">Estado de previsualizaci\u00f3n<\/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=\"#proximos-pasos\">Pr\u00f3ximos pasos<\/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=\"#recursos-adicionales\">Recursos adicionales<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 es importante Voice Relay<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un agente de IA suele empezar como una aplicaci\u00f3n de texto. Acepta un mensaje, llama a un modelo y devuelve una respuesta de texto. Voice Relay mueve el l\u00edmite de audio a la plataforma de Sinch para que conserves el agente, sus herramientas, prompts y estado, y trabajes con texto en lugar de audio sin procesar. Incluye las interrupciones, por lo que quienes llaman pueden intervenir mientras se reproduce una respuesta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto hace que Voice Relay sea un punto de entrada pr\u00e1ctico para funciones de recepci\u00f3n mediante IA, bots de demostraci\u00f3n de productos y un centro de asistencia interno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El modelo de la API de voz v2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La API de voz v2 organiza una interacci\u00f3n en torno a tres recursos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Una <strong>sesi\u00f3n<\/strong> agrupa las llamadas y conexiones relacionadas y permanece activa hasta que finalizan las llamadas asociadas.<\/li>\n\n\n\n<li>Una <strong>llamada<\/strong> representa la conexi\u00f3n de un participante, como un tel\u00e9fono, SIP o un tramo de streaming.<\/li>\n\n\n\n<li>Un <strong>puente<\/strong> conecta las llamadas dentro de una sesi\u00f3n cuando varios participantes necesitan comunicarse.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">SVAML, el lenguaje de marcado de la API de voz de Sinch, describe lo que ocurre durante la interacci\u00f3n. Un comando <code>dial<\/code> puede crear un tramo de llamada. Los eventos anidados pueden definir lo que ocurre cuando se responde a la llamada, est\u00e1 ocupada, se agota el tiempo de espera o falla. Un webhook puede tomar el control cuando la aplicaci\u00f3n necesite tomar una decisi\u00f3n din\u00e1mica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este modelo es importante para los agentes de IA porque la conversaci\u00f3n y la llamada est\u00e1n relacionadas, pero no son lo mismo. El agente de IA gestiona la conversaci\u00f3n. SVAML y la API de voz gestionan los flujos de llamadas. Esta separaci\u00f3n te permite a\u00f1adir una transferencia humana, otro tramo de llamada o una ruta de medios diferente sin poner toda esa l\u00f3gica dentro del prompt del modelo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 necesitas<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Una cuenta de Sinch con acceso a la API de voz v2, en el <a href=\"https:\/\/dashboard.sinch.com\">panel de control de Sinch Build<\/a><\/li>\n\n\n\n<li>Un ID de proyecto de Sinch, un ID de clave de acceso y un secreto de clave de acceso<\/li>\n\n\n\n<li>Un n\u00famero virtual de Sinch activado<\/li>\n\n\n\n<li>Una  <a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/voice\">ID de servicio de la API de voz v2<\/a>, desde Voz &gt; Voz programable &gt; Servicios en el panel de control<\/li>\n\n\n\n<li>Python 3.10 o superior<\/li>\n\n\n\n<li>Una clave de API para OpenAI, Anthropic Claude o Google Gemini<\/li>\n\n\n\n<li><code>ngrok<\/code> con un authtoken registrado, u otra forma de exponer un servidor local a trav\u00e9s de <code>wss:\/\/<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El tutorial utiliza el repositorio <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\"><code>sinch-voice-tutorials<\/code><\/a> . Su tutorial <code>4.1-voice-relay<\/code> es un servidor Python WebSocket respaldado por LangChain, que lee su configuraci\u00f3n desde variables de entorno y es compatible con OpenAI, Anthropic Claude y Google Gemini.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conecta un agente con Voice Relay<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Clona el repositorio de tutoriales y ve al ejemplo de Voice Relay:<\/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\">Crea un entorno e instala las dependencias del ejemplo:<\/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\">Estos comandos son para macOS y Linux. En Windows, utiliza <code>python<\/code> en lugar de <code>python3<\/code> y act\u00edvalo con <code>.venv\\Scripts\\activate<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copia la configuraci\u00f3n del ejemplo:<\/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\">Configura un proveedor y su clave de API en <code>.env<\/code>:<\/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\">El archivo <code>.env.example<\/code> del repositorio utiliza <code>openai<\/code> como proveedor predeterminado. El ejemplo tambi\u00e9n es compatible con <code>claude<\/code> para Anthropic Claude y <code>gemini<\/code> para Google Gemini, y <code>requirements.txt<\/code> instala los paquetes para los tres, por lo que para cambiar de proveedor hay que cambiar <code>PROVIDER<\/code> y <code>API_KEY<\/code>. Tambi\u00e9n puedes configurar <code>MODEL<\/code>, <code>TEMPERATURE<\/code>, <code>MAX_TOKENS<\/code> y <code>PORT<\/code>, cuyos valores predeterminados aparecen en el registro de inicio a continuaci\u00f3n, adem\u00e1s de <code>GREETING<\/code> para cambiar el mensaje <code>Hello!<\/code> con el que inicia el agente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inicia el servidor local:<\/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\">El servidor genera un informe del prompt del sistema que ha cargado, luego de los ajustes del proveedor y el modelo, y por \u00faltimo de la direcci\u00f3n local en la que est\u00e1 escuchando:<\/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\">Comprueba ese resultado antes de realizar una llamada. Si falta una clave del proveedor o hay una dependencia rota, aparecer\u00e1 aqu\u00ed en lugar de en mitad de una conversaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El comportamiento del agente proviene de <code>system_prompt.md<\/code>. Edita ese archivo para cambiar la persona, el dominio o las instrucciones, y luego reinicia <code>server.py<\/code>, ya que el prompt se carga al inicio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sinch realiza una conexi\u00f3n entrante a tu servidor de retransmisi\u00f3n, por lo que necesita una direcci\u00f3n p\u00fablica. Deja <code>server.py<\/code> en ejecuci\u00f3n en el primer terminal y abre un segundo. Si a\u00fan no tienes ngrok, inst\u00e1lalo y registra un authtoken desde la p\u00e1gina <a href=\"https:\/\/dashboard.ngrok.com\/get-started\/your-authtoken\">Your Authtoken<\/a> del panel de control de ngrok. El nivel gratuito cubre este tutorial y ngrok no iniciar\u00e1 ning\u00fan t\u00fanel hasta que se configure un token:<\/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 toma el control del terminal e imprime una tabla de estado. La l\u00ednea importante es la direcci\u00f3n de reenv\u00edo:<\/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\">Toma esa direcci\u00f3n, cambia solo el esquema a <code>wss:\/\/<\/code> y util\u00edzala como punto de conexi\u00f3n de Voice Relay:<\/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\">Ese valor de <code>wss:\/\/<\/code> va en la configuraci\u00f3n del servicio de Sinch, no en el servidor de retransmisi\u00f3n, que se mantiene en el puerto local <code>8765<\/code>. A partir de aqu\u00ed, deja que tanto <code>server.py<\/code> como ngrok sigan ejecut\u00e1ndose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El destino m\u00ednimo de Voice Relay tiene este aspecto:<\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar al portapapeles\">\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>Campo\u00a0<\/td><td>Requerido\u00a0<\/td><td>Notas\u00a0<\/td><\/tr><tr><td><code>endpoint<\/code>\u00a0<\/td><td>S\u00ed\u00a0<\/td><td>La direcci\u00f3n <code>wss:\/\/<\/code> a la que se conecta Sinch\u00a0<\/td><\/tr><tr><td><code>ttsVoice<\/code>\u00a0<\/td><td>S\u00ed\u00a0<\/td><td><code>Tiffany<\/code> coincide con este tutorial. Consulta la <a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/text-to-speech-voices\" target=\"_blank\" rel=\"noreferrer noopener\">referencia de voces compatibles<\/a> antes de cambiarla\u00a0<\/td><\/tr><tr><td><code>sttLanguage\u00a0<\/code><\/td><td>S\u00ed\u00a0<\/td><td>Una etiqueta de idioma BCP-47\u00a0<\/td><\/tr><tr><td><code>enableInterruptions<\/code>\u00a0<\/td><td>No\u00a0<\/td><td>El valor predeterminado es <code>true<\/code>\u00a0<\/td><\/tr><tr><td><code>callHeaders\u00a0<\/code><\/td><td>No\u00a0<\/td><td>Hasta 16 pares clave\/valor, cada clave y valor con 255 caracteres o menos<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tu servicio necesita el n\u00famero antes de que nada de esto importe. En el panel de control, abre el servicio, ve a Canales de voz y elige Configurar en la fila Tel\u00e9fono, luego A\u00f1adir n\u00fameros y escoge tu n\u00famero virtual. Un n\u00famero pertenece a un servicio a la vez, por lo que si ya est\u00e1 en otro servicio, el panel de control te pedir\u00e1 que confirmes la reasignaci\u00f3n, y las llamadas entrantes a ese n\u00famero seguir\u00e1n al nuevo servicio a partir de entonces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez configurado el n\u00famero, enruta la llamada dando al servicio un comportamiento de llamada est\u00e1tico o un webhook que devuelva SVAML. La configuraci\u00f3n est\u00e1tica realiza cinco acciones:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Responder la llamada entrante.<\/li>\n\n\n\n<li>A\u00f1adir el tramo entrante a <code>main-bridge<\/code>.<\/li>\n\n\n\n<li>Crear un tramo de llamada con un destino <code>VOICE_RELAY<\/code>.<\/li>\n\n\n\n<li>A\u00f1adir el tramo de retransmisi\u00f3n al mismo <code>main-bridge<\/code> cuando responda.<\/li>\n\n\n\n<li>Colgar el tramo de retransmisi\u00f3n cuando finalice el tramo entrante.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Tanto <code>server.py<\/code> como ngrok est\u00e1n ocupando sus terminales ahora, as\u00ed que abre un tercero para este paso. Rellena los cinco valores en la parte superior de la solicitud y ejec\u00fatala. Si prefieres utilizar el panel de control, pega el cuerpo de SVAML interno de <code>static.txt<\/code> en el editor de comportamientos de llamada predefinido.<\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar al portapapeles\">\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\">Un <code>PATCH<\/code> exitoso devuelve el servicio actualizado, de modo que puedes leer tu punto de conexi\u00f3n en la respuesta y confirmar que se aplic\u00f3:<\/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=\"Copiar al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copiar al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar al portapapeles\">\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\">El cuerpo interno de SVAML tambi\u00e9n est\u00e1 disponible en <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\">Aspecto de una ejecuci\u00f3n exitosa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Llama al n\u00famero de Sinch asociado al servicio. Deber\u00edas escuchar <code>Hello!<\/code>, o el saludo que hayas configurado con <code>GREETING<\/code>. Luego haz una pregunta y escucha la respuesta del agente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El terminal del servidor registra ambas direcciones del WebSocket y ese registro es lo m\u00e1s \u00fatil que ver\u00e1s en pantalla durante una primera llamada. El m\u00edo se ve\u00eda as\u00ed, recortado a un solo intercambio:<\/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! \u00bfC\u00f3mo puedo ayudarte hoy? Si tiene que ver con tecnolog\u00eda de voz o un buen ch'\u2026<br>  WS &gt;&gt; {\"command\": \"text\", \"text\": \"Hey there! \u00bfC\u00f3mo puedo ayudarte hoy?...\", \"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\">Vale la pena conocer dos aspectos de ese registro antes de tu primera llamada. El mensaje <code>connect<\/code> incluye <code>interruptionsEnabled<\/code>: true, que es donde puedes confirmar el valor predeterminado de interrupci\u00f3n en lugar de tomarlo de la referencia de configuraci\u00f3n. Adem\u00e1s, la conexi\u00f3n se cierra con el c\u00f3digo <code>1006<\/code> cuando quien llama cuelga; esto parece un cierre anormal, pero es el aspecto de un cuelgue normal en este contexto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aparece un <code>interrupt<\/code> con <code>reason=speech-detected<\/code> en cada turno, ya que Sinch env\u00eda uno cada vez que escucha a la persona que llama. Su posici\u00f3n es lo que nos da la informaci\u00f3n: si aparece despu\u00e9s de <code>textPlaybackStop<\/code> solo marca el inicio del turno de la persona que llama, mientras que si est\u00e1 entre <code>textPlaybackStart<\/code> y <code>textPlaybackStop<\/code> se trata de una intervenci\u00f3n (barge-in). Cuando habl\u00e9 por encima de una respuesta, la reproducci\u00f3n se detuvo y la siguiente transcripci\u00f3n reflej\u00f3 lo que yo hab\u00eda dicho por encima:<\/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\">Se trata de una interfaz de voz frente a un agente de IA basado en texto, sin que t\u00fa tengas que gestionar ni una sola trama de audio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00f3nde se sit\u00faa tu aplicaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sinch y el servidor WebSocket intercambian un peque\u00f1o protocolo JSON, con un comando por mensaje, y <code>server.py<\/code> lo gestiona por ti. Las correcciones de las transcripciones son la parte que vale la pena entender antes de seguir construyendo sobre el ejemplo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sinch env\u00eda una transcripci\u00f3n inicial y luego puede enviar una corregida para la misma declaraci\u00f3n con <code>isCorrection: true<\/code>; el texto corregido incluye el texto anterior en lugar de reemplazar solo la parte modificada. Ocurri\u00f3 una vez cada tres llamadas: <code>Thank you.<\/code> fue seguido por <code>Thank you.\\nOh<\/code>, <code>that's nice.<\/code>, y ambos fueron al modelo, por lo que el agente respondi\u00f3 a la misma declaraci\u00f3n dos veces. Decide si vas a esperar a una correcci\u00f3n, cancelar la solicitud en curso o ignorar las correcciones por completo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El l\u00edmite de la aplicaci\u00f3n tiene este aspecto:<\/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>Voz de la persona que llama<br>    |<br>Sinch conversi\u00f3n de voz a texto<br>    |<br>Mensaje de texto de Voice Relay<br>    |<br>Agente de IA<br>    |<br>Respuesta de texto de Voice Relay<br>    |<br>Sinch texto a voz<br>    |<br>La persona que llama escucha la respuesta<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfVoice Relay o streaming de audio sin procesar?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Elige\u00a0<\/td><td>Cu\u00e1ndo\u00a0<\/td><\/tr><tr><td>Voice Relay\u00a0<\/td><td>Tu agente acepta texto y devuelve texto, y Sinch gestiona el STT y TTS.\u00a0<\/td><\/tr><tr><td>Voice Streams\u00a0<\/td><td>Necesitas audio sin procesar y controlas el pipeline de STT\/TTS.\u00a0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voice Streams es adecuado para un pipeline de voz personalizado, un procesador de audio especializado o un proveedor cuyo protocolo requiera acceso directo al audio. Tambi\u00e9n significa que tienes un mayor control sobre la latencia y el comportamiento ante fallos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Consideraciones para la producci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las interacciones de voz hacen visible la latencia. Una respuesta lenta del modelo crea silencios para la persona que llama, por lo que es necesario medir el tiempo transcurrido desde el evento de voz entrante hasta la primera respuesta y hasta la respuesta completa. Utiliza un modelo y un prompt que se adapten a una conversaci\u00f3n telef\u00f3nica en lugar de optimizar solo para obtener la m\u00e1xima calidad de respuesta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El ejemplo del repositorio espera a recibir la respuesta completa del modelo antes de devolver nada, por lo que la persona que llama no escucha nada hasta que el modelo ha terminado de generarla. Ese es el primer aspecto a revisar si las pausas parecen muy largas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El ejemplo tambi\u00e9n guarda el historial de conversaci\u00f3n en la memoria para cada conexi\u00f3n WebSocket. Est\u00e1 bien para una primera prueba, pero no es un almacenamiento duradero para las conversaciones. Decide qu\u00e9 estado pertenece a una llamada, qu\u00e9 pertenece a un cliente y qu\u00e9 debe sobrevivir a una reconexi\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las interrupciones requieren una gesti\u00f3n expl\u00edcita. Si la persona que llama habla mientras se reproduce una respuesta, puedes recibir un evento de interrupci\u00f3n cuando a\u00fan se est\u00e1 ejecutando una solicitud de LLM. Cancela la solicitud si es posible, o etiqueta cada respuesta con un ID de turno y descarta los resultados obsoletos antes de enviarlos de vuelta a Sinch. El mismo ID de turno gestiona las transcripciones corregidas, que llegan como un segundo mensaje de <code>text<\/code> para una declaraci\u00f3n que ya has enviado al modelo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El ejemplo local tambi\u00e9n necesita una gesti\u00f3n de fallos m\u00e1s s\u00f3lida antes de su uso en producci\u00f3n:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Env\u00eda una breve respuesta alternativa cuando el proveedor del modelo falle.<\/li>\n\n\n\n<li>Mant\u00e9n el estado de la conversaci\u00f3n cuando la llamada deba sobrevivir al reinicio de un proceso.<\/li>\n\n\n\n<li>Mant\u00e9n el punto de conexi\u00f3n WebSocket disponible durante toda la vida \u00fatil de la llamada.<\/li>\n\n\n\n<li>Registra los identificadores de llamada, sesi\u00f3n, conexi\u00f3n y tiempos del modelo sin registrar innecesariamente contenido sensible de la conversaci\u00f3n.<\/li>\n\n\n\n<li>Utiliza credenciales de cliente de OAuth 2.0 para el acceso a la API en producci\u00f3n. La autenticaci\u00f3n b\u00e1sica resulta \u00fatil para las pruebas iniciales.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Soluci\u00f3n de problemas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comprueba la configuraci\u00f3n del proveedor antes de realizar una llamada. Una clave de LLM incorrecta o ausente se refleja como una llamada silenciosa en lugar de un error, ya que no se llama al modelo hasta el primer turno, as\u00ed que confirma que <code>PROVIDER<\/code> y <code>API_KEY<\/code> coinciden entre s\u00ed en <code>.env<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La URL gratuita de ngrok cambia cuando se reinicia el t\u00fanel. Actualiza el <code>endpoint<\/code> en la configuraci\u00f3n del servicio de la API de voz v2 siempre que ocurra, o de lo contrario Sinch no podr\u00e1 conectarse al servidor actual. Para ello no es necesario reiniciar <code>server.py<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Estado de previsualizaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las condiciones de la previsualizaci\u00f3n permiten realizar pruebas, evaluaciones, un uso comercial temprano y tr\u00e1fico en directo, y establecen que la plataforma est\u00e1 dise\u00f1ada para gestionar vol\u00famenes a nivel de producci\u00f3n. El servicio se proporciona tal cual y seg\u00fan disponibilidad, es posible que se apliquen l\u00edmites de uso y no se aplica ning\u00fan SLA. Sinch podr\u00eda a\u00f1adir funcionalidades y no se pueden descartar cambios importantes antes de su disponibilidad general.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos pasos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voice Relay es una v\u00eda de acceso a la API de voz v2. El mismo modelo de plataforma tambi\u00e9n es compatible con:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alertas de voz salientes con texto a voz<\/li>\n\n\n\n<li>Detecci\u00f3n de contestador autom\u00e1tico<\/li>\n\n\n\n<li>Llamadas por lotes con control de ritmo<\/li>\n\n\n\n<li>Grabaci\u00f3n de llamadas y transcripci\u00f3n<\/li>\n\n\n\n<li>Enmascaramiento de n\u00fameros<\/li>\n\n\n\n<li>Conexiones SIP<\/li>\n\n\n\n<li>Streaming de audio sin procesar<\/li>\n\n\n\n<li>Control de llamadas en directo mediante SVAML y webhooks<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">El repositorio de tutoriales de la API de voz v2 de Sinch<\/a> tiene ejemplos pr\u00e1cticos para estas opciones. Empieza con el tutorial <code>4.1-voice-relay<\/code> para un agente basado en texto y luego pasa a <code>4.2-stream-audio<\/code> cuando necesites acceso directo al stream de audio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La API de voz v2 proporciona a un agente de texto existente una v\u00eda hacia una interacci\u00f3n de voz en directo sin convertir a ese agente en un sistema de procesamiento de audio. Clona <code>4.1-voice-relay<\/code>, dirige <code>system_prompt.md<\/code> al prompt de tu propio agente y llama al n\u00famero.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recursos adicionales<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/overview\">Descripci\u00f3n general de la API de voz v2 de Sinch<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/getting-started\">Gu\u00eda de inicio r\u00e1pido de la API de voz v2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/voice\">Referencia de la API de voz v2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/text-to-speech-voices\">Referencia de voces de texto a voz<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">Repositorio de tutoriales de la API de voz v2<\/a><\/li>\n<\/ul>\n","protected":false},"author":93,"featured_media":211257,"menu_order":0,"template":"","meta":{"_acf_changed":false,"footnotes":""},"tags":[],"blog_category":[344],"class_list":["post-211317","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-desarrolladores"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2<\/title>\n<meta name=\"description\" content=\"Conecta agentes de IA a llamadas telef\u00f3nicas en directo sin infraestructura de telecomunicaciones con la API de voz v2 de Sinch y Voice Relay. Tutorial paso a paso desde la clonaci\u00f3n hasta lograr una llamada funcional.\" \/>\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\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2\" \/>\n<meta property=\"og:description\" content=\"Conecta agentes de IA a llamadas telef\u00f3nicas en directo sin infraestructura de telecomunicaciones con la API de voz v2 de Sinch y Voice Relay. Tutorial paso a paso desde la clonaci\u00f3n hasta lograr una llamada funcional.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-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=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\"},\"author\":{\"name\":\"Gunnar Grosch\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\"},\"headline\":\"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2\",\"datePublished\":\"2026-09-25T10:35:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\"},\"wordCount\":2675,\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/SI_NEB_Voice_API-V2.png\",\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\",\"name\":\"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sinch.com\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/SI_NEB_Voice_API-V2.png\",\"datePublished\":\"2026-09-25T10:35:22+00:00\",\"description\":\"Conecta agentes de IA a llamadas telef\u00f3nicas en directo sin infraestructura de telecomunicaciones con la API de voz v2 de Sinch y Voice Relay. Tutorial paso a paso desde la clonaci\u00f3n hasta lograr una llamada funcional.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/ai-agent-phone-calls-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\\\/es\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sinch.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/sinch.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/sinch.com\\\/es\\\/\",\"name\":\"Sinch\",\"description\":\"Mensajer\u00eda SMS, Voz, Email, Video y API de verificaci\u00f3n | Sinch\",\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sinch.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#organization\",\"name\":\"Sinch\",\"url\":\"https:\\\/\\\/sinch.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/sinch.com\\\/es\\\/#\\\/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\\\/es\\\/#\\\/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\\\/es\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\",\"name\":\"Gunnar Grosch\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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":"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2","description":"Conecta agentes de IA a llamadas telef\u00f3nicas en directo sin infraestructura de telecomunicaciones con la API de voz v2 de Sinch y Voice Relay. Tutorial paso a paso desde la clonaci\u00f3n hasta lograr una llamada funcional.","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\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/","og_locale":"es_ES","og_type":"article","og_title":"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2","og_description":"Conecta agentes de IA a llamadas telef\u00f3nicas en directo sin infraestructura de telecomunicaciones con la API de voz v2 de Sinch y Voice Relay. Tutorial paso a paso desde la clonaci\u00f3n hasta lograr una llamada funcional.","og_url":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-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":{"Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/#article","isPartOf":{"@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/"},"author":{"name":"Gunnar Grosch","@id":"https:\/\/sinch.com\/es\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08"},"headline":"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2","datePublished":"2026-09-25T10:35:22+00:00","mainEntityOfPage":{"@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/"},"wordCount":2675,"publisher":{"@id":"https:\/\/sinch.com\/es\/#organization"},"image":{"@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/","url":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/","name":"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2","isPartOf":{"@id":"https:\/\/sinch.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/#primaryimage"},"image":{"@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/#primaryimage"},"thumbnailUrl":"https:\/\/sinch.com\/wp-content\/uploads\/2026\/09\/SI_NEB_Voice_API-V2.png","datePublished":"2026-09-25T10:35:22+00:00","description":"Conecta agentes de IA a llamadas telef\u00f3nicas en directo sin infraestructura de telecomunicaciones con la API de voz v2 de Sinch y Voice Relay. Tutorial paso a paso desde la clonaci\u00f3n hasta lograr una llamada funcional.","breadcrumb":{"@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/sinch.com\/es\/blog\/ai-agent-phone-calls-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\/es\/blog\/ai-agent-phone-calls-voice-api-relay\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sinch.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/sinch.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Conecta agentes de IA a llamadas telef\u00f3nicas con la API de voz de Sinch v2"}]},{"@type":"WebSite","@id":"https:\/\/sinch.com\/es\/#website","url":"https:\/\/sinch.com\/es\/","name":"Sinch","description":"Mensajer\u00eda SMS, Voz, Email, Video y API de verificaci\u00f3n | Sinch","publisher":{"@id":"https:\/\/sinch.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sinch.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/sinch.com\/es\/#organization","name":"Sinch","url":"https:\/\/sinch.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/sinch.com\/es\/#\/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\/es\/#\/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\/es\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08","name":"Gunnar Grosch","image":{"@type":"ImageObject","inLanguage":"es","@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\/es\/wp-json\/wp\/v2\/blog\/211317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/users\/93"}],"version-history":[{"count":0,"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/blog\/211317\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/media\/211257"}],"wp:attachment":[{"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/media?parent=211317"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/tags?post=211317"},{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/sinch.com\/es\/wp-json\/wp\/v2\/blog_category?post=211317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}