Set 1: Home & Family
Set 2: Work & Education
Set 3: Leisure & Hobbies
Set 4: Travel & Places
Set 5: Technology & Media
Set 6: Health & Lifestyle
Set 7: Environment & Nature
Set 8: Culture & Traditions
Set 9: Society & Relationships
Set 10: Goals & Achievements
0:00
<!--
-->
// Initialize dark mode
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.classList.add('dark');
}
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
if (event.matches) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
});
// IELTS Speaking Test Questions - 10 sets with 3 parts each
const testQuestionSets = [
// Set 1: Home & Family
{
name: "Home & Family",
parts: [
{
name: "Introduction & Interview",
questions: [
"Where do you live? Do you like living there?",
"Do you live in a house or an apartment? Why?",
"What's your favorite room in your home?",
"Tell me about your family. Do you have any siblings?",
"How much time do you spend with your family?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a family celebration that you remember well. You should say:\n- when this celebration took place\n- what you were celebrating\n- who was present\n- and explain why you remember this celebration so well."
]
},
{
name: "Two-way Discussion",
questions: [
"How important is family in your culture?",
"Do you think family structures have changed in recent years?",
"What are the advantages and disadvantages of living with extended family?",
"How does technology affect family relationships nowadays?"
]
}
]
},
// Set 2: Work & Education
{
name: "Work & Education",
parts: [
{
name: "Introduction & Interview",
questions: [
"What do you do for work or study?",
"Why did you choose this field?",
"What do you like or dislike about your job/studies?",
"What was your favorite subject in school?",
"Do you think education is important? Why?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a teacher who has influenced you. You should say:\n- who this teacher was\n- what subject they taught\n- how they taught you\n- and explain why they influenced you so much."
]
},
{
name: "Two-way Discussion",
questions: [
"How has education changed in recent years in your country?",
"Do you think online learning is as effective as traditional classroom learning?",
"What skills do you think are most important for success in the workplace?",
"How might jobs change in the future due to technology?"
]
}
]
},
// Set 3: Leisure & Hobbies
{
name: "Leisure & Hobbies",
parts: [
{
name: "Introduction & Interview",
questions: [
"What do you like to do in your free time?",
"How did you become interested in this hobby?",
"Do you prefer indoor or outdoor activities?",
"What hobbies were popular when you were a child?",
"Do you think hobbies are important? Why or why not?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a skill you would like to learn. You should say:\n- what this skill is\n- how you would learn it\n- how difficult it would be to learn\n- and explain why you want to learn this skill."
]
},
{
name: "Two-way Discussion",
questions: [
"Why do people need hobbies?",
"Do you think people have enough leisure time nowadays?",
"How have people's leisure activities changed over time?",
"Do you think hobbies can help people in their careers? How?"
]
}
]
},
// Set 4: Travel & Places
{
name: "Travel & Places",
parts: [
{
name: "Introduction & Interview",
questions: [
"Have you traveled much in your own country?",
"What kind of transportation do you prefer for long journeys?",
"Do you like visiting other countries?",
"What's your favorite holiday destination?",
"What do you like to do when you travel?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a place you have visited that you found interesting. You should say:\n- where this place is\n- when you visited it\n- what you did there\n- and explain why you found it interesting."
]
},
{
name: "Two-way Discussion",
questions: [
"How has travel changed in the last few decades?",
"What are the benefits of traveling to other countries?",
"Do you think tourism can have negative effects on local communities?",
"How might travel and tourism change in the future?"
]
}
]
},
// Set 5: Technology & Media
{
name: "Technology & Media",
parts: [
{
name: "Introduction & Interview",
questions: [
"How often do you use technology in your daily life?",
"Which device do you use most frequently?",
"Do you follow the news? How do you access it?",
"How has technology changed the way you communicate?",
"Do you think people spend too much time on their phones?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a piece of technology that you find useful. You should say:\n- what this technology is\n- how often you use it\n- what you use it for\n- and explain why you find it useful."
]
},
{
name: "Two-way Discussion",
questions: [
"How has technology changed education?",
"Do you think social media has more positive or negative effects on society?",
"How might artificial intelligence affect our lives in the future?",
"Is it possible to live without modern technology nowadays?"
]
}
]
},
// Set 6: Health & Lifestyle
{
name: "Health & Lifestyle",
parts: [
{
name: "Introduction & Interview",
questions: [
"Do you exercise regularly? What kind of exercise do you do?",
"How important is healthy eating to you?",
"Do you get enough sleep? Why or why not?",
"What do you do to relax when you feel stressed?",
"How would you describe a healthy lifestyle?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a time when you had to stay healthy for an important event. You should say:\n- when this was\n- why you needed to be healthy\n- what you did to stay healthy\n- and explain how you felt about this experience."
]
},
{
name: "Two-way Discussion",
questions: [
"Why do you think some people find it difficult to maintain a healthy lifestyle?",
"How has people's understanding of health changed in recent years?",
"Do you think governments should do more to promote public health?",
"How might healthcare change in the future with new technology?"
]
}
]
},
// Set 7: Environment & Nature
{
name: "Environment & Nature",
parts: [
{
name: "Introduction & Interview",
questions: [
"Do you enjoy spending time in nature?",
"Are there any environmental problems in your area?",
"What do you do to help protect the environment?",
"Did you learn about environmental issues at school?",
"Do you think people are more concerned about the environment now than in the past?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a place with beautiful natural scenery. You should say:\n- where this place is\n- how you know about this place\n- what the scenery is like\n- and explain why you think the scenery is beautiful."
]
},
{
name: "Two-way Discussion",
questions: [
"What are the most serious environmental problems facing the world today?",
"Do you think individuals can make a difference to environmental problems?",
"How has industrialization affected the environment?",
"What can governments do to protect natural resources?"
]
}
]
},
// Set 8: Culture & Traditions
{
name: "Culture & Traditions",
parts: [
{
name: "Introduction & Interview",
questions: [
"What traditions are important in your culture?",
"Do you enjoy traditional festivals and celebrations?",
"Has globalization affected traditions in your country?",
"What traditional foods do you like?",
"Do you think it's important to preserve cultural traditions? Why or why not?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a traditional celebration in your country. You should say:\n- what the celebration is\n- when it takes place\n- what people do during this celebration\n- and explain why this celebration is important."
]
},
{
name: "Two-way Discussion",
questions: [
"How do traditions differ between generations?",
"What is the impact of immigration on cultural traditions?",
"Do you think some traditions can be harmful?",
"How can a society balance modernization with preserving traditions?"
]
}
]
},
// Set 9: Society & Relationships
{
name: "Society & Relationships",
parts: [
{
name: "Introduction & Interview",
questions: [
"How important are friendships to you?",
"What qualities do you value in a friend?",
"How do you usually meet new people?",
"Do you prefer having many casual friends or a few close friends?",
"How do you stay in touch with friends who live far away?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe a person who has been a good influence in your life. You should say:\n- who this person is\n- how you know them\n- how they have influenced you\n- and explain why you think they have been a good influence."
]
},
{
name: "Two-way Discussion",
questions: [
"How have relationships changed with the rise of social media?",
"What social problems are people most concerned about in your country?",
"Do you think community spirit is stronger or weaker than in the past?",
"What responsibilities do individuals have toward their communities?"
]
}
]
},
// Set 10: Goals & Achievements
{
name: "Goals & Achievements",
parts: [
{
name: "Introduction & Interview",
questions: [
"What is a goal you are currently working towards?",
"How do you motivate yourself to achieve your goals?",
"Do you think it's important to set goals? Why?",
"What achievement are you most proud of?",
"Who has inspired you to achieve your goals?"
]
},
{
name: "Individual Long Turn",
questions: [
"Describe an important goal you achieved. You should say:\n- what this goal was\n- how long it took to achieve\n- what difficulties you faced\n- and explain why achieving this goal was important to you."
]
},
{
name: "Two-way Discussion",
questions: [
"Why do some people achieve their goals while others don't?",
"How important is failure in achieving success?",
"What types of goals do you think are most important in life?",
"Do you think society puts too much pressure on people to achieve certain goals?"
]
}
]
}
];
let currentSetIndex = 0;
let currentPartIndex = 0;
let currentQuestionIndex = 0;
let isRecording = false;
let mediaRecorder;
let audioChunks = [];
let recognition;
let startTime;
let timerInterval;
let waitingForNextQuestion = false;
// DOM Elements
const testContent = document.getElementById('testContent');
const startButton = document.getElementById('startButton');
const endButton = document.getElementById('endButton');
const timerDisplay = document.getElementById('timerDisplay');
const messageInput = document.getElementById('messageInput');
const sendButton = document.getElementById('sendButton');
const testSelector = document.getElementById('testSelector');
// Update question set when selector changes
testSelector.addEventListener('change', function() {
currentSetIndex = parseInt(this.value);
resetTest();
displayWelcomeMessage();
});
// Format time for display (mm:ss)
function formatTime(seconds) {
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return `${minutes}:${remainingSeconds < 10 ? '0' : ''}${remainingSeconds}`;
}
// Update timer display
function updateTimer() {
const elapsed = Math.floor((Date.now() - startTime) / 1000);
timerDisplay.textContent = formatTime(elapsed);
}
// Get current question
function getCurrentQuestion() {
const set = testQuestionSets[currentSetIndex];
const part = set.parts[currentPartIndex];
return part.questions[currentQuestionIndex];
}
// Get current part name
function getCurrentPartName() {
return testQuestionSets[currentSetIndex].parts[currentPartIndex].name;
}
// Reset test to beginning
function resetTest() {
currentPartIndex = 0;
currentQuestionIndex = 0;
waitingForNextQuestion = false;
}
// Move to next question
function moveToNextQuestion() {
const currentPart = testQuestionSets[currentSetIndex].parts[currentPartIndex];
// If there are more questions in this part
if (currentQuestionIndex < currentPart.questions.length - 1) {
currentQuestionIndex++;
return true;
}
// If there are more parts in this set
else if (currentPartIndex < testQuestionSets[currentSetIndex].parts.length - 1) {
currentPartIndex++;
currentQuestionIndex = 0;
return true;
}
// End of test
else {
return false;
}
}
// Start recording function
function startRecording() {
if (isRecording) return;
isRecording = true;
startButton.textContent = 'Stop';
startButton.classList.remove('bg-primary', 'hover:bg-blue-600');
startButton.classList.add('bg-red-500', 'hover:bg-red-600');
startTime = Date.now();
timerInterval = setInterval(updateTimer, 1000);
// Add current question to the display
const questionHTML = `
Part ${currentPartIndex + 1}: ${getCurrentPartName()}
`;
responseContainer.appendChild(evaluationContainer);
// After a small delay, show the container with animation
setTimeout(() => {
evaluationContainer.classList.add('show');
}, 100);
// Instructions for AI evaluation
const systemPrompt = `
You are an IELTS speaking examiner. Evaluate the candidate's response for an IELTS speaking test.
Provide band scores (0-9, can use half bands like 6.5) and brief comments for each of these criteria:
1. Fluency and coherence
2. Lexical resource
3. Grammatical range and accuracy
4. Pronunciation
Make sure to penalize too short responses. Must be at least 100 words long.
For refernce, for parts 1 and 3, to secure band 9, the candidate's response should be around 150 words, use at least 3 less common or topic-specific words, use a minimum of 3 different grammatical structures, have at least 90% grammatical accuracy with minimal errors.
For part 2, to secure band 9, the candidate's response should be around 300 words, use at least 6 less common or topic-specific words, use a minimum of 6 different grammatical structures, have at least 90% grammatical accuracy with minimal errors.
Then provide an overall band score and 2-3 sentences of constructive feedback.
Only return a JSON object with this structure:
{
"fluency": {"score": 0.0, "comment": ""},
"lexical": {"score": 0.0, "comment": ""},
"grammar": {"score": 0.0, "comment": ""},
"pronunciation": {"score": 0.0, "comment": ""},
"overall": 0.0,
"feedback": ""
}
`;
try {
const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer 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",
"HTTP-Referer": window.location.href,
"X-Title": "IELTS Speaking Mock Test",
"Content-Type": "application/json"
},
body: JSON.stringify({
"model": "qwen/qwen-2-7b-instruct:free",
"messages": [
{ role: "system", content: systemPrompt },
{ role: "user", content: `Question: ${getCurrentQuestion()}\n\nCandidate's response: ${transcript}` }
]
})
});
const data = await response.json();
let evaluation;
try {
// Try to parse the response as JSON directly
const content = data.choices[0].message.content;
evaluation = JSON.parse(content);
} catch (e) {
// If parsing fails, extract JSON from the response using regex
const content = data.choices[0].message.content;
const jsonMatch = content.match(/{[\s\S]*}/);
if (jsonMatch) {
evaluation = JSON.parse(jsonMatch[0]);
} else {
throw new Error("Could not parse evaluation JSON from response");
}
}
displayEvaluation(evaluation, evaluationContainer);
} catch (error) {
console.error('Error evaluating speaking:', error);
evaluationContainer.innerHTML = `
Error evaluating your response. Please try again.
`;
}
}
// Display evaluation results
// Display evaluation results
function displayEvaluation(evaluation, container) {
// Map scores to colors
function getScoreColor(score) {
if (score >= 8) return 'text-green-600 dark:text-green-400';
if (score >= 6.5) return 'text-blue-600 dark:text-blue-400';
if (score >= 5) return 'text-yellow-600 dark:text-yellow-400';
return 'text-red-600 dark:text-red-400';
}
// Calculate overall score as average of individual scores, rounded to nearest 0.5
function calculateOverallScore(eval) {
const scores = [
eval.fluency.score,
eval.lexical.score,
eval.grammar.score,
eval.pronunciation.score
];
// Calculate average
const average = scores.reduce((sum, score) => sum + score, 0) / scores.length;
// Round to nearest 0.5
const roundedScore = Math.round(average * 2) / 2;
return `${roundedScore.toFixed(1)}`;
}
container.innerHTML = `
IELTS Band Score Evaluation
Fluency & Coherence
${evaluation.fluency.score}
${evaluation.fluency.comment}
Lexical Resource
${evaluation.lexical.score}
${evaluation.lexical.comment}
Grammar
${evaluation.grammar.score}
${evaluation.grammar.comment}
Pronunciation
${evaluation.pronunciation.score}
${evaluation.pronunciation.comment}
Overall Band Score
${calculateOverallScore(evaluation)}
${evaluation.feedback}
`;
// Add event listener to the next question button
container.querySelector('.next-question-btn').addEventListener('click', function() {
// Don't move to next question immediately, just flag that we're ready for the next one
// and enable the start button
waitingForNextQuestion = true;
startButton.disabled = false;
startButton.classList.remove('opacity-50', 'cursor-not-allowed');
// If this was the last question in the test
if (!hasMoreQuestions()) {
// End of test
testContent.innerHTML += `
Test Completed
You've completed the IELTS speaking practice for ${testQuestionSets[currentSetIndex].name}.
Select another topic from the dropdown to continue practicing.
`;
testContent.scrollTop = testContent.scrollHeight;
// Reset for next test
resetTest();
}
});
}
// Check if there are more questions left
function hasMoreQuestions() {
const currentPart = testQuestionSets[currentSetIndex].parts[currentPartIndex];
// If there are more questions in this part or more parts
return (currentQuestionIndex < currentPart.questions.length - 1) ||
(currentPartIndex < testQuestionSets[currentSetIndex].parts.length - 1);
}
// Append recording results to the UI
function appendRecordingResult(audioBlob) {
const elapsedTimeSeconds = Math.floor((Date.now() - startTime) / 1000);
const timeUsed = formatTime(elapsedTimeSeconds);
const responseTextDiv = testContent.querySelector('.question-container:last-child .response-text');
const transcript = responseTextDiv.textContent;
const wordCount = transcript.trim().split(/\s+/).length;
const wordsPerMinute = wordCount / (elapsedTimeSeconds / 60);
const responseContainer = testContent.querySelector('.question-container:last-child .response-container');
const statsHTML = `
This test has three parts, just like the real IELTS exam:
• Part 1: Introduction & Interview (short questions)
• Part 2: Individual Long Turn (speaking for 1-2 minutes)
• Part 3: Two-way Discussion (more abstract questions)
Click "Start" when you're ready to begin with Part 1.
`;
}
// Initialize with a welcome message
window.addEventListener('load', function() {
displayWelcomeMessage();
});