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 (para reconhecimento de fala) e SpeechSynthesis (para síntese de fala). No momento da escrita deste artigo, a Web Speech API ainda não é um padrão oficial do W3C, e sua compatibilidade pode variar entre navegadores. Aqui, exploraremos o recurso de síntese de fala.
A síntese de fala está disponível no navegador por meio da propriedade speechSynthesis do objeto window, que representa a interface SpeechSynthesis. Para verificar se o navegador suporta essa funcionalidade, use o seguinte código:
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, que representa uma declaração individual e permite configurar propriedades como:
lang: define o idioma da fala.pitch: ajusta a altura do som.rate: controla a velocidade da fala.text: define o texto que será sintetizado.voice: seleciona a voz usada na fala.volume: ajusta o volume da fala.
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, incluindo:
cancel(): remove todas as declarações da fila.getVoices(): retorna uma lista das vozes disponíveis no dispositivo.pause(): pausa a síntese em andamento.resume(): retoma a síntese pausada.speak(): adiciona uma declaração à fila para ser sintetizada.
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(). Cada voz possui atributos como nome e idioma:
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 do objeto 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:
boundary: acionado ao alcançar limites de palavras ou frases.end: acionado ao final da fala.error: acionado em caso de erro.mark: acionado ao alcançar uma marca nomeada no SSML.pause: acionado quando a fala é pausada.resume: acionado ao retomar a fala.start: acionado ao iniciar a fala.
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);
}
}Documentação oficial: