Web Speech API. Синтез речи

Последнее обновление: 16.11.2023

Web Speech API позволяет веб-разработчикам программно генерировавать и распознавать речь на веб-странице. Для этого Web Speech API определяет два интерфейса: SpeechRecognition (для распознавания речи) и SpeechSynthesis (для синтеза речи). Данный API (на момент написания текущей статьи) еще не является официальным стандартом W3C, и его поддержка в различных браузерах может отличаться. Вначале рассмотрим синтез речи.

На уровне браузера синтез речи доступен через свойство speechSynthesis объекта window, которое представляет SpeechSynthesis и через которое можно проверить поддержку браузером синтеза речи:

if(window.speechSynthesis) {
    console.log("Синтез речи поддерживается");
} 
else {
    console.log("Синтез речи НЕ поддерживается");
}
// Альтернативный способ проверки 
if("speechSynthesis" in window) {  
    console.log("Синтез речи поддерживается");
} 
else {
    console.log("Синтез речи НЕ поддерживается");
}

Для синтеза речи применяется объект типа SpeechSynthesisUtterance, который представляет собой отдельное высказывание и который позволяет определить конфигурацию синтеза с помощью ряда свойств:

  • lang: получает и устанавливает язык высказывания.

  • pitch: получает и задает высоту звука, с которой будет произнесено высказывание.

  • rate: получает и задает скорость произнесения высказывания.

  • text: получает и задает текст, который будет синтезироваться при произнесении высказывания.

  • voice: получает и задает голос, который будет использоваться для произнесения высказывания.

  • volume: получает и задает громкость произнесения высказывания.

В общем случае нам достаточно установить свойство text:

const utterance = new SpeechSynthesisUtterance();
utterance.text = "Hello World";

Непосредственно для синтеза речи и ее управлением вызывается один из методов типа SpeechSynthesis:

  • cancel(): удаляет все высказывания из очереди высказываний.

  • getVoices(): возвращает список объектов SpeechSynthesisVoice, представляющих все доступные голоса на текущем устройстве.

  • pause(): приостанавливает синтез речи.

  • resume(): возобновляет синтез речи (если он ранее был приостановлен).

  • speak(): добавляет высказывание в очередь высказываний для последующего произнесения

Например, синтезируем речь для простейшего текста:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
<input id="text" value="Hello World" />
<button id="btn">Speak</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("Feature not supported");
    }
}
</script>
</body>
</html>

В данном случае по нажатию на кнопку будет синтезироваться речь для текста, который введен в текстовое поле. Стоит отметить, что в браузерах могут действовать ограничения на запуск синтеза, так в Google Chrome требуется, чтобы пользователь активировал действие. Именно поэтому здесь синтез выполняется по нажатию на кнопку, а не сразу при загрузке страницы.

Дополнительно можно настроить и другие настройки речи:

document.getElementById("btn").addEventListener("click", speak);
function speak(){
    if(window.speechSynthesis) {
        const utterance = new SpeechSynthesisUtterance();
        utterance.text = "Привет";
        utterance.lang = "ru";           // аббревиатура языка
        utterance.volume = 0.5;          // громкость
        utterance.rate = 0.5;            // скорость
        utterance.pitch = 0.5;           // высота
        window.speechSynthesis.speak(utterance);
    }
}

Выбор голоса

Если браузер поддерживает несколько голосов, то их можно выбрать с помощью метода getVoices() объекта SpeechSynthesis. Каждый голос имеет разные свойства, включая имя и связанное с ним сокращение страны или языка. И мы можем перебрать все голоса в цикле:

const voices = window.speechSynthesis.getVoices();
    voices.forEach(function(voice) {  
    console.log(voice.lang);
    console.log(voice.name);
});

Выбрав нужный голос, его можно установить с помощью свойства voices объекта SpeechSynthesisUtterance

document.getElementById("btn").addEventListener("click", speak);
function speak(){
    if(window.speechSynthesis) {
        const utterance = new SpeechSynthesisUtterance();
        utterance.text = "Привет";
        const voices = window.speechSynthesis.getVoices();
        const selectedVoice = voices[0];    //  выбираем первый голос
        window.speechSynthesis.speak(utterance);
    }
}

Но стоит отметить, что в моем случае, хотя список выдавал три русскоязычных голоса, все они были идентичны первому.

События синтеза речи

В процессе синтеза речи могут возникать различные события (на объекте SpeechSynthesisUtterance):

  • boundary: возникает при достижении границы слова или фразы. Обработчик устанавливается с помощью свойства onboundary

  • end: возникает при завершении речи. Обработчик устанавливается с помощью свойства onend

  • error: возникает при воникновении ошибки. Обработчик устанавливается с помощью свойства onerror

  • mark: возникает, когда речь достигает именованного тега "метки" SSML. Обработчик устанавливается с помощью свойства onmark

  • pause: возникает, когда речь приостановлена. Обработчик устанавливается с помощью свойства onpause

  • resume: возникает, когда речь возобновлена. Обработчик устанавливается с помощью свойства onresume

  • start: возникает при начале речи. Обработчик устанавливается с помощью свойства onstart

Для демонстрации обработаем пару событий:

document.getElementById("btn").addEventListener("click", speak);
function speak(){
    if(window.speechSynthesis) {
        const utterance = new SpeechSynthesisUtterance();
        utterance.onstart = () => console.log("Начало речи");
        utterance.onend = () => console.log("Конец речи");
        utterance.text = "Привет";
        window.speechSynthesis.speak(utterance);
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850