{"id":419,"date":"2025-12-03T07:15:23","date_gmt":"2025-12-03T07:15:23","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=419"},"modified":"2025-12-03T07:15:23","modified_gmt":"2025-12-03T07:15:23","slug":"hopes-and-intentions-describing-pictures","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/hopes-and-intentions-describing-pictures\/","title":{"rendered":"Hopes and Intentions &#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>Hopes and Dreams \u2013 Gary, Paula, Celia, Richard<\/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\/hopes-and-intentions-conversation\/\">Conversation<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-vocabulary\/\">Vocabulary<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-real-life\/\">Real Life<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-describing-pictures\/\">Describing Pictures<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-reading-comprehension\/\">Reading<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-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 hopes and dreams -->\n                <img decoding=\"async\" src=\"http:\/\/asiacall.info\/wp-content\/uploads\/2025\/12\/12-1.png\"\n                     alt=\"Hopes and dreams of Gary, Paula, Celia and Richard\">\n                <div class=\"sentence-text\">\n                    Look at the pictures. Talk about the hopes and dreams of Gary, Paula, Celia and Richard.\n                    Use <b>going to<\/b> to talk about their future plans.\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>Hopes and Dreams \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\/hopes-and-intentions-conversation\/\">Conversation<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-vocabulary\/\">Vocabulary<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-real-life\/\">Real Life<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-describing-pictures\/\">Describing Pictures<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-reading-comprehension\/\">Reading<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-listening\/\">Listening<\/a>\n    <\/div>\n\n<script>\n    \/\/ Rounds for each person\u2019s hopes and dreams\n    const rounds = [\n        {\n            label: \"Gary \u2013 Health and lifestyle\",\n            name: \"Gary\",\n            question:\n                \"Look at Gary\u2019s pictures. What are Gary\u2019s hopes and dreams?\",\n            followUp:\n                \"Use going to. For example: Gary wants to lose weight. He\u2019s going to stop eating fast food, and he\u2019s going to exercise more.\",\n            ideas: [\n                \"lose weight\",\n                \"stop eating fast food\",\n                \"eat healthier food\",\n                \"do more exercise\",\n                \"join a gym\"\n            ],\n            exampleAnswer:\n                \"Gary wants to lose weight. He\u2019s going to stop eating fast food and he\u2019s going to exercise every day.\"\n        },\n        {\n            label: \"Paula \u2013 Study and career\",\n            name: \"Paula\",\n            question:\n                \"Now look at Paula. What is Paula going to do in the future?\",\n            followUp:\n                \"Talk about her studies and career. Use sentences like: She\u2019s going to go to graduate school. She\u2019s going to study hard and get a good job.\",\n            ideas: [\n                \"go to graduate school\",\n                \"study at a good university\",\n                \"get a great job\",\n                \"earn a good salary\",\n                \"live in a big city\"\n            ],\n            exampleAnswer:\n                \"Paula is going to go to graduate school. She\u2019s going to study at a good university and she\u2019s going to get a great job.\"\n        },\n        {\n            label: \"Celia \u2013 Job and travel\",\n            name: \"Celia\",\n            question:\n                \"Look at Celia\u2019s hopes and dreams. What is she going to do?\",\n            followUp:\n                \"Say two or three things. For example: She\u2019s going to get a good job, she\u2019s going to travel a lot, and she\u2019s going to take vacations by the sea.\",\n            ideas: [\n                \"get a good job\",\n                \"work in an office\",\n                \"travel to many countries\",\n                \"take vacations by the sea\",\n                \"save money for the future\"\n            ],\n            exampleAnswer:\n                \"Celia is going to get a good job in business. She\u2019s going to travel to other countries and she\u2019s going to take vacations by the sea.\"\n        },\n        {\n            label: \"Richard \u2013 Helping people\",\n            name: \"Richard\",\n            question:\n                \"Now talk about Richard. What are Richard\u2019s hopes and dreams?\",\n            followUp:\n                \"Use going to to talk about helping people. For example: He\u2019s going to work in another country and he\u2019s going to help poor people.\",\n            ideas: [\n                \"work in another country\",\n                \"go to India\",\n                \"work for a charity\",\n                \"help poor families\",\n                \"teach children\",\n                \"work as a doctor or volunteer\"\n            ],\n            exampleAnswer:\n                \"Richard is going to go to India. He\u2019s going to work for a charity and he\u2019s going to help poor families and children.\"\n        },\n        {\n            label: \"Challenge \u2013 True or false\",\n            name: \"Challenge\",\n            question:\n                \"Challenge time! Make a true or false sentence about the hopes and dreams of one person.\",\n            followUp:\n                \"For example: Gary\u2019s going to give up fast food. Or: Paula\u2019s going to live in Spain. Your partner can say: That\u2019s true or That\u2019s false.\",\n            ideas: [\n                \"Gary\u2019s going to give up fast food.\",\n                \"Paula\u2019s going to study in another country.\",\n                \"Celia\u2019s going to get a boring job.\",\n                \"Richard\u2019s going to live in India.\"\n            ],\n            exampleAnswer:\n                \"Gary\u2019s going to give up fast food. Paula\u2019s going to go to graduate school.\"\n        }\n    ];\n\n    const positiveFeedback = [\n        \"Great! You used going to correctly.\",\n        \"Nice work! Your sentence about hopes and dreams sounds natural.\",\n        \"Excellent! You used going to and some good vocabulary.\",\n        \"Very good. That\u2019s a clear description of the person\u2019s future plans.\",\n        \"Fantastic! You used full sentences with going to.\",\n        \"Nice sentence! Your future verbs are correct.\"\n    ];\n\n    const constructiveFeedback = [\n        \"Try to use going to, for example: He\u2019s going to lose weight. She\u2019s going to study at university.\",\n        \"Remember to say the person\u2019s name, for example: Gary is going to\u2026, Paula is going to\u2026.\",\n        \"Can you make a longer answer? Add one more hope or dream.\",\n        \"Use full sentences, not only words. For example: She\u2019s going to get a great job.\",\n        \"Include at least two future plans with going to.\"\n    ];\n\n    \/\/ Grammar feedback for common mistakes\n    const grammarFeedbackPatterns = [\n        {\n            match: \"he go to\",\n            message: 'For plans, say: \"He\u2019s going to \u2026\", not \"He go to \u2026\".'\n        },\n        {\n            match: \"she go to\",\n            message: 'Say: \"She\u2019s going to \u2026\", not \"She go to \u2026\".'\n        },\n        {\n            match: \"going gonna\",\n            message: 'Use: \"going to\", not \"going gonna\".'\n        },\n        {\n            match: \"he is going gonna\",\n            message: 'Say: \"He\u2019s going to \u2026\", not \"He is going gonna \u2026\".'\n        },\n        {\n            match: \"she going to goes\",\n            message: 'Say: \"She\u2019s going to go \u2026\", not \"going to goes\".'\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            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 language for hopes and dreams (future plans):\");\n        addSentenceToBox(\"\u2022 He wants to lose weight.\");\n        addSentenceToBox(\"\u2022 He\u2019s going to stop eating fast food.\");\n        addSentenceToBox(\"\u2022 She\u2019s going to go to graduate school.\");\n        addSentenceToBox(\"\u2022 She\u2019s going to get a great job.\");\n        addSentenceToBox(\"\u2022 He\u2019s going to work in another country.\");\n        addSentenceToBox(\"\u2022 She\u2019s going to travel a lot.\");\n        addSentenceToBox(\"Challenge: Make true or false sentences, for example:\");\n        addSentenceToBox(\"\u2022 Gary\u2019s going to give up fast food.\");\n        addSentenceToBox(\"\u2022 Paula\u2019s going to live in Spain.\");\n    }\n\n    function greetUser() {\n        const greeting =\n            \"Hello! In this activity we will talk about the hopes and dreams of Gary, Paula, Celia and Richard. \" +\n            \"Use going to to talk about their future plans. 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        addSentenceToBox(\"Useful ideas:\");\n        round.ideas.forEach(v => addSentenceToBox(\"\u2022 \" + v));\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        \/\/ Check use of going to\n        if (lower.includes(\"going to\")) {\n            feedbackParts.push(\"Good! You used going to for future plans.\");\n        } else {\n            feedbackParts.push(\"Try to use going to, for example: He\u2019s going to\u2026, She\u2019s going to\u2026\");\n        }\n\n        \/\/ Check if person\u2019s name is mentioned\n        if (lower.includes(\"gary\") || lower.includes(\"paula\") ||\n            lower.includes(\"celia\") || lower.includes(\"richard\")) {\n            feedbackParts.push(\"Nice! You said the person\u2019s name.\");\n        } else if (round.name !== \"Challenge\") {\n            feedbackParts.push(\"Remember to say the person\u2019s name, for example: \" + round.name + \" is going to \u2026\");\n        }\n\n        \/\/ Check length (very simple)\n        if (userInput.split(\" \").length >= 8) {\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 hopes and dreams today. Goodbye!\";\n        } else {\n            message = \"Well done! You finished all the rounds. Keep practising going to for future plans.\";\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":101,"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-419","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\/419","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=419"}],"version-history":[{"count":1,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/419\/revisions"}],"predecessor-version":[{"id":420,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/419\/revisions\/420"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/101"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}