{"id":403,"date":"2025-12-03T06:52:56","date_gmt":"2025-12-03T06:52:56","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=403"},"modified":"2025-12-03T06:52:56","modified_gmt":"2025-12-03T06:52:56","slug":"life-stories-describing-pictures","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/life-stories-describing-pictures\/","title":{"rendered":"Life Stories &#8211; Describing Pictures"},"content":{"rendered":"\n<p>This Robot is used for practicing English at level A2. In order to interact with this Robot smoothly, please use a laptop, desktop, or iPad. Do not use Smartphones, though they are sometimes fine. It depends on the updated browsers and Internet connection.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Carole\u2019s Life \u2013 Questions and Answers<\/title>\n    <style>\n        * { box-sizing: border-box; }\n\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #f4f6f8;\n            margin: 0;\n            padding: 0;\n            display: flex;\n            flex-direction: column;\n            min-height: 100vh;\n        }\n\n        .menu {\n            width: 100%;\n            background-color: #28a745;\n            padding: 10px;\n            text-align: center;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n            margin-bottom: 10px;\n            overflow-x: auto;\n            white-space: nowrap;\n        }\n        .menu a {\n            color: #fff;\n            text-decoration: none;\n            margin: 0 10px;\n            font-weight: bold;\n            font-size: 14px;\n            display: inline-block;\n        }\n        .menu a:hover,\n        .menu a:focus {\n            text-decoration: underline;\n            outline: 2px dashed #fff;\n            outline-offset: 4px;\n        }\n\n        .container {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            padding: 10px;\n            flex: 1 0 auto;\n            width: 100%;\n        }\n\n        .image-chat-wrapper {\n            display: flex;\n            flex-direction: column;\n            width: 100%;\n            max-width: 900px;\n            flex: 1;\n        }\n\n        .image-container {\n            flex: 1;\n            text-align: center;\n            margin-bottom: 15px;\n        }\n        .image-container img {\n            width: 100%;\n            height: auto;\n            max-height: 320px;\n            object-fit: cover;\n            border-radius: 15px;\n            box-shadow: 0 0 8px rgba(0,0,0,0.1);\n        }\n        .sentence-text {\n            margin: 10px 0;\n            font-weight: bold;\n            color: #333;\n            font-size: 16px;\n        }\n        .word-box {\n            margin-top: 10px;\n            padding: 10px;\n            background-color: #fff;\n            border: 2px solid #28a745;\n            border-radius: 8px;\n            box-shadow: 0 0 8px rgba(0,0,0,0.1);\n            font-size: 15px;\n            font-weight: bold;\n            color: #28a745;\n            text-align: left;\n            max-height: 260px;\n            overflow-y: auto;\n        }\n\n        .chat-container {\n            background-color: #28a745;\n            border-radius: 15px;\n            box-shadow: 0 0 8px rgba(0,0,0,0.1);\n            border: 3px solid #007bff;\n            overflow: hidden;\n            display: flex;\n            flex-direction: column;\n            height: auto;\n            max-height: 520px;\n            flex: 1;\n        }\n        .chat-header {\n            background-color: #1e7e34;\n            color: #fff;\n            padding: 12px;\n            text-align: center;\n            border-bottom: 1px solid #155724;\n            position: relative;\n        }\n        .chat-header h2 {\n            margin: 0;\n            font-size: 18px;\n        }\n        .chat-header .loader {\n            position: absolute;\n            right: 20px;\n            top: 50%;\n            transform: translateY(-50%);\n            display: none;\n        }\n\n        .chat-messages {\n            padding: 12px;\n            overflow-y: auto;\n            flex: 1;\n            background-color: #fff;\n            max-height: 320px;\n        }\n        .message {\n            margin-bottom: 10px;\n            padding: 10px;\n            border-radius: 6px;\n            font-size: 14px;\n            line-height: 1.5;\n        }\n        .user-message {\n            background-color: #ffc107;\n            color: #fff;\n            text-align: right;\n        }\n        .bot-message {\n            background-color: #17a2b8;\n            color: #fff;\n            text-align: left;\n        }\n\n        .chat-input {\n            display: flex;\n            align-items: center;\n            background-color: #c3e6cb;\n            padding: 10px;\n            flex-wrap: wrap;\n            justify-content: center;\n        }\n\n        .voice-selection {\n            margin: 10px 0;\n            width: 100%;\n            max-width: 100%;\n            margin-bottom: 10px;\n        }\n        .voice-selection label {\n            display: block;\n            margin-bottom: 5px;\n            font-weight: bold;\n            color: #333;\n        }\n        .voice-selection select {\n            width: 100%;\n            padding: 8px;\n            border-radius: 5px;\n            border: 1px solid #ccc;\n            font-size: 14px;\n        }\n\n        .send-button,\n        .stop-button {\n            background-color: #17a2b8;\n            color: #fff;\n            font-weight: bold;\n            border: none;\n            border-radius: 5px;\n            cursor: pointer;\n            transition: background-color 0.3s;\n            flex: 0 0 calc(50% - 12px);\n            max-width: calc(50% - 12px);\n            margin: 6px;\n            font-size: 18px;\n            padding: 14px 0;\n        }\n        .stop-button { background-color: #dc3545; }\n\n        .send-button:hover,\n        .stop-button:hover,\n        .send-button:focus,\n        .stop-button:focus {\n            background-color: #218838;\n            outline: none;\n        }\n        .stop-button:hover,\n        .stop-button:focus {\n            background-color: #c82333;\n        }\n\n        @media (max-width: 480px) {\n            .send-button,\n            .stop-button {\n                flex: 0 0 100%;\n                max-width: 100%;\n            }\n        }\n\n        .loader {\n            border: 4px solid #f3f3f3;\n            border-top: 4px solid #17a2b8;\n            border-radius: 50%;\n            width: 20px;\n            height: 20px;\n            animation: spin 2s linear infinite;\n            display: inline-block;\n            margin-left: 10px;\n        }\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n\n        @media (orientation: portrait) {\n            .image-chat-wrapper {\n                flex-direction: column;\n            }\n            .image-container, .chat-container {\n                width: 100%;\n                max-width: 100%;\n            }\n        }\n\n        @media (orientation: landscape) and (min-width: 600px) {\n            .image-chat-wrapper {\n                flex-direction: row;\n                justify-content: space-between;\n            }\n            .image-container, .chat-container {\n                width: 48%;\n                max-width: 48%;\n            }\n            .word-box { max-height: 220px; }\n            .chat-header h2 { font-size: 20px; }\n            .message { font-size: 15px; }\n        }\n\n        @media (max-width: 768px) {\n            .chat-header h2 { font-size: 16px; }\n            .message { font-size: 14px; }\n            .word-box { font-size: 15px; }\n            .voice-selection select { font-size: 14px; }\n        }\n    <\/style>\n<\/head>\n<body>\n    <!-- Top menu -->\n    <div class=\"menu\">\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-conversation\/\">Conversation<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-vocabulary\/\">Vocabulary<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-real-life\/\">Real Life<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-describing-pictures\/\">Describing Pictures<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-reading-comprehension\/\">Reading<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-listening\/\">Listening<\/a>\n    <\/div>\n\n    <div class=\"container\">\n        <div class=\"image-chat-wrapper\">\n            <div class=\"image-container\">\n                <!-- Replace with your image of Carole's life -->\n                <img decoding=\"async\" src=\"http:\/\/asiacall.info\/wp-content\/uploads\/2025\/12\/11.png\"\n                     alt=\"Timeline of Carole\u2019s life from 1939 to 2015\">\n                <div class=\"sentence-text\">\n                    Look at the pictures. Ask and answer questions about Carole\u2019s life: \n                    Where was she born? How old was she when she did different things? What did she do in each year?\n                <\/div>\n                <div id=\"word-box\" class=\"word-box\"><\/div>\n            <\/div>\n\n            <div class=\"chat-container\">\n                <div class=\"chat-header\">\n                    <h2>Carole\u2019s Life \u2013 Speaking Practice<\/h2>\n                    <div class=\"loader\" id=\"synthesis-loader\"><\/div>\n                <\/div>\n                <div class=\"chat-messages\" id=\"chat-messages\"><\/div>\n                <div class=\"chat-input\">\n                    <div class=\"voice-selection\">\n                        <label for=\"voice-select\">Choose Voice (US \/ UK):<\/label>\n                        <select id=\"voice-select\" aria-label=\"Select Voice\">\n                            <option value=\"\">Loading voices&#8230;<\/option>\n                        <\/select>\n                    <\/div>\n                    <button id=\"start-btn\" class=\"send-button\" aria-label=\"Start Lesson\">Start<\/button>\n                    <button id=\"stop-btn\" class=\"stop-button\" aria-label=\"Stop Lesson\">Stop<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Bottom menu -->\n    <div class=\"menu\">\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-conversation\/\">Conversation<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-vocabulary\/\">Vocabulary<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-real-life\/\">Real Life<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-describing-pictures\/\">Describing Pictures<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-reading-comprehension\/\">Reading<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/life-stories-listening\/\">Listening<\/a>\n    <\/div>\n\n<script>\n    \/\/ Rounds for each stage of Carole's life\n    const rounds = [\n        {\n            label: \"Birth \u2013 1939\",\n            year: \"1939\",\n            focus: \"birth\",\n            question:\n                \"First, talk about Carole\u2019s birth. Where was she born and when was she born?\",\n            followUp:\n                \"Use a sentence like: She was born in California in 1939.\",\n            exampleAnswer:\n                \"She was born in California in 1939.\"\n        },\n        {\n            label: \"Move to New York \u2013 1943\",\n            year: \"1943\",\n            focus: \"move\",\n            question:\n                \"Now look at the next picture. What happened in 1943?\",\n            followUp:\n                \"Use the simple past: In 1943 she moved to New York.\",\n            exampleAnswer:\n                \"In 1943 she moved to New York.\"\n        },\n        {\n            label: \"High school graduation \u2013 1957\",\n            year: \"1957\",\n            focus: \"high school graduation\",\n            question:\n                \"Let\u2019s talk about 1957. What did she do in 1957?\",\n            followUp:\n                \"You can say: She graduated from high school in 1957. How old was she then?\",\n            exampleAnswer:\n                \"She graduated from high school in 1957. She was eighteen.\"\n        },\n        {\n            label: \"Yale University \u2013 1958\",\n            year: \"1958\",\n            focus: \"university start\",\n            question:\n                \"Look at the picture of Yale University. What did she do in 1958?\",\n            followUp:\n                \"Say where she studied and what she studied, for example: In 1958 she went to Yale University to study Business.\",\n            exampleAnswer:\n                \"In 1958 she went to Yale University to study Business. She was nineteen.\"\n        },\n        {\n            label: \"University graduation and Europe \u2013 1962\",\n            year: \"1962\",\n            focus: \"university graduation and vacation\",\n            question:\n                \"Now look at the pictures from 1962. What did she do in 1962?\",\n            followUp:\n                \"Use two sentences, for example: She graduated from Yale in 1962. In the summer of 1962 she went on vacation to Europe.\",\n            exampleAnswer:\n                \"She graduated from Yale in 1962. In the summer of 1962 she went on vacation to Europe.\"\n        },\n        {\n            label: \"Job at Ford Motor Company \u2013 1963\",\n            year: \"1963\",\n            focus: \"job\",\n            question:\n                \"What happened in 1963? Where did she work?\",\n            followUp:\n                \"Use a sentence like: She started working at Ford Motor Company in 1963.\",\n            exampleAnswer:\n                \"She started working at Ford Motor Company in 1963.\"\n        },\n        {\n            label: \"Marriage \u2013 James 1967\",\n            year: \"1967\",\n            focus: \"marriage\",\n            question:\n                \"Now look at the picture from 1967. What did she do in 1967?\",\n            followUp:\n                \"Use the simple past: She got married. For example: She married James in 1967.\",\n            exampleAnswer:\n                \"She married James in 1967.\"\n        },\n        {\n            label: \"First child \u2013 Leon 1972\",\n            year: \"1972\",\n            focus: \"child one\",\n            question:\n                \"Look at the baby picture in 1972. What happened in 1972?\",\n            followUp:\n                \"Use: She had a son. For example: She had a son, Leon, in 1972.\",\n            exampleAnswer:\n                \"She had a son, Leon, in 1972.\"\n        },\n        {\n            label: \"Move to London \u2013 1976\",\n            year: \"1976\",\n            focus: \"move to London\",\n            question:\n                \"What did she do in 1976?\",\n            followUp:\n                \"Say where she moved: She moved to London in 1976.\",\n            exampleAnswer:\n                \"She moved to London in 1976.\"\n        },\n        {\n            label: \"Second child \u2013 Emma 1981\",\n            year: \"1981\",\n            focus: \"child two\",\n            question:\n                \"Now look at 1981. What happened in 1981?\",\n            followUp:\n                \"Use a sentence like: She had a daughter, Emma, in 1981.\",\n            exampleAnswer:\n                \"She had a daughter, Emma, in 1981.\"\n        },\n        {\n            label: \"Trip with grandchildren \u2013 1999\",\n            year: \"1999\",\n            focus: \"trip with grandchildren\",\n            question:\n                \"Look at the picture from 1999. What did she do in 1999?\",\n            followUp:\n                \"You can say: She went on a trip with her grandchildren in 1999.\",\n            exampleAnswer:\n                \"She went on a trip with her grandchildren in 1999.\"\n        },\n        {\n            label: \"End of her life \u2013 2015\",\n            year: \"2015\",\n            focus: \"death\",\n            question:\n                \"Finally, what happened in 2015?\",\n            followUp:\n                \"Use a respectful sentence like: She died in 2015.\",\n            exampleAnswer:\n                \"She died in 2015.\"\n        },\n        {\n            label: \"Challenge \u2013 True or false\",\n            year: \"\",\n            focus: \"challenge\",\n            question:\n                \"Challenge time! Make a true or false sentence about Carole\u2019s life.\",\n            followUp:\n                \"For example: Carole was born in New York. Your partner can say: That\u2019s false. She was born in California. Now make your own sentence.\",\n            exampleAnswer:\n                \"Carole graduated from Yale in 1962. She moved to London in 1976.\"\n        }\n    ];\n\n    const positiveFeedback = [\n        \"Great! You used clear sentences in the simple past.\",\n        \"Nice work! Your answer sounds natural.\",\n        \"Excellent! You used the year and the action correctly.\",\n        \"Very good. That\u2019s a clear description of this stage of her life.\",\n        \"Fantastic! You used was, were and past verbs very well.\",\n        \"Nice sentence! Your simple past verbs are correct.\"\n    ];\n\n    const constructiveFeedback = [\n        \"Try to use the simple past, for example: was, went, moved, graduated, died.\",\n        \"Remember to say the year as well: in 1958, in 1963, and so on.\",\n        \"Can you make a longer answer? Add one more detail.\",\n        \"Try to say who, where or when, not only the action.\",\n        \"Use full sentences, for example: She went to Yale University in 1958.\"\n    ];\n\n    \/\/ Grammar feedback for common mistakes\n    const grammarFeedbackPatterns = [\n        {\n            match: \"she were\",\n            message: 'Remember: say \"she was\", not \"she were\".'\n        },\n        {\n            match: \"did born\",\n            message: 'For birth, say: \"she was born\", not \"she did born\".'\n        },\n        {\n            match: \"did moved\",\n            message: 'Say: \"she moved\", not \"she did moved\".'\n        },\n        {\n            match: \"did went\",\n            message: 'Say: \"she went\", not \"she did went\".'\n        },\n        {\n            match: \"was died\",\n            message: 'Say: \"she died in 2015\", not \"she was died\".'\n        }\n    ];\n\n    const stopKeywords = [\"goodbye\",\"good bye\",\"bye\",\"bye-bye\",\"byebye\"];\n\n    let currentRoundIndex = 0;\n    let recognition;\n    let isLessonActive = false;\n    let speechRecognitionActive = false;\n\n    const speechSynthesisSupported = \"speechSynthesis\" in window;\n    const speechRecognitionSupported = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n    let voices = [];\n    let selectedVoice = null;\n\n    const desiredVoiceNames = [\n        \"Google US English\",\n        \"Google US English Female\",\n        \"Google UK English Male\",\n        \"Google UK English Female\"\n    ];\n\n    function initialize() {\n        if (speechSynthesisSupported) {\n            loadVoices();\n        } else {\n            appendMessage(\"Sorry, your browser does not support speech synthesis.\", \"bot\");\n        }\n\n        fillInitialWordBox();\n\n        if (speechSynthesisSupported) {\n            setTimeout(greetUser, 500);\n        }\n\n        if (!speechRecognitionSupported) {\n            appendMessage(\"Sorry, your browser does not support speech recognition.\", \"bot\");\n        }\n\n        document.getElementById(\"start-btn\").onclick = function() {\n            if (isLessonActive) return;\n\n            if (!speechSynthesisSupported) {\n                appendMessage(\"Speech synthesis is not supported in your browser.\", \"bot\");\n                return;\n            }\n            if (!speechRecognitionSupported) {\n                appendMessage(\"Speech recognition is not supported in your browser.\", \"bot\");\n                return;\n            }\n\n            isLessonActive = true;\n            currentRoundIndex = 0;\n            startRound();\n        };\n\n        document.getElementById(\"stop-btn\").onclick = function() {\n            if (recognition && speechRecognitionActive) {\n                recognition.stop();\n                speechRecognitionActive = false;\n            }\n            endLesson(true);\n        };\n    }\n\n    function loadVoices() {\n        voices = window.speechSynthesis.getVoices();\n        if (voices.length === 0) {\n            window.speechSynthesis.onvoiceschanged = () => {\n                voices = window.speechSynthesis.getVoices();\n                populateVoiceList();\n            };\n        } else {\n            populateVoiceList();\n        }\n    }\n\n    function populateVoiceList() {\n        const voiceSelect = document.getElementById(\"voice-select\");\n        voiceSelect.innerHTML = \"\";\n\n        const filteredVoices = voices.filter(v => desiredVoiceNames.includes(v.name));\n\n        if (filteredVoices.length === 0) {\n            \/\/ Fallback: all English voices, or all voices if none\n            const englishVoices = voices.filter(v => v.lang && v.lang.startsWith(\"en\"));\n            const list = englishVoices.length ? englishVoices : voices;\n\n            list.forEach((voice, index) => {\n                const option = document.createElement(\"option\");\n                option.value = index;\n                option.textContent = `${voice.name} (${voice.lang})`;\n                voiceSelect.appendChild(option);\n            });\n\n            voiceSelect.disabled = list.length === 0;\n            selectedVoice = list[0] || null;\n\n            voiceSelect.onchange = () => {\n                const idx = parseInt(voiceSelect.value, 10);\n                selectedVoice = list[idx];\n            };\n            return;\n        }\n\n        filteredVoices.forEach((voice, index) => {\n            const option = document.createElement(\"option\");\n            option.value = index;\n            option.textContent = `${voice.name} (${voice.lang})`;\n            voiceSelect.appendChild(option);\n        });\n\n        voiceSelect.selectedIndex = 0;\n        selectedVoice = filteredVoices[0];\n\n        voiceSelect.onchange = () => {\n            const idx = parseInt(voiceSelect.value, 10);\n            selectedVoice = filteredVoices[idx];\n        };\n    }\n\n    function fillInitialWordBox() {\n        clearWordBox();\n        addSentenceToBox(\"Useful questions and answers about a life story:\");\n        addSentenceToBox(\"\u2022 Where was she born?\");\n        addSentenceToBox(\"\u2022 When was she born?\");\n        addSentenceToBox(\"\u2022 What did she do in 1957?\");\n        addSentenceToBox(\"\u2022 Where did she study?\");\n        addSentenceToBox(\"\u2022 When did she get married?\");\n        addSentenceToBox(\"\u2022 When did she have her first child?\");\n        addSentenceToBox(\"\u2022 How old was she when she graduated?\");\n        addSentenceToBox(\"\u2022 She was born in California in 1939.\");\n        addSentenceToBox(\"\u2022 She went to Yale University in 1958.\");\n        addSentenceToBox(\"\u2022 She moved to London in 1976.\");\n    }\n\n    function greetUser() {\n        const greeting =\n            \"Hello! In this activity we will talk about Carole\u2019s life. \" +\n            \"Look at the timeline and answer questions like: Where was she born? What did she do in 1958? \" +\n            \"How old was she when she did different things? Click Start to begin.\";\n        appendMessage(greeting, \"bot\");\n        showSynthesisLoader(true);\n        sayText(greeting, \"en-US\").then(() => showSynthesisLoader(false));\n    }\n\n    function startRound() {\n        if (!isLessonActive) return;\n\n        if (currentRoundIndex >= rounds.length) {\n            endLesson(false);\n            return;\n        }\n\n        const round = rounds[currentRoundIndex];\n\n        clearWordBox();\n        addSentenceToBox(round.label);\n        if (round.year) addSentenceToBox(\"Year: \" + round.year);\n        addSentenceToBox(\"Focus: \" + round.focus);\n        addSentenceToBox(\"Example answer:\");\n        addSentenceToBox(round.exampleAnswer);\n\n        appendMessage(round.label, \"bot\");\n        appendMessage(round.question + \" \" + round.followUp, \"bot\");\n\n        showSynthesisLoader(true);\n        const speakText = `${round.label}. ${round.question} ${round.followUp}`;\n        sayText(speakText, \"en-US\").then(() => {\n            showSynthesisLoader(false);\n            listenForAnswer(round);\n        });\n    }\n\n    function listenForAnswer(round) {\n        if (!speechRecognitionSupported) return;\n\n        recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();\n        recognition.lang = \"en-US\";\n        recognition.interimResults = false;\n        recognition.maxAlternatives = 1;\n\n        showRecognitionLoader(true);\n        appendMessage(\"Listening...\", \"bot\");\n        speechRecognitionActive = true;\n        recognition.start();\n\n        recognition.onresult = function(event) {\n            if (!speechRecognitionActive) return;\n\n            const userInput = event.results[0][0].transcript.trim();\n            const formattedInput = normalizeAndFormatUserInput(userInput);\n\n            appendMessage(formattedInput, \"user\");\n            addSentenceToBox(\"Your answer: \" + formattedInput);\n\n            showRecognitionLoader(false);\n            speechRecognitionActive = false;\n\n            if (checkStopKeywords(formattedInput.toLowerCase())) {\n                endLesson(true);\n                return;\n            }\n\n            const feedback = buildFeedback(formattedInput, round);\n            appendMessage(feedback, \"bot\");\n            showSynthesisLoader(true);\n            sayText(feedback, \"en-US\").then(() => {\n                showSynthesisLoader(false);\n                currentRoundIndex++;\n                setTimeout(startRound, 2600);\n            });\n        };\n\n        recognition.onspeechend = function() {\n            if (speechRecognitionActive) {\n                recognition.stop();\n                speechRecognitionActive = false;\n                showRecognitionLoader(false);\n            }\n        };\n\n        recognition.onerror = function(event) {\n            showRecognitionLoader(false);\n            speechRecognitionActive = false;\n            let msg = \"Error: \" + event.error;\n\n            if (event.error === \"not-allowed\") {\n                msg = \"Microphone access was not allowed. Please allow microphone access in your browser settings and try again.\";\n            } else if (event.error === \"no-speech\") {\n                msg = \"I didn\u2019t hear anything. Please try speaking a bit louder or closer to the microphone.\";\n            }\n\n            appendMessage(msg, \"bot\");\n\n            const retryMessage = \"Let\u2019s try that question again.\";\n            appendMessage(retryMessage, \"bot\");\n            showSynthesisLoader(true);\n            sayText(retryMessage, \"en-US\").then(() => {\n                showSynthesisLoader(false);\n                setTimeout(() => listenForAnswer(round), 2500);\n            });\n        };\n    }\n\n    function buildFeedback(userInput, round) {\n        const lower = userInput.toLowerCase();\n        const feedbackParts = [];\n\n        \/\/ Grammar feedback\n        const grammarMessage = checkGrammar(lower);\n        if (grammarMessage) {\n            feedbackParts.push(grammarMessage);\n        }\n\n        \/\/ Year check\n        if (round.year && lower.includes(round.year)) {\n            feedbackParts.push(\"Good, you mentioned the year \" + round.year + \".\");\n        } else if (round.year && round.label !== \"Challenge \u2013 True or false\") {\n            feedbackParts.push(\"Try to add the year, for example: in \" + round.year + \".\");\n        }\n\n        \/\/ Simple past verbs \/ was \/ were\n        if (\n            lower.includes(\"was\") ||\n            lower.includes(\"were\") ||\n            lower.includes(\"went\") ||\n            lower.includes(\"moved\") ||\n            lower.includes(\"graduated\") ||\n            lower.includes(\"studied\") ||\n            lower.includes(\"worked\") ||\n            lower.includes(\"married\") ||\n            lower.includes(\"had\") ||\n            lower.includes(\"died\")\n        ) {\n            feedbackParts.push(\n                positiveFeedback[Math.floor(Math.random() * positiveFeedback.length)]\n            );\n        } else {\n            feedbackParts.push(\n                constructiveFeedback[Math.floor(Math.random() * constructiveFeedback.length)]\n            );\n        }\n\n        return feedbackParts.join(\" \");\n    }\n\n    function checkGrammar(lower) {\n        for (const pattern of grammarFeedbackPatterns) {\n            if (lower.includes(pattern.match)) {\n                return pattern.message;\n            }\n        }\n        return null;\n    }\n\n    function checkStopKeywords(userInput) {\n        const pattern = new RegExp(\"\\\\b(\" + stopKeywords.join(\"|\") + \")\\\\b\", \"i\");\n        return pattern.test(userInput);\n    }\n\n    function normalizeAndFormatUserInput(text) {\n        let normalized = text.replace(\/\\bi\\b\/g, \"I\");\n        return formatSentence(normalized);\n    }\n\n    function formatSentence(text) {\n        if (!text) return text;\n        text = text.charAt(0).toUpperCase() + text.slice(1);\n\n        const questionWords = [\n            \"who\",\"what\",\"where\",\"when\",\"why\",\"how\",\n            \"is\",\"are\",\"do\",\"does\",\"can\",\"should\",\"will\",\"would\",\"did\"\n        ];\n        const firstWord = text.split(\" \")[0].toLowerCase();\n\n        if (questionWords.includes(firstWord) && !text.endsWith(\"?\")) {\n            text += \"?\";\n        } else if (!text.endsWith(\".\") && !text.endsWith(\"?\")) {\n            text += \".\";\n        }\n\n        return text;\n    }\n\n    function addSentenceToBox(sentence) {\n        const box = document.getElementById(\"word-box\");\n        const div = document.createElement(\"div\");\n        div.innerText = sentence;\n        box.appendChild(div);\n        box.scrollTop = box.scrollHeight;\n    }\n\n    function clearWordBox() {\n        document.getElementById(\"word-box\").innerHTML = \"\";\n    }\n\n    function endLesson(userStopped = false) {\n        if (speechSynthesisSupported) {\n            window.speechSynthesis.cancel();\n        }\n        if (recognition && speechRecognitionActive) {\n            recognition.stop();\n            speechRecognitionActive = false;\n        }\n\n        isLessonActive = false;\n\n        let message;\n        if (userStopped) {\n            message = \"Thank you for talking about Carole\u2019s life today. Goodbye!\";\n        } else {\n            message = \"Well done! You finished all the rounds. Keep practising questions about people\u2019s lives.\";\n        }\n        appendMessage(message, \"bot\");\n        showSynthesisLoader(true);\n        sayText(message, \"en-US\").then(() => showSynthesisLoader(false));\n    }\n\n    function sayText(text, lang) {\n        return new Promise(resolve => {\n            if (!speechSynthesisSupported) {\n                resolve();\n                return;\n            }\n            const utterance = new SpeechSynthesisUtterance(text);\n            utterance.lang = lang || \"en-US\";\n            utterance.rate = 1.0;\n            utterance.pitch = 1.0;\n\n            if (selectedVoice) {\n                utterance.voice = selectedVoice;\n            }\n\n            utterance.onend = () => resolve();\n            utterance.onerror = () => resolve();\n\n            window.speechSynthesis.speak(utterance);\n        });\n    }\n\n    function appendMessage(text, sender) {\n        const container = document.getElementById(\"chat-messages\");\n        const messageElement = document.createElement(\"div\");\n        messageElement.classList.add(\"message\");\n        messageElement.classList.add(sender === \"bot\" ? \"bot-message\" : \"user-message\");\n        messageElement.innerText = text;\n        container.appendChild(messageElement);\n        container.scrollTop = container.scrollHeight;\n    }\n\n    function showSynthesisLoader(show) {\n        const loader = document.getElementById(\"synthesis-loader\");\n        loader.style.display = show ? \"inline-block\" : \"none\";\n        if (show) {\n            loader.style.borderTop = \"4px solid #17a2b8\";\n        }\n    }\n\n    function showRecognitionLoader(show) {\n        const loader = document.getElementById(\"synthesis-loader\");\n        if (show) {\n            loader.style.display = \"inline-block\";\n            loader.style.borderTop = \"4px solid #ffc107\";\n        } else {\n            loader.style.display = \"none\";\n        }\n    }\n\n    window.onload = initialize;\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>This Robot is used for practicing English at level A2. In order to interact with this Robot smoothly, please use<\/p>\n","protected":false},"author":1,"featured_media":84,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[18,5],"tags":[],"class_list":["post-403","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-a2","category-chatbot"],"_links":{"self":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/403","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/comments?post=403"}],"version-history":[{"count":1,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/403\/revisions"}],"predecessor-version":[{"id":404,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/403\/revisions\/404"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/84"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}