Appearance
La Web Speech API permet de faire de la reconnaissance vocale directement dans le navigateur, sans serveur externe.
Compatibilité navigateurs
| Navigateur | Support | Notes |
|---|---|---|
| Safari | ✅ Oui | Fonctionne bien, utilise webkitSpeechRecognition |
| Chrome | ✅ Oui | Nécessite HTTPS ou localhost |
| Firefox | ❌ Non | Non supporté nativement |
| Edge | ✅ Oui | Basé sur Chromium |
Recommandation
Pour un projet qui doit fonctionner offline ou en local, Safari est le meilleur choix car il ne nécessite pas de connexion HTTPS.
Code de base
javascript
// Vérifier le support
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if (!SpeechRecognition) {
console.error('Web Speech API non supportée');
return;
}
// Créer l'instance
const recognition = new SpeechRecognition();
recognition.lang = 'fr-FR'; // Langue française
recognition.continuous = true; // Écoute continue
recognition.interimResults = true; // Résultats intermédiaires
// Événements
recognition.onstart = () => {
console.log('🎤 Écoute en cours...');
};
recognition.onresult = (event) => {
let transcript = '';
for (let i = event.resultIndex; i < event.results.length; i++) {
transcript += event.results[i][0].transcript;
}
console.log('Entendu:', transcript);
};
recognition.onerror = (event) => {
console.error('Erreur:', event.error);
};
recognition.onend = () => {
console.log('Reconnaissance terminée');
};
// Démarrer
recognition.start();Ce qui fonctionne
Reconnaissance continue
Avec continuous: true, la reconnaissance ne s'arrête pas après la première phrase.
javascript
recognition.continuous = true;Résultats intermédiaires
Avec interimResults: true, on reçoit le texte au fur et à mesure qu'on parle (pas besoin d'attendre la fin de la phrase).
javascript
recognition.interimResults = true;Langues supportées
On peut spécifier la langue avec le code BCP 47 :
javascript
recognition.lang = 'fr-FR'; // Français (France)
recognition.lang = 'en-US'; // Anglais (USA)
recognition.lang = 'nl-BE'; // Néerlandais (Belgique)Redémarrage automatique
La reconnaissance peut s'arrêter après un silence. Pour la relancer automatiquement :
javascript
recognition.onend = () => {
if (shouldContinue) {
setTimeout(() => {
recognition.start();
}, 300);
}
};Ce qui ne fonctionne pas
Activation sans interaction utilisateur
Les navigateurs modernes bloquent le démarrage du micro sans interaction utilisateur (clic, tap...).
Obligatoire
Toujours démarrer la reconnaissance dans un gestionnaire d'événement utilisateur (click, touchstart...).
javascript
// ❌ Ne fonctionne PAS
recognition.start(); // Bloqué par le navigateur
// ✅ Fonctionne
button.addEventListener('click', () => {
recognition.start();
});p5.speech (librairie)
La librairie p5.speech est un wrapper autour de l'API native mais :
- Elle est parfois instable
- Elle peut ne pas fonctionner sur certains navigateurs
- Mieux vaut utiliser l'API native directement
Firefox
Firefox ne supporte pas la Web Speech API pour la reconnaissance vocale (uniquement la synthèse vocale).
Erreurs courantes
| Erreur | Cause | Solution |
|---|---|---|
not-allowed | Permission micro refusée | Autoriser le micro dans les paramètres |
network | Pas de connexion | Chrome nécessite une connexion pour la reconnaissance |
no-speech | Aucune parole détectée | Normal après un silence, relancer si besoin |
aborted | Reconnaissance annulée | Souvent à cause d'un double start() |
Exemple complet avec comparaison de mots
javascript
let motATrouver = "soleil";
let motTrouve = false;
recognition.onresult = (event) => {
let transcript = '';
for (let i = event.resultIndex; i < event.results.length; i++) {
transcript += event.results[i][0].transcript;
}
// Normaliser (minuscules, trim)
let heard = transcript.toLowerCase().trim();
// Vérifier si le mot est dans la phrase
if (!motTrouve && heard.includes(motATrouver.toLowerCase())) {
console.log('🎉 Mot trouvé !');
motTrouve = true;
recognition.stop();
}
};Intégration avec WebSocket
On peut combiner la reconnaissance vocale avec WebSocket pour créer un jeu multijoueur :
javascript
// Recevoir le mot à trouver
socket.on('message', (data) => {
if (data.mot) {
motATrouver = data.mot;
}
});
// Envoyer la victoire quand trouvé
recognition.onresult = (event) => {
// ... (voir exemple ci-dessus)
if (motTrouve) {
socket.emit('message', { victoire: motATrouver });
}
};