Voix

Synthèse vocale & langues locales

AfriMap offre deux moteurs TTS : Edge TTS (Microsoft, gratuit, français + anglais) et Coqui XTTS v2 (open-source, fine-tunable pour dioula et baoulé). Ce guide explique comment intégrer la voix dans votre application.

Architecture TTS

  Votre app             Gateway             TTS Service
     │                    │                      │
     │ POST /navigate     │                      │
     │  { voice: "fr" }   │                      │
     │ ──────────────►    │                      │
     │                    │  Check Redis cache   │
     │                    │  ─────────────►      │
     │                    │                      │
     │                    │  MISS? Synthesize    │
     │                    │  ─────────────►      │
     │                    │                      │
     │                    │  ◄── audio/mpeg      │
     │                    │                      │
     │                    │  Cache in Redis 24h  │
     │  ◄── audio URLs    │                      │
     │                    │                      │

Edge TTS (port 5500)

Moteur principal. Utilise les voix neuronales Microsoft via la bibliothèque edge-tts. Gratuit, haute qualité.

  • Français : fr-FR-DeniseNeural
  • Anglais : en-US-AriaNeural
  • Cache Redis TTL 24h
  • Format : MP3 128kbps

Coqui XTTS v2 (port 5501)

Moteur langues locales. Modèle multilingue avec fine-tuning possible sur des enregistrements vocaux locaux (3-10 secondes).

  • Dioula : modèle fine-tuné (en cours)
  • Baoulé : modèle fine-tuné (en cours)
  • Zero-shot voice cloning
  • Format : MP3 via pydub/ffmpeg

Synthétiser un clip audio

Via le SDK

TypeScriptSynthèse vocale
const audio = await client.navigation.voice({ text: 'Tournez à droite sur Boulevard Latrille', language: 'fr', format: 'mp3', }) // Jouer le clipconst audioEl = new Audio(URL.createObjectURL(audio)) audioEl.play()

Via cURL

TerminalAppel direct
 curl -X POST https://api.afrimap.ci/v1/navigate/voice \ -H "X-AfriMap-Key: afm_test_..." \ -H "Content-Type: application/json" \ -d '{"text": "Tournez a droite", "language": "fr", "format": "mp3"}' \ --output instruction.mp3

Synthèse batch (pré-cache)

Pour la navigation hors-ligne, pré-synthétisez toutes les instructions d'un itinéraire en un seul appel. Les clips sont stockés dans Redis et servis via URL.

TypeScriptBatch TTS
const batch = await client.navigation.voiceBatch({ texts: [ 'Dirigez-vous vers le nord sur Avenue Marchand', 'Tournez à droite sur Boulevard de la République', 'Continuez tout droit pendant 800 mètres', 'Vous êtes arrivé à destination', ], language: 'fr', format: 'mp3', }) // batch.audio_urls = [// "/tts/cache/abc123.mp3",// "/tts/cache/def456.mp3",// ...// ]// Téléchargez-les pour utilisation hors-lignefor (const url of batch.audio_urls) { const blob = await fetch(url).then(r => r.blob()) // Stockez dans IndexedDB ou le filesystem natif }

Clonage de voix (zero-shot)

Coqui XTTS v2 supporte le clonage de voix à partir d'un échantillon audio de 3 à 10 secondes. Utile pour créer des voix de marque.

TypeScriptClonage de voix
// Encodez le fichier WAV de référence en base64const wavBytes = await fs.readFile('reference_speaker.wav') const b64 = wavBytes.toString('base64') // Synthétisez avec cette voixconst response = await fetch('https://api.afrimap.ci/v1/navigate/voice', { method: 'POST', headers: { 'X-AfriMap-Key': 'afm_live_...', 'Content-Type': 'application/json', }, body: JSON.stringify({ text: 'Bienvenue dans votre véhicule HopRide', language: 'fr', speaker_wav_b64: b64, }), })
Format requis : WAV mono, 16-bit, 22050 Hz minimum. L'échantillon doit contenir de la parole claire sans bruit de fond. 3-10 secondes suffisent pour un clonage de qualité.

Proxy automatique Edge → Coqui

Quand la variable COQUI_URL est configurée, le service Edge TTS proxy automatiquement les requêtes dioula/baoulé vers Coqui. Si Coqui échoue, Edge TTS sert un fallback en français.

Le header X-Model-Variant dans la réponse indique quel modèle a produit l'audio :

  • xtts_v2_dioula_finetuned — modèle Dioula fine-tuné
  • xtts_v2_baoule_finetuned — modèle Baoulé fine-tuné
  • xtts_v2_base — modèle multilingue de base

Entraîner un modèle vocal

Pour ajouter une nouvelle langue, collectez 1-2 heures d'enregistrements propres et utilisez l'endpoint de préparation d'entraînement :

TerminalPréparer les données d'entraînement
# Structure des enregistrements recordings/ dioula_train/ metadata.csv # id|texte (pipe-separated) wavs/ turn_left.wav turn_right.wav ... dioula_val/ metadata.csv wavs/... # Générer la config d'entraînement curl -X POST https://api.afrimap.ci/train/prepare \ -H "Content-Type: application/json" \ -d '{"recordings_dir": "/data/recordings", "language": "dioula"}'
Format metadata.csv : pipe-separated, une ligne par fichier WAV. turn_left|Bi ka gɛrɛn-gɛrɛn-na numan-fɛ