JS30. Задание 23 Magic Site


Демо https://js30232.github.io/
Код https://github.com/js30232/js30232.github.io

Оригинальное авторское задание было в одном из предыдущих постов, здесь - вариация на его тему: сайт, меняющий цвет фона по голосовой команде.

Разметка

        <div class="voiceinator">
            <h1>Magic Site</h1>
            <p>Этот сайт управляется голосом.<br>
            Назовите любой из цветов радуги,<br>
            или выберите его из списка ниже<br><br>
            Работает в Хроме</p>
            <select id="text">
                <option>Белый</option>
                <option>Красный</option>
                <option>Оранжевый</option>
                <option>Желтый</option>
                <option>Зелёный</option>
                <option>Голубой</option>
                <option>Синий цвет</option>
                <option>Фиолетовый</option>
            </select>
            <button id="speak">Speak</button>
        </div>


Предполагается, что пользователь может не только сам называть цвет фона, а выбрать его из списка. Сайт озвучит название цвета, распознает его и изменит цвет в соответствии с распознанным текстом.

Вообще, сделать смену фона по клику можно было сильно проще. Здесь смысл как раз в том, чтобы цвет менялся по голосовой команде, которую может озвучить или пользователь, или сам сайт.

Код

1. window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;

Строка нужна для того, чтобы распознавание речи работало и с префиксом webkit и без него, когда это станет возможным.

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

var text = document.getElementById("text");
var speakButton = document.getElementById("speak");
var body = document.querySelector("body");


3. var voice = "белый";

var colors = {
    "белый": "#F7F7F7",
    "красный": "#BC382E",
    "оранжевый": "#FF8000",
    "желтый": "#F5BD00",
    "зеленый": "#388D80",
    "голубой": "#4583AA",
    "синий цвет": "#163260",
    "фиолетовый": "#560DA6"
}


Цвет фона по умолчанию и объект соответствия названий и кода цвета.

4. function speak() {
    var msg = new SpeechSynthesisUtterance();
    msg.text = text.value;
    speechSynthesis.speak(msg);   
}


speakButton.addEventListener("click", speak);

Функция озвучивания выбранного цвета.
Запускается по клику по кнопке

5. Функция распознавания голоса и изменения фона согласно названному цвету

var recognition = new SpeechRecognition();
recognition.interimResults = true;

function recognitionVoice(e) {
    voice = Array.from(e.results)
        .map(result => result[0])
        .map(result => result.transcript)
        .join("");
    console.log(voice);
   
    for (key in colors) {
        if(voice === key) {
            body.style.backgroundColor = colors[key];
        }
    }
}

recognition.addEventListener("result", recognitionVoice);

recognition.addEventListener("end", function(e) {
    recognition.start();
});


Здесь мне не очень нравится, что объединены две функции, но как их разделить не знаю.
Код полностью:

window.SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;

var text = document.getElementById("text");
var speakButton = document.getElementById("speak");
var body = document.querySelector("body");
var voice = "белый";

var colors = {
    "белый": "#F7F7F7",
    "красный": "#BC382E",
    "оранжевый": "#FF8000",
    "желтый": "#F5BD00",
    "зеленый": "#388D80",
    "голубой": "#4583AA",
    "синий цвет": "#163260",
    "фиолетовый": "#560DA6"
}

function speak() {
    var msg = new SpeechSynthesisUtterance();
    msg.text = text.value;
    speechSynthesis.speak(msg);   
}

var recognition = new SpeechRecognition();
recognition.interimResults = true;

function recognitionVoice(e) {
    voice = Array.from(e.results)
        .map(result => result[0])
        .map(result => result.transcript)
        .join("");
    console.log(voice);
   
    for (key in colors) {
        if(voice === key) {
            body.style.backgroundColor = colors[key];
        }
    }
}

recognition.addEventListener("result", recognitionVoice);

recognition.addEventListener("end", function(e) {
    recognition.start();
});

speakButton.addEventListener("click", speak);
recognition.start();