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