{"id":211318,"date":"2026-09-25T10:35:25","date_gmt":"2026-09-25T10:35:25","guid":{"rendered":"https:\/\/sinch.com\/blog\/ai-agent-phone-calls-voice-api-relay-2\/"},"modified":"2026-09-25T10:35:25","modified_gmt":"2026-09-25T10:35:25","slug":"ai-agent-phone-calls-voice-api-relay","status":"publish","type":"blog","link":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/","title":{"rendered":"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Conectar um agente de IA a uma chamada telef\u00f4nica ao vivo significa fazer a ponte entre a rede telef\u00f4nica e o agente. Isso pode envolver integra\u00e7\u00e3o SIP ou um caminho de m\u00eddia bruto por um WebSocket, al\u00e9m de convers\u00e3o de fala em texto, convers\u00e3o de texto para fala e o gerenciamento dos turnos de conversa entre quem liga e o agente. \u00c9 muita infraestrutura de telefonia e m\u00eddia para construir e operar em torno de um agente de IA.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/overview\">A API de voz v2 da Sinch<\/a> poupa voc\u00ea desse trabalho. O destino Voice Relay dela conecta uma chamada ao vivo ao seu endpoint WebSocket, a Sinch executa a convers\u00e3o de fala em texto e de texto para fala, e o seu aplicativo troca texto simples. A API de voz v2 tamb\u00e9m adiciona o Voice Streams, um caminho de \u00e1udio bidirecional bruto para os casos em que voc\u00ea mesmo quer processar a m\u00eddia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Est\u00e1 em pr\u00e9-visualiza\u00e7\u00e3o p\u00fablica, ent\u00e3o os recursos, limites, documenta\u00e7\u00e3o e comportamento ainda podem mudar e nenhum SLA se aplica, mas est\u00e1 aberto para testes, avalia\u00e7\u00e3o e tr\u00e1fego inicial de produ\u00e7\u00e3o. Executei todo o caminho de ponta a ponta com o  <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">exemplo do tutorial<\/a>: um agente LangChain atendendo a uma chamada telef\u00f4nica real, com interrup\u00e7\u00f5es inclu\u00eddas.<\/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-7700\"><p class=\"h5 m-0\" id=\"toc-title-7700\">\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-o-voice-relay-e-importante\">Por que o Voice Relay \u00e9 importante<\/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=\"#o-modelo-da-api-de-voz-v2\">O modelo da 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=\"#voce-precisara-de\">Voc\u00ea precisar\u00e1 de<\/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=\"#conectar-um-agente-com-o-voice-relay\">Conectar um agente com o 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=\"#como-saber-se-deu-certo\">Como saber se deu certo<\/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=\"#onde-o-seu-aplicativo-fica\">Onde o seu aplicativo fica<\/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-ou-streaming-de-audio-bruto\">Voice Relay ou streaming de \u00e1udio bruto?<\/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=\"#consideracoes-sobre-a-producao\">Considera\u00e7\u00f5es sobre a produ\u00e7\u00e3o<\/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=\"#solucao-de-problemas\">Solu\u00e7\u00e3o 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=\"#status-de-pre-visualizacao\">Status de pr\u00e9-visualiza\u00e7\u00e3o<\/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=\"#o-que-vem-a-seguir\">O que vem a seguir<\/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-adicionais\">Recursos adicionais<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Por que o Voice Relay \u00e9 importante<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um agente de IA geralmente come\u00e7a como um aplicativo de texto. Ele aceita uma mensagem, chama um modelo e retorna uma resposta de texto. O Voice Relay move a fronteira de \u00e1udio para a plataforma Sinch. Assim, voc\u00ea mant\u00e9m o agente, as ferramentas, os prompts e o estado dele, e trabalha com texto em vez de \u00e1udio bruto. Ele j\u00e1 inclui interrup\u00e7\u00f5es, ent\u00e3o quem ligou pode intervir enquanto uma resposta est\u00e1 sendo reproduzida.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso torna o Voice Relay um ponto de entrada pr\u00e1tico para recepcionistas de IA, bots de demonstra\u00e7\u00e3o de produtos e helpdesks internos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O modelo da API de voz v2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A API de voz v2 organiza uma intera\u00e7\u00e3o em torno de tr\u00eas recursos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uma <strong>sess\u00e3o<\/strong> agrupa chamadas e conex\u00f5es relacionadas e permanece ativa at\u00e9 que suas chamadas associadas terminem.<\/li>\n\n\n\n<li>Uma <strong>chamada<\/strong> representa a conex\u00e3o de um participante, como um segmento de telefone, SIP ou streaming.<\/li>\n\n\n\n<li>Uma <strong>ponte<\/strong> conecta chamadas dentro de uma sess\u00e3o quando v\u00e1rios participantes precisam se comunicar.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A linguagem SVAML (Sinch Voice API Markup Language) descreve o que acontece durante a intera\u00e7\u00e3o. Um comando <code>dial<\/code> pode criar um segmento de chamada. Eventos aninhados podem definir o que acontece quando a chamada \u00e9 atendida, d\u00e1 ocupado, excede o tempo limite ou falha. Um webhook pode assumir o controle quando o aplicativo precisa tomar uma decis\u00e3o din\u00e2mica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse modelo \u00e9 importante para agentes de IA porque a conversa e a chamada est\u00e3o relacionadas, mas n\u00e3o s\u00e3o a mesma coisa. O agente de IA gerencia a conversa. A SVAML e a API de voz gerenciam o fluxo de chamada. Essa separa\u00e7\u00e3o permite que voc\u00ea adicione uma transfer\u00eancia para humanos, outro segmento de chamada ou um caminho de m\u00eddia diferente sem colocar toda essa l\u00f3gica dentro do prompt do modelo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Voc\u00ea precisar\u00e1 de<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uma conta da Sinch com acesso \u00e0 API de voz v2, no  <a href=\"https:\/\/dashboard.sinch.com\">painel do Sinch Build<\/a><\/li>\n\n\n\n<li>Um ID de projeto da Sinch, ID de chave de acesso e segredo de chave de acesso<\/li>\n\n\n\n<li>Um n\u00famero virtual da Sinch ativado<\/li>\n\n\n\n<li>Uma <a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/voice\">ID do servi\u00e7o da API de voz v2<\/a>, em Voice &gt; Programmable Voice &gt; Services no painel<\/li>\n\n\n\n<li>Python 3.10 ou mais recente<\/li>\n\n\n\n<li>Uma chave de API para a OpenAI, Anthropic Claude ou Google Gemini<\/li>\n\n\n\n<li>O <code>ngrok<\/code> com um authtoken registrado ou outra maneira de expor um servidor local por <code>wss:\/\/<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">O passo a passo usa o reposit\u00f3rio  <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\"><code>sinch-voice-tutorials<\/code><\/a> . O tutorial <code>4.1-voice-relay<\/code> dele \u00e9 um servidor WebSocket em Python apoiado pelo LangChain, que l\u00ea sua configura\u00e7\u00e3o de vari\u00e1veis de ambiente e tem suporte para a OpenAI, Anthropic Claude e Google Gemini.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conectar um agente com o Voice Relay<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Clone o reposit\u00f3rio de tutoriais e acesse o exemplo do 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\">Crie um ambiente e instale as depend\u00eancias do exemplo:<\/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\">Os comandos aqui s\u00e3o para macOS e Linux. No Windows, use <code>python<\/code> no lugar de <code>python3<\/code> e ative com <code>.venv\\Scripts\\activate<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copie a configura\u00e7\u00e3o de exemplo:<\/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\">Defina um provedor e sua chave de API no arquivo <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\">O arquivo <code>.env.example<\/code> do reposit\u00f3rio usa <code>openai<\/code> como provedor padr\u00e3o. O exemplo tamb\u00e9m \u00e9 compat\u00edvel com <code>claude<\/code> para Anthropic Claude e <code>gemini<\/code> para Google Gemini, e o <code>requirements.txt<\/code> instala os pacotes para os tr\u00eas. Portanto, para mudar de provedor, basta alterar as vari\u00e1veis <code>PROVIDER<\/code> e <code>API_KEY<\/code>. Voc\u00ea tamb\u00e9m pode definir <code>MODEL<\/code>, <code>TEMPERATURE<\/code>, <code>MAX_TOKENS<\/code> e <code>PORT<\/code>, cujos padr\u00f5es aparecem no log de inicializa\u00e7\u00e3o abaixo, al\u00e9m de <code>GREETING<\/code> para alterar o <code>Hello!<\/code> com que o agente inicia a conversa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inicie o 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\">O servidor informa o prompt do sistema que carregou, depois suas configura\u00e7\u00f5es de provedor e modelo, e, em seguida, o endere\u00e7o local em que est\u00e1 escutando:<\/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\">Verifique essa sa\u00edda antes de fazer uma chamada. Uma chave de provedor ausente ou uma depend\u00eancia quebrada aparece aqui, e n\u00e3o no meio de uma conversa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O comportamento do agente vem do arquivo <code>system_prompt.md<\/code>. Edite esse arquivo para alterar a persona, o dom\u00ednio ou as instru\u00e7\u00f5es e, em seguida, reinicie o <code>server.py<\/code>, pois o prompt \u00e9 carregado na inicializa\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Sinch se conecta internamente ao seu servidor de relay, ent\u00e3o \u00e9 preciso ter um endere\u00e7o p\u00fablico. Deixe o <code>server.py<\/code> rodando no primeiro terminal e abra um segundo. Se voc\u00ea ainda n\u00e3o tiver o ngrok, instale-o e registre um authtoken na p\u00e1gina  <a href=\"https:\/\/dashboard.ngrok.com\/get-started\/your-authtoken\">Your Authtoken<\/a>  no painel do ngrok. O n\u00edvel gratuito abrange este passo a passo, e o ngrok se recusa a iniciar um t\u00fanel at\u00e9 que um token seja configurado:<\/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\">O ngrok assume o controle do terminal e imprime uma tabela de status. A linha que importa \u00e9 o endere\u00e7o de encaminhamento:<\/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\">Pegue esse endere\u00e7o, altere apenas o esquema para <code>wss:\/\/<\/code> e use-o como o endpoint do 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\">Esse valor <code>wss:\/\/<\/code> vai na configura\u00e7\u00e3o do servi\u00e7o da Sinch, n\u00e3o no servidor de relay, que permanece na porta local <code>8765<\/code>. Daqui em diante, deixe o <code>server.py<\/code> e o ngrok em execu\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O destino m\u00ednimo do Voice Relay fica assim:<\/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 para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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>Obrigat\u00f3rio\u00a0<\/td><td>Notas\u00a0<\/td><\/tr><tr><td><code>endpoint<\/code>\u00a0<\/td><td>Sim\u00a0<\/td><td>O endere\u00e7o <code>wss:\/\/<\/code> ao qual a Sinch se conecta\u00a0<\/td><\/tr><tr><td><code>ttsVoice<\/code>\u00a0<\/td><td>Sim\u00a0<\/td><td>A voz <code>Tiffany<\/code> corresponde a este tutorial. Veja o <a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/text-to-speech-voices\" target=\"_blank\" rel=\"noreferrer noopener\">refer\u00eancia de vozes compat\u00edveis<\/a>  antes de alter\u00e1-la\u00a0<\/td><\/tr><tr><td><code>sttLanguage\u00a0<\/code><\/td><td>Sim\u00a0<\/td><td>Uma tag de idioma BCP-47\u00a0<\/td><\/tr><tr><td><code>enableInterruptions<\/code>\u00a0<\/td><td>N\u00e3o\u00a0<\/td><td>O padr\u00e3o \u00e9 <code>true<\/code>\u00a0<\/td><\/tr><tr><td><code>callHeaders\u00a0<\/code><\/td><td>N\u00e3o\u00a0<\/td><td>At\u00e9 16 pares de chave\/valor, sendo que cada chave e valor deve ter 255 caracteres ou menos<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Seu servi\u00e7o precisa do n\u00famero antes que qualquer uma dessas coisas importe. No painel, abra o servi\u00e7o, acesse \u201cVoice channels\u201d e escolha \u201cConfigure\u201d na linha \u201cPhone\u201d. Em seguida, clique em \u201cAdd numbers\u201d e escolha seu n\u00famero virtual. Um n\u00famero pertence a apenas um servi\u00e7o de cada vez. Portanto, se ele j\u00e1 estiver em outro servi\u00e7o, o painel pedir\u00e1 que voc\u00ea confirme a reatribui\u00e7\u00e3o, e as chamadas recebidas para esse n\u00famero seguir\u00e3o para o novo servi\u00e7o a partir de ent\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Com o n\u00famero pronto, roteie a chamada atribuindo ao servi\u00e7o um comportamento de chamada est\u00e1tico ou um webhook que retorne a SVAML. A configura\u00e7\u00e3o est\u00e1tica faz cinco coisas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Atende a chamada de entrada.<\/li>\n\n\n\n<li>Adiciona o segmento de entrada \u00e0 <code>main-bridge<\/code>.<\/li>\n\n\n\n<li>Cria um segmento de chamada com um destino <code>VOICE_RELAY<\/code>.<\/li>\n\n\n\n<li>Adiciona o segmento de relay \u00e0 mesma <code>main-bridge<\/code> quando ele atender.<\/li>\n\n\n\n<li>Encerra o segmento de relay quando o segmento de entrada termina.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">O <code>server.py<\/code> e o ngrok est\u00e3o ocupando seus terminais agora, ent\u00e3o abra um terceiro para esta etapa. Preencha os cinco valores no topo da solicita\u00e7\u00e3o e execute-a. Se preferir usar o painel, cole o corpo SVAML interno do <code>static.txt<\/code> no editor de comportamento de chamada predefinido dele.<\/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 para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Um <code>PATCH<\/code> bem-sucedido retorna o servi\u00e7o atualizado, para que voc\u00ea possa ler seu endpoint de volta na resposta e confirmar que funcionou:<\/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 para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">O corpo SVAML interno tamb\u00e9m est\u00e1 dispon\u00edvel no arquivo  <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\">Como saber se deu certo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ligue para o n\u00famero da Sinch associado ao servi\u00e7o. Voc\u00ea dever\u00e1 ouvir <code>Hello!<\/code>, ou a sauda\u00e7\u00e3o que voc\u00ea definiu com <code>GREETING<\/code>. Em seguida, fa\u00e7a uma pergunta em voz alta e ou\u00e7a a resposta do agente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O terminal do servidor registra ambas as dire\u00e7\u00f5es do WebSocket, e esse log \u00e9 a coisa mais \u00fatil na tela durante uma primeira chamada. O meu ficou assim, reduzido a uma intera\u00e7\u00e3o:<\/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\">Vale a pena saber duas coisas sobre esse log antes da sua primeira chamada. A mensagem <code>connect<\/code> carrega <code>interruptionsEnabled<\/code>: true, que \u00e9 onde voc\u00ea pode confirmar o padr\u00e3o de interrup\u00e7\u00e3o em vez de tir\u00e1-lo da refer\u00eancia de configura\u00e7\u00e3o. E a conex\u00e3o \u00e9 fechada com o c\u00f3digo <code>1006<\/code> quando a pessoa que ligou desliga a chamada, o que parece um fechamento anormal, mas \u00e9 como um desligamento normal aparece aqui.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma interrup\u00e7\u00e3o (<code>interrupt<\/code>) com <code>reason=speech-detected<\/code> aparece em todos os turnos, porque a Sinch envia uma sempre que ouve quem est\u00e1 ligando. \u00c9 a posi\u00e7\u00e3o dela que diz algo a voc\u00ea: depois de <code>textPlaybackStop<\/code>, ela apenas marca o in\u00edcio do turno de quem ligou, enquanto entre <code>textPlaybackStart<\/code> e <code>textPlaybackStop<\/code>, ela \u00e9 uma interven\u00e7\u00e3o (barge-in). Quando eu falei por cima de uma resposta, a reprodu\u00e7\u00e3o parou e a transcri\u00e7\u00e3o seguinte foi o que eu havia dito por cima:<\/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\">Isso \u00e9 uma interface de voz na frente de um agente de IA baseado em texto, sem que voc\u00ea precise lidar com um \u00fanico quadro de \u00e1udio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Onde o seu aplicativo fica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Sinch e o servidor WebSocket trocam um pequeno protocolo JSON, com um comando por mensagem, e o <code>server.py<\/code> lida com isso para voc\u00ea. As corre\u00e7\u00f5es de transcri\u00e7\u00e3o s\u00e3o a parte que vale a pena entender antes de voc\u00ea avan\u00e7ar em cima do exemplo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Sinch envia uma transcri\u00e7\u00e3o antecipada e, depois, pode enviar uma corrigida para a mesma fala com <code>isCorrection: true<\/code>. O texto corrigido inclui o texto anterior em vez de substituir apenas a parte alterada. Isso aconteceu uma vez em tr\u00eas chamadas: <code>Thank you.<\/code> foi seguido por <code>Thank you.\\nOh<\/code>, <code>that's nice.<\/code>, e ambos foram para o modelo, de modo que o agente respondeu \u00e0 mesma fala duas vezes. Decida se vai aguardar uma corre\u00e7\u00e3o, cancelar a solicita\u00e7\u00e3o em andamento ou ignorar as corre\u00e7\u00f5es totalmente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A fronteira do aplicativo \u00e9 mais ou menos assim:<\/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>Fala de quem liga<br>    |<br>Fala para texto da Sinch<br>    |<br>Mensagem de texto do Voice Relay<br>    |<br>Agente de IA<br>    |<br>Resposta de texto do Voice Relay<br>    |<br>Texto para fala da Sinch<br>    |<br>Quem liga ouve a resposta<\/code><\/p><\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Voice Relay ou streaming de \u00e1udio bruto?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Escolha\u00a0<\/td><td>Quando\u00a0<\/td><\/tr><tr><td>Voice Relay\u00a0<\/td><td>Seu agente aceita e retorna texto, e a Sinch lida com o STT e o TTS.\u00a0<\/td><\/tr><tr><td>Voice Streams\u00a0<\/td><td>Voc\u00ea precisa do \u00e1udio bruto e possui o pr\u00f3prio pipeline de STT\/TTS.\u00a0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">O Voice Streams \u00e9 adequado para um pipeline de fala personalizado, um processador de \u00e1udio especializado ou um provedor cujo protocolo exija acesso direto ao \u00e1udio. Isso tamb\u00e9m significa que voc\u00ea tem mais responsabilidade sobre o comportamento de lat\u00eancia e falhas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Considera\u00e7\u00f5es sobre a produ\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As intera\u00e7\u00f5es por voz deixam a lat\u00eancia evidente. Uma resposta lenta do modelo gera sil\u00eancio para quem ligou. Por isso, me\u00e7a o tempo desde o evento de fala de entrada at\u00e9 a primeira resposta e at\u00e9 a resposta conclu\u00edda. Use um modelo e um prompt que se adequem a uma conversa telef\u00f4nica, em vez de otimizar apenas para obter a qualidade m\u00e1xima da resposta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O exemplo do reposit\u00f3rio espera pela resposta completa do modelo antes de enviar qualquer coisa de volta, ent\u00e3o a pessoa n\u00e3o ouve nada at\u00e9 que o modelo termine de gerar a resposta. Esse \u00e9 o primeiro lugar a se observar se as pausas parecerem longas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O exemplo tamb\u00e9m mant\u00e9m o hist\u00f3rico de conversas na mem\u00f3ria para cada conex\u00e3o do WebSocket. Isso n\u00e3o \u00e9 problema para um primeiro teste, mas n\u00e3o \u00e9 um armazenamento de conversas dur\u00e1vel. Decida qual estado pertence a uma chamada, qual pertence a um cliente e qual precisa sobreviver a uma reconex\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Interrup\u00e7\u00f5es exigem tratamento expl\u00edcito. Se a pessoa falar enquanto uma resposta est\u00e1 sendo reproduzida, voc\u00ea poder\u00e1 receber um evento de interrup\u00e7\u00e3o enquanto uma solicita\u00e7\u00e3o ao LLM ainda estiver em execu\u00e7\u00e3o. Cancele a solicita\u00e7\u00e3o onde puder, ou marque cada resposta com um ID de turno e descarte sa\u00eddas obsoletas antes de envi\u00e1-las de volta \u00e0 Sinch. O mesmo ID de turno lida com transcri\u00e7\u00f5es corrigidas, que chegam como uma segunda mensagem de <code>text<\/code> para uma fala que voc\u00ea j\u00e1 enviou ao modelo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O exemplo local tamb\u00e9m precisa de um tratamento de falhas mais robusto antes do uso em produ\u00e7\u00e3o:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Envie uma resposta curta de fallback quando o provedor do modelo falhar.<\/li>\n\n\n\n<li>Persista o estado da conversa quando a chamada precisar sobreviver \u00e0 reinicializa\u00e7\u00e3o de um processo.<\/li>\n\n\n\n<li>Mantenha o endpoint do WebSocket dispon\u00edvel por toda a dura\u00e7\u00e3o da chamada.<\/li>\n\n\n\n<li>Registre os identificadores de chamada, sess\u00e3o, conex\u00e3o e tempo do modelo sem registrar o conte\u00fado sens\u00edvel da conversa desnecessariamente.<\/li>\n\n\n\n<li>Use credenciais de cliente OAuth 2.0 para acesso \u00e0 API em produ\u00e7\u00e3o. A autentica\u00e7\u00e3o b\u00e1sica \u00e9 \u00fatil para testes iniciais.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Solu\u00e7\u00e3o de problemas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verifique a configura\u00e7\u00e3o do provedor antes de fazer uma chamada. Uma chave de LLM inv\u00e1lida ou ausente se manifesta como uma chamada silenciosa em vez de um erro, pois o modelo n\u00e3o \u00e9 chamado at\u00e9 o primeiro turno. Portanto, confirme se <code>PROVIDER<\/code> e <code>API_KEY<\/code> correspondem entre si no arquivo <code>.env<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A URL gratuita do ngrok muda quando o t\u00fanel \u00e9 reiniciado. Atualize o <code>endpoint<\/code> na configura\u00e7\u00e3o do servi\u00e7o da API de voz v2 sempre que isso acontecer, ou a Sinch n\u00e3o conseguir\u00e1 acessar o servidor atual. N\u00e3o \u00e9 preciso reiniciar o <code>server.py<\/code> para isso.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Status de pr\u00e9-visualiza\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os termos de pr\u00e9-visualiza\u00e7\u00e3o permitem testes, avalia\u00e7\u00e3o, uso comercial antecipado e tr\u00e1fego ao vivo, e afirmam que a plataforma \u00e9 projetada para ter suporte para volumes de n\u00edvel de produ\u00e7\u00e3o. O servi\u00e7o \u00e9 fornecido &#8220;no estado em que se encontra&#8221; e &#8220;conforme a disponibilidade&#8221;. Limites de uso podem ser aplicados, e nenhum SLA se aplica. A Sinch pode adicionar funcionalidades, e altera\u00e7\u00f5es incompat\u00edveis n\u00e3o podem ser descartadas antes da disponibilidade geral.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que vem a seguir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O Voice Relay \u00e9 um dos caminhos para a API de voz v2. O mesmo modelo de plataforma tamb\u00e9m \u00e9 compat\u00edvel com:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alertas de voz de sa\u00edda com convers\u00e3o de texto para fala<\/li>\n\n\n\n<li>Detec\u00e7\u00e3o de secret\u00e1ria eletr\u00f4nica<\/li>\n\n\n\n<li>Chamadas em lote com controle de ritmo (call pacing)<\/li>\n\n\n\n<li>Grava\u00e7\u00e3o de chamadas e transcri\u00e7\u00e3o<\/li>\n\n\n\n<li>Mascaramento de n\u00fameros<\/li>\n\n\n\n<li>Conex\u00f5es SIP<\/li>\n\n\n\n<li>Streaming de \u00e1udio bruto<\/li>\n\n\n\n<li>Controle de chamadas ao vivo por meio de SVAML e webhooks<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A <a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">O reposit\u00f3rio de tutoriais da API de voz v2 da Sinch<\/a> tem exemplos pr\u00e1ticos para esses caminhos. Comece pelo tutorial <code>4.1-voice-relay<\/code> para um agente baseado em texto e, em seguida, passe para o <code>4.2-stream-audio<\/code> quando precisar de acesso direto ao stream de \u00e1udio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A API de voz v2 oferece a um agente de texto existente um roteamento para uma intera\u00e7\u00e3o de voz ao vivo, sem transform\u00e1-lo em um sistema de processamento de \u00e1udio. Clone o <code>4.1-voice-relay<\/code>, aponte o <code>system_prompt.md<\/code> para o prompt do seu pr\u00f3prio agente e ligue para o n\u00famero.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recursos adicionais<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/overview\">Vis\u00e3o geral da API de voz v2 da Sinch<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/getting-started\">Primeiros passos com a API de voz v2<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developers.sinch.com\/docs\/voice-2.0\/api-reference\/voice\">Refer\u00eancia da 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\">Refer\u00eancia de vozes de texto para fala<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/sinch\/sinch-voice-tutorials\">Reposit\u00f3rio de tutoriais da 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":[309],"class_list":["post-211318","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-desenvolvedores"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch<\/title>\n<meta name=\"description\" content=\"Conecte agentes de IA a chamadas telef\u00f4nicas ao vivo sem infraestrutura de telecomunica\u00e7\u00f5es com a API de voz v2 da Sinch e o Voice Relay. Passo a passo, do clone a uma chamada funcionando.\" \/>\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\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch\" \/>\n<meta property=\"og:description\" content=\"Conecte agentes de IA a chamadas telef\u00f4nicas ao vivo sem infraestrutura de telecomunica\u00e7\u00f5es com a API de voz v2 da Sinch e o Voice Relay. Passo a passo, do clone a uma chamada funcionando.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sinch.com\/pt\/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=\"Est. tempo de leitura\" \/>\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\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\"},\"author\":{\"name\":\"Gunnar Grosch\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\"},\"headline\":\"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch\",\"datePublished\":\"2026-09-25T10:35:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\"},\"wordCount\":2632,\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/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\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\",\"name\":\"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/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:25+00:00\",\"description\":\"Conecte agentes de IA a chamadas telef\u00f4nicas ao vivo sem infraestrutura de telecomunica\u00e7\u00f5es com a API de voz v2 da Sinch e o Voice Relay. Passo a passo, do clone a uma chamada funcionando.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/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\\\/pt\\\/blog\\\/ai-agent-phone-calls-voice-api-relay\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sinch.com\\\/pt\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/sinch.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/\",\"name\":\"Sinch\",\"description\":\"Envio de mensagens SMS, Voz, E-mail, V\u00eddeo & APIs de verifica\u00e7\u00e3o | Sinch\",\"publisher\":{\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sinch.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#organization\",\"name\":\"Sinch\",\"url\":\"https:\\\/\\\/sinch.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/sinch.com\\\/pt\\\/#\\\/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\\\/pt\\\/#\\\/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\\\/pt\\\/#\\\/schema\\\/person\\\/b2bde1c2728a21bc953ea0e129936c08\",\"name\":\"Gunnar Grosch\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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":"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch","description":"Conecte agentes de IA a chamadas telef\u00f4nicas ao vivo sem infraestrutura de telecomunica\u00e7\u00f5es com a API de voz v2 da Sinch e o Voice Relay. Passo a passo, do clone a uma chamada funcionando.","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\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/","og_locale":"pt_BR","og_type":"article","og_title":"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch","og_description":"Conecte agentes de IA a chamadas telef\u00f4nicas ao vivo sem infraestrutura de telecomunica\u00e7\u00f5es com a API de voz v2 da Sinch e o Voice Relay. Passo a passo, do clone a uma chamada funcionando.","og_url":"https:\/\/sinch.com\/pt\/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":{"Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/#article","isPartOf":{"@id":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/"},"author":{"name":"Gunnar Grosch","@id":"https:\/\/sinch.com\/pt\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08"},"headline":"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch","datePublished":"2026-09-25T10:35:25+00:00","mainEntityOfPage":{"@id":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/"},"wordCount":2632,"publisher":{"@id":"https:\/\/sinch.com\/pt\/#organization"},"image":{"@id":"https:\/\/sinch.com\/pt\/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":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/","url":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/","name":"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch","isPartOf":{"@id":"https:\/\/sinch.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/#primaryimage"},"image":{"@id":"https:\/\/sinch.com\/pt\/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:25+00:00","description":"Conecte agentes de IA a chamadas telef\u00f4nicas ao vivo sem infraestrutura de telecomunica\u00e7\u00f5es com a API de voz v2 da Sinch e o Voice Relay. Passo a passo, do clone a uma chamada funcionando.","breadcrumb":{"@id":"https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sinch.com\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/sinch.com\/pt\/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\/pt\/blog\/ai-agent-phone-calls-voice-api-relay\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sinch.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/sinch.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Conectar agentes de IA a chamadas telef\u00f4nicas com a API de voz v2 da Sinch"}]},{"@type":"WebSite","@id":"https:\/\/sinch.com\/pt\/#website","url":"https:\/\/sinch.com\/pt\/","name":"Sinch","description":"Envio de mensagens SMS, Voz, E-mail, V\u00eddeo & APIs de verifica\u00e7\u00e3o | Sinch","publisher":{"@id":"https:\/\/sinch.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sinch.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/sinch.com\/pt\/#organization","name":"Sinch","url":"https:\/\/sinch.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/sinch.com\/pt\/#\/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\/pt\/#\/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\/pt\/#\/schema\/person\/b2bde1c2728a21bc953ea0e129936c08","name":"Gunnar Grosch","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/pt\/wp-json\/wp\/v2\/blog\/211318","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/users\/93"}],"version-history":[{"count":0,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog\/211318\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/media\/211257"}],"wp:attachment":[{"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/media?parent=211318"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/tags?post=211318"},{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/sinch.com\/pt\/wp-json\/wp\/v2\/blog_category?post=211318"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}