xAI Voice (Texto para Fala)
Use o Text to Speech no OCI Generative AI para converter texto em áudio falado com o xAI Voice.
Você pode converter texto em fala de duas maneiras:
- API de Fala de Áudio compatível com OCI OpenAI para geração de fala baseada em solicitação.
- WebSocket Streaming para entrada de texto de streaming e saída de áudio.
Use a opção API para enviar texto e receber um arquivo de áudio. Use o streaming WebSocket para enviar texto de forma incremental e receber blocos de áudio à medida que são gerados.
Modelo Suportado
O modelo Texto para Fala só está disponível no modo sob demanda.
| Modelo | Descrição |
|---|---|
xai.grok-tts |
Modelo de texto para fala para gerar áudio falado a partir do texto. |
Regiões para este Modelo
Para regiões suportadas, tipos de ponto final (clusters de IA sob demanda ou dedicados) e hospedagem (OCI Generative AI ou chamadas externas) para esse modelo, consulte a página Modelos por Região. Para obter detalhes sobre as regiões, consulte a página Regiões de IA Generativa.
Vozes
As seguintes vozes estão disponíveis. Nomes de voz não fazem distinção entre maiúsculas e minúsculas. Por exemplo, ara, Ara e ARA são aceitos.
| Voz | Descrição |
|---|---|
ara |
Quente e conversacional |
eve |
Energético e otimista |
leo |
Autorizado e forte |
rex |
Clara e profissional |
sal |
Suave e equilibrada |
Opções de Acesso
Você pode converter texto em fala usando a API do OCI OpenAI-compatible Audio Speech ou streaming WebSocket.
| Opção de acesso | Ponto Final | Estilo de parâmetro | Usar quando |
|---|---|---|---|
| API de fala de áudio compatível com OCI OpenAI | https://inference.generativeai.{region}.oci.oraclecloud.com/openai/v1 |
Formato de solicitação de fala de áudio compatível com OpenAI, com opções específicas de xAI em extra_body |
Você deseja enviar texto e receber um arquivo de áudio em uma única solicitação. |
| Streaming do WebSocket | wss://inference.generativeai.{region}.oci.oraclecloud.com/xai/v1/tts |
parâmetros de streaming de texto para fala xAI | Você deseja transmitir a entrada de texto e receber blocos de áudio à medida que são gerados. |
A API de Áudio Speech compatível com OCI OpenAI não suporta streaming em tempo real. Para streaming de texto para fala, use o ponto final WebSocket.
API de fala de áudio compatível com OCI OpenAI
Use a API de Audio Speech compatível com o OCI OpenAI para gerar áudio de uma única solicitação.
- Ponto final compatível com OCI OpenAI
-
https://inference.generativeai.{region}.oci.oraclecloud.com/openai/v1
Na solicitação, chame o modelo xai.grok-tts e use uma das vozes do Grok Voice listadas neste tópico. Não use nomes de modelo de texto para fala OpenAI ou nomes de voz OpenAI.
Especifique estes valores na solicitação de fala de áudio compatível com OpenAI padrão:
model:xai.grok-ttsinput: Texto para conversão em falavoice: Uma das vozes do Grok Voice suportadas, comoara,eve,leo,rexousalresponse_format: Formato de resposta de áudio, comomp3
Coloque opções específicas de xAI, como language e output_format, em extra_body.
Por exemplo, use extra_body para definições como:
languageoutput_format.sample_rateoutput_format.bit_rate
Ao usar a API de Fala de Áudio compatível com OpenAI da OCI, use a estrutura de solicitação compatível com OpenAI com o ponto final da OCI, mas use o modelo xai.grok-tts e as vozes xAI suportadas. Não use vozes somente OpenAI, nomes de modelo OpenAI TTS ou objetos de voz personalizados OpenAI.
Streaming do WebSocket
Use o streaming WebSocket para fluxos de trabalho de texto para fala em tempo real ou interativos. Com esta opção, você envia texto para o serviço como mensagens e recebe áudio como partes de áudio codificadas por base64.
- Ponto final do OCI WebSocket:
-
wss://inference.generativeai.{region}.oci.oraclecloud.com/xai/v1/tts
Não use o ponto final xAI diretamente.
Configure a conexão WebSocket com parâmetros de consulta de texto para fala xAI, como:
| Parâmetro | Descrição |
|---|---|
voice |
Voz para usar na geração de fala. |
language |
Código de idioma, como en, ou auto para detecção automática de idioma. |
codec |
Codec de áudio, como mp3, wav, pcm, mulaw ou alaw. |
sample_rate |
Taxa de amostragem de áudio. |
bit_rate |
Taxa de bits MP3. Aplica-se à saída MP3. |
optimize_streaming_latency |
Otimiza para menor tempo para o primeiro áudio quando ativado. |
text_normalization |
Normaliza o texto escrito na forma falada quando ativado. |
Depois de abrir a conexão WebSocket, envie texto usando mensagens text.delta. Envie text.done para indicar o fim da declaração atual.
O serviço retorna:
| Evento | Descrição |
|---|---|
audio.delta |
Parte de áudio codificada em Base64. |
audio.done |
A geração de áudio para a declaração atual foi concluída. |
error |
Mensagem de erro do serviço. |
A conexão WebSocket pode permanecer aberta após o audio.done, para que você possa enviar outra sequência text.delta e text.done sem se reconectar.
Para streaming WebSocket, use parâmetros de streaming de texto para fala xAI com o ponto final OCI WebSocket.
Uso do Parâmetro
Os parâmetros que você usa dependem da opção de acesso.
Para a API do OCI OpenAI-compatible Audio Speech, use o formato de solicitação de fala de áudio compatível com OpenAI. Defina model como xai.grok-tts, use uma voz xAI suportada e coloque definições específicas de xAI em extra_body.
Para WebSocket Streaming, use parâmetros de streaming de texto para fala xAI. Configure voz, idioma, codec, taxa de amostragem e taxa de bits como parâmetros de consulta do WebSocket. Envie texto com mensagens text.delta e conclua cada declaração com text.done.
Formatos de Saída
O Text to Speech suporta formatos de áudio comuns para diferentes casos de uso.
| Formato | Uso do caso |
|---|---|
mp3 |
Uso geral e ampla compatibilidade |
wav |
Fluxos de trabalho de áudio e edição de maior fidelidade |
pcm |
Áudio bruto para processamento em tempo real |
mulaw |
Fluxos de trabalho de telefonia |
alaw |
Fluxos de trabalho de telefonia |
Para a API do OCI OpenAI-compatible Audio Speech, defina o formato de áudio em response_format e coloque as configurações de áudio xAI, como taxa de amostragem e taxa de bits, em extra_body.output_format. Para WebSocket Streaming, defina o formato de áudio, a taxa de amostragem e a taxa de bits como parâmetros de consulta ao abrir a conexão.
A taxa de bits aplica-se à saída MP3.
Linguagens
O Text to Speech suporta vários idiomas. Use um código de idioma suportado, como en, ou use auto para detecção automática de idioma quando suportado pelo método de acesso.
Limites
Os limites de texto para fala dependem da opção de acesso.
| Limite | API de fala de áudio compatível com OCI OpenAI | Streaming do WebSocket |
|---|---|---|
| Limite de caracteres | Até 15.000 caracteres por solicitação | Até 15.000 caracteres por mensagem text.delta |
| Conteúdo mais longo | Divida o conteúdo em solicitações menores e combine a saída de áudio | Dividir conteúdo em várias mensagens text.delta ou declarações separadas |
| Limite de taxa | 600 solicitações por minuto ou 10 solicitações por segundo | 600 solicitações por minuto ou 10 solicitações por segundo |
| Solicitações ou sessões simultâneas | Até 100 solicitações simultâneas | Até 50 sessões simultâneas |
| TTL de permissão de sessão | Não aplicável | 600 segundos |
Para texto mais longo, divida o conteúdo em segmentos lógicos, como parágrafos ou frases. Isso ajuda a manter cada solicitação ou bloco de texto dentro do limite de caracteres e facilita a combinação do áudio gerado em ordem.
Para streaming do WebSocket, envie texto usando mensagens text.delta e envie text.done quando a declaração atual estiver concluída. Cada mensagem text.delta deve permanecer dentro do limite de caracteres.
Datas de Lançamento e Baixa do OCI
Para datas de liberação e baixa e opções de modelo de substituição, consulte Datas de Baixa do Modelo (Modo Sob Demanda).
Links da Documentação Externa
- Texto para Fala no xAI
- Streaming TTS WebSocket na xAI
- Texto para Fala na OpenAI
Exemplos
Os exemplos a seguir mostram as duas opções de acesso suportadas. O exemplo compatível com OCI OpenAI usa o ponto final compatível com OCI OpenAI e o modelo xai.grok-tts. O exemplo WebSocket usa o ponto final xAI WebSocket da OCI e os parâmetros de streaming xAI.
- API de fala de áudio compatível com OCI OpenAI
-
from openai import OpenAI from oci_openai import OciSessionAuth client = OpenAI( api_key="<not-used>", base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/openai/v1", http_client=httpx.Client( auth=OciSessionAuth(profile_name=<profile>), headers={"CompartmentId": <compartment_id>} ), ) speech = client.audio.speech.create( model="xai.grok-tts", input="hello", voice="ara", response_format="mp3", extra_body={ "language": "en", "output_format": { "sample_rate": 44100, "bit_rate": 192000 } } ) audio_file = f"output.mp3" with open(audio_file, "wb") as f: f.write(speech.content)
- Streaming do WebSocket
-
import asyncio import base64 import inspect import json from datetime import datetime, timezone from pathlib import Path from urllib.parse import urlencode import websockets CONFIG = { "endpoint": "wss://inference.generativeai.us-chicago-1.oci.oraclecloud.com/xai/v1/tts", "api_key": "<YOUR GENAI API KEY>", "text": "Hi, this is an audio sample.", "voice": "eve", "language": "en", "codec": "mp3", "sample_rate": 24000, "bit_rate": 128000, "output_dir": "./", } def tts_url(): params = { "language": CONFIG["language"], "voice": CONFIG["voice"], "codec": CONFIG["codec"], "sample_rate": CONFIG["sample_rate"], } if CONFIG["codec"] == "mp3": params["bit_rate"] = CONFIG["bit_rate"] return "{}?{}".format(CONFIG["endpoint"], urlencode(params)) def output_file(): folder = Path(CONFIG["output_dir"]).expanduser() folder.mkdir(parents=True, exist_ok=True) timestamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") return folder / "grok_tts_{}.{}".format(timestamp, CONFIG["codec"]) async def main(): if CONFIG["api_key"] == "<YOUR GENAI API KEY>": raise ValueError("Set api_key before running this sample.") path = output_file() headers = {"Authorization": "Bearer {}".format(CONFIG["api_key"])} header_arg = ( "additional_headers" if "additional_headers" in inspect.signature(websockets.connect).parameters else "extra_headers" ) async with websockets.connect(tts_url(), **{header_arg: headers}) as ws: await ws.send(json.dumps({"type": "text.delta", "delta": CONFIG["text"]})) await ws.send(json.dumps({"type": "text.done"})) with open(str(path), "wb") as audio_file: async for message in ws: event = json.loads(message) if event["type"] == "audio.delta": audio_file.write(base64.b64decode(event["delta"])) elif event["type"] == "audio.done": print("Saved audio to {}".format(path)) break elif event["type"] == "error": raise RuntimeError(event.get("message", message)) if __name__ == "__main__": asyncio.run(main())