Skip to content

Texto para Fala (TTS)

Os serviços de TTS (Text-to-Speech) do SipPulse AI convertem texto escrito em áudio com som natural, permitindo que suas aplicações "falem" com seus usuários. Nossa plataforma oferece modelos de provedores como OpenAI, ElevenLabs, Microsoft e Fish Audio, cada um com um conjunto distinto de vozes e características.

Para informações detalhadas sobre preços e especificações de cada modelo, consulte nossa página de Pricing.

1. Playground Interativo de Texto para Fala

O Playground Interativo de Texto para Fala (acesse aqui) é a ferramenta ideal para experimentar e validar os modelos TTS de forma intuitiva antes de integrá-los via API:

  • Seleção de Modelos e Vozes: Explore os diversos modelos de síntese de fala (OpenAI, ElevenLabs, Microsoft, Fish Audio) e as vozes disponíveis para cada um.
  • Entrada de Texto: Insira o texto que deseja converter em áudio.
  • Ajuste de Parâmetros: Configure parâmetros como velocidade (speed) e o formato de saída do áudio (response_format).
  • Geração e Reprodução Imediata: Execute a síntese e ouça o áudio resultante diretamente na interface.
  • Visualização de Código: Obtenha exemplos de código em cURL, Python e JavaScript, pré-configurados com o modelo, voz e parâmetros que você testou, facilitando a implementação em suas aplicações.

O Playground é uma excelente maneira de descobrir a voz perfeita para seu projeto e entender como os diferentes parâmetros afetam o resultado final da síntese de fala.

2. Consumo via API REST

A integração da funcionalidade de TTS em suas aplicações é realizada através de chamadas à nossa API REST.

2.1. Sintetizar Fala

Utilize o endpoint /v1/tts/generate para converter uma string de texto em dados de áudio.

Endpoint: POST /v1/tts/generate

Corpo da Requisição (JSON):

  • input (string, obrigatório): O texto a ser convertido em fala.
  • model (string, obrigatório): O nome do modelo de TTS a ser utilizado (e.g., "tts-1" para OpenAI, "eleven_multilingual_v2" para ElevenLabs, "fish-s2.1-pro" para Fish Audio, ou um modelo específico da Microsoft). Consulte o endpoint /v1/tts/models para a lista de modelos disponíveis.
  • voice (string, obrigatório): A chave (key) da voz específica a ser usada para a síntese (e.g., "alloy" para OpenAI TTS; uma ID de voz da ElevenLabs ou Fish Audio; ou um nome de voz da Microsoft como "pt-BR-FranciscaNeural"). Consulte o endpoint /v1/tts/voices para obter as chaves das vozes disponíveis para cada modelo.
  • response_format (string, opcional, padrão: "mp3"): O formato do arquivo de áudio de saída. Valores suportados: "mp3", "opus", "aac", "flac", "wav", "pcm".
  • speed (float, opcional, padrão: 1.0): Controla a velocidade da fala. Valores típicos entre 0.25 e 4.0. O intervalo exato pode variar conforme o modelo.

Parâmetros Dinâmicos

Os parâmetros disponíveis variam conforme o modelo. Use o Playground para ver quais parâmetros são expostos por cada modelo. O Fish Audio S2.1 Pro expõe speed e response_format; parâmetros avançados específicos do provider usam padrões estáveis da plataforma.

Resposta (JSON):

  • Sucesso (200 OK):
    json
    {
      "filename": "string", // Nome do arquivo gerado
      "usage": {}, // Informações de uso (pode variar)
      "performance": {}, // Informações de performance (pode variar)
      "unit": "string", // Unidade de custo (e.g., "characters")
      "stream": "string", // URL para streaming do áudio
      "download": "string" // URL para download do áudio
    }
  • Erro: Resposta JSON com código de status HTTP apropriado e detalhes do erro no corpo.
bash
# Exemplo: Sintetizar fala
curl -X POST 'https://api.sippulse.ai/v1/tts/generate' \
  -H 'api-key: $SIPPULSE_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "input": "Olá, mundo! Esta é uma demonstração da síntese de fala.",
    "model": "tts-1",
    "voice": "alloy",
    "response_format": "mp3",
    "speed": 1.1
  }'
python
import os
import requests
import json

def synthesize_speech(
    text_input: str,
    model_id: str,
    voice_key: str,
    response_format: str = "mp3",
    speed: float = 1.0
) -> dict | None:
    """
    Sintetiza fala a partir de texto utilizando a API SipPulse AI.
    """
    api_url = "https://api.sippulse.ai/v1/tts/generate"
    api_key = os.getenv("SIPPULSE_API_KEY")

    if not api_key:
        print("Erro: A variável de ambiente SIPPULSE_API_KEY não está configurada.")
        return None

    headers = {
        "api-key": api_key,
        "Content-Type": "application/json"
    }
    payload = {
        "input": text_input,
        "model": model_id,
        "voice": voice_key,
        "response_format": response_format,
        "speed": speed
    }

    try:
        response = requests.post(api_url, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        return response.json()
    except requests.exceptions.HTTPError as e:
        error_content = e.response.text
        try:
            error_json = e.response.json()
            error_content = json.dumps(error_json, indent=2)
        except json.JSONDecodeError:
            pass
        print(f"Erro na API: {e.response.status_code}\n{error_content}")
    except Exception as e:
        print(f"Ocorreu um erro inesperado: {e}")
    return None

if __name__ == "__main__":
    tts_result = synthesize_speech(
        text_input="Testando a síntese de voz com a API.",
        model_id="tts-1", # Exemplo com modelo OpenAI
        voice_key="nova",    # Exemplo com voz OpenAI
        response_format="mp3",
        speed=1.0
    )
    if tts_result:
        print("Síntese bem-sucedida:")
        print(json.dumps(tts_result, indent=2, ensure_ascii=False))
        print(f"Link para download: {tts_result.get('download')}")
        print(f"Link para stream: {tts_result.get('stream')}")
javascript
// Node.js com fetch
async function synthesizeSpeech({
  textInput,
  modelId,
  voiceKey,
  responseFormat = "mp3",
  speed = 1.0,
}) {
  const apiUrl = "https://api.sippulse.ai/v1/tts/generate";
  const apiKey = process.env.SIPPULSE_API_KEY;

  if (!apiKey) {
    console.error("A variável de ambiente SIPPULSE_API_KEY não está configurada.");
    return null;
  }

  const payload = {
    input: textInput,
    model: modelId,
    voice: voiceKey,
    response_format: responseFormat,
    speed,
  };

  try {
    const response = await fetch(apiUrl, {
      method: "POST",
      headers: {
        "api-key": apiKey,
        "Content-Type": "application/json",
      },
      body: JSON.stringify(payload),
    });

    if (!response.ok) {
      let errorBody = await response.text();
      try {
        errorBody = JSON.stringify(JSON.parse(errorBody), null, 2);
      } catch (e) { /* não é JSON */ }
      throw new Error(`Erro na API: ${response.status} ${response.statusText}\n${errorBody}`);
    }
    return response.json();
  } catch (error) {
    console.error("Falha ao sintetizar fala:", error);
    return null;
  }
}

// Exemplo de uso:
// (async () => {
//   const result = await synthesizeSpeech({
//     textInput: "Olá, JavaScript falando aqui!",
//     modelId: "eleven_multilingual_v2", // Exemplo com ElevenLabs
//     voiceKey: "VOICE_ID_ELEVENLABS", // Substitua pela ID da voz desejada da ElevenLabs
//     responseFormat: "opus",
//     speed: 0.9
//   });
//   if (result) {
//     console.log("Resultado da Síntese:", JSON.stringify(result, null, 2));
//   }
// })();

2.2. Listar Modelos de TTS Disponíveis

Para consultar os modelos de TTS (Text-to-Speech) atualmente disponíveis para sua organização:

Endpoint: GET /v1/tts/models

Parâmetros de Query:

  • status (string, opcional): Filtra modelos pelo status (active ou inactive). Padrão: active.
bash
curl -X GET 'https://api.sippulse.ai/v1/tts/models?status=active' \
  -H 'api-key: $SIPPULSE_API_KEY' \
  -H 'Accept: application/json'
python
import os
import requests

def list_tts_models(status: str = "active") -> list | None:
  """
  Lista os modelos de TTS disponíveis na API SipPulse AI.
  """
  api_url = "https://api.sippulse.ai/v1/tts/models"
  api_key = os.getenv("SIPPULSE_API_KEY")

  if not api_key:
    print("Erro: A variável de ambiente SIPPULSE_API_KEY não está configurada.")
    return None

  headers = {
    "api-key": api_key,
    "Accept": "application/json"
  }
  params = {"status": status}

  try:
    response = requests.get(api_url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()
  except requests.exceptions.HTTPError as e:
    print(f"Erro na API: {e.response.status_code}")
  return None

# Uso
models = list_tts_models()
if models:
  for model in models:
    print(f"{model['name']} ({model['provider']})")
javascript
async function listTTSModels(status = "active") {
  const apiUrl = `https://api.sippulse.ai/v1/tts/models?status=${status}`;
  const apiKey = process.env.SIPPULSE_API_KEY;

  if (!apiKey) {
    console.error("A variável de ambiente SIPPULSE_API_KEY não está configurada.");
    return null;
  }

  try {
    const response = await fetch(apiUrl, {
      method: "GET",
      headers: {
        "api-key": apiKey,
        "Accept": "application/json",
      },
    });

    if (!response.ok) {
      throw new Error(`Erro na API: ${response.status}`);
    }
    return response.json();
  } catch (error) {
    console.error("Falha ao listar modelos TTS:", error);
    return null;
  }
}

// Uso
// const models = await listTTSModels();
// models?.forEach(m => console.log(`${m.name} (${m.provider})`));

Exemplo de Resposta (JSON):

json
[
  {
    "name": "tts-1",
    "status": "active",
    "provider": "openai"
  },
  {
    "name": "eleven_multilingual_v2",
    "status": "active",
    "provider": "elevenlabs"
  },
  {
    "name": "azure-tts",
    "status": "active",
    "provider": "microsoft"
  },
  {
    "name": "fish-s2.1-pro",
    "status": "active",
    "provider": "fishaudio"
  }
]

2.3. Listar Vozes Disponíveis

Para consultar as vozes disponíveis para síntese. A resposta é um Record onde a chave é o nome do modelo e o valor é uma lista de suas vozes.

Endpoint: GET /v1/tts/voices

bash
curl -X GET 'https://api.sippulse.ai/v1/tts/voices' \
  -H 'api-key: $SIPPULSE_API_KEY' \
  -H 'Accept: application/json'
python
import os
import requests

def list_tts_voices(model: str = None) -> dict | None:
  """
  Lista as vozes disponíveis para modelos TTS.
  Opcionalmente filtra por nome do modelo.
  """
  api_url = "https://api.sippulse.ai/v1/tts/voices"
  api_key = os.getenv("SIPPULSE_API_KEY")

  if not api_key:
    print("Erro: A variável de ambiente SIPPULSE_API_KEY não está configurada.")
    return None

  headers = {
    "api-key": api_key,
    "Accept": "application/json"
  }
  params = {"model": model} if model else {}

  try:
    response = requests.get(api_url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()
  except requests.exceptions.HTTPError as e:
    print(f"Erro na API: {e.response.status_code}")
  return None

# Uso
voices = list_tts_voices()
if voices:
  for model_name, voice_list in voices.items():
    print(f"\n{model_name}:")
    for voice in voice_list[:3]:  # Mostra as 3 primeiras vozes
      print(f"  - {voice['name']} ({voice['key']}) - {voice['languages']}")
javascript
async function listTTSVoices(model = null) {
  const params = model ? `?model=${model}` : "";
  const apiUrl = `https://api.sippulse.ai/v1/tts/voices${params}`;
  const apiKey = process.env.SIPPULSE_API_KEY;

  if (!apiKey) {
    console.error("A variável de ambiente SIPPULSE_API_KEY não está configurada.");
    return null;
  }

  try {
    const response = await fetch(apiUrl, {
      method: "GET",
      headers: {
        "api-key": apiKey,
        "Accept": "application/json",
      },
    });

    if (!response.ok) {
      throw new Error(`Erro na API: ${response.status}`);
    }
    return response.json();
  } catch (error) {
    console.error("Falha ao listar vozes TTS:", error);
    return null;
  }
}

// Uso
// const voices = await listTTSVoices("tts-1");
// Object.entries(voices).forEach(([model, voiceList]) => {
//   console.log(`${model}: ${voiceList.length} vozes`);
// });

Exemplo de Resposta (JSON):

json
{
  "tts-1": [
    { "name": "Alloy", "key": "alloy", "languages": ["multi"] },
    { "name": "Echo", "key": "echo", "languages": ["multi"] },
    { "name": "Nova", "key": "nova", "languages": ["multi"] }
  ],
  "eleven_multilingual_v2": [
    { "name": "Rachel", "key": "21m00Tcm4TlvDq8ikWAM", "languages": ["multi"] },
    { "name": "Adam", "key": "pNInz6obpgDQGcFmaJgB", "languages": ["multi"] }
  ],
  "azure-tts": [
    { "name": "Francisca", "key": "pt-BR-FranciscaNeural", "languages": ["pt-BR"] },
    { "name": "Emma", "key": "en-US-EmmaNeural", "languages": ["en-US"] }
  ],
  "fish-s2.1-pro": [
    { "name": "Exemplo de Voz Fish", "key": "FISH_VOICE_ID", "languages": ["pt"] }
  ]
}

Utilize a key da voz desejada no parâmetro voice da requisição de síntese (/v1/tts/generate).

3. Formatos de Áudio Suportados (response_format)

O SipPulse AI TTS suporta os seguintes formatos de saída de áudio:

FormatoTipo MIMETamanhoQualidadeMelhor Para
mp3audio/mpegPequenoBoaAplicações web, uso geral
opusaudio/oggMuito pequenoExcelenteStreaming em tempo real, VoIP
aacaudio/aacPequenoMuito boaApps mobile, iOS
flacaudio/flacGrandeLosslessArquivamento, áudio profissional
wavaudio/wavMuito grandeLosslessEdição de áudio, processamento
pcmaudio/L16Muito grandeRawSistemas de telefonia, processamento customizado

Recomendações de Formato

  • Aplicações web: Use mp3 para ampla compatibilidade
  • Tempo real/streaming: Use opus para melhor compressão
  • Apps mobile: Use aac para iOS ou opus para Android
  • Telefonia/URA: Use pcm (24kHz mono) para integração direta

A escolha do formato depende dos requisitos da sua aplicação em termos de qualidade, tamanho de arquivo e compatibilidade com players de áudio.

4. Integração com SDK da OpenAI

Para desenvolvedores que preferem utilizar o SDK oficial da OpenAI, o SipPulse AI oferece compatibilidade. Configure o baseURL do cliente OpenAI para o endpoint do SipPulse AI: https://api.sippulse.ai/v1/openai.

Ao usar esta integração para TTS, a API do SipPulse AI retornará diretamente o stream binário do áudio no formato solicitado, em vez do objeto JSON com links de download/stream. Isso se alinha com o comportamento padrão do SDK da OpenAI para síntese de fala.

O endpoint de compatibilidade com o SDK da OpenAI suporta os parâmetros padrão definidos pela API da OpenAI. A disponibilidade dos parâmetros pode variar dependendo do modelo específico.

python
import os
from openai import OpenAI

# Configura o cliente OpenAI para usar o endpoint do SipPulse AI
client = OpenAI(
  api_key=os.environ.get("SIPPULSE_API_KEY"),
  base_url="https://api.sippulse.ai/v1/openai" # Endpoint de compatibilidade do SipPulse AI
)

try:
  response = client.audio.speech.create(
    model="tts-1",
    voice="alloy",
    input="Olá, este áudio foi gerado usando o SDK da OpenAI através do SipPulse AI!",
    response_format="mp3",
    speed=1.0  # Opcional: 0.25 a 4.0
  )
  # A resposta 'response' contém o stream de áudio.
  # Você pode salvar em um arquivo:
  response.stream_to_file("sippulse_openai_sdk_output.mp3")
  print("Áudio gerado e salvo como sippulse_openai_sdk_output.mp3")

except Exception as e:
  print(f"Ocorreu um erro: {e}")
javascript
// Exemplo de uso com o SDK JavaScript da OpenAI em Node.js
import OpenAI from "openai";
import fs from "fs";
import path from "path";

const openai = new OpenAI({
  apiKey: process.env.SIPPULSE_API_KEY,
  baseURL: "https://api.sippulse.ai/v1/openai"
});

async function main() {
  try {
    const speechStream = await openai.audio.speech.create({
      model: "tts-1",
      voice: "nova",
      input: "Testando a síntese de fala com o SDK JavaScript e SipPulse AI.",
      response_format: "opus"
    });

    // speechStream é um ReadableStream. Você pode salvá-lo em um arquivo.
    const filePath = path.resolve("./sippulse_openai_sdk_output.opus");
    const writer = fs.createWriteStream(filePath);

    // Node.js < 18 (sem ReadableStream.toWeb()):
    // speechStream.body.pipe(writer);
    // await new Promise((resolve, reject) => {
    //   writer.on("finish", resolve);
    //   writer.on("error", reject);
    // });

    // Node.js >= 18 (com ReadableStream.toWeb() e Readable.fromWeb())
    // Ou se o SDK retornar um ReadableStream do Node diretamente:
    for await (const chunk of speechStream) {
        writer.write(chunk);
    }
    writer.end();
    // Alternativamente, se speechStream.body for um stream web:
    // const nodeStream = Readable.fromWeb(speechStream.body);
    // nodeStream.pipe(writer);
    // ... (código de promise para aguardar 'finish')


    console.log(`Áudio gerado e salvo como ${filePath}`);

  } catch (error) {
    console.error("Ocorreu um erro:", error);
  }
}

main();

Nota: O endpoint de compatibilidade do SDK OpenAI suporta modelos TTS da OpenAI (tts-1, tts-1-hd) com suas vozes padrão. Para acessar outros provedores como ElevenLabs ou Azure, use a API REST nativa (/v1/tts/generate).

5. Boas Práticas para Síntese de Fala

  • Texto Claro e Bem Estruturado: Forneça texto gramaticalmente correto e bem pontuado para a melhor prosódia e inteligibilidade.
  • Escolha Adequada de Voz e Idioma: Utilize os endpoints /v1/tts/models e /v1/tts/voices para selecionar a combinação de modelo e voz que melhor se alinham com seu público-alvo e o contexto da aplicação.
  • Experimente Formatos de Saída: Teste diferentes response_format para encontrar o equilíbrio ideal entre qualidade sonora e tamanho de arquivo.
  • Gerenciamento de Erros Robusto: Implemente tratamento de erros detalhado em sua aplicação para lidar com possíveis falhas na API.
  • Caching: Para textos frequentemente sintetizados, armazene os links de download ou stream (ou o próprio áudio, se baixado) para evitar requisições repetidas e otimizar custos e latência.

6. Perguntas Frequentes (FAQ)

P: Como os custos são calculados para o serviço de TTS?R: A unidade de cobrança depende do modelo. O Fish Audio S2.1 Pro é cobrado pelo tamanho exato, em bytes UTF-8, do campo input; outros modelos podem ser cobrados por caracteres ou tempo. Consulte a página de Pricing e o seu dashboard de conta para um detalhamento preciso.

P: Posso usar os links de download e stream múltiplas vezes?R: Sim, os links fornecidos na resposta da API /v1/tts/generate podem ser usados para acessar o áudio gerado. No entanto, a disponibilidade desses links a longo prazo pode depender das políticas de armazenamento do SipPulse AI. Para uso persistente, recomenda-se baixar o áudio.