xAI Voice (Texte à la parole)

Utilisez le service Texte pour la parole dans le service d'intelligence artificielle générative pour OCI pour convertir du texte en audio parlé avec la voix xAI.

Vous pouvez convertir le texte en discours de deux manières :

  • API de reconnaissance de la parole audio compatible OCI OpenAI pour la génération de la parole basée sur une demande.
  • Service de diffusion en continu WebSocket pour la diffusion en continu d'entrées de texte et de sorties audio.

Utilisez l'option API pour soumettre du texte et recevoir un fichier audio. Utilisez la diffusion en continu WebSocket pour envoyer du texte de manière incrémentielle et recevoir des fragments audio au fur et à mesure de leur génération.

Modèle pris en charge

Note

Le modèle Texte pour la parole n'est disponible qu'en mode sur demande.

Modèle Description
xai.grok-tts Modèle text-to-speech pour générer de l'audio parlé à partir de texte.

Voix

Les voix suivantes sont disponibles. Les noms vocaux ne sont pas sensibles à la casse. Par exemple, ara, Ara et ARA sont acceptés.

Messagerie vocale Description
ara Chaleureux et conversationnel
eve Énergétique et optimiste
leo Autorisé et fort
rex Clair et professionnel
sal Lisse et équilibrée

Options d'accès

Vous pouvez convertir du texte en discours à l'aide de l'API de reconnaissance de la parole audio compatible avec OCI OpenAI ou de la diffusion en continu WebSocket.

Option d'accès Point d'extrémité Style de paramètre Utiliser lorsque
API de reconnaissance de la parole audio compatible avec OCI OpenAI https://inference.generativeai.{region}.oci.oraclecloud.com/openai/v1 Format de demande audio compatible OpenAI, avec options propres à xAI dans extra_body Vous souhaitez soumettre du texte et recevoir un fichier audio en une seule demande.
Diffusion WebSocket wss://inference.generativeai.{region}.oci.oraclecloud.com/xai/v1/tts xAI paramètres de diffusion de texte à parole Vous souhaitez diffuser du texte en continu et recevoir des fragments audio au fur et à mesure qu'ils sont générés.

L'API de reconnaissance de la parole audio compatible avec OCI OpenAI ne prend pas en charge la diffusion en continu en temps réel. Pour diffuser du texte à la parole en continu, utilisez le point d'extrémité WebSocket.

API de reconnaissance de la parole audio compatible avec OCI OpenAI

Utilisez l'API de reconnaissance de la parole audio compatible avec OCI OpenAI pour générer de l'audio à partir d'une seule demande.

Point d'extrémité compatible avec OCI OpenAI
https://inference.generativeai.{region}.oci.oraclecloud.com/openai/v1

Dans la demande, appelez le modèle xai.grok-tts et utilisez l'une des voix Grok Voice répertoriées dans cette rubrique. N'utilisez pas de noms de modèle de synthèse vocale OpenAI ou de noms vocaux OpenAI.

Spécifiez ces valeurs dans la demande de parole audio compatible OpenAI standard :

  • model: xai.grok-tts
  • input : Texte à convertir en parole
  • voice : Une des voix vocales Grok prises en charge, par exemple ara, eve, leo, rex ou sal
  • response_format : Format de réponse audio, par exemple mp3

Placez les options propres à xAI, telles que language et output_format, dans extra_body.

Par exemple, utilisez extra_body pour les paramètres tels que :

  • language
  • output_format.sample_rate
  • output_format.bit_rate
Note

Lors de l'utilisation de l'API de reconnaissance de la parole audio compatible avec OCI OpenAI, utilisez la structure de demande compatible OpenAI avec le point d'extrémité OCI, mais utilisez le modèle xai.grok-tts et les voix xAI prises en charge. N'utilisez pas de voix uniquement OpenAI, de noms de modèle OpenAI TTS ou d'objets vocaux personnalisés OpenAI.

Diffusion en continu WebSocket

Utilisez la diffusion en continu WebSocket pour les flux de travail de synthèse vocale en temps réel ou interactifs. Avec cette option, vous envoyez du texte au service sous forme de messages et recevez de l'audio sous forme de blocs audio encodés en base64.

Point d'extrémité OCI WebSocket :
wss://inference.generativeai.{region}.oci.oraclecloud.com/xai/v1/tts

N'utilisez pas le point d'extrémité xAI directement.

Configurez la connexion WebSocket avec des paramètres d'interrogation de synthèse vocale xAI tels que :

Paramètre Description
voice Voix à utiliser pour la génération vocale.
language Code de langue, par exemple en ou auto pour la détection automatique de la langue.
codec Codec audio, tel que mp3, wav, pcm, mulaw ou alaw.
sample_rate Fréquence d'échantillonnage.
bit_rate débit MP3. S'applique à la sortie MP3.
optimize_streaming_latency Optimise le délai d'accès à la première lecture lorsqu'elle est activée.
text_normalization Normalise le texte écrit sous forme orale lorsqu'il est activé.

Après avoir ouvert la connexion WebSocket, envoyez du texte à l'aide de messages text.delta. Envoyer text.done pour indiquer la fin de l'énoncé courant.

Le service retourne :

Événement Description
audio.delta Bloc audio encodé en Base64.
audio.done La génération audio de l'énoncé courant est terminée.
error Message d'erreur du service.

La connexion WebSocket peut rester ouverte après audio.done. Vous pouvez donc envoyer une autre séquence text.delta et text.done sans vous reconnecter.

Note

Pour le service de diffusion en continu WebSocket, utilisez les paramètres de diffusion en continu du texte à la parole xAI avec le point d'extrémité WebSocket pour OCI.

Utilisation du paramètre

Les paramètres que vous utilisez dépendent de l'option d'accès.

Pour l'API de reconnaissance de la parole audio compatible OCI OpenAI, utilisez le format de demande de parole audio compatible OpenAI. Réglez model à xai.grok-tts, utilisez une voix xAI prise en charge et placez les paramètres propres à xAI dans extra_body.

Pour la diffusion en continu de WebSocket, utilisez les paramètres de diffusion de texte à parole xAI. Configurez la voix, le langage, le codec, le taux d'échantillonnage et le débit binaire en tant que paramètres d'interrogation WebSocket. Envoyez du texte avec des messages text.delta et terminez chaque énoncé avec text.done.

Formats de sortie

Text to Speech prend en charge les formats audio courants pour différents cas d'utilisation.

Format Cas d'utilisation
mp3 Utilisation générale et compatibilité étendue
wav Flux de travail audio et d'édition de haute fidélité
pcm Audio brut pour le traitement en temps réel
mulaw Flux de travail de téléphonie
alaw Flux de travail de téléphonie
Note

Pour l'API de reconnaissance de la parole audio compatible OCI OpenAI, réglez le format audio dans response_format et placez les paramètres audio xAI, tels que le taux d'échantillonnage et le débit binaire, dans extra_body.output_format. Pour la diffusion en continu de WebSocket, définissez le format audio, le taux d'échantillonnage et le débit binaire en tant que paramètres d'interrogation lors de l'ouverture de la connexion.

Note

Le débit s'applique à la sortie MP3.

Langages

Text to Speech prend en charge de nombreuses langues. Utilisez un code de langue pris en charge, tel que en, ou utilisez auto pour la détection automatique de langue lorsqu'il est pris en charge par la méthode d'accès.

Limites

Les limites de texte à parole dépendent de l'option d'accès.

Limite API de reconnaissance de la parole audio compatible avec OCI OpenAI Diffusion WebSocket
Limite de caractères Jusqu'à 15 000 caractères par demande Jusqu'à 15 000 caractères par message text.delta
Contenu plus long Fractionner le contenu en demandes plus petites et combiner la sortie audio Fractionner le contenu en plusieurs messages text.delta ou en énoncés distincts
Limite de débit 600 demandes par minute ou 10 demandes par seconde 600 demandes par minute ou 10 demandes par seconde
Demandes ou sessions concurrentes Jusqu'à 100 demandes concurrentes Jusqu'à 50 sessions concurrentes
Durée de vie du permis de session Non applicable 600 seconde

Pour un texte plus long, fractionnez le contenu en segments logiques, tels que des paragraphes ou des phrases. Cela permet de maintenir chaque requête ou fragment de texte dans la limite des caractères et facilite la combinaison de l'audio généré dans l'ordre.

Pour la diffusion en continu de WebSocket, envoyez du texte à l'aide de messages text.delta et envoyez text.done lorsque l'énoncé courant est terminé. Chaque message text.delta doit rester dans la limite de caractères.

Exemples

Les exemples suivants montrent les deux options d'accès prises en charge. L'exemple compatible OCI OpenAI utilise le point d'extrémité compatible OCI OpenAI et le modèle xai.grok-tts. L'exemple WebSocket utilise le point d'extrémité xAI WebSocket pour OCI et les paramètres de diffusion en continu xAI.

API de reconnaissance de la parole audio compatible avec 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)
Diffusion en continu 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())