{"id":296,"date":"2025-11-21T11:52:47","date_gmt":"2025-11-21T11:52:47","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=296"},"modified":"2025-11-25T08:09:49","modified_gmt":"2025-11-25T08:09:49","slug":"whats-happening-speaking","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/whats-happening-speaking\/","title":{"rendered":"What\u2019s happening? &#8211; Speaking"},"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.<\/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>What&#8217;s happening? &#8211; Speaking<\/title>\n    <style>\n        \/* Reset and Base Styles *\/\n        * {\n            box-sizing: border-box;\n        }\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 Styles *\/\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 Styles *\/\n        .container {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            padding: 10px;\n            box-sizing: border-box;\n            flex: 1 0 auto;\n            width: 100%;\n        }\n\n        \/* Image and Chat Containers *\/\n        .image-chat-wrapper {\n            display: flex;\n            flex-direction: column;\n            width: 100%;\n            max-width: 800px;\n            flex: 1;\n        }\n\n        \/* Image Container Styles *\/\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: 300px;\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: 16px;\n            font-weight: bold;\n            color: #28a745;\n            text-align: left;\n            max-height: 250px;\n            overflow-y: auto;\n        }\n\n        \/* Chat Container Styles *\/\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; \/* blue border for chatbot *\/\n            overflow: hidden;\n            display: flex;\n            flex-direction: column;\n            height: auto;\n            max-height: 500px;\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        \/* Loader Indicator *\/\n        .chat-header .loader {\n            position: absolute;\n            right: 20px;\n            top: 50%;\n            transform: translateY(-50%);\n            display: none;\n        }\n        .chat-messages {\n            padding: 12px;\n            overflow-y: auto;\n            flex: 1;\n            background-color: #fff;\n            max-height: 300px;\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 Styles *\/\n        .chat-input {\n            display: flex;\n            align-items: center;\n            background-color: #c3e6cb;\n            padding: 10px;\n            justify-content: space-between;\n            flex-wrap: wrap;\n        }\n        .send-button, .stop-button {\n            background-color: #17a2b8;\n            color: #fff;\n            font-weight: bold;\n            border: none;\n            border-radius: 5px;\n            padding: 12px 16px;\n            cursor: pointer;\n            transition: background-color 0.3s;\n            flex: 1;\n            margin: 6px;\n            max-width: 150px;\n            font-size: 16px;\n        }\n        .stop-button {\n            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\n        \/* Voice Selection Styles *\/\n        .voice-selection {\n            margin: 10px 0;\n            width: 100%;\n            max-width: 300px;\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        \/* Loader Styles *\/\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\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n\n        \/* Responsive Design Adjustments *\/\n\n        \/* Portrait Mode *\/\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        \/* Landscape Mode *\/\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 {\n                max-height: 200px;\n            }\n            .chat-header h2 {\n                font-size: 20px;\n            }\n            .message {\n                font-size: 15px;\n            }\n            .send-button, .stop-button {\n                font-size: 18px;\n                padding: 14px 20px;\n                max-width: 200px;\n            }\n        }\n\n        \/* General Mobile Responsiveness *\/\n        @media (max-width: 768px) {\n            .chat-header h2 {\n                font-size: 16px;\n            }\n            .message {\n                font-size: 14px;\n            }\n            .send-button, .stop-button {\n                font-size: 16px;\n                padding: 12px 16px;\n                max-width: 150px;\n            }\n            .word-box {\n                font-size: 15px;\n            }\n            .voice-selection select {\n                font-size: 14px;\n            }\n        }\n\n        \/* Samsung Android Specific Adjustments *\/\n        @media only screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2) {\n            .chat-header h2 {\n                font-size: 18px;\n            }\n            .send-button, .stop-button {\n                padding: 14px 18px;\n                font-size: 16px;\n            }\n            .message {\n                font-size: 14px;\n            }\n            .word-box {\n                font-size: 16px;\n            }\n            .chat-input input {\n                font-size: 16px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"menu\">\n<a href=\"https:\/\/i-cte.org\/robot\/whats-happening-conversation\/\">Conversation<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-vocabulary\/\">Vocabulary<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-real-life\/\">Real Life<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-describing-pictures\/\">Describing Pictures<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-job-application\/\">Job Application<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-speaking\/\">Speaking<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-reading-comprehension\/\">Reading<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-practice\/\">Practice<\/a>\n    <\/div>\n\n    <div class=\"container\">\n        <div class=\"image-chat-wrapper\">\n            <div class=\"image-container\">\n                <img decoding=\"async\" src=\"https:\/\/i-cte.org\/robot\/wp-content\/uploads\/2025\/11\/5.webp\" alt=\"Robot teacher asking what's happening now\">\n                <div class=\"sentence-text\">Listen to the questions about what is happening now and these days. Answer in full sentences.<\/div>\n                <div id=\"word-box\" class=\"word-box\">\n                    <!-- Learned sentences and answers will be displayed here -->\n                <\/div>\n            <\/div>\n            <div class=\"chat-container\">\n                <div class=\"chat-header\">\n                    <h2>What&#8217;s happening? &#8211; Speaking<\/h2>\n                    <div class=\"loader\" id=\"synthesis-loader\"><\/div>\n                <\/div>\n                <div class=\"chat-messages\" id=\"chat-messages\">\n                    <!-- Messages will appear here -->\n                <\/div>\n                <div class=\"chat-input\">\n                   <!-- Voice Selection Dropdown -->\n                    <div class=\"voice-selection\">\n                        <label for=\"voice-select\">Choose Voice:<\/label>\n                        <select id=\"voice-select\" aria-label=\"Select Voice\">\n                            <option value=\"\">Loading voices&#8230;<\/option>\n                        <\/select>\n                    <\/div>\n                    <!-- Start and Stop Buttons -->\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    <div class=\"menu\">\n<a href=\"https:\/\/i-cte.org\/robot\/whats-happening-conversation\/\">Conversation<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-vocabulary\/\">Vocabulary<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-real-life\/\">Real Life<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-describing-pictures\/\">Describing Pictures<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-job-application\/\">Job Application<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-speaking\/\">Speaking<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-reading-comprehension\/\">Reading<\/a>\n      <a href=\"https:\/\/i-cte.org\/robot\/whats-happening-practice\/\">Practice<\/a>\n    <\/div>\n<script>\n \/\/ Questionnaire: \u201cWhat\u2019s happening in your life these days?\u201d\n const questions = [\n    { \n        english: \"Are you going out with friends a lot?\", \n        keywords: [\"going out with friends\", \"friends\", \"a lot\"],\n        answer: \"Yes, I\u2019m going out with friends a lot these days. We\u2019re eating out and watching movies together.\"\n    },\n    { \n        english: \"Are you studying hard?\", \n        keywords: [\"studying hard\", \"study\", \"homework\"],\n        answer: \"Yes, I\u2019m studying hard. I\u2019m doing a lot of homework and I\u2019m preparing for tests.\"\n    },\n    { \n        english: \"Are you playing a lot of sports?\", \n        keywords: [\"playing a lot of sports\", \"sports\", \"playing\"],\n        answer: \"Yes, I\u2019m playing a lot of sports. I\u2019m playing soccer and basketball every week.\"\n    },\n    { \n        english: \"Are you working part-time?\", \n        keywords: [\"working part-time\", \"part-time\", \"job\"],\n        answer: \"Yes, I\u2019m working part-time in a caf\u00e9 these days.\"\n    },\n    { \n        english: \"Are you eating well?\", \n        keywords: [\"eating well\", \"healthy\", \"food\"],\n        answer: \"Yes, I\u2019m eating well. I\u2019m eating more vegetables and fruit.\"\n    },\n    { \n        english: \"Are you sleeping OK?\", \n        keywords: [\"sleeping OK\", \"sleeping\", \"sleep\"],\n        answer: \"Yes, I\u2019m sleeping OK. I\u2019m going to bed earlier during the week.\"\n    },\n    { \n        english: \"Are you looking for a job?\", \n        keywords: [\"looking for a job\", \"job\", \"applying\"],\n        answer: \"Yes, I\u2019m looking for a job. I\u2019m checking websites and I\u2019m sending applications.\"\n    },\n    { \n        english: \"Are you reading any good books?\", \n        keywords: [\"reading any good books\", \"reading\", \"books\"],\n        answer: \"Yes, I\u2019m reading a really good book right now. I\u2019m enjoying it a lot.\"\n    },\n    { \n        english: \"Are you learning to drive?\", \n        keywords: [\"learning to drive\", \"driving lessons\"],\n        answer: \"Yes, I\u2019m learning to drive. I\u2019m taking driving lessons every weekend.\"\n    },\n    { \n        english: \"Are you enjoying your life?\", \n        keywords: [\"enjoying your life\", \"enjoying life\"],\n        answer: \"Yes, I\u2019m really enjoying my life these days. I\u2019m spending time with friends and family.\"\n    }\n ];\n\n \/\/ Positive feedback\n const positiveFeedback = [\n    \"Great job!\",\n    \"Well done!\",\n    \"Excellent response!\",\n    \"Very good.\",\n    \"Your answer was clear and natural.\",\n    \"Fantastic!\",\n    \"You\u2019re using the present continuous very well.\",\n    \"Nice answer!\"\n ];\n\n \/\/ Constructive feedback \u2013 focus on Yes\/No + full sentence\n const constructiveFeedback = [\n    \"Try to start with Yes, I am or No, I\u2019m not, and then add more information.\",\n    \"Can you use the present continuous? For example: I\u2019m studying hard these days.\",\n    \"Add a time phrase like these days, this week, or right now.\",\n    \"Try to give one or two extra details in your answer.\",\n    \"Remember: am \/ are + verb-ing, for example: I\u2019m playing a lot of sports.\",\n    \"You can say what you are doing and how often you are doing it.\",\n    \"Try to connect your answer to your real life these days.\",\n    \"Make your sentence a little longer by adding because or and.\",\n    \"Use full sentences, not just single words.\",\n    \"Think about the question and use the same key words in your answer.\"\n ];\n\n \/\/ Pronunciation feedback \u2013 questionnaire vocabulary\n const pronunciationFeedback = [\n    \"Good job! Try to say \u201cfriends\u201d clearly \u2013 FRENDS.\",\n    \"Nice answer! Practice the word \u201cstudying\u201d \u2013 STU-dy-ing.\",\n    \"Well spoken! Focus on the word \u201csports\u201d \u2013 remember the final \/s\/ sound.\",\n    \"Great effort! Pay attention to the word \u201cenjoying\u201d \u2013 en-JOY-ing.\",\n    \"Your pronunciation is clear. For extra practice, repeat: \u201cI\u2019m going out with friends a lot these days.\u201d\"\n ];\n\n \/\/ Stop keywords\n const stopKeywords = [\"goodbye\", \"good bye\", \"bye\", \"bye-bye\", \"byebye\"];\n\n let currentQuestionIndex = 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    loadVoices();\n\n    if (speechSynthesisSupported) {\n        setTimeout(() => greetUser(), 500);\n    } else {\n        appendMessage(\"Sorry, your browser does not support speech synthesis.\", \"bot\");\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        currentQuestionIndex = 0;\n        clearWordBox();\n        startLesson();\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(voice => desiredVoiceNames.includes(voice.name));\n\n    if (filteredVoices.length === 0) {\n        const option = document.createElement('option');\n        option.value = \"\";\n        option.textContent = \"No desired voices available\";\n        voiceSelect.appendChild(option);\n        voiceSelect.disabled = true;\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    if (filteredVoices.length > 0) {\n        voiceSelect.selectedIndex = 0;\n        selectedVoice = filteredVoices[0];\n    }\n\n    voiceSelect.onchange = () => {\n        const selectedIndex = voiceSelect.value;\n        selectedVoice = filteredVoices[selectedIndex];\n        console.log(`Selected voice: ${selectedVoice.name}`);\n    };\n }\n\n function greetUser() {\n    const greeting = \"Hello! In this lesson, I\u2019ll ask you questions from the questionnaire \u201cWhat\u2019s happening in your life these days?\u201d. Answer with Yes, I am or No, I\u2019m not, and add more information. Click Start to begin!\";\n    appendMessage(greeting, 'bot');\n    showSynthesisLoader(true);\n    sayText(greeting, \"en-US\").then(() => {\n        showSynthesisLoader(false);\n    });\n }\n\n function startLesson() {\n    if (currentQuestionIndex < questions.length) {\n        const question = questions[currentQuestionIndex];\n        const questionNumber = currentQuestionIndex + 1;\n        const questionText = `Question ${questionNumber}: ${question.english}`;\n\n        appendMessage(questionText, 'bot');\n        addSentenceToBox(`Q${questionNumber}: ${question.english}`);\n        showSynthesisLoader(true);\n        sayText(questionText, \"en-US\").then(() => {\n            showSynthesisLoader(false);\n            addSentenceToBox(`Example answer: ${question.answer}`);\n            listenUserResponse(question);\n        });\n    } else {\n        endLesson(false);\n    }\n }\n\n function listenUserResponse(question) {\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\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        appendMessage(formattedInput, 'user');\n\n        showRecognitionLoader(false);\n        speechRecognitionActive = false;\n\n        if (checkStopKeywords(formattedInput.toLowerCase())) {\n            endLesson(true);\n            return;\n        }\n\n        let feedbackMessage = \"\";\n        const grammarFeedback = checkGrammar(formattedInput);\n        if (grammarFeedback) {\n            feedbackMessage = grammarFeedback;\n        } else {\n            const feedbackType = analyzeResponse(formattedInput, question.keywords);\n            if (feedbackType === \"pronunciation\") {\n                feedbackMessage = pronunciationFeedback[Math.floor(Math.random() * pronunciationFeedback.length)];\n            } else if (feedbackType === \"positive\") {\n                feedbackMessage = positiveFeedback[Math.floor(Math.random() * positiveFeedback.length)];\n            } else {\n                feedbackMessage = constructiveFeedback[Math.floor(Math.random() * constructiveFeedback.length)];\n            }\n        }\n\n        appendMessage(feedbackMessage, 'bot');\n        showSynthesisLoader(true);\n        sayText(feedbackMessage, \"en-US\").then(() => {\n            showSynthesisLoader(false);\n            currentQuestionIndex++;\n            setTimeout(() => {\n                startLesson();\n            }, 3000);\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 errorMessage = 'Error: ' + event.error;\n\n        if (event.error === 'not-allowed') {\n            errorMessage = \"Microphone access was not allowed. Please allow microphone access in your browser settings and try again.\";\n        }\n\n        appendMessage(errorMessage, 'bot');\n\n        const chatMessages = document.getElementById('chat-messages');\n        chatMessages.innerHTML = '';\n\n        const retryMessage = \"Let's try that question again.\";\n        appendMessage(retryMessage, 'bot');\n        showSynthesisLoader(true);\n        sayText(retryMessage, \"en-US\").then(() => {\n            showSynthesisLoader(false);\n            setTimeout(() => {\n                listenUserResponse(question);\n            }, 3000);\n        });\n    };\n }\n\n \/\/ Analyze response using keywords\n function analyzeResponse(userInput, keywords) {\n    const lowerCaseInput = userInput.toLowerCase();\n    for (let keyword of keywords) {\n        if (lowerCaseInput.includes(keyword.toLowerCase())) {\n            if (keyword.toLowerCase().includes(\"friends\") || keyword.toLowerCase().includes(\"studying\")) {\n                return \"pronunciation\";  \/\/ occasionally give pronunciation feedback\n            }\n            return \"positive\";\n        }\n    }\n    return \"constructive\";\n }\n\n \/\/ Simple grammar help: Yes\/No answers with present continuous\n function checkGrammar(userInput) {\n    const lower = userInput.toLowerCase();\n\n    if (lower.startsWith(\"yes, i do\") || lower.startsWith(\"yeah, i do\")) {\n        return 'For these questions, try: \"Yes, I am.\" and then add more: \"Yes, I am. I\u2019m going out with friends a lot these days.\"';\n    }\n    if (lower.startsWith(\"no, i don\")) {\n        return 'You can say: \"No, I\u2019m not.\" and then add more information.';\n    }\n    if (lower.includes(\"i study hard these days\")) {\n        return 'You can also say: \"I\u2019m studying hard these days.\" with the present continuous.';\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 = ['who', 'what', 'where', 'when', 'why', 'how', 'is', 'are', 'do', 'does', 'can', 'should', 'will', 'would'];\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 wordBox = document.getElementById('word-box');\n    const sentenceElement = document.createElement('div');\n    sentenceElement.innerText = sentence;\n    wordBox.appendChild(sentenceElement);\n    wordBox.scrollTop = wordBox.scrollHeight;\n }\n\n function clearWordBox() {\n    const wordBox = document.getElementById('word-box');\n    wordBox.innerHTML = \"\";\n }\n\n function endLesson(userStopped = false) {\n    if (speechSynthesisSupported) {\n        window.speechSynthesis.cancel();\n    }\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 practicing! Goodbye!\";\n    } else {\n        message = \"Well done! You\u2019ve completed the questionnaire. Keep practicing your English!\";\n    }\n    appendMessage(message, \"bot\");\n    showSynthesisLoader(true);\n    sayText(message, \"en-US\").then(() => {\n        showSynthesisLoader(false);\n    });\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;\n        utterance.rate = 1.0;\n        utterance.pitch = 1.0;\n\n        if (selectedVoice) {\n            utterance.voice = selectedVoice;\n        }\n\n        utterance.onend = function() {\n            resolve();\n        };\n\n        utterance.onerror = function(event) {\n            console.error('Speech synthesis error:', event.error);\n            resolve();\n        };\n\n        window.speechSynthesis.speak(utterance);\n    });\n }\n\n function appendMessage(text, sender) {\n    const messageContainer = 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    messageContainer.appendChild(messageElement);\n    messageContainer.scrollTop = messageContainer.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","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":287,"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-296","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\/296","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=296"}],"version-history":[{"count":2,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/296\/revisions"}],"predecessor-version":[{"id":312,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/296\/revisions\/312"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/287"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}