Aller au contenu principal

Voix disponibles et personnalisation

Voix disponibles et personnalisation

Le choix de la voix est déterminant pour l’expérience utilisateur de votre agent vocal. Une voix adaptée au contexte — professionnelle pour un service client, chaleureuse pour un assistant personnel — transforme la perception de l’agent. L’API TTS propose plusieurs voix distinctes, chacune avec son caractère et ses forces.

Les voix standard

OpenAI propose six voix principales, chacune avec une personnalité sonore distincte :

Voix Caractère Usage recommandé
alloy Neutre, polyvalente Usage général, assistants
echo Grave, posée Narration, formations
fable Expressive, animée Histoires, contenus éducatifs
onyx Profonde, autoritaire Présentations, audiobooks
nova Claire, énergique Service client, tutoriels
shimmer Douce, amicale Bien-être, méditation, accueil

Comparer les voix programmatiquement

Pour choisir la voix la plus adaptée, générez un échantillon avec chacune :

from openai import OpenAI
from pathlib import Path

client = OpenAI()

VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"]
SAMPLE_TEXT = (
    "Bonjour, je suis votre assistant vocal Corsen. "
    "Comment puis-je vous aider aujourd'hui ?"
)

def generate_voice_samples(output_dir: str = "./voice_samples"):
    """Génère un échantillon audio pour chaque voix disponible."""
    Path(output_dir).mkdir(exist_ok=True)

    for voice in VOICES:
        response = client.audio.speech.create(
            model="tts-1-hd",
            voice=voice,
            input=SAMPLE_TEXT
        )

        output_path = Path(output_dir) / f"{voice}.mp3"
        response.stream_to_file(output_path)
        print(f"Généré : {output_path}")

generate_voice_samples()

Choisir la voix selon le contexte

La sélection de voix peut être dynamique selon le type de contenu :

def select_voice(context: str, tone: str = "professional") -> str:
    """Sélectionne la voix optimale selon le contexte."""
    voice_map = {
        "customer_service": {
            "professional": "nova",
            "warm": "shimmer",
            "authoritative": "onyx"
        },
        "education": {
            "professional": "echo",
            "warm": "fable",
            "authoritative": "onyx"
        },
        "narration": {
            "professional": "onyx",
            "warm": "echo",
            "authoritative": "onyx"
        },
        "notification": {
            "professional": "alloy",
            "warm": "shimmer",
            "authoritative": "nova"
        }
    }

    return voice_map.get(context, {}).get(tone, "alloy")

# Exemples
voice = select_voice("customer_service", "warm")    # → shimmer
voice = select_voice("education", "professional")    # → echo
voice = select_voice("narration", "authoritative")   # → onyx

Voix dans la Realtime API

La voix configurée dans la Realtime API est la même que celle du TTS. Elle se définit dans session.update :

await ws.send(json.dumps({
    "type": "session.update",
    "session": {
        "voice": "nova",
        "modalities": ["text", "audio"]
    }
}))

La voix ne peut pas être changée en cours de session. Pour basculer, vous devez ouvrir une nouvelle session WebSocket.

Influencer le style par le texte

Bien que l’API ne propose pas de paramètres de style explicites, vous pouvez influencer le rendu par la ponctuation et la mise en forme du texte :

# Ton neutre
text_neutral = "Votre commande a été expédiée. Elle arrivera demain."

# Ton enthousiaste (exclamations)
text_excited = "Bonne nouvelle ! Votre commande a été expédiée ! Elle arrive dès demain !"

# Ton posé (phrases longues, virgules)
text_calm = "Votre commande, qui a été soigneusement préparée, vient d'être expédiée, et elle devrait arriver demain dans la journée."

# Pause explicite (tiret long ou points de suspension)
text_dramatic = "Le résultat est... extraordinaire."

# Emphase par capitalisation partielle
text_emphasis = "C'est EXACTEMENT ce dont vous avez besoin."

Utiliser le SSML-like via le texte

OpenAI TTS ne supporte pas le SSML standard, mais vous pouvez simuler certains effets :

def format_for_tts(text: str, pauses: dict = None) -> str:
    """Formate le texte pour optimiser le rendu TTS."""
    # Ajouter des pauses via des points de suspension
    if pauses:
        for marker, duration in pauses.items():
            dots = "..." if duration == "short" else "....."
            text = text.replace(marker, dots)

    return text

formatted = format_for_tts(
    "Résultat final : [pause] vous avez réussi le test.",
    pauses={"[pause]": "short"}
)
# → "Résultat final : ... vous avez réussi le test."

Points clés à retenir

  • Six voix disponibles : alloy (neutre), echo (grave), fable (expressive), onyx (profonde), nova (claire), shimmer (douce)
  • Le choix de la voix dépend du contexte : service client, éducation, narration, notifications
  • La voix ne peut pas être changée en cours de session Realtime API
  • La ponctuation influence directement la prosodie : exclamations, ellipses, tirets créent des effets
  • Testez systématiquement les voix sur votre contenu réel avant de choisir