-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConversationScenarios.swift
More file actions
508 lines (501 loc) · 23.4 KB
/
Copy pathConversationScenarios.swift
File metadata and controls
508 lines (501 loc) · 23.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
//
// ConversationScenarios.swift
// InstantEnglish
//
// デフォルト会話シナリオ
//
import Foundation
struct ConversationScenarios {
static let defaultScenarios: [ConversationScenario] = [
// MARK: - Daily (日常会話)
ConversationScenario(
id: UUID(),
titleJP: "初対面の会話",
titleEN: "First Meeting",
descriptionJP: "初めて会う人との自己紹介と会話",
descriptionEN: "Self-introduction and conversation with someone you meet for the first time.",
category: .daily,
difficulty: .beginner,
openingLine: "Hi! Nice to meet you. I'm Sarah. What's your name?",
context: "You are meeting someone for the first time at a social event.",
keyPhrases: ["name", "nice to meet", "from", "work", "hobby"],
responses: [
ScenarioResponse(
triggerPhrases: ["name", "I'm", "My name"],
text: "Nice to meet you! Where are you from?",
score: 0.9,
feedback: "Perfect! 'Nice to meet you' is standard for first meetings."
),
ScenarioResponse(
triggerPhrases: ["from", "live"],
text: "I've heard that's a beautiful place! I'm from Canada.",
score: 0.85,
feedback: "Good answer about your hometown."
),
ScenarioResponse(
triggerPhrases: ["work", "job", "student"],
text: "That sounds interesting! Do you enjoy it?",
score: 0.9,
feedback: "Asking 'What do you do?' back keeps the conversation going."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "道順を尋ねる",
titleEN: "Asking Directions",
descriptionJP: "目的地への行き方を尋ねる",
descriptionEN: "Asking how to get to a destination.",
category: .daily,
difficulty: .beginner,
openingLine: "Excuse me, I think I'm lost. Do you know where the nearest station is?",
context: "You are lost on the street and asking a passerby for help.",
keyPhrases: ["station", "straight", "turn", "left", "right", "far"],
responses: [
ScenarioResponse(
triggerPhrases: ["go straight", "turn", "block"],
text: "Okay, go straight and turn? Got it. Is it far from here?",
score: 0.9,
feedback: "Using direction words like 'straight' and 'turn' is key here."
),
ScenarioResponse(
triggerPhrases: ["thank", "help"],
text: "You're welcome! Good luck finding it.",
score: 0.9,
feedback: "Always thank someone for helping you with directions."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "世間話(天気)",
titleEN: "Small Talk (Weather)",
descriptionJP: "近所の人や同僚との天気の話",
descriptionEN: "Talking about the weather with a neighbor or colleague.",
category: .daily,
difficulty: .beginner,
openingLine: "It's really hot today, isn't it?",
context: "You are waiting for an elevator with a colleague.",
keyPhrases: ["hot", "cold", "weather", "summer", "rain"],
responses: [
ScenarioResponse(
triggerPhrases: ["yes", "agree", "hot", "humid"],
text: "I hope it cools down soon. Do you like summer?",
score: 0.9,
feedback: "Agreeing with the observation is a good way to bond."
),
ScenarioResponse(
triggerPhrases: ["prefer", "winter", "spring"],
text: "I agree, I prefer cooler weather too.",
score: 0.85,
feedback: "Sharing your preference adds depth to the small talk."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "趣味について",
titleEN: "Talking about Hobbies",
descriptionJP: "休日の過ごし方や趣味について話す",
descriptionEN: "Discussing how you spend weekends and your hobbies.",
category: .daily,
difficulty: .intermediate,
openingLine: "What do you usually do on weekends?",
context: "You are chatting with a friend at a cafe.",
keyPhrases: ["hobby", "weekend", "movie", "book", "sport", "like"],
responses: [
ScenarioResponse(
triggerPhrases: ["like", "enjoy", "hobby", "watch", "play"],
text: "That sounds fun! How long have you been doing that?",
score: 0.9,
feedback: "Using 'I like to...' or 'I enjoy...' is perfect."
),
ScenarioResponse(
triggerPhrases: ["recently", "often", "sometimes"],
text: "I should try that sometime. It sounds relaxing.",
score: 0.85,
feedback: "Describing frequency (often, sometimes) is good detail."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "デート(カフェ)",
titleEN: "First Date",
descriptionJP: "初デートで相手のことを知る",
descriptionEN: "Getting to know someone on a first date.",
category: .daily,
difficulty: .intermediate,
openingLine: "I really like this cafe. The atmosphere is nice. Do you come here often?",
context: "You are on a first date at a cafe.",
keyPhrases: ["cafe", "coffee", "often", "time", "nice"],
responses: [
ScenarioResponse(
triggerPhrases: ["first time", "never", "before"],
text: "Oh, really? I'm glad I brought you here then. What are you drinking?",
score: 0.9,
feedback: "Honesty is good! 'This is my first time' works well."
),
ScenarioResponse(
triggerPhrases: ["yes", "sometimes", "favorite"],
text: "Me too! Their coffee is amazing. So, tell me more about yourself.",
score: 0.85,
feedback: "Common ground helps build connection."
)
]
),
// MARK: - Travel (旅行)
ConversationScenario(
id: UUID(),
titleJP: "空港チェックイン",
titleEN: "Airport Check-in",
descriptionJP: "搭乗手続きと荷物の預け入れ",
descriptionEN: "Check-in procedure and baggage drop.",
category: .airport,
difficulty: .beginner,
openingLine: "Good morning. May I see your passport and ticket, please?",
context: "You are at the airline check-in counter.",
keyPhrases: ["passport", "ticket", "bag", "check", "window", "aisle"],
responses: [
ScenarioResponse(
triggerPhrases: ["here", "passport", "ticket"],
text: "Thank you. Are you checking any bags today?",
score: 0.9,
feedback: "'Here you go' is a polite way to hand something over."
),
ScenarioResponse(
triggerPhrases: ["check", "bag", "suitcase"],
text: "Okay, please place it on the scale. Would you like a window or aisle seat?",
score: 0.9,
feedback: "Correctly identifying your luggage intent is key."
),
ScenarioResponse(
triggerPhrases: ["window", "aisle", "seat"],
text: "A window seat it is. Here is your boarding pass. Gate A5.",
score: 0.9,
feedback: "Cleanly stating your preference is good."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "入国審査",
titleEN: "Immigration",
descriptionJP: "入国審査での質問に答える",
descriptionEN: "Answering questions at immigration control.",
category: .airport,
difficulty: .intermediate,
openingLine: "Next, please. What is the purpose of your visit?",
context: "You are arriving in a foreign country and speaking to an officer.",
keyPhrases: ["sightseeing", "tourism", "business", "day", "stay", "hotel"],
responses: [
ScenarioResponse(
triggerPhrases: ["sightseeing", "vacation", "tourist", "holiday"],
text: "I see. How long will you be staying?",
score: 0.95,
feedback: "'Sightseeing' or 'Vacation' are the standard answers."
),
ScenarioResponse(
triggerPhrases: ["day", "week", "month"],
text: "And where will you be staying appropriately?",
score: 0.9,
feedback: "Answering with the duration clearly is important."
),
ScenarioResponse(
triggerPhrases: ["hotel", "staying at"],
text: "Okay. Enjoy your trip. Welcome.",
score: 0.9,
feedback: "Having your hotel name ready is helpful."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "ホテルのチェックイン",
titleEN: "Hotel Check-in",
descriptionJP: "予約の確認とチェックイン",
descriptionEN: "Confirming reservation and checking in.",
category: .hotel,
difficulty: .beginner,
openingLine: "Welcome to the Grand Hotel. How can I help you?",
context: "You have arrived at your hotel.",
keyPhrases: ["check in", "reservation", "name", "booked"],
responses: [
ScenarioResponse(
triggerPhrases: ["check in", "reservation"],
text: "Certainly. May I have your name, please?",
score: 0.9,
feedback: "'I'd like to check in' is the standard phrase."
),
ScenarioResponse(
triggerPhrases: ["name is", "my name"],
text: "Ah, yes. I have a reservation for a double room for 3 nights. Is that correct?",
score: 0.9,
feedback: "Simply stating your name is sufficient."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "タクシーに乗る",
titleEN: "Taking a Taxi",
descriptionJP: "行き先を告げてタクシーに乗る",
descriptionEN: "Telling the destination and taking a taxi.",
category: .travel,
difficulty: .beginner,
openingLine: "Hi, where are you heading to?",
context: "You just got into a taxi.",
keyPhrases: ["station", "hotel", "take me", "address", "please"],
responses: [
ScenarioResponse(
triggerPhrases: ["please", "take me", "to"],
text: "Sure thing. Do you know the best way to get there?",
score: 0.9,
feedback: "'Please take me to [Destination]' is polite and clear."
),
ScenarioResponse(
triggerPhrases: ["address", "here"],
text: "Okay, I'll put that in the GPS. It should take about 20 minutes.",
score: 0.85,
feedback: "Showing the address is a safe way to ensure accuracy."
)
]
),
// MARK: - Restaurant (レストラン)
ConversationScenario(
id: UUID(),
titleJP: "レストランで注文",
titleEN: "Ordering at a Restaurant",
descriptionJP: "メニューを見て料理を注文する",
descriptionEN: "Looking at the menu and ordering food.",
category: .restaurant,
difficulty: .beginner,
openingLine: "Are you ready to order, or do you need a few more minutes?",
context: "You are seated at a table and looking at the menu.",
keyPhrases: ["ready", "order", "have", "would like", "recommend"],
responses: [
ScenarioResponse(
triggerPhrases: ["ready", "order"],
text: "Great. What can I get for you?",
score: 0.9,
feedback: "'We are ready to order' signals the waiter clearly."
),
ScenarioResponse(
triggerPhrases: ["have", "please", "like"],
text: "Excellent choice. Would you like anything to drink with that?",
score: 0.9,
feedback: "Using 'I'll have...' or 'I'd like...' is natural."
),
ScenarioResponse(
triggerPhrases: ["recommend", "special"],
text: "The Chef's Salad is very popular today.",
score: 0.85,
feedback: "Asking for recommendations is a great conversation starter."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "お会計",
titleEN: "Paying the Bill",
descriptionJP: "食事後の支払いを依頼する",
descriptionEN: "Asking for the bill after a meal.",
category: .restaurant,
difficulty: .beginner,
openingLine: "How was everything? Can I get you any dessert?",
context: "You have finished your meal.",
keyPhrases: ["check", "bill", "pay", "no", "full"],
responses: [
ScenarioResponse(
triggerPhrases: ["check", "bill", "please"],
text: "Certainly. I'll bring that right out for you. Paying together or separate?",
score: 0.9,
feedback: "'Check, please' is the standard phrase in the US."
),
ScenarioResponse(
triggerPhrases: ["card", "cash", "credit"],
text: "We take all major credit cards. I'll be right back with the machine.",
score: 0.85,
feedback: "Clarifying payment method helps the waiter."
)
]
),
// MARK: - Shopping (ショッピング)
ConversationScenario(
id: UUID(),
titleJP: "服を買う",
titleEN: "Buying Clothes",
descriptionJP: "サイズや試着について尋ねる",
descriptionEN: "Asking about sizes and trying on clothes.",
category: .shopping,
difficulty: .beginner,
openingLine: "Hello! Can I help you find anything today?",
context: "You are in a clothing store looking at a shirt.",
keyPhrases: ["looking", "try", "size", "fitting", "medium"],
responses: [
ScenarioResponse(
triggerPhrases: ["looking", "just"],
text: "No problem. Let me know if you need help with sizes.",
score: 0.85,
feedback: "'Just looking' is fine if you're browsing."
),
ScenarioResponse(
triggerPhrases: ["try", "on", "fitting"],
text: "Sure, the fitting rooms are in the back. What size do you need?",
score: 0.9,
feedback: "'Can I try this on?' is the phrase to remember."
),
ScenarioResponse(
triggerPhrases: ["size", "medium", "large", "small"],
text: "Here is a Medium. It runs a bit small, just so you know.",
score: 0.9,
feedback: "Stating your size clearly helps the clerk."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "映画のチケット購入",
titleEN: "Buying Movie Tickets",
descriptionJP: "映画館でチケットとスナックを買う",
descriptionEN: "Buying tickets and snacks at the cinema.",
category: .entertainment,
difficulty: .beginner,
openingLine: "Welcome to Cinema World. Which movie would you like to see?",
context: "You are at the box office.",
keyPhrases: ["ticket", "adult", "student", "seat", "popcorn"],
responses: [
ScenarioResponse(
triggerPhrases: ["ticket", "see", "movie"],
text: "Okay. For what time?",
score: 0.9,
feedback: "State the movie name clearly."
),
ScenarioResponse(
triggerPhrases: ["adult", "two", "please"],
text: "Two adults. That will be $25. Would you like any popcorn?",
score: 0.9,
feedback: "Specify the number and type of tickets."
)
]
),
// MARK: - Business (ビジネス)
ConversationScenario(
id: UUID(),
titleJP: "ビジネス会議",
titleEN: "Business Meeting",
descriptionJP: "会議での提案と意見交換",
descriptionEN: "Proposing ideas and exchanging opinions in a meeting.",
category: .meeting,
difficulty: .advanced,
openingLine: "Good morning. Let's start. Does anyone have updates on the marketing project?",
context: "You are in a weekly team meeting.",
keyPhrases: ["update", "progress", "schedule", "plan", "behind"],
responses: [
ScenarioResponse(
triggerPhrases: ["progress", "going", "well"],
text: "That's good to hear. Are we on schedule?",
score: 0.85,
feedback: "Reporting positive progress clearly is good."
),
ScenarioResponse(
triggerPhrases: ["behind", "schedule", "delay"],
text: "I see. What do you need to get back on track?",
score: 0.9,
feedback: "Being honest about delays allows the team to help."
),
ScenarioResponse(
triggerPhrases: ["propose", "suggest", "idea"],
text: "Interesting idea. Can you elaborate?",
score: 0.9,
feedback: "'I'd like to propose...' is a strong way to introduce options."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "プレゼンテーション",
titleEN: "Presentation Q&A",
descriptionJP: "プレゼン後の質疑応答に対応する",
descriptionEN: "Handling Q&A after a presentation.",
category: .presentation,
difficulty: .advanced,
openingLine: "Thank you for listening. I'd like to open the floor for questions now.",
context: "You just finished a presentation.",
keyPhrases: ["question", "ask", "cost", "timeline", "detail"],
responses: [
ScenarioResponse(
triggerPhrases: ["question", "ask"],
text: "Yes, go ahead. What would you like to know?",
score: 0.9,
feedback: "Inviting questions confidently creates a good impression."
),
ScenarioResponse(
triggerPhrases: ["answer", "that", "point"],
text: "That's a great question. The main benefit is cost reduction.",
score: 0.85,
feedback: "Acknowledging the quality of the question gives you time to think."
)
]
),
// MARK: - Emergency (緊急)
ConversationScenario(
id: UUID(),
titleJP: "緊急通報(911)",
titleEN: "Emergency Call (911)",
descriptionJP: "事故を目撃して通報する",
descriptionEN: "Reporting a car accident to 911.",
category: .emergency,
difficulty: .advanced,
openingLine: "911, what is your emergency?",
context: "You witnessed a car accident and are calling for help.",
keyPhrases: ["accident", "crash", "injured", "ambulance", "location", "street"],
responses: [
ScenarioResponse(
triggerPhrases: ["accident", "crash", "car"],
text: "Okay, I'm logging that. What is your location?",
score: 0.95,
feedback: "Creating a clear picture 'There is a car accident' is priority one."
),
ScenarioResponse(
triggerPhrases: ["street", "avenue", "near"],
text: "Help is on the way. Is anyone injured?",
score: 0.95,
feedback: "Giving specific location details helps emergency services."
),
ScenarioResponse(
triggerPhrases: ["injured", "hurt", "bleeding", "unconscious"],
text: "Please stay on the line. Do not move the injured person.",
score: 0.95,
feedback: "Reporting injuries accurately determines the response level."
)
]
),
ConversationScenario(
id: UUID(),
titleJP: "遺失物",
titleEN: "Lost Property",
descriptionJP: "落とし物を問い合わせる",
descriptionEN: "Inquiring about a lost item.",
category: .daily,
difficulty: .intermediate,
openingLine: "Lost and Found department. How can I help you?",
context: "You lost your wallet at a train station.",
keyPhrases: ["lost", "wallet", "bag", "phone", "color", "black"],
responses: [
ScenarioResponse(
triggerPhrases: ["lost", "dropped", "missing"],
text: "I see. Can you describe the item for me?",
score: 0.9,
feedback: "'I lost my [Item]' is the correct opening."
),
ScenarioResponse(
triggerPhrases: ["color", "black", "leather", "brand"],
text: "Okay, let me check our inventory. Yes, we found one matching that description.",
score: 0.9,
feedback: "Providing specific details (color, material) is crucial."
)
]
)
]
}