{"id":1369,"date":"2024-06-07T12:53:42","date_gmt":"2024-06-07T12:53:42","guid":{"rendered":"https:\/\/phamho.com\/book\/?p=1369"},"modified":"2024-06-09T06:41:08","modified_gmt":"2024-06-09T06:41:08","slug":"practice-speaking-travel","status":"publish","type":"post","link":"https:\/\/phamho.com\/book\/practice-speaking-travel\/","title":{"rendered":"Practice Speaking &#8211; Travel"},"content":{"rendered":"\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>Practice Speaking &#8211; Travel<\/title>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #ffffff;\n            margin: 0;\n            padding: 0;\n        }\n        .chat-container {\n            max-width: 400px;\n            border: 2px;\n            margin: 50px auto;\n            background-color: #026c96;\n            border-radius: 20px;\n            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n            overflow: hidden;\n        }\n        .chat-header {\n            background-color: #d97b0f;\n            color: #fff;\n            padding: 10px;\n            text-align: center;\n            border-bottom: 1px solid #69010a;\n        }\n        .chat-messages {\n            padding: 10px;\n            overflow-y: auto;\n            max-height: 300px;\n            border: 2px;\n        }\n        .message {\n            margin-bottom: 10px;\n            padding: 10px;\n            border-radius: 5px;\n        }\n        .user-message {\n            background-color: #4caf50;\n            color: #fff;\n            text-align: right;\n        }\n        .bot-message {\n            background-color: #2196f3;\n            color: #080900;\n            text-align: left;\n        }\n        .chat-input {\n            display: flex;\n            align-items: center;\n            background-color: #a3e106;\n            padding: 10px;\n        }\n        .input-field {\n            flex: 1;\n            border: 1px;\n            border-radius: 5px;\n            padding: 8px;\n            margin-right: 10px;\n        }\n        .send-button {\n            background-color: #17c686;\n            color: #fff;\n            font-weight: bold;\n            border: none;\n            border-radius: 5px;\n            padding: 8px 15px;\n            margin-left: 3px;\n            cursor: pointer;\n            transition: background-color 0.3s;\n        }\n        .talk-button {\n            background-color: #c86722;\n            color: #fff;\n            border: none;\n            font-weight: bold;\n            border-radius: 5px;\n            padding: 8px 15px;\n            cursor: pointer;\n            transition: background-color 0.3s;\n        }\n        .send-button:hover,\n        .talk-button:hover {\n            background-color: #45a049;\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"chat-container\">\n        <div class=\"chat-header\">Practice Speaking &#8211; Travel<\/div>\n        <div class=\"chat-messages\" id=\"chat-messages\">\n            <!-- Chat messages will be added here dynamically -->\n        <\/div>\n        <div class=\"chat-input\">\n            <input type=\"text\" class=\"input-field\" id=\"user-input\" placeholder=\"Type your message...\">\n            <button class=\"talk-button\" onclick=\"startSpeechRecognition()\">Talk<\/button>\n            <button class=\"send-button\" onclick=\"sendMessage()\">Send<\/button>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/\/ Initialize the speech recognition object\n        var recognition = new webkitSpeechRecognition();\n        recognition.lang = \"en-US\";\n        recognition.continuous = false;\n        recognition.interimResults = false;\n\n        \/\/ Initialize MediaRecorder object\n        let mediaRecorder;\n\n        \/\/ Function to add messages to the chat\n        function addMessage(message, isUser) {\n            var chatMessages = document.getElementById(\"chat-messages\");\n            var messageElement = document.createElement(\"div\");\n            messageElement.className = \"message \" + (isUser ? \"user-message\" : \"bot-message\");\n            messageElement.textContent = message;\n            chatMessages.appendChild(messageElement);\n            chatMessages.scrollTop = chatMessages.scrollHeight; \/\/ Auto scroll to bottom\n        }\n\n        \/\/ Function to process user's response\n        function processResponse(userResponse) {\n            \/\/ Repeat user's input\n            var repeatResponse = \"You said: \" + userResponse;\n            addMessage(userResponse, true); \/\/ Show the user's response\n            addMessage(repeatResponse, false);\n            speak(repeatResponse); \/\/ Speak the repeated response\n\n            \/\/ Check if the user's response contains goodbye keywords\n            const goodbyeKeywords = [\"goodbye\", \"byebye\", \"bye\"];\n            if (goodbyeKeywords.some(keyword => userResponse.toLowerCase().includes(keyword))) {\n                var endMessage = \"Thank you for talking with me! Goodbye!\";\n                addMessage(endMessage, false);\n                speak(endMessage);\n                return; \/\/ End the conversation\n            }\n\n            \/\/ Move to the next question or interaction after a delay\n            setTimeout(function() {\n                if (questions.length > 0) {\n                    var nextQuestion = questions.shift();\n                    addMessage(nextQuestion, false);\n                    speak(nextQuestion); \/\/ Speak the next question\n                    setTimeout(startSpeechRecognition, 2000); \/\/ Delay before starting speech recognition\n                } else {\n                    var endMessage = \"Thank you for talking with me! Have a great day!\";\n                    addMessage(endMessage, false);\n                    speak(endMessage);\n                }\n            }, 2000);\n        }\n\n        \/\/ Function to start speech recognition\n        function startSpeechRecognition() {\n            navigator.mediaDevices.getUserMedia({ audio: true })\n                .then(stream => {\n                    mediaRecorder = new MediaRecorder(stream);\n                    mediaRecorder.start();\n\n                    mediaRecorder.onstop = (e) => {\n                        const audioData = e.data[0]; \/\/ Get the audio blob\n                        processAudioData(audioData);\n                    };\n\n                    recognition.start();\n                    recognition.onresult = function (event) {\n                        const userResponse = event.results[0][0].transcript;\n                        processResponse(userResponse);\n                        mediaRecorder.stop(); \/\/ Stop recording after the transcript is received\n                    };\n                })\n                .catch(err => {\n                    console.error('Error accessing microphone:', err);\n                });\n        }\n\n        \/\/ Process the audio blob\n        function processAudioData(audioData) {\n            fetch('\/recognize', {\n                method: 'POST',\n                headers: { 'Content-Type': 'audio\/wav' },\n                body: audioData\n            })\n                .then(response => response.json())\n                .then(data => {\n                    processResponse(data.text); \/\/ Pass the recognized text to your chatbot\n                })\n                .catch(err => {\n                    console.error('Error sending audio to server:', err);\n                });\n        }\n\n        \/\/ Function to speak text\n        function speak(text) {\n            var utterance = new SpeechSynthesisUtterance(text);\n            utterance.lang = \"en-US\";\n            window.speechSynthesis.speak(utterance);\n        }\n\n        \/\/ Function to send user's typed message\n        function sendMessage() {\n            var userInput = document.getElementById(\"user-input\").value;\n            if (userInput.trim() !== \"\") {\n                addMessage(userInput, true);\n                processResponse(userInput); \/\/ Process user's response\n                document.getElementById(\"user-input\").value = \"\"; \/\/ Clear input field after sending message\n            }\n        }\n\n        \/\/ Questions about traveling\nvar questions = [\n    \"Do you enjoy traveling?\",\n    \"What's your favorite place you've ever visited?\",\n    \"Do you prefer traveling by car, plane, or train?\",\n    \"Have you ever been to another country?\",\n    \"What's the longest trip you've ever taken?\",\n    \"Do you like to travel with family or friends?\",\n    \"What's your dream travel destination?\",\n    \"Do you prefer beach vacations or mountain vacations?\",\n    \"Have you ever been on a road trip?\",\n    \"What's the most exciting thing you've done while traveling?\",\n    \"Do you like to try new foods when you travel?\",\n    \"Have you ever stayed in a hotel?\",\n    \"What's your favorite souvenir from a trip?\",\n    \"Do you like to plan your trips ahead of time?\",\n    \"Have you ever visited a famous landmark?\",\n    \"Do you prefer city trips or nature trips?\",\n    \"What's your favorite travel memory?\",\n    \"Have you ever traveled for a special occasion, like a wedding or a holiday?\",\n    \"Do you enjoy visiting museums when you travel?\",\n    \"What's the best part about traveling?\",\n    \"Do you like to take photos when you travel?\",\n    \"Have you ever been on a cruise?\",\n    \"Do you have a travel bucket list?\",\n    \"What's the first thing you pack when you travel?\",\n    \"Do you like to travel during the summer or winter?\"\n];\n\n        \/\/ Start the interview when the page loads\n        window.onload = function () {\n            var greeting = \"Hello! Welcome to the Practice Speaking about travel. Are you ready?\";\n            addMessage(greeting, false);\n            speak(greeting);\n\n            let startTimeout = setTimeout(() => {\n                if (questions.length > 0) {\n                    const firstQuestion = questions.shift();\n                    addMessage(firstQuestion, false);\n                    speak(firstQuestion);\n                    startSpeechRecognition();\n                }\n            }, 5000);\n\n            const talkButton = document.querySelector('.talk-button');\n            talkButton.addEventListener('click', () => {\n                clearTimeout(startTimeout);\n                if (questions.length > 0) {\n                    const firstQuestion = questions.shift();\n                    addMessage(firstQuestion, false);\n                    speak(firstQuestion);\n                    startSpeechRecognition();\n                }\n            });\n        };\n    <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Practice Speaking &#8211; Travel Practice Speaking &#8211; Travel Talk Send<\/p>\n","protected":false},"author":1,"featured_media":1370,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,27],"tags":[],"class_list":["post-1369","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-adults","category-speaking"],"featured_image_src":"https:\/\/phamho.com\/book\/wp-content\/uploads\/2024\/06\/DALL\u00b7E-2024-06-07-19.53.00-A-friendly-humanoid-robot-traveling-in-various-settings.-The-robot-has-a-sleek-modern-design-with-smooth-white-surfaces-and-gentle-curves.-Its-face-1024x585.webp","blog_images":{"medium":"https:\/\/phamho.com\/book\/wp-content\/uploads\/2024\/06\/DALL\u00b7E-2024-06-07-19.53.00-A-friendly-humanoid-robot-traveling-in-various-settings.-The-robot-has-a-sleek-modern-design-with-smooth-white-surfaces-and-gentle-curves.-Its-face-300x171.webp","large":"https:\/\/phamho.com\/book\/wp-content\/uploads\/2024\/06\/DALL\u00b7E-2024-06-07-19.53.00-A-friendly-humanoid-robot-traveling-in-various-settings.-The-robot-has-a-sleek-modern-design-with-smooth-white-surfaces-and-gentle-curves.-Its-face-1024x585.webp"},"ams_acf":[],"_links":{"self":[{"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/posts\/1369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/comments?post=1369"}],"version-history":[{"count":2,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/posts\/1369\/revisions"}],"predecessor-version":[{"id":1411,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/posts\/1369\/revisions\/1411"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/media\/1370"}],"wp:attachment":[{"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/media?parent=1369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/categories?post=1369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/phamho.com\/book\/wp-json\/wp\/v2\/tags?post=1369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}