🎙️ Synteza mowy w czystym JavaScript

Co to jest Web Speech API?
Web Speech API to interfejs przeglądarki, który umożliwia syntezę mowy (text-to-speech) oraz rozpoznawanie mowy (speech recognition). W tym tutorialu skupimy się na syntezie mowy.

1. Podstawy - Pierwsze kroki

Aby używać text-to-speech w przeglądarce, potrzebujemy interfejsu SpeechSynthesis oraz obiektu SpeechSynthesisUtterance.

// Sprawdź, czy przeglądarka obsługuje Web Speech API
if ('speechSynthesis' in window) {
    console.log('Text-to-Speech jest wspierany!');
} else {
    console.log('Twoja przeglądarka nie wspiera TTS');
}

2. Podstawowy przykład

Najprostszy sposób na przemówienie tekstu:

function mow(tekst) {
    const wypowiedz = new SpeechSynthesisUtterance(tekst);
    wypowiedz.lang = 'pl-PL'; // Ustawienie języka polskiego
    window.speechSynthesis.speak(wypowiedz);
}

Demo 1: Podstawowa synteza mowy

3. Kontrola parametrów głosu

Możesz kontrolować różne parametry wypowiedzi:

const wypowiedz = new SpeechSynthesisUtterance('Tekst do wypowiedzenia');

wypowiedz.lang = 'pl-PL';        // Język
wypowiedz.pitch = 1.0;           // Wysokość głosu (0.1 - 2.0)
wypowiedz.rate = 1.0;            // Szybkość (0.1 - 10)
wypowiedz.volume = 1.0;          // Głośność (0 - 1)

window.speechSynthesis.speak(wypowiedz);

Demo 2: Kontrola parametrów

4. Wybór głosu

Przeglądarka oferuje różne głosy. Możesz je pobrać i wybrać:

// Pobierz dostępne głosy
function pobierzGlosy() {
    return window.speechSynthesis.getVoices();
}

// Użyj konkretnego głosu
const glosy = pobierzGlosy();
const polskiGlos = glosy.find(glos => glos.lang === 'pl-PL');

const wypowiedz = new SpeechSynthesisUtterance('Witaj');
wypowiedz.voice = polskiGlos;
window.speechSynthesis.speak(wypowiedz);

Demo 3: Wybór głosu

Jeżeli wybrany zostanie głos w języku innym niż język tekstu, tekst zostanie przeczytany nieprawidłowo lub z obcym akcentem.

5. Zdarzenia (Events)

SpeechSynthesisUtterance wspiera różne zdarzenia:

const wypowiedz = new SpeechSynthesisUtterance('Test');

wypowiedz.onstart = () => {
    console.log('Rozpoczęto mowę');
};

wypowiedz.onend = () => {
    console.log('Zakończono mowę');
};

wypowiedz.onerror = (e) => {
    console.error('Błąd:', e);
};

wypowiedz.onpause = () => {
    console.log('Wstrzymano');
};

wypowiedz.onresume = () => {
    console.log('Wznowiono');
};

Demo 4: Kontrola odtwarzania

6. Kompletny przykład

Uwaga: W niektórych przeglądarkach lista głosów może być dostępna dopiero po załadowaniu strony. Użyj zdarzenia voiceschanged aby upewnić się, że głosy są dostępne.
class TextToSpeech {
    constructor() {
        this.synth = window.speechSynthesis;
        this.voices = [];
        
        // Załaduj głosy
        this.loadVoices();
        
        // Na wypadek opóźnionego ładowania głosów
        if (speechSynthesis.onvoiceschanged !== undefined) {
            speechSynthesis.onvoiceschanged = () => this.loadVoices();
        }
    }
    
    loadVoices() {
        this.voices = this.synth.getVoices();
    }
    
    speak(text, options = {}) {
        // Zatrzymaj aktualną mowę
        this.synth.cancel();
        
        const utterance = new SpeechSynthesisUtterance(text);
        
        // Ustaw parametry
        utterance.lang = options.lang || 'pl-PL';
        utterance.pitch = options.pitch || 1;
        utterance.rate = options.rate || 1;
        utterance.volume = options.volume || 1;
        
        // Wybierz głos
        if (options.voiceName) {
            const voice = this.voices.find(v => v.name === options.voiceName);
            if (voice) utterance.voice = voice;
        }
        
        // Dodaj obsługę zdarzeń
        if (options.onStart) utterance.onstart = options.onStart;
        if (options.onEnd) utterance.onend = options.onEnd;
        if (options.onError) utterance.onerror = options.onError;
        
        this.synth.speak(utterance);
    }
    
    pause() {
        this.synth.pause();
    }
    
    resume() {
        this.synth.resume();
    }
    
    stop() {
        this.synth.cancel();
    }
}
Wsparcie przeglądarek:
Web Speech API jest wspierane przez większość nowoczesnych przeglądarek (Chrome, Edge, Safari, Firefox). Niektóre funkcje mogą się różnić w zależności od przeglądarki.