Web Speech API: Síntese de fala em JavaScript
A Web Speech API permite que desenvolvedores web gerem e reconheçam fala de forma programática em páginas web. Ela define dois principais interfaces: SpeechRecognition
SpeechSynthesis
A síntese de fala está disponível no navegador por meio da propriedade speechSynthesis
window
SpeechSynthesis
if (window.speechSynthesis) {
console.log("A síntese de fala é suportada.");
} else {
console.log("A síntese de fala NÃO é suportada.");
}
// Alternativamente:
if ("speechSynthesis" in window) {
console.log("A síntese de fala é suportada.");
} else {
console.log("A síntese de fala NÃO é suportada.");
}
Criando e configurando a fala
A síntese de fala é realizada usando o objeto SpeechSynthesisUtterance
: define o idioma da fala.lang
: ajusta a altura do som.pitch
: controla a velocidade da fala.rate
: define o texto que será sintetizado.text
: seleciona a voz usada na fala.voice
: ajusta o volume da fala.volume
Por exemplo, para gerar uma fala básica, basta configurar o texto:
const utterance = new SpeechSynthesisUtterance();
utterance.text = "Hello World";
A execução da fala e seu controle são realizados pelos métodos da interface SpeechSynthesis
: remove todas as declarações da fila.cancel()
: retorna uma lista das vozes disponíveis no dispositivo.getVoices()
: pausa a síntese em andamento.pause()
: retoma a síntese pausada.resume()
: adiciona uma declaração à fila para ser sintetizada.speak()
Um exemplo prático de síntese em um formulário HTML seria:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Síntese de Fala</title>
</head>
<body>
<input id="text" value="Hello World" />
<button id="btn">Falar</button>
<script>
document.getElementById("btn").addEventListener("click", speak);
function speak() {
if (window.speechSynthesis) {
const utterance = new SpeechSynthesisUtterance();
utterance.text = document.getElementById("text").value;
window.speechSynthesis.speak(utterance);
} else {
console.log("A funcionalidade não é suportada.");
}
}
</script>
</body>
</html>
Neste caso, o texto inserido no campo será sintetizado ao clicar no botão. Alguns navegadores, como o Google Chrome, podem impor restrições exigindo que a síntese seja ativada apenas por uma ação do usuário, como um clique em botão.
Personalizando configurações de fala
É possível personalizar a fala ajustando as propriedades:
document.getElementById("btn").addEventListener("click", speak);
function speak() {
if (window.speechSynthesis) {
const utterance = new SpeechSynthesisUtterance();
utterance.text = "Olá";
utterance.lang = "pt-BR";
utterance.volume = 0.7; // Volume da fala (0.0 a 1.0)
utterance.rate = 1.0; // Velocidade da fala (0.1 a 10.0)
utterance.pitch = 1.2; // Altura da voz (0.0 a 2.0)
window.speechSynthesis.speak(utterance);
}
}
Seleção de vozes disponíveis
O navegador pode oferecer várias opções de vozes, que podem ser acessadas usando o método getVoices()
const voices = window.speechSynthesis.getVoices();
voices.forEach((voice) => {
console.log(voice.name);
console.log(voice.lang);
});
Após identificar a voz desejada, ela pode ser configurada na propriedade voice
SpeechSynthesisUtterance
document.getElementById("btn").addEventListener("click", speak);
function speak() {
if (window.speechSynthesis) {
const utterance = new SpeechSynthesisUtterance();
utterance.text = "Olá";
const voices = window.speechSynthesis.getVoices();
utterance.voice = voices[0]; // Seleciona a primeira voz
window.speechSynthesis.speak(utterance);
}
}
Eventos de síntese de fala
Durante a síntese de fala, vários eventos podem ser disparados para monitorar ou controlar o processo:
: acionado ao alcançar limites de palavras ou frases.boundary
: acionado ao final da fala.end
: acionado em caso de erro.error
: acionado ao alcançar uma marca nomeada no SSML.mark
: acionado quando a fala é pausada.pause
: acionado ao retomar a fala.resume
: acionado ao iniciar a fala.start
Por exemplo, para capturar os eventos de início e término da fala:
document.getElementById("btn").addEventListener("click", speak);
function speak() {
if (window.speechSynthesis) {
const utterance = new SpeechSynthesisUtterance();
utterance.text = "Olá";
utterance.onstart = () => console.log("Início da fala.");
utterance.onend = () => console.log("Fim da fala.");
window.speechSynthesis.speak(utterance);
}
}