File size: 7,317 Bytes
bc92670
 
 
 
 
 
 
 
 
2bfc369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1abc475
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
---
title: Captation Audio
emoji: 🏢
colorFrom: yellow
colorTo: gray
sdk: static
pinned: false
---

Voici un aperçu de l'enregistrement et du traitement audio sur le web, basé sur le fichier HTML fourni.

---

### 🎙️ Fonctionnement de l'Enregistrement Audio

Le cœur de ce système d'enregistrement audio réside dans l'utilisation de l'API **MediaDevices**.

1.  **Accès au Microphone** : L'utilisateur clique sur le bouton "Démarrer", ce qui déclenche l'appel à `navigator.mediaDevices.getUserMedia({ audio: true })`. Cette fonction demande l'autorisation d'accéder au microphone de l'utilisateur. Si l'accès est accordé, elle crée un flux audio (un "stream") que l'on peut manipuler.

2.  **L'Enregistrement (MediaRecorder)** : Une fois le flux audio capturé, un objet `MediaRecorder` est instancié. Cet objet est spécialisé dans l'enregistrement de flux multimédias. Il collecte les données audio par petites portions (des "chunks") et les stocke dans un tableau. La fonction `initMediaRecorder` dans le code configure ce processus, en s'assurant que les données sont collectées lorsque l'événement `dataavailable` se déclenche.

3.  **Arrêt et Finalisation** : Lorsque l'utilisateur appuie sur "Stopper", la méthode `mediaRecorder.stop()` est appelée. Le `MediaRecorder` arrête alors de collecter les données, et le code combine tous les "chunks" enregistrés pour former un seul fichier audio compressé, appelé **Blob**. Ce Blob est ensuite prêt à être utilisé.

---

### ➡️ Envoi de l'Audio à une API

L'objectif de l'application est d'envoyer l'audio enregistré ou un fichier audio existant à un service externe, généralement pour une tâche comme la transcription.

1.  **Préparation de l'Envoi** : Le fichier audio (sous forme de **Blob**) est inséré dans un objet `FormData`. Le `FormData` est un format standard pour construire des requêtes HTTP afin d'envoyer des fichiers. Dans ce cas, le fichier est nommé dynamiquement avec un horodatage pour s'assurer qu'il est unique.

2.  **La Requête HTTP** : L'objet `FormData` est ensuite envoyé à l'URL de l'API cible via une requête `fetch()` de type `POST`. Le navigateur s'occupe de définir le bon en-tête (`Content-Type: multipart/form-data`) pour le transfert du fichier.

3.  **Traitement de la Réponse** : Après l'envoi, l'application attend une réponse du serveur. Si la requête est réussie, le code lit la réponse comme un objet JSON. Il recherche ensuite la transcription dans ce JSON, généralement sous une clé comme `"text"`, et l'affiche à l'utilisateur. Si l'API renvoie un statut d'erreur, l'application affiche un message d'échec.

---

### 📁 Upload de Fichiers Audio Existants

Le code ne se limite pas à l'enregistrement en direct ; il permet aussi de téléverser un fichier audio depuis l'ordinateur de l'utilisateur. Le processus est similaire : l'utilisateur sélectionne un fichier, et au lieu de créer un Blob à partir de l'enregistrement, l'application utilise directement le fichier sélectionné comme entrée pour la fonction d'envoi à l'API.

### 💡 Autres Méthodes de Traitement Audio

Bien que ce code utilise l'API `MediaDevices` et `MediaRecorder`, il existe d'autres outils pour manipuler l'audio sur le web :

* **API Web Audio** : Cette API est beaucoup plus avancée et offre un contrôle très granulaire sur le son. Elle est utile pour des tâches telles que la synthèse sonore, l'ajout d'effets (comme la réverbération), et la visualisation des ondes sonores.
* **Élément `<audio>`** : Le plus simple de tous, cet élément HTML sert uniquement à la lecture de fichiers audio. Il est parfait pour une utilisation basique comme la lecture de l'enregistrement après l'arrêt, comme c'est le cas dans le code fourni.


### 🛠️ Intégration de l'API Whisper Côté Client

Pour intégrer l'API OpenAI Whisper directement dans une page web, vous devez envoyer une requête **`POST`** en utilisant le format `multipart/form-data`. Le code HTML fourni est déjà configuré pour cela. Voici une note technique expliquant les modifications à apporter au code JavaScript pour réaliser l'appel.

-----

### 📝 Note Technique : Appel direct à l'API Whisper

#### 1\. Préparation de la Requête

L'API Whisper requiert deux éléments principaux dans le corps de la requête `multipart/form-data`:

  * `file` : Le fichier audio à transcrire.
  * `model` : Le nom du modèle à utiliser, qui doit être `"whisper-1"`.

De plus, une **clé API** est nécessaire pour l'authentification. Elle doit être incluse dans l'en-tête de la requête sous la forme `Authorization: Bearer VOTRE_CLÉ_API`.

#### 2\. Modification du Code JavaScript

Pour adapter la fonction `sendAudioToApi` afin qu'elle envoie la requête directement à l'API Whisper, suivez ces étapes :

a. **Mettez à jour l'URL de l'API.**
L'endpoint de l'API Whisper est `https://api.openai.com/v1/audio/transcriptions` (pour la transcription) ou `https://api.openai.com/v1/audio/translations` (pour la traduction). Assurez-vous que l'URL dans la variable `endpoint` est correcte.

b. **Construisez le corps de la requête.**
Ajoutez le modèle `"whisper-1"` et le fichier audio (`blob`) au `FormData` que la fonction prépare déjà.

c. **Ajoutez les en-têtes d'authentification.**
L'en-tête `Content-Type` sera automatiquement géré par le navigateur pour le `multipart/form-data`, mais vous devez explicitement ajouter l'en-tête `Authorization`.

Voici la fonction `sendAudioToApi` modifiée :

```javascript
async function sendAudioToApi(blob) {
  // L'endpoint pour la traduction est https://api.openai.com/v1/audio/translations
  const endpoint = "https://api.openai.com/v1/audio/translations"; 
  const apiKey = "VOTRE_CLÉ_API_OPENAI"; // Mettez votre clé ici
  if (!apiKey) {
    setStatus("Clé API manquante. Impossible d'envoyer la requête.");
    return;
  }
  
  setStatus("Envoi de l'audio à l'API OpenAI...");

  const form = new FormData();
  const extension = blob.type.includes('wav') ? 'wav' : (blob.type.includes('mpeg') ? 'mp3' : 'webm');
  const filename = `recording-${Date.now()}.${extension}`;
  
  form.append('file', blob, filename);
  form.append('model', 'whisper-1');

  try {
    const response = await fetch(endpoint, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${apiKey}`,
      },
      body: form,
    });

    if (!response.ok) {
      const errorData = await response.json();
      setStatus(`Échec de l'envoi : ${response.status} - ${errorData.error.message}`);
      throw new Error('Échec de l\'envoi');
    }

    const result = await response.json();
    setStatus('Envoi réussi');
    
    if (result && result.text) {
      displayTranscription(result.text);
    } else {
      log('Aucune transcription trouvée dans la réponse de l\'API');
    }
    
    return result;
  } catch (err) {
    setStatus('Erreur lors de l\'envoi à l\'API');
    console.error(err);
    throw err;
  }
}
```

**Remarque** : Si vous souhaitez faire une traduction au lieu d'une transcription, utilisez l'endpoint `https://api.openai.com/v1/audio/translations`. La structure de la requête reste la même. L'API retourne un objet JSON avec la clé `"text"` contenant la transcription ou la traduction.