Skip to content
Learni
Voir tous les tutoriels
IA Générative

Comment intégrer Resemble AI pour TTS expert en 2026

Read in English

Introduction

Resemble AI est une plateforme leader en synthèse vocale (TTS) et clonage vocal, offrant des voix hyper-réalistes via API REST. En 2026, son SDK et endpoints avancés permettent des cas d'usage experts comme le streaming en temps réel, le traitement batch de milliers de clips, et l'intégration de voix clonées personnalisées. Ce tutoriel expert vous guide pas à pas pour intégrer Resemble AI dans une app Node.js/TypeScript : du clonage vocal à la gestion de webhooks pour clips asynchrones. Pourquoi c'est crucial ? Les voix IA réduisent les coûts de production audio de 90 % tout en boostant l'engagement (podcasts, assistants virtuels, jeux). Avec une latence <200ms en streaming, c'est production-ready. Suivez ces étapes pour un setup scalable, incluant error handling et caching. (128 mots)

Prérequis

  • Compte Resemble AI avec API key (créez-en un sur app.resemble.ai)
  • Node.js 20+ et npm/yarn
  • Connaissances avancées en TypeScript, fetch API et async/await
  • Fichier audio WAV/MP3 (10-30s) pour clonage vocal
  • Outils : FFmpeg pour post-traitement audio (optionnel)

Initialiser le projet Node.js

setup.sh
mkdir resemble-ai-expert && cd resemble-ai-expert
npm init -y
npm install typescript @types/node ts-node axios form-data dotenv
npm install -D @types/node
npx tsc --init
mkdir src
echo 'API_KEY=your_resemble_api_key_here
PROJECT_UUID=your_project_uuid_here' > .env

Ce script initialise un projet TypeScript avec Axios pour HTTP et FormData pour uploads multipart. Le fichier .env stocke les credentials sensibles ; remplacez par vos vraies valeurs depuis le dashboard Resemble. Évitez les .env en Git via .gitignore.

Configurer les credentials

Créez un projet sur Resemble AI pour obtenir le PROJECT_UUID. Générez une API key via Account > API Keys. Chargez votre fichier audio source (propre, sans bruit, 44.1kHz idéal) dans /assets/voice_sample.wav. Testez l'API avec curl : curl -H 'Authorization: Bearer $API_KEY' https://app.resemble.ai/api/v2/projects/$PROJECT_UUID. Analogie : comme un studio vocal pro, le clonage nécessite un 'master' audio de qualité.

Cloner une voix personnalisée

src/cloneVoice.ts
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';
import dotenv from 'dotenv';
dotenv.config();

const API_KEY = process.env.API_KEY!;
const PROJECT_UUID = process.env.PROJECT_UUID!;
const VOICE_SAMPLE_PATH = './assets/voice_sample.wav';

async function cloneVoice() {
  const form = new FormData();
  form.append('name', 'MaVoixClonee');
  form.append('gender', 'male');
  form.append('accent', 'fr-FR');
  form.append('description', 'Voix experte française clonée');
  form.append('audio', fs.createReadStream(VOICE_SAMPLE_PATH));

  try {
    const response = await axios.post(
      `https://app.resemble.ai/api/v2/projects/${PROJECT_UUID}/voices`,
      form,
      {
        headers: {
          'Authorization': `Bearer ${API_KEY}`,
          ...form.getHeaders(),
        },
      }
    );
    console.log('Voix clonée:', response.data.uuid);
    return response.data.uuid;
  } catch (error: any) {
    console.error('Erreur clonage:', error.response?.data || error.message);
    throw error;
  }
}

cloneVoice();

Ce script upload un audio et crée une voix clonée asynchrone (training ~10min). Utilisez FormData pour multipart ; surveillez le dashboard pour status. Piège : audio >60s ou bruité = rejet ; validez SSML avant. Retourne l'UUID voix pour TTS ultérieur.

Générer TTS basique avec voix clonée

Une fois clonée (UUID récupéré), générez des clips. Resemble supporte SSML pour prosodie avancée (emphasis, pauses). Pour expert : optimisez prompts pour cohérence vocale. Téléchargez via polling ou webhook.

Générer et télécharger un clip TTS

src/generateTTS.ts
import axios from 'axios';
import fs from 'fs';
import dotenv from 'dotenv';
import { v4 as uuidv4 } from 'uuid';
dotenv.config();

const API_KEY = process.env.API_KEY!;
const PROJECT_UUID = process.env.PROJECT_UUID!;
const VOICE_UUID = 'your_cloned_voice_uuid_here'; // Remplacez par UUID du clonage

async function generateTTS(text: string, outputPath: string) {
  const clipUuid = uuidv4();

  // Créer clip
  const createResponse = await axios.post(
    `https://app.resemble.ai/api/v2/projects/${PROJECT_UUID}/clips`,
    {
      voice_uuid: VOICE_UUID,
      ssml: `<speak>${text}</speak>`,
      name: `clip-${clipUuid}`,
      description: 'TTS expert',
    },
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` },
    }
  );

  // Polling jusqu\'à ready
  let status = 'generating';
  while (status !== 'finished') {
    const statusRes = await axios.get(
      `https://app.resemble.ai/api/v2/projects/${PROJECT_UUID}/clips/${createResponse.data.uuid}`,
      { headers: { 'Authorization': `Bearer ${API_KEY}` } }
    );
    status = statusRes.data.status;
    if (status === 'error') throw new Error('Clip failed');
    await new Promise(r => setTimeout(r, 2000));
  }

  // Télécharger
  const audioRes = await axios.get(
    `https://app.resemble.ai/api/v2/projects/${PROJECT_UUID}/clips/${createResponse.data.uuid}/audio`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` },
      responseType: 'arraybuffer',
    }
  );
  fs.writeFileSync(outputPath, audioRes.data);
  console.log(`Clip sauvé: ${outputPath}`);
}

generateTTS('Bonjour, ceci est une voix clonée experte en français.', './output/tts.wav');

Génère un clip SSML, poll status (évite timeouts), télécharge WAV. UUID unique anti-collision. Piège : sans polling, clips asynchrones échouent ; limitez à 10min/clip. Intégrez caching Redis pour réutilisation.

Implémenter TTS streaming

src/streamTTS.ts
import axios from 'axios';
import dotenv from 'dotenv';
import { Readable } from 'stream';
dotenv.config();

const API_KEY = process.env.API_KEY!;
const PROJECT_UUID = process.env.PROJECT_UUID!;
const VOICE_UUID = 'your_cloned_voice_uuid_here';

async function streamTTS(text: string) {
  const response = await axios.post(
    `https://app.resemble.ai/api/v2/projects/${PROJECT_UUID}/stream`,
    {
      voice_uuid: VOICE_UUID,
      ssml: `<speak>${text}</speak>`,
    },
    {
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json',
      },
      responseType: 'stream',
    }
  );

  const stream = response.data as Readable;
  stream.pipe(process.stdout); // Ou fs.createWriteStream('./stream.wav')

  return new Promise((resolve, reject) => {
    stream.on('end', resolve);
    stream.on('error', reject);
  });
}

streamTTS('Texte streamé en temps réel pour latence faible.');

Streaming pour <200ms latence, idéal chatbots/jeux. responseType 'stream' pipe directement. Piège : pas de SSML complexe en stream ; testez bande passante. Scalez avec WebSockets pour clients.

Gérer les batches et webhooks

Pour >100 clips, utilisez batch API. Configurez webhooks (Project Settings > Webhooks) pour notifier https://yourapp.com/webhook/resemble. Analogie : comme un orchestrateur de render farm.

Batch processing de clips

src/batchTTS.ts
import axios from 'axios';
import dotenv from 'dotenv';
dotenv.config();

const API_KEY = process.env.API_KEY!;
const PROJECT_UUID = process.env.PROJECT_UUID!;
const VOICE_UUID = 'your_cloned_voice_uuid_here';

const texts = [
  'Premier clip batch.',
  'Deuxième clip avec SSML: <emphasis>important</emphasis>.',
  'Troisième en français expert.'
];

async function batchGenerate() {
  const batch = texts.map((text, i) => ({
    voice_uuid: VOICE_UUID,
    ssml: `<speak>${text}</speak>`,
    name: `batch-${i}`,
  }));

  const response = await axios.post(
    `https://app.resemble.ai/api/v2/projects/${PROJECT_UUID}/clips/bulk`,
    { clips: batch },
    { headers: { 'Authorization': `Bearer ${API_KEY}` } }
  );

  console.log('Batch UUIDs:', response.data.map((c: any) => c.uuid));
}

batchGenerate();

Crée multiple clips en un appel (quota 1000/jour). Traitez UUIDs via webhooks. Piège : excede quota = 429 ; implémentez retry exponential. Coût : ~0.01$/clip.

Handler webhook pour clips prêts

src/webhookHandler.ts
import express from 'express';
import dotenv from 'dotenv';
dotenv.config();

const app = express();
app.use(express.json());

app.post('/webhook/resemble', (req, res) => {
  const { project_uuid, clip_uuid, status } = req.body;

  if (status === 'finished') {
    console.log(`Clip ${clip_uuid} prêt dans projet ${project_uuid}`);
    // Trigger download ou notify user
    downloadClip(project_uuid, clip_uuid);
  } else if (status === 'failed') {
    console.error(`Clip ${clip_uuid} échoué`);
  }

  res.status(200).send('OK');
});

async function downloadClip(project_uuid: string, clip_uuid: string) {
  // Logique download comme generateTTS
  console.log(`Téléchargement ${clip_uuid}`);
}

const PORT = 3000;
app.listen(PORT, () => console.log(`Webhook sur port ${PORT}`));

Express handler vérifie payload HMAC (ajoutez validation Resemble). Répond 200 vite. Piège : sans ACK, retries infinis ; sécurisez avec ngrok pour dev.

Bonnes pratiques

  • Cachez clips : Redis/Memcached par hash(voice+text) pour éviter régénérations (économie 80 % quota).
  • SSML optimisé : pour narrations ; testez phonèmes /fʁɑ̃.sɛ/ pour FR.
  • Retry & Circuit Breaker : Axios retry 3x + backoff pour 5xx.
  • Monitoring : Track latence/usage via Prometheus ; quota daily alert.
  • Sécurité : Rotate keys mensuel, never expose en client-side.

Erreurs courantes à éviter

  • Polling trop agressif : >1req/s = rate-limit ; utilisez 2-5s intervals.
  • Audio source dégradé : Bruit >-40dB = clonage fail ; preprocess avec FFmpeg ffmpeg -i input.wav -af silenceremove=1:0:-50dB output.wav.
  • SSML invalide : Pas de nesting excessif ; validez via Resemble playground.
  • Oubli webhooks : Polling scale mal >100 clips ; priorisez callbacks.

Pour aller plus loin

  • Docs officielles : Resemble AI API
  • SDK Node : npm i @resembleai/sdk
  • Avancé : TSX (time-stretch), multi-langue fusion.
  • Découvrez nos formations IA Learni pour maîtrise complète des APIs vocales.