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');
}
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);
}
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);
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);
Jeżeli wybrany zostanie głos w języku innym niż język tekstu, tekst zostanie przeczytany nieprawidłowo lub z obcym akcentem.
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');
};
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();
}
}