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
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
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.mp3Synthè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.
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.
// 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, }), })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 :
# 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"}'turn_left|Bi ka gɛrɛn-gɛrɛn-na numan-fɛ