diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..22c521f801af94bdabc0b44e47564f117c52e9d6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,74 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +assets/Gemini_Generated_Image_lisgawlisgawlisg[[:space:]](1).png filter=lfs diff=lfs merge=lfs -text +assets/Gemini_Generated_Image_lisgawlisgawlisg[[:space:]](2).png filter=lfs diff=lfs merge=lfs -text +assets/Gemini_Generated_Image_ygxekoygxekoygxe[[:space:]](1).png filter=lfs diff=lfs merge=lfs -text +assets/pure[[:space:]]app[[:space:]]games[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/pure[[:space:]]app[[:space:]]games.png filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist.png filter=lfs diff=lfs merge=lfs -text +assets/The[[:space:]]Bridge[[:space:]]of[[:space:]]Understanding.pdf filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener.png filter=lfs diff=lfs merge=lfs -text +assets/The_Dialects_of_Innovation.pdf filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest.png filter=lfs diff=lfs merge=lfs -text +all[[:space:]]4[[:space:]]games.png filter=lfs diff=lfs merge=lfs -text +assets/all[[:space:]]4[[:space:]]games.png filter=lfs diff=lfs merge=lfs -text +assets/all[[:space:]]4[[:space:]]games[[:space:]]anime[[:space:]]version.png filter=lfs diff=lfs merge=lfs -text +assets/ca-iedi[[:space:]]graphical[[:space:]]abstract.png filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]3.jpg filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]3.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]3.jpg filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]3.jpg filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/convo[[:space:]]bridge[[:space:]]mobile.png filter=lfs diff=lfs merge=lfs -text +assets/human[[:space:]]convo[[:space:]]mobile.png filter=lfs diff=lfs merge=lfs -text +assets/convo[[:space:]]bridge[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/human[[:space:]]convo[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/IEDID/African American Vernacular English.csv b/IEDID/African American Vernacular English.csv new file mode 100644 index 0000000000000000000000000000000000000000..d90f3235c749a0ce8f154d92fc0018d3e3021432 --- /dev/null +++ b/IEDID/African American Vernacular English.csv @@ -0,0 +1,18 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User" +"Yeah, my mom's.","African American Vernacular English","Yes, my mother.","Conversational","Chat","\byeah,\ my\ mom's\.\b","Game: Listener","","","","","" +"for realsies, she be throwing it down in the kitchen.","African American Vernacular English","Seriously, she cooks very well in the kitchen.","Conversational","Chat","\bfor\ realsies,\ she\ be\ throwing\ it\ down\ in\ the\ kitchen\.\b","Game: Listener","","","","","" +"But as you can see.","African American Vernacular English","Consider what I've just shown or explained; it should be evident now.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37" +"What's going on?","African American Vernacular English","Hello, how far away is the goal? What's happening?","Neutral / Conversational","","","Verified via local Regex","","๐Ÿ—„๏ธ Local Dataset","Lab_Admin_202.31.143.81","","Admin_001" +"Trees","African American Vernacular English","Reference to trees, likely in response to a question or as a topic introduction, or perhaps an observation of trees being present.","Neutral / Conversational","General","","","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Topography","African American Vernacular English","Referring to the surface features of a place or region, including its elevation, landforms, and other natural or artificial features.","Neutral / Conversational","General","","","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"LINE","African American Vernacular English","Either 'form a queue,' 'draw a line,' or, if shouted in a theatrical performance or game, 'the dialogue/scene starts now!'","Neutral / Conversational","General","","","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"We can talk about where I'm from. We can talk about whe from. ","African American Vernacular English","Let's discuss my background; I'm willing to discuss my background.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"I'm from Detroit, Michigan. Most of my family is from Detroit, Michigan, but I also lived in Columbus, Ohio.","African American Vernacular English","My roots are in Detroit, Michigan, where most of my family still resides. However, I have also lived Columbus, Ohio.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Most of my family is from the EastSide of Detroit, but I also lived in Columbus, Ohio because my family left after the O.A. crisis. Most of my family is from the East Outer D-Thorrie, but I also lived in Columbus, Ohio because of the 2008 crisis. ","African American Vernacular English","The speaker's family primarily originates from the East Side of Detroit. They also lived in Columbus, Ohio after relocating due to the economic crisis that started in 2008.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Near 8mile and Moenart","African American Vernacular English","Location reference; specifically, in proximity to the intersection of 8 Mile Road and Moenart Street. Likely used to indicate current position, destination, or event location.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Not much the city is trying to revitalize the area.","African American Vernacular English","The city isn't really doing much to revitalize the area, despite claims to the contrary.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"This is a blockchain test.","African American Vernacular English","Straight up, it's a test involving blockchain technology. Just stating a fact, nothing extra.","Neutral, Informative","Could be said in a tech meeting, a casual conversation about technology, or while doing a blockchain-related task.","","Providing information, stating a current activity.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001" +"This is a blockchain test.","African American Vernacular English","Straight up, it's a test involving blockchain technology. Just stating a fact, nothing extra.","Neutral / Conversational","","","Verified via local Regex","","๐Ÿ—„๏ธ Local Dataset","Lab_Admin_119.56.184.37","","Admin_001" +"Bran Bran.","African American Vernacular English","[Silence. Absence of utterance.]","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096023_84ff9d.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317" +"Wetin you dey talk","African American Vernacular English","What are you saying?","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096063_1b9f75.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317" +"testing again agagain","African American Vernacular English","Still testing. Like, *still* at it. The repetition emphasizes persistence or perhaps frustration.","Casual, slightly exasperated or humorous","Could be used in a situation where someone is repeatedly trying something, like debugging code, trying to get a sound system to work, or even trying to get someone's attention. It implies a prolonged effort.","","Expressing ongoing activity with a hint of mild annoyance or self-deprecating humor about the repetitive nature of the task.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001" diff --git a/IEDID/Algerian Arabic/data/Algiers.csv b/IEDID/Algerian Arabic/data/Algiers.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Algerian Arabic/data/Algiers.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Algerian Arabic/data/Constantine.csv b/IEDID/Algerian Arabic/data/Constantine.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Algerian Arabic/data/Constantine.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Algerian Arabic/data/Oran.csv b/IEDID/Algerian Arabic/data/Oran.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Algerian Arabic/data/Oran.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/American English.csv b/IEDID/American English.csv new file mode 100644 index 0000000000000000000000000000000000000000..8bdd70ea1696bb8d86f2519a09b9cf50767f17f0 --- /dev/null +++ b/IEDID/American English.csv @@ -0,0 +1,50 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User" +"I'm gonna grab some coffee.","American English","I'm going to get some coffee.","---","---","\bgrab\s?some\b","---","","","","","" +"My bad.","American English","My mistake / I apologize.","---","---","\bmy\s?bad\b","---","","","","","" +"I'll take a rain check.","American English","I will reschedule for another time.","---","---","\brain\s?check\b","---","","","","","" +"Let's touch base later.","American English","Let's contact each other later.","---","---","\btouch\s?base\b","---","","","","","" +"Shoot me an email.","American English","Send me an email.","---","---","\bshoot\s?me\b","---","","","","","" +"Piece of cake.","American English","Very easy.","---","---","\bpiece\s?of\s?cake\b","---","","","","","" +"Spill the beans.","American English","Reveal the secret.","---","---","\bspill\s?the\s?beans\b","---","","","","","" +"Break a leg.","American English","Good luck.","---","---","\bbreak\s?a\s?leg\b","---","","","","","" +"Wrap it up.","American English","Finish it.","---","---","\bwrap\s?it\s?up\b","---","","","","","" +"Hang tight.","American English","Wait a moment.","---","---","\bhang\s?tight\b","---","","","","","" +"Heads up.","American English","Warning / Notification.","---","---","\bheads\s?up\b","---","","","","","" +"It's a no-brainer.","American English","It's an obvious decision.","---","---","\bno-brainer\b","---","","","","","" +"Keep me in the loop.","American English","Keep me informed.","---","---","\bin\s?the\s?loop\b","---","","","","","" +"Hit the books.","American English","Study.","---","---","\bhit\s?the\s?books\b","---","","","","","" +"Pitch in.","American English","Contribute / Help out.","---","---","\bpitch\s?in\b","---","","","","","" +"Cold turkey.","American English","Stopping abruptly.","---","---","\bcold\s?turkey\b","---","","","","","" +"Play it by ear.","American English","Decide as we go along.","---","---","\bplay\s?it\s?by\\s?ear\b","---","","","","","" +"Under the weather.","American English","Sick / Ill.","---","---","\bunder\s?the\s?weather\b","---","","","","","" +"Ring a bell?","American English","Sound familiar?","---","---","\bring\s?a\s?bell\b","---","","","","","" +"Cut to the chase.","American English","Get to the point.","---","---","\bcut\s?to\s?the\s?chase\b","---","","","","","" +"Let me know if you're coming to meet me tomorrow.","American English","Inform me if you'll be meeting me tomorrow.","---","---","\blet\s?me\s?know\s?if\s?you're\s?coming\s?to\s?meet\s?me\s?tomorrow.\b","---","","","","","" +"Alright, spill the beans.","American English","Alright, reveal the secret.","---","---","\balright,\s?spill\s?the\s?beans.\b","---","audio/American English/20251126_174202_2266.wav","","","","" +"This is going to take a minute.","American English","This is going to take a while.","---","---","\bthis\s?is\s?going\s?to\s?take\s?a\s?minute.\b","---","audio/American English/20251126_174856_3245.wav","","","","" +"You don't think it's interesting?","American English","Don't you think it's interesting?","---","---","\byou\s?don't\s?think\s?it's\s?interesting?\b","---","audio/American English/20251127_161213_9559.m4a","","","","" +"I wanna start this one.","American English","I want to start this one, or I'll start with this.","---","---","\bi\s?wanna\s?start\s?this\s?one.\b","---","","","","","" +"I wanna go home soon.","American English","I want to go home soon, or I would like to go home soon.","---","---","\bi\s?wanna\s?go\s?home\s?soon.\b","---","audio/American English/20251127_165016_6589.wav","","","","" +"It's gonna take a minute.","American English","It is going to take some time.","---","---","\bit's\s?gonna\s?take\s?a\s?minute.\b","---","audio/American English/20251130_000801_4230.wav","","","","" +"If you knew who I was, you would know that I'm really good.","American English","You are underestimating me because you are unfamiliar with my background.","Defensive/Justification","In American English, this phrasing is often used as a status claim.","\bif\s?you\s?knew\s?who\s?i\s?was,\s?you\s?would\s?know\s?that\s?i'm\s?really\s?good.\b","It shifts the burden of proof onto the listener. Implies reputation precedes the speaker.","audio/American English/20251130_090739_1945.wav","---","---","---","" +"If you knew who I was, you would know that I'm really good.","American English","My reputation and past achievements demonstrate my high level of competence.","Professional/Assertive","In American English, this phrasing is often used as a status claim.","\bif\s?you\s?knew\s?who\s?i\s?was,\s?you\s?would\s?know\s?that\s?i'm\s?really\s?good.\b","It shifts the burden of proof onto the listener. Implies reputation precedes the speaker.","audio/American English/20251130_092003_4158.wav","---","---","---","" +"If you knew who I was, you would know that I'm really good.","American English","I am a significant person in this field, and my skills are unquestionable.","Arrogant/Status-Signaling","In American English, this phrasing is often used as a status claim.","\bif\s?you\s?knew\s?who\s?i\s?was,\s?you\s?would\s?know\s?that\s?i'm\s?really\s?good.\b","It shifts the burden of proof onto the listener. Implies reputation precedes the speaker.","audio/American English/20251130_092003_4158.wav","---","---","---","" +"hey, can we do a rain check for the meeting tomorrow?","American English","hello, I need to postpone our meeting scheduled for tomorrow.","Direct/Standard (Most Common)","Polite and informal way to request a postponement or rescheduling.","\bhey,\s?can\s?we\s?do\s?a\s?rain\s?check\s?for\s?the\s?meeting\s?tomorrow?\b","Implication that the speaker intends to follow through at a later time.","audio/American English/20251202_060221_9258.wav","---","---","---","" +"Hello, what's going on?","American English","Hello, how are you?","Phatic Communion (Social Bonding)","""Safe"" for strangers or colleagues; signals politeness without requiring a story.","\bhello,\s?what's\s?going\s?on?\b","Rhetorical greeting among friends; doesn't necessarily expect a detailed answer.","audio/American English/20260120_083843_5320.wav","---","---","---","" +"Hello, what's going on?","American English","Hello, what is happening?","Information Seeking (Referential)","Walking into a room and asking what event is taking place.","\bhello,\s?what's\s?going\s?on?\b","Focuses purely on the literal request for information about the current event.","audio/American English/20260120_084110_1067.wav","---","---","---","" +"Hello, what's going on?","American English","Good morning/afternoon, how may I help you?","Transactional / Service Offer","Used in service, retail, or corporate environments.","\bhello,\s?what's\s?going\s?on?\b","Reframes interaction to role-based. Establishes professional boundary immediately.","audio/American English/20260121_065641_7959.wav","---","---","---","" +"Please hold on, I'm coming.","American English","Please hold on, I'm coming.","---","---","\bplease\s?hold\s?on,\s?i'm\s?coming.\b","---","audio/American English/20260121_094227_9151.wav","","","","" +"How about we do a rain check and circle back tomorrow?","American English","To decline an invitation now but promise to accept it later.","Contextual","Detected via Lab Profile Jargon","\bhow\s?about\s?we\s?do\s?a\s?rain\s?check\s?and\s?circle\s?back\s?tomorrow?\b","User is employing the term 'Rain check' defined in the active profile.","audio/American English/20260121_101254_5822.wav","---","---","---","" +"Hey, what's going on?","American English","Hello, how are you?","Phatic Communion (Social Bonding)","""Safe"" for strangers or colleagues; signals politeness.","\bhey,\ what's\ going\ on\?\b","Rhetorical greeting; maintains social function but widens social distance.","audio/American English/20260126_034414_2550.wav","---","---","---","" +"Hey, what's going on?","American English","Hello, what is happening?","Information Seeking (Referential)","Walking into a room and asking what event is taking place.","\bhey,\ what's\ going\ on\?\b","Strips away ""greeting"" aspect; focuses on literal request for information.","audio/American English/20260126_034420_4422.wav","---","---","---","" +"Hey, what's going on?","American English","Good morning/afternoon, how may I help you?","Transactional / Service Offer","Used in service, retail, or corporate environments.","\bhey,\ what's\ going\ on\?\b","Reframes interaction to role-based. Establishes professional boundary immediately.","audio/American English/20260126_034424_9486.wav","---","---","---","" +"Can we discuss the action item for tomorrow?","American English","Talk about the specific task assigned for completion by tomorrow.","Proactive / Professional","Standard request in corporate setting focused on productivity.","(?i)Can\s+we\s+discuss\s+the\s+action\s+item\s+for\s+tomorrow\s*[\?\.\!]?","Formalizes task as trackable unit. Reflects achievement-oriented culture.","audio/American English/20260126_165828_7469.wav","---","---","---","" +"Can we discuss the action item for tomorrow?","American English","Concerned or unclear about the task due tomorrow; need resolution.","Slightly Anxious / Urgent","Prevent a last-minute 'fire drill' or failure.","^(?:can|could)\s+(?:we|I)\s+(?:discuss|talk\s+about|review)\s+...","Preemptive move to manage risk. Form of professional self-preservation.","audio/American English/20260126_165908_8298.wav","---","---","---","" +"Can we discuss the action item for tomorrow?","American English","Review the task I expect completed. Ensure you understand.","Directive / Managerial","Manager speaking to subordinate. Question form softens command.","(?i)Can\s+we\s+discuss\s+(?:the|this|an)?\s*action\s+item\s*...","Asserts authority while maintaining a veneer of collaboration.","audio/American English/20260126_170028_1610.wav","---","---","---","" +"Hey, how far? What's going on?","American English","Hello, how far away is the goal? What's happening?","Information Seeking (Referential)","On a road trip; car starts jerking.","regex Hey, how far\? What's going on\?","Request for information about the current situation or recent events.","audio/American English/20260130_032957_5787.wav","---","---","---","" +"What's going on, man?","American English","Greeting someone casually; asking how they are/what they are doing.","Phatic Communion (Social Bonding)","Initiating conversation or acknowledging presence.","\bwhat's\ going\ on,\ man\?\b","Seeking response about current activities or general well-being.","audio/American English/20260212_041228_6248.wav","---","---","---","" +"What's going on, man?","American English","Hello, what is happening, friend?","Information Seeking (Referential)","Walking into a room and asking what event is taking place.","\bwhat\s\ going\ on,\ man\?\b","Casual greeting and inquiry about the current situation. Familiar tone.","audio/American English/20260212_041232_3648.wav","---","---","---","" +"What's going on, man?","American English","Good morning/afternoon, how may I help you today?","Transactional / Service Offer","Used in service, retail, or corporate environments.","\bwhat's\ going\ on,\ man\?\b","Interpreted as greeting/inquiry about assistance. Informal tone adapted.","audio/American English/20260212_041234_4285.wav","---","---","---","" +"Hey, how's everybody doing today?","American English","Hello, how are you?","Phatic Communion (Social Bonding)","""Safe"" for strangers or colleagues; signals politeness.","","Rhetorical greeting; maintains social function but widens social distance.","audio/American English/audio.wav","User","Web","","" +"Hey y'all, it's gonna take a minute okay?","American English","Hello everyone, it's going to take quite some time.","Neutral / Conversational","The speaker is giving the listeners an update on how long a particular expectation is going to take.","","Verified via local Regex + HITL","audio/American English/audio.wav","User","Lab_Admin_119.56.184.37","","" +"So I'm coming in tomorrow. Okay. Thank you.","American English","Inform me if you'll be meeting me tomorrow.","Custom","User provided","\bso\ i'm\ coming\ in\ tomorrow\.\ okay\.\ thank\ you\.\b","","audio/American English/20260511_084343_1210.wav","","","","" diff --git a/IEDID/Amharic/data/Gojjam.csv b/IEDID/Amharic/data/Gojjam.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Amharic/data/Gojjam.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Amharic/data/Gondar.csv b/IEDID/Amharic/data/Gondar.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Amharic/data/Gondar.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Amharic/data/Shoa.csv b/IEDID/Amharic/data/Shoa.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Amharic/data/Shoa.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Arabic/data/Egyptian Arabic.csv b/IEDID/Arabic/data/Egyptian Arabic.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Arabic/data/Egyptian Arabic.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Arabic/data/Gulf Arabic.csv b/IEDID/Arabic/data/Gulf Arabic.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Arabic/data/Gulf Arabic.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Arabic/data/Levantine Arabic.csv b/IEDID/Arabic/data/Levantine Arabic.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Arabic/data/Levantine Arabic.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Arabic/data/Maghrebi Arabic.csv b/IEDID/Arabic/data/Maghrebi Arabic.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Arabic/data/Maghrebi Arabic.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Arabic/data/Modern Standard Arabic.csv b/IEDID/Arabic/data/Modern Standard Arabic.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Arabic/data/Modern Standard Arabic.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Assamese/data/Central Assamese.csv b/IEDID/Assamese/data/Central Assamese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Assamese/data/Central Assamese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Assamese/data/Eastern Assamese.csv b/IEDID/Assamese/data/Eastern Assamese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Assamese/data/Eastern Assamese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Assamese/data/Goalpariya.csv b/IEDID/Assamese/data/Goalpariya.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Assamese/data/Goalpariya.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Assamese/data/Kamrupi.csv b/IEDID/Assamese/data/Kamrupi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Assamese/data/Kamrupi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bavarian/data/Central Bavarian.csv b/IEDID/Bavarian/data/Central Bavarian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bavarian/data/Central Bavarian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bavarian/data/North Bavarian.csv b/IEDID/Bavarian/data/North Bavarian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bavarian/data/North Bavarian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bavarian/data/South Bavarian.csv b/IEDID/Bavarian/data/South Bavarian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bavarian/data/South Bavarian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bengali/data/Bangali.csv b/IEDID/Bengali/data/Bangali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bengali/data/Bangali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bengali/data/Kamarupi.csv b/IEDID/Bengali/data/Kamarupi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bengali/data/Kamarupi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bengali/data/Rarhi.csv b/IEDID/Bengali/data/Rarhi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bengali/data/Rarhi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bengali/data/Sylheti.csv b/IEDID/Bengali/data/Sylheti.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bengali/data/Sylheti.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bengali/data/Varendri.csv b/IEDID/Bengali/data/Varendri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bengali/data/Varendri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bhojpuri/data/Northern Bhojpuri.csv b/IEDID/Bhojpuri/data/Northern Bhojpuri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bhojpuri/data/Northern Bhojpuri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bhojpuri/data/Southern Bhojpuri.csv b/IEDID/Bhojpuri/data/Southern Bhojpuri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bhojpuri/data/Southern Bhojpuri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Bhojpuri/data/Western Bhojpuri.csv b/IEDID/Bhojpuri/data/Western Bhojpuri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Bhojpuri/data/Western Bhojpuri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/British English.csv b/IEDID/British English.csv new file mode 100644 index 0000000000000000000000000000000000000000..04aaa14c0a744fa55dd0aa93ff61fd6c32fe5eee --- /dev/null +++ b/IEDID/British English.csv @@ -0,0 +1,2 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"Fancy a cuppa?","British Dialect","Fancy a cuppa?","Formal","General","Fancy a cuppa\?","","","","","" \ No newline at end of file diff --git a/IEDID/Burmese/data/Mandalay.csv b/IEDID/Burmese/data/Mandalay.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Burmese/data/Mandalay.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Burmese/data/Standard Burmese.csv b/IEDID/Burmese/data/Standard Burmese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Burmese/data/Standard Burmese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Burmese/data/Yangon.csv b/IEDID/Burmese/data/Yangon.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Burmese/data/Yangon.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Cebuano/data/Boholano.csv b/IEDID/Cebuano/data/Boholano.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Cebuano/data/Boholano.csv @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Cebuano/data/Leyte\342\224\234\342\226\222o.csv" "b/IEDID/Cebuano/data/Leyte\342\224\234\342\226\222o.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Cebuano/data/Leyte\342\224\234\342\226\222o.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Cebuano/data/Standard Cebuano.csv b/IEDID/Cebuano/data/Standard Cebuano.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Cebuano/data/Standard Cebuano.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Chhattisgarhi/data/Kedri.csv b/IEDID/Chhattisgarhi/data/Kedri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Chhattisgarhi/data/Kedri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Chhattisgarhi/data/Khandi.csv b/IEDID/Chhattisgarhi/data/Khandi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Chhattisgarhi/data/Khandi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Chhattisgarhi/data/Laria.csv b/IEDID/Chhattisgarhi/data/Laria.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Chhattisgarhi/data/Laria.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Chittagonian/data/Rohingya.csv b/IEDID/Chittagonian/data/Rohingya.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Chittagonian/data/Rohingya.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Chittagonian/data/Standard Chittagonian.csv b/IEDID/Chittagonian/data/Standard Chittagonian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Chittagonian/data/Standard Chittagonian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Creole/data/Jamaican Patois.csv b/IEDID/Creole/data/Jamaican Patois.csv new file mode 100644 index 0000000000000000000000000000000000000000..9663fc27b59e27a5db17d231a12f81334cbf9b89 --- /dev/null +++ b/IEDID/Creole/data/Jamaican Patois.csv @@ -0,0 +1,2 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","audio_file_name","Data_Origin","Clarification_Source","User" +"Wah gwaan inna di area?","Jamaican Patois","What's going on in the area? What's the news or happenings around here?","Conversational","Chat","","Interactive Chat Session","","","Gradio App","User","Admin | Net-IP: 119.56.184.37" diff --git a/IEDID/Creole/data/Nigerian Pidgin English.csv b/IEDID/Creole/data/Nigerian Pidgin English.csv new file mode 100644 index 0000000000000000000000000000000000000000..7231b9a6f234a9929c5a397ea82a3287a87241a8 --- /dev/null +++ b/IEDID/Creole/data/Nigerian Pidgin English.csv @@ -0,0 +1,85 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User","Acoustic_Profile" +"Abeg, wetin dey sup?","Nigerian Pidgin English","Please, what's going on?","Neutral / Conversational","Friendly setting/acquaintance. ""Abeg"" may deflect from a disturbing situation.","\babeg,\ wetin\ dey\ sup\?\b","Abeg (social lubricant), Wetin (interrogative 'what'), Sup (latest news/current reality).","audio/NaijaPidgin English/audio.wav","","","","","" +"When I wake for morning like this, I dey quick look my phone first.","Nigerian Pidgin English","When I wake up in the morning, I quickly check my phone first.","Neutral / Conversational","General","\bwhen\ i\ wake\ for\ morning\ like\ this,\ i\ dey\ quick\ look\ my\ phone\ first\.\b","Game: Archivist","","","","","","" +"hobbies ke? You mean wetin I dey like do?","Nigerian Pidgin English","['Hobbies? Are you asking what I enjoy doing?']","Neutral / Conversational","General","\bhobbies\ ke\?\ you\ mean\ wetin\ i\ dey\ like\ do\?\b","Game: SpeedChat","","","","","","" +"Me I dey like play piano well well","Nigerian Pidgin English","['I really enjoy playing the piano.']","Neutral / Conversational","General","","","","AI","Web","","","" +"Because of the work wey I dey do, I no dey quick chop for morning.","Nigerian Pidgin English","Because of the job I do, I don't usually eat breakfast.","Neutral / Conversational","General","","","","AI","Web","","","" +"So, when we dey grow, we been dey six children and my papa and my mama.","Nigerian Pidgin English","['So, when we were growing up, there were six children, my father, and my mother in the family.']","Neutral / Conversational","General","","","","AI","Web","","","" +"I dey like to play piano wella.","Nigerian Pidgin English","['I enjoy playing the piano very much.']","Neutral / Conversational","General","","","","AI","Web","","","" +"I dey plan to waka go climb dat mountain wey dem dey call Geumosan again.","Nigerian Pidgin English","I am planning to get to the Geeumosan mountain, so that I can climb it.","Neutral / Conversational","General","","","","AI","Web","","","" +"I no get any particular thing wey I want to talk about. Wetin you fit talk about?","Nigerian Pidgin English","[""I don't have anything specific I want to talk about. What can you talk about?""]","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"Ah! You dey speak Pidgin? Stress dey. I dey work since.","Nigerian Pidgin English","Oh! You speak Pidgin? I'm stressed out. I've been working for a long time..","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"Ah! Wetin dey sup, my brother?","Nigerian Pidgin English","[""Hey! What's up, my friend?""]","Neutral / Conversational","General","","","","AI","Web","","","" +"Na anytime wey I dey talk to my babe.","Nigerian Pidgin English","[""It's whenever I am talking to my girlfriend.""]","Neutral / Conversational","General","","","","AI","Web","","","" +"Me I dey like pesin wey dey sabi criticize imself make e improve how e dey behave..","Nigerian Pidgin English","I prefer a person who is self-reflective, and who is big on self-improvement.","Neutral / Conversational","General","","","","AI","Web","","","" +"Pretty much anything, Make we just talk life.","Nigerian Pidgin English","[""Let's talk about anything, but mostly about life in general.""]","Conversational","Chat","","Interactive Chat Session","","AI","Web","","","" +"Na luxurious bus be dat nau.","Nigerian Pidgin English","['That is definitely a luxurious bus.']","Neutral / Conversational","General","","","","AI","Web","","","" +"two people wen dey on top canoe, wey dey on top water.","Nigerian Pidgin English","Two people in a canoe, on the water.","Neutral / Conversational","General","","","","AI","Web","","","" +"My mind just blank. Nothing dey inside.","Nigerian Pidgin English","I have absolutely nothing on my mind.","Conversational","Chat","","Interactive Chat Session","","AI","Web","","","" +"Ah, bros, the weather here, e hot sha.","Nigerian Pidgin English","['Ah, brother, the weather here is really hot.']","Neutral / Conversational","General","","","","AI","Web","","","" +"Abeg, me, I dey like waka for city pass beach oh.","Nigerian Pidgin English","['Please, I prefer walking around the city to going to the beach.']","Neutral / Conversational","General","","","","AI","Web","","","" +"mmm, small small sha","Nigerian Pidgin English","['Yes, but only a little bit.']","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"I dey like to ride bicycle.","Nigerian Pidgin English","['I enjoy riding a bicycle.']","Neutral / Conversational","General","","","","AI","Web","","","" +"Abeg, cat better pass dog. Cat dey sabi dey on im own. Dog, e no dey fit dey on im own.","Nigerian Pidgin English","Please, cats are better than dogs. A cat knows how to be independent. A dog cannot be independent.","Neutral / Conversational","General","","","","AI","Web","","","" +"eh, if you fit find pesin, make you find am nau. Me, I no get any work to do work you.","Nigerian Pidgin English","Hey, if you can find someone else, go ahead and find them now. As for me, I have nothing to do for you.","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"E be like advertisement for people wey wan tgo back school.","Nigerian Pidgin English","['It seems like an advertisement for people who want to return to school.']","Neutral / Conversational","General","","","","AI","Web","","","" +"My guy, wetin dey happen?","Nigerian Pidgin English","What's going on, my friend?","Casual / Slang","The speaker walks in on someone familiar, says hi, and then asks what's going on.","","""My guy"" is Nigerian pidgin for ""my friend"", but can also be used for others who aren't friends. +""Wetin' is Pidgin for ""what"". +""Dey"" could mean ""is"" in some occasions, but something else in others.","","AI","Web","audio_files/Nigerian_Pidgin_English/audio.wav","","" +"No dey try me oh!","Nigerian Pidgin English","Stop testing my patience.","Emphatic / Serious","A neighbour has been testing your patience by parking his vehicle near your door entrance, so that you can't get in or out without squeezing through. When you finally see him, you tell him not to keep trying your patience.","","""No dey"" is a Nigerian Pidgin English word for ""stop"". ""Try me"" means pushing one to a limit, or testing one's patience.","","AI","Web","audio_files/Nigerian_Pidgin_English/57dd0d5f-9edf-463f-a00a-4354a5bb5649.wav","","" +"Ah ah! Wetin dey happen nau?","Nigerian Pidgin English","Yo! What's going on?","","","regex +Ah ah! Wetin dey happen nau\? +","","audio/Nigerian Pidgin English/20260220_193854_9339.wav","","","","","" +"We fit talk about food?","Nigerian Pidgin English","'Shall we talk about food?' or 'Do you want to talk about food?'","Conversational","Chat","","Interactive Chat Session","","User","Web","","","" +"E go be Reggae oh..","Nigerian Pidgin English","It'd definitely be Reggae.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E go be Thailand because I hear say the women there dey like take care of the men.","Nigerian Pidgin English","It will probably be Thailand because I heard the women there really like to take care of men.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Babe wey dey stand beside guy wey siddon.","Nigerian Pidgin English","A girl that's standing next to a guy who is seated.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"No be electric pole be dat?","Nigerian Pidgin English","Isn't that an electric pole?","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"You dey watch football?","Nigerian Pidgin English","'Are you watching football?' or 'Do you watch football?'","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"I no dey too support teams. I just like when Lionel Messi dey play.","Nigerian Pidgin English","I don't usually support football teams very much. I just enjoy watching Lionel Messi play.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Na on top roof of houses wey I dey see like this.","Nigerian Pidgin English","I see the rooftops of houses.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Na very big wall clock wey dey for wall of building.","Nigerian Pidgin English","It's a very large wall clock that is on the wall of a building.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Ah, I no get anything.","Nigerian Pidgin English","Oh, I don't have anything.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Yo nor dey speak Pidgin English?","Nigerian Pidgin English","Don't you speak Pidgin English?","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Nor dey do anyhow.","Nigerian Pidgin English","Stop misbehaving.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E go be Reggae.","Nigerian Pidgin English","It'd be Reggae.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E be like me and you dey play?","Nigerian Pidgin English","Is this some kind of joke? Are you taking me for granted? I am not to be trifled with. You think we are equals in this situation to engage in frivolous play?","Sarcastic, Aggrieved, Challenging","A situation where someone feels disrespected, undervalued, or taken advantage of; potentially a tense situation where boundaries are being tested.","","Expressing annoyance and disapproval; challenging perceived disrespect; establishing dominance or setting boundaries.","audio/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"me, I be Waffi boy sha","Nigerian Pidgin English","I am definitely a Waffi boy.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Na my guy Bruce Lee. I wan sabi wetin been dey happen for im mind when e kpai.","Nigerian Pidgin English","It's my main man, Bruce Lee. I'm really curious to know what he was thinking about when he died.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E be like two big buildings with trees wey dey in front of dem.","Nigerian Pidgin English","It's like two large buildings with trees in front of them.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Me, I dey rep, I dey rep Delta side sha.","Nigerian Pidgin English","As for me, I represent, I represent the Delta region, you know?","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Guy, wetin dey work you?","Nigerian Pidgin English","Hey man, what's bothering you?","Concerned, Casual","Everyday conversation between acquaintances or friends when one notices the other seems troubled or preoccupied.","","Expressing concern and offering a listening ear; showing empathy.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001","" +"Guy, wetin dey work you!?","Nigerian Pidgin English","Hey, why are you misbehaving!?","Concerned, Casual","A stern warning from an acquaintances or close friend where the speaker is getting troubled or annoyed by the listener.","","Expressing frustration to the other person.","audio/audio 1.wav","User","Lab_Admin_119.56.184.37","","","" +"Why you dey stress me?","Nigerian Pidgin English","Why are you bothering or stressing me? What's the reason for your actions that are causing me stress or annoyance?","Annoyed, Frustrated, Exasperated","A casual conversation, potentially between friends, family members, or acquaintances, where one person feels they are being bothered or pressured by the other's actions or words.","","Expressing annoyance and requesting the other person to stop their behavior that is causing stress; setting a boundary.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001","" +"No dey show yourself!","Nigerian Pidgin English","Stop showing off! or Don't make yourself so conspicuous/noticeable!","Admonishing, Impatient, Irritated (can also be playful depending on context)","A situation where someone is behaving in a boastful, ostentatious, or attention-seeking manner, or drawing unwanted attention to themselves.","","Expressing disapproval of someone's behavior and urging them to stop; can also serve as a warning to be more discreet.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001","" +"I wan talk about work.","Nigerian Pidgin English","I want to talk about work.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Man, we just dey rush make we do work, make we post on. Man, we just the rush to walk. Man, we just the rush maker to walk make we post am.","Nigerian Pidgin English","Damn, we're just hustling, trying to get this work done and post it. Damn, we're just rushing to move forward. Damn, we're just making a big effort to move forward and post it.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Na one very big building like that.","Nigerian Pidgin English","It's a very large building, quite impressive.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"You no go believe am o. Na Geumosan, one devil mountain like dat for Korea.","Nigerian Pidgin English","You won't believe this! It's Geumosan, which is one of the really scary, devil mountains in Korea.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"May we yarn food.","Nigerian Pidgin English","Let's chat about food.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_106.101.137.222","","","" +"Make we yarn about house.","Nigerian Pidgin English","Let's chat about housing.","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 106.101.137.222","" +"You dey feel football?","Nigerian Pidgin English","Do you enjoy football?/Do you feel the excitement of football?/Are you into football?","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Normally, na Arsenal. But I dey also gbadu Barca.","Nigerian Pidgin English","Usually, I support Arsenal. But I also really admire Barcelona.","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Ah! Na goat meat nau. Dat thing make sense die!","Nigerian Pidgin English","Ah! It's freely definitely goat meat. That stuff is incredibly delicious!","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Na say I deploy my app for online nau.","Nigerian Pidgin English","It's that I successfully deployed my app online.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"E go be mixed martial arts wey I fit dey defend myself.E go...","Nigerian Pidgin English","It would be some mixed martial arts so I can defend myself. It would...","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"E go be lime.","Nigerian Pidgin English","It'd be line.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"e go be to play piano oh","Nigerian Pidgin English","It's going to be playing the piano!","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Food","Nigerian Pidgin English","A request or expression of need for sustenance; could also be a simple statement of fact or observation.","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 202.31.143.81","" +"E go be Reggae","Nigerian Pidgin English","It's gonna be Reggae music.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 202.31.143.81","" +"and talk with the teleto-descriptives.","Nigerian Pidgin English","And chat with the people who specialize in describing things for television or visual media.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 1.212.70.3","" +"We fit yarn about wetin pesin fit chop?","Nigerian Pidgin English","Are we Can we discuss what to to eat?","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096716_7f4033.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317","" +"I say make we just order out abeg. I no fit shout.","Nigerian Pidgin English","I suggest we simply order food. Please, I'm too tired to argue or exert myself.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096832_221852.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317","" +"E be like na woman wey carry two bags.","Nigerian Pidgin English","It seems like (or, It's probably) a woman carrying two bags.","Neutral / Conversational","General","","","audio/rec_1772101586_f4c973.wav","User/AI Hybrid","Game: Vision | Op: 0x366afaf524a843aabba022e1968a3181","","0x366afaf524a843aabba022e1968a3181","" +"Na when dis app start to dey work, and the pending file start to dey work.","Nigerian Pidgin English","It was when this app finally started functioning properly, and when the pending files finally start processing.","Neutral / Conversational","General","","","audio/rec_1772101844_c656a9.wav","User/AI Hybrid","Game: Archivist | Op: 0x366afaf524a843aabba022e1968a3181","","0x366afaf524a843aabba022e1968a3181","" +"People just plenty for front of building.","Nigerian Pidgin English","There are many people in front of the building.","Neutral / Conversational","General","","","audio/rec_1772131337_745991.wav","User/AI Hybrid","Game: Vision | Op: 0x3eff72b669704e9fba2e55a80cdce8c7","","0x3eff72b669704e9fba2e55a80cdce8c7","" +"Forget that thing wey you dey yarn!","Nigerian Pidgin English","Ignore or dismiss what you are saying! It's irrelevant or nonsense.","Dismissive, Impatient, potentially Confrontational (depending on context and relationship)","An argument, a debate, a situation where someone is perceived to be talking foolishly or irrelevantly, or when someone wants to quickly change the topic.","","Expressing disagreement, dismissing someone's opinion, asserting dominance in a conversation, or quickly changing the subject.","audio/rec_1772131679_24e211.wav","Lab Admin","Gradio Admin UI","","0x9ddf5e209ced4cdeb5d9cfc33096eac2f72d9713","" +"E get as this week just be. E just slow., I no sleep well ","Nigerian Pidgin English","It feels like this week is dragging on forever. It's just so slow. Also, I haven't been sleeping well.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772181210_8367eb.wav","User/AI Hybrid","Game: Listener","","0x3eff72b669704e9fba2e55a80cdce8c7","" +"Correct goat meat.","Nigerian Pidgin English","Well-made goat meat.","Neutral / Conversational","General","","","audio/rec_1772454639_66a9a6.wav","Admin Edit","Game: Archivist","","0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe","" +"Goat wey dem roast.","Nigerian Pidgin English","Roast/roasted goat meat.","Neutral / Conversational","General","","","audio/rec_1772295393_23f398.wav","Admin Edit","Game: SpeedChat","","0x0d49d2d6b1d34f17a038428cd9b991fb","" +"E get dis guy, Sean, wey dey make video for Facebook. The guy funny bad bad","Nigerian Pidgin English","There's this guy, Sean, who makes videos on Facebook. He's extremely funny.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772291700_f5e507.wav","Admin Edit","Game: Listener","","0x0d49d2d6b1d34f17a038428cd9b991fb","" +"Trees just plenty outside.","Nigerian Pidgin English","There are a lot of trees outside.","Neutral / Conversational","General","","","audio/rec_1772290880_129d5c.wav","Admin Edit","Game: Vision | Op: 0x3eff72b669704e9fba2e55a80cdce8c7","","0x3eff72b669704e9fba2e55a80cdce8c7","" +"Wetin I dey like do","Nigerian Pidgin English","What I usually like to do.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772291149_4e7e42.wav","Admin Edit","Game: Listener","","0x0d49d2d6b1d34f17a038428cd9b991fb","" +"I dey see yellow houses","Nigerian Pidgin English","I am seeing yellow houses.","Neutral / Conversational","General","","","audio/rec_1772531698_ab0560.wav","Admin Edit","Game: Vision","","0x82be5a07eda4408cb507bd13b84b2343ac73f617","" +"Wetin dey happen happen nau?","Nigerian Pidgin English","What is happening?","Casual","Informal conversations among friends or acquaintances, possibly in a situation of surprise or shock.","","Showing interest and curiosity about a situation, while possibly establishing solidarity with the speaker or engaging in lighthearted conversation.","audio/rec_1778637109_ad3e72.wav","Lab Admin","Gradio Admin UI","","0x432ce4178d724128ba50e934fac66cb90f453a6a","" +"Wetin dey happen jor?","Nigerian Pidgin English","What is happening, really?","Concerned or Exasperated Inquiry","Informal conversation among friends, family, or in a casual setting, often used to express surprise, concern, or frustration about a situation","","Seeking information or clarification while expressing emotional investment in the outcome or situation","audio/rec_1779585721_272581.wav","Lab Admin","Gradio Admin UI","","0x4deaa09470db471fa960789839766e41da6df956","{}" diff --git a/IEDID/Creole/data/Spanish Creole.csv b/IEDID/Creole/data/Spanish Creole.csv new file mode 100644 index 0000000000000000000000000000000000000000..1c77a535dbf5b296e2a24ebca27ca36d92dc207a --- /dev/null +++ b/IEDID/Creole/data/Spanish Creole.csv @@ -0,0 +1,4 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","audio_file_name","Data_Origin","Clarification_Source","User" +"Goatmeat","Spanish Creole","Could be referencing the meat itself. Depending on tone and situation, it could also be a playful, teasing jab at someone considered stubborn or foolish, similar to calling someone a 'goat' in English. The literal meaning also needs to be considered if a recipe is being discussed.","Neutral / Conversational","General","","","audio/rec_1772101388_5601c2.wav","","Game: Archivist | Op: 0x366afaf524a843aabba022e1968a3181","User/AI Hybrid","0x366afaf524a843aabba022e1968a3181" +"whatever","Spanish Creole","Eh, whatever. I don't care. Forget about it.","Neutral / Conversational","General","","","audio/rec_1772105787_2837a7.wav","","Game: Vision | Op: 0x366afaf524a843aabba022e1968a3181","User/AI Hybrid","0x366afaf524a843aabba022e1968a3181" +"fry me some bread","Spanish Creole","Fix me some fried bread, please. (Implied: likely expecting it to be a comforting or familiar dish)","Neutral / Conversational","General","","","audio/rec_1772134229_e6e237.wav","","Game: Archivist | Op: 0xafb4b73208e242b2baa04e1633cfd57d6ff5d48f","User/AI Hybrid","0xafb4b73208e242b2baa04e1633cfd57d6ff5d48f" diff --git a/IEDID/Czech/data/Common Czech.csv b/IEDID/Czech/data/Common Czech.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Czech/data/Common Czech.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Czech/data/Moravian.csv b/IEDID/Czech/data/Moravian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Czech/data/Moravian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Czech/data/Silesian.csv b/IEDID/Czech/data/Silesian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Czech/data/Silesian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Deccan/data/Standard Deccani.csv b/IEDID/Deccan/data/Standard Deccani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Deccan/data/Standard Deccani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Dutch/data/Brabantian.csv b/IEDID/Dutch/data/Brabantian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Dutch/data/Brabantian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Dutch/data/Hollandic.csv b/IEDID/Dutch/data/Hollandic.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Dutch/data/Hollandic.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Dutch/data/Limburgish.csv b/IEDID/Dutch/data/Limburgish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Dutch/data/Limburgish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Egyptian Arabic/data/Alexandrian.csv b/IEDID/Egyptian Arabic/data/Alexandrian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Egyptian Arabic/data/Alexandrian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Egyptian Arabic/data/Cairene.csv b/IEDID/Egyptian Arabic/data/Cairene.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Egyptian Arabic/data/Cairene.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Egyptian Arabic/data/Saidi.csv b/IEDID/Egyptian Arabic/data/Saidi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Egyptian Arabic/data/Saidi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/English/data/African American Vernacular English.csv b/IEDID/English/data/African American Vernacular English.csv new file mode 100644 index 0000000000000000000000000000000000000000..d90f3235c749a0ce8f154d92fc0018d3e3021432 --- /dev/null +++ b/IEDID/English/data/African American Vernacular English.csv @@ -0,0 +1,18 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User" +"Yeah, my mom's.","African American Vernacular English","Yes, my mother.","Conversational","Chat","\byeah,\ my\ mom's\.\b","Game: Listener","","","","","" +"for realsies, she be throwing it down in the kitchen.","African American Vernacular English","Seriously, she cooks very well in the kitchen.","Conversational","Chat","\bfor\ realsies,\ she\ be\ throwing\ it\ down\ in\ the\ kitchen\.\b","Game: Listener","","","","","" +"But as you can see.","African American Vernacular English","Consider what I've just shown or explained; it should be evident now.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37" +"What's going on?","African American Vernacular English","Hello, how far away is the goal? What's happening?","Neutral / Conversational","","","Verified via local Regex","","๐Ÿ—„๏ธ Local Dataset","Lab_Admin_202.31.143.81","","Admin_001" +"Trees","African American Vernacular English","Reference to trees, likely in response to a question or as a topic introduction, or perhaps an observation of trees being present.","Neutral / Conversational","General","","","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Topography","African American Vernacular English","Referring to the surface features of a place or region, including its elevation, landforms, and other natural or artificial features.","Neutral / Conversational","General","","","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"LINE","African American Vernacular English","Either 'form a queue,' 'draw a line,' or, if shouted in a theatrical performance or game, 'the dialogue/scene starts now!'","Neutral / Conversational","General","","","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"We can talk about where I'm from. We can talk about whe from. ","African American Vernacular English","Let's discuss my background; I'm willing to discuss my background.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"I'm from Detroit, Michigan. Most of my family is from Detroit, Michigan, but I also lived in Columbus, Ohio.","African American Vernacular English","My roots are in Detroit, Michigan, where most of my family still resides. However, I have also lived Columbus, Ohio.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Most of my family is from the EastSide of Detroit, but I also lived in Columbus, Ohio because my family left after the O.A. crisis. Most of my family is from the East Outer D-Thorrie, but I also lived in Columbus, Ohio because of the 2008 crisis. ","African American Vernacular English","The speaker's family primarily originates from the East Side of Detroit. They also lived in Columbus, Ohio after relocating due to the economic crisis that started in 2008.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Near 8mile and Moenart","African American Vernacular English","Location reference; specifically, in proximity to the intersection of 8 Mile Road and Moenart Street. Likely used to indicate current position, destination, or event location.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"Not much the city is trying to revitalize the area.","African American Vernacular English","The city isn't really doing much to revitalize the area, despite claims to the contrary.","Conversational","Chat","","Interactive Chat Session","","User","Gradio App","","Admin | Net-IP: 68.34.16.13" +"This is a blockchain test.","African American Vernacular English","Straight up, it's a test involving blockchain technology. Just stating a fact, nothing extra.","Neutral, Informative","Could be said in a tech meeting, a casual conversation about technology, or while doing a blockchain-related task.","","Providing information, stating a current activity.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001" +"This is a blockchain test.","African American Vernacular English","Straight up, it's a test involving blockchain technology. Just stating a fact, nothing extra.","Neutral / Conversational","","","Verified via local Regex","","๐Ÿ—„๏ธ Local Dataset","Lab_Admin_119.56.184.37","","Admin_001" +"Bran Bran.","African American Vernacular English","[Silence. Absence of utterance.]","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096023_84ff9d.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317" +"Wetin you dey talk","African American Vernacular English","What are you saying?","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096063_1b9f75.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317" +"testing again agagain","African American Vernacular English","Still testing. Like, *still* at it. The repetition emphasizes persistence or perhaps frustration.","Casual, slightly exasperated or humorous","Could be used in a situation where someone is repeatedly trying something, like debugging code, trying to get a sound system to work, or even trying to get someone's attention. It implies a prolonged effort.","","Expressing ongoing activity with a hint of mild annoyance or self-deprecating humor about the repetitive nature of the task.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001" diff --git a/IEDID/English/data/American English.csv b/IEDID/English/data/American English.csv new file mode 100644 index 0000000000000000000000000000000000000000..8bdd70ea1696bb8d86f2519a09b9cf50767f17f0 --- /dev/null +++ b/IEDID/English/data/American English.csv @@ -0,0 +1,50 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User" +"I'm gonna grab some coffee.","American English","I'm going to get some coffee.","---","---","\bgrab\s?some\b","---","","","","","" +"My bad.","American English","My mistake / I apologize.","---","---","\bmy\s?bad\b","---","","","","","" +"I'll take a rain check.","American English","I will reschedule for another time.","---","---","\brain\s?check\b","---","","","","","" +"Let's touch base later.","American English","Let's contact each other later.","---","---","\btouch\s?base\b","---","","","","","" +"Shoot me an email.","American English","Send me an email.","---","---","\bshoot\s?me\b","---","","","","","" +"Piece of cake.","American English","Very easy.","---","---","\bpiece\s?of\s?cake\b","---","","","","","" +"Spill the beans.","American English","Reveal the secret.","---","---","\bspill\s?the\s?beans\b","---","","","","","" +"Break a leg.","American English","Good luck.","---","---","\bbreak\s?a\s?leg\b","---","","","","","" +"Wrap it up.","American English","Finish it.","---","---","\bwrap\s?it\s?up\b","---","","","","","" +"Hang tight.","American English","Wait a moment.","---","---","\bhang\s?tight\b","---","","","","","" +"Heads up.","American English","Warning / Notification.","---","---","\bheads\s?up\b","---","","","","","" +"It's a no-brainer.","American English","It's an obvious decision.","---","---","\bno-brainer\b","---","","","","","" +"Keep me in the loop.","American English","Keep me informed.","---","---","\bin\s?the\s?loop\b","---","","","","","" +"Hit the books.","American English","Study.","---","---","\bhit\s?the\s?books\b","---","","","","","" +"Pitch in.","American English","Contribute / Help out.","---","---","\bpitch\s?in\b","---","","","","","" +"Cold turkey.","American English","Stopping abruptly.","---","---","\bcold\s?turkey\b","---","","","","","" +"Play it by ear.","American English","Decide as we go along.","---","---","\bplay\s?it\s?by\\s?ear\b","---","","","","","" +"Under the weather.","American English","Sick / Ill.","---","---","\bunder\s?the\s?weather\b","---","","","","","" +"Ring a bell?","American English","Sound familiar?","---","---","\bring\s?a\s?bell\b","---","","","","","" +"Cut to the chase.","American English","Get to the point.","---","---","\bcut\s?to\s?the\s?chase\b","---","","","","","" +"Let me know if you're coming to meet me tomorrow.","American English","Inform me if you'll be meeting me tomorrow.","---","---","\blet\s?me\s?know\s?if\s?you're\s?coming\s?to\s?meet\s?me\s?tomorrow.\b","---","","","","","" +"Alright, spill the beans.","American English","Alright, reveal the secret.","---","---","\balright,\s?spill\s?the\s?beans.\b","---","audio/American English/20251126_174202_2266.wav","","","","" +"This is going to take a minute.","American English","This is going to take a while.","---","---","\bthis\s?is\s?going\s?to\s?take\s?a\s?minute.\b","---","audio/American English/20251126_174856_3245.wav","","","","" +"You don't think it's interesting?","American English","Don't you think it's interesting?","---","---","\byou\s?don't\s?think\s?it's\s?interesting?\b","---","audio/American English/20251127_161213_9559.m4a","","","","" +"I wanna start this one.","American English","I want to start this one, or I'll start with this.","---","---","\bi\s?wanna\s?start\s?this\s?one.\b","---","","","","","" +"I wanna go home soon.","American English","I want to go home soon, or I would like to go home soon.","---","---","\bi\s?wanna\s?go\s?home\s?soon.\b","---","audio/American English/20251127_165016_6589.wav","","","","" +"It's gonna take a minute.","American English","It is going to take some time.","---","---","\bit's\s?gonna\s?take\s?a\s?minute.\b","---","audio/American English/20251130_000801_4230.wav","","","","" +"If you knew who I was, you would know that I'm really good.","American English","You are underestimating me because you are unfamiliar with my background.","Defensive/Justification","In American English, this phrasing is often used as a status claim.","\bif\s?you\s?knew\s?who\s?i\s?was,\s?you\s?would\s?know\s?that\s?i'm\s?really\s?good.\b","It shifts the burden of proof onto the listener. Implies reputation precedes the speaker.","audio/American English/20251130_090739_1945.wav","---","---","---","" +"If you knew who I was, you would know that I'm really good.","American English","My reputation and past achievements demonstrate my high level of competence.","Professional/Assertive","In American English, this phrasing is often used as a status claim.","\bif\s?you\s?knew\s?who\s?i\s?was,\s?you\s?would\s?know\s?that\s?i'm\s?really\s?good.\b","It shifts the burden of proof onto the listener. Implies reputation precedes the speaker.","audio/American English/20251130_092003_4158.wav","---","---","---","" +"If you knew who I was, you would know that I'm really good.","American English","I am a significant person in this field, and my skills are unquestionable.","Arrogant/Status-Signaling","In American English, this phrasing is often used as a status claim.","\bif\s?you\s?knew\s?who\s?i\s?was,\s?you\s?would\s?know\s?that\s?i'm\s?really\s?good.\b","It shifts the burden of proof onto the listener. Implies reputation precedes the speaker.","audio/American English/20251130_092003_4158.wav","---","---","---","" +"hey, can we do a rain check for the meeting tomorrow?","American English","hello, I need to postpone our meeting scheduled for tomorrow.","Direct/Standard (Most Common)","Polite and informal way to request a postponement or rescheduling.","\bhey,\s?can\s?we\s?do\s?a\s?rain\s?check\s?for\s?the\s?meeting\s?tomorrow?\b","Implication that the speaker intends to follow through at a later time.","audio/American English/20251202_060221_9258.wav","---","---","---","" +"Hello, what's going on?","American English","Hello, how are you?","Phatic Communion (Social Bonding)","""Safe"" for strangers or colleagues; signals politeness without requiring a story.","\bhello,\s?what's\s?going\s?on?\b","Rhetorical greeting among friends; doesn't necessarily expect a detailed answer.","audio/American English/20260120_083843_5320.wav","---","---","---","" +"Hello, what's going on?","American English","Hello, what is happening?","Information Seeking (Referential)","Walking into a room and asking what event is taking place.","\bhello,\s?what's\s?going\s?on?\b","Focuses purely on the literal request for information about the current event.","audio/American English/20260120_084110_1067.wav","---","---","---","" +"Hello, what's going on?","American English","Good morning/afternoon, how may I help you?","Transactional / Service Offer","Used in service, retail, or corporate environments.","\bhello,\s?what's\s?going\s?on?\b","Reframes interaction to role-based. Establishes professional boundary immediately.","audio/American English/20260121_065641_7959.wav","---","---","---","" +"Please hold on, I'm coming.","American English","Please hold on, I'm coming.","---","---","\bplease\s?hold\s?on,\s?i'm\s?coming.\b","---","audio/American English/20260121_094227_9151.wav","","","","" +"How about we do a rain check and circle back tomorrow?","American English","To decline an invitation now but promise to accept it later.","Contextual","Detected via Lab Profile Jargon","\bhow\s?about\s?we\s?do\s?a\s?rain\s?check\s?and\s?circle\s?back\s?tomorrow?\b","User is employing the term 'Rain check' defined in the active profile.","audio/American English/20260121_101254_5822.wav","---","---","---","" +"Hey, what's going on?","American English","Hello, how are you?","Phatic Communion (Social Bonding)","""Safe"" for strangers or colleagues; signals politeness.","\bhey,\ what's\ going\ on\?\b","Rhetorical greeting; maintains social function but widens social distance.","audio/American English/20260126_034414_2550.wav","---","---","---","" +"Hey, what's going on?","American English","Hello, what is happening?","Information Seeking (Referential)","Walking into a room and asking what event is taking place.","\bhey,\ what's\ going\ on\?\b","Strips away ""greeting"" aspect; focuses on literal request for information.","audio/American English/20260126_034420_4422.wav","---","---","---","" +"Hey, what's going on?","American English","Good morning/afternoon, how may I help you?","Transactional / Service Offer","Used in service, retail, or corporate environments.","\bhey,\ what's\ going\ on\?\b","Reframes interaction to role-based. Establishes professional boundary immediately.","audio/American English/20260126_034424_9486.wav","---","---","---","" +"Can we discuss the action item for tomorrow?","American English","Talk about the specific task assigned for completion by tomorrow.","Proactive / Professional","Standard request in corporate setting focused on productivity.","(?i)Can\s+we\s+discuss\s+the\s+action\s+item\s+for\s+tomorrow\s*[\?\.\!]?","Formalizes task as trackable unit. Reflects achievement-oriented culture.","audio/American English/20260126_165828_7469.wav","---","---","---","" +"Can we discuss the action item for tomorrow?","American English","Concerned or unclear about the task due tomorrow; need resolution.","Slightly Anxious / Urgent","Prevent a last-minute 'fire drill' or failure.","^(?:can|could)\s+(?:we|I)\s+(?:discuss|talk\s+about|review)\s+...","Preemptive move to manage risk. Form of professional self-preservation.","audio/American English/20260126_165908_8298.wav","---","---","---","" +"Can we discuss the action item for tomorrow?","American English","Review the task I expect completed. Ensure you understand.","Directive / Managerial","Manager speaking to subordinate. Question form softens command.","(?i)Can\s+we\s+discuss\s+(?:the|this|an)?\s*action\s+item\s*...","Asserts authority while maintaining a veneer of collaboration.","audio/American English/20260126_170028_1610.wav","---","---","---","" +"Hey, how far? What's going on?","American English","Hello, how far away is the goal? What's happening?","Information Seeking (Referential)","On a road trip; car starts jerking.","regex Hey, how far\? What's going on\?","Request for information about the current situation or recent events.","audio/American English/20260130_032957_5787.wav","---","---","---","" +"What's going on, man?","American English","Greeting someone casually; asking how they are/what they are doing.","Phatic Communion (Social Bonding)","Initiating conversation or acknowledging presence.","\bwhat's\ going\ on,\ man\?\b","Seeking response about current activities or general well-being.","audio/American English/20260212_041228_6248.wav","---","---","---","" +"What's going on, man?","American English","Hello, what is happening, friend?","Information Seeking (Referential)","Walking into a room and asking what event is taking place.","\bwhat\s\ going\ on,\ man\?\b","Casual greeting and inquiry about the current situation. Familiar tone.","audio/American English/20260212_041232_3648.wav","---","---","---","" +"What's going on, man?","American English","Good morning/afternoon, how may I help you today?","Transactional / Service Offer","Used in service, retail, or corporate environments.","\bwhat's\ going\ on,\ man\?\b","Interpreted as greeting/inquiry about assistance. Informal tone adapted.","audio/American English/20260212_041234_4285.wav","---","---","---","" +"Hey, how's everybody doing today?","American English","Hello, how are you?","Phatic Communion (Social Bonding)","""Safe"" for strangers or colleagues; signals politeness.","","Rhetorical greeting; maintains social function but widens social distance.","audio/American English/audio.wav","User","Web","","" +"Hey y'all, it's gonna take a minute okay?","American English","Hello everyone, it's going to take quite some time.","Neutral / Conversational","The speaker is giving the listeners an update on how long a particular expectation is going to take.","","Verified via local Regex + HITL","audio/American English/audio.wav","User","Lab_Admin_119.56.184.37","","" +"So I'm coming in tomorrow. Okay. Thank you.","American English","Inform me if you'll be meeting me tomorrow.","Custom","User provided","\bso\ i'm\ coming\ in\ tomorrow\.\ okay\.\ thank\ you\.\b","","audio/American English/20260511_084343_1210.wav","","","","" diff --git a/IEDID/English/data/British English.csv b/IEDID/English/data/British English.csv new file mode 100644 index 0000000000000000000000000000000000000000..04aaa14c0a744fa55dd0aa93ff61fd6c32fe5eee --- /dev/null +++ b/IEDID/English/data/British English.csv @@ -0,0 +1,2 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"Fancy a cuppa?","British Dialect","Fancy a cuppa?","Formal","General","Fancy a cuppa\?","","","","","" \ No newline at end of file diff --git a/IEDID/English/data/Indian English.csv b/IEDID/English/data/Indian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..6375a1603ec0dca8299e59f23f77661f4afef998 --- /dev/null +++ b/IEDID/English/data/Indian English.csv @@ -0,0 +1,25 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"I will prepone the meeting.","Indian English","I will bring the meeting forward.","---","---","\bprepone\b","---","","","","" +"Do the needful.","Indian English","Please do what is required.","---","---","\bdo\s?the\s?needful\b","---","","","","" +"He passed out last year.","Indian English","He graduated last year.","---","---","\bpassed\s?out\b","---","","","","" +"I have a doubt.","Indian English","I have a question.","---","---","\bhave\s?a\s?doubt\b","---","","","","" +"Please revert back.","Indian English","Please reply.","---","---","\brevert\s?back\b","---","","","","" +"She is my cousin sister.","Indian English","She is my female cousin.","---","---","\bcousin\s?sister\b","---","","","","" +"What is your good name?","Indian English","What is your name.","---","---","\bgood\s?name\b","---","","","","" +"I am out of station.","Indian English","I am out of town.","---","---","\bout\s?of\s?station\b","---","","","","" +"Tell me only.","Indian English","Just tell me.","---","---","\btell\s?me\s?only\b","---","","","","" +"He is eating my head.","Indian English","He is annoying me.","---","---","\beating\s?my\s?head\b","---","","","","" +"Are you coming, na?","Indian English","Are you coming?","---","---",",\s?na\b","---","","","","" +"Let us discuss about this.","Indian English","Let us discuss this.","---","---","\bdiscuss\s?about\b","---","","","","" +"Kindly adjust.","Indian English","Please make room / accommodate.","---","---","\bkindly\s?adjust\b","---","","","","" +"Timepass.","Indian English","Something to pass the time / trivial.","---","---","\btimepass\b","---","","","","" +"He is sitting on my head.","Indian English","He is pressuring me.","---","---","\bsitting\s?on\s?my\s?head\b","---","","","","" +"Today morning.","Indian English","This morning.","---","---","\btoday\s?morning\b","---","","","","" +"Years back.","Indian English","Years ago.","---","---","\byears\s?back\b","---","","","","" +"First-class.","Indian English","Excellent / Very good.","---","---","\bfirst-?class\b","---","","","","" +"Don't eat my brain.","Indian English","Stop bothering me.","---","---","\beat\s?my\s?brain\b","---","","","","" +"Shift a bit.","Indian English","Move over slightly.","---","---","\bshift\s?a\s?bit\b","---","","","","" +"Better","Indian English","Better","---","---","\bbetter\b","---","audio/Indian English/20251130_071733_9980.wav","","","" +"Can't","Indian English","Can't","---","---","\bcan't\b","---","audio/Indian English/20251130_071849_5419.wav","","","" +"Naughty","Indian English","Naughty","---","---","\bnaughty\b","---","audio/Indian English/20251130_072004_4175.wav","","","" +"You're naughty girl!","Indian English","You're a naughty girl!","---","---","\byou're\s?naughty\s?girl!\b","---","audio/Indian English/20251130_072121_8390.wav","","","" diff --git a/IEDID/English/data/Indonesian English.csv b/IEDID/English/data/Indonesian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..31eae533ddde5f5b5577025b2cb85754b80f7862 --- /dev/null +++ b/IEDID/English/data/Indonesian English.csv @@ -0,0 +1,24 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"Please open your shoes.","Indonesian English","Please take off your shoes.","---","---","\bopen\s?(your|the)?\s?shoes\b","---","","","","" +"Close the light.","Indonesian English","Turn off the light.","---","---","\bclose\s?(the)?\s?light\b","---","","","","" +"Thanks before.","Indonesian English","Thanks in advance.","---","---","\bthanks\s?before\b","---","","","","" +"I will follow you.","Indonesian English","I will accompany/join you.","---","---","\bfollow\s?you\b","---","","","","" +"Join with us.","Indonesian English","Join us.","---","---","\bjoin\s?with\s?us\b","---","","","","" +"I am boring here.","Indonesian English","I am bored here.","---","---","\bam\s?boring\b","---","","","","" +"Don't be arrogant.","Indonesian English","Don't be snobbish.","---","---","\barrogant\b","---","","","","" +"Keep your bag.","Indonesian English","Put away your bag.","---","---","\bkeep\s?your\b","---","","","","" +"Have you ever go to Bali?","Indonesian English","Have you ever been to Bali?","---","---","\bhave\s?you\s?ever\s?go\b","---","","","","" +"Same same.","Indonesian English","It is the same.","---","---","\bsame\s?same\b","---","","","","" +"First first.","Indonesian English","Wait a moment / Me first.","---","---","\bfirst\s?first\b","---","","","","" +"Ask to him.","Indonesian English","Ask him.","---","---","\bask\s?to\b","---","","","","" +"I already eat.","Indonesian English","I have already eaten.","---","---","\balready\s?eat\b","---","","","","" +"Buy for me food.","Indonesian English","Buy food for me.","---","---","\bbuy\s?for\s?me\b","---","","","","" +"The food is very delicious.","Indonesian English","The food is delicious.","---","---","\bvery\s?delicious\b","---","","","","" +"Make it fast.","Indonesian English","Hurry up.","---","---","\bmake\s?it\s?fast\b","---","","","","" +"Is it?","Indonesian English","Really? / Is that so?","---","---","\bis\s?it\??$","---","","","","" +"Where you stay?","Indonesian English","Where do you live?","---","---","\bwhere\s?you\s?stay\b","---","","","","" +"Take profit.","Indonesian English","Benefit from / Take advantage.","---","---","\btake\s?profit\b","---","","","","" +"Please enter inside.","Indonesian English","Please come in.","---","---","\benter\s?inside\b","---","","","","" +"How long did you take to prepare for the presentation?","Indonesian English","How long did it take you to prepare for the presentation?","---","---","\bhow\s?long\s?did\s?you\s?take\s?to\s?prepare\s?for\s?the\s?presentation?\b","---","","","","" +"I think our lab also have like similar thing but not that bad, right?","Indonesian English","In our lab, we have a similar issue, but thankfully it's not as severe.","---","---","\bi\s?think\s?our\s?lab\s?also\s?have\s?like\s?similar\s?thing\s?but\s?not\s?that\s?bad,\s?right?\b","---","audio/Indonesian English/20251130_055349_2411.wav","","","" +"Our lab also have like similar thing.","Indonesian English","Our lab also has something similar.","---","---","\bour\s?lab\s?also\s?have\s?like\s?similar\s?thing.\b","---","audio/Indonesian English/20251130_072319_6314.wav","","","" \ No newline at end of file diff --git a/IEDID/English/data/Korean English.csv b/IEDID/English/data/Korean English.csv new file mode 100644 index 0000000000000000000000000000000000000000..6fd5c0f4c22f84fc939ea1be739facbba537a123 --- /dev/null +++ b/IEDID/English/data/Korean English.csv @@ -0,0 +1,27 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"He was living.","Korean English","He was alive.","---","---","\bwas\s?living\b","---","","","","" +"Please check once.","Korean English","Please check it briefly.","---","---","\bcheck\s?once\b","---","","","","" +"I need your sign.","Korean English","I need your signature/autograph.","---","---","\byour\s?sign\b","---","","","","" +"We had a meeting.","Korean English","We went on a group blind date.","---","---","\ba\s?meeting\b","---","","","","" +"Turn the handle.","Korean English","Turn the steering wheel.","---","---","\bhandle\b","---","","","","" +"This service is free.","Korean English","This extra item is on the house.","---","---","\bservice\b","---","","","","" +"Don't do over.","Korean English","Don't exaggerate.","---","---","\bdo\s?over\b","---","","","","" +"My condition is bad.","Korean English","I am not feeling well.","---","---","\bcondition\s?is\s?bad\b","---","","","","" +"Did you eat lunch?","Korean English","How are you?","---","---","\bdid\s?you\s?eat\b","---","","","","" +"Fighting!","Korean English","Cheer up! / You can do it!","---","---","\bfighting!?\b","---","","","","" +"He is a gag man.","Korean English","He is a comedian.","---","---","\bgag\s?man\b","---","","","","" +"I watched a cunning movie.","Korean English","I watched a cheating/affair movie.","---","---","\bcunning\b","---","","","","" +"Use the concent.","Korean English","Use the power outlet/socket.","---","---","\bconcent\b","---","","","","" +"Did you see the grand open?","Korean English","Did you see the grand opening?","---","---","\bgrand\s?open\b","---","","","","" +"Too much skinship.","Korean English","Too much physical affection.","---","---","\bskinship\b","---","","","","" +"I will dutch pay.","Korean English","Let's split the bill.","---","---","\bi\s?will\s?dutch\s?pay.\b","---","audio/Korean English/20251127_151123_3372.wav","","","" +"She is glamour.","Korean English","She is curvaceous/voluptuous.","---","---","\bglamour\b","---","","","","" +"One shot!","Korean English","Bottoms up.","---","---","\bone\s?shot\b","---","","","","" +"It is hard training.","Korean English","It is intensive training.","---","---","\bhard\s?training\b","---","","","","" +"Keep the promise.","Korean English","Keep your word.","---","---","\bkeep\s?the\s?promise\b","---","","","","" +"kicking this back up to the top","Korean English","I'm bringing this back to your attention.","---","---","\bkicking\s?this\s?back\s?up\s?to\s?the\s?top\b","---","audio/Korean English/20251127_151823_1187.m4a","","","" +"and he might soon have company.","Korean English","and he may soon be joined by others.","---","---","\band\s?he\s?might\s?soon\s?have\s?company.\b","---","audio/Korean English/20251127_152057_6916.m4a","","","" +"Number one, better.","Korean English","Number one, better.","---","---","\bnumber\s?one,\s?better.\b","---","audio/Korean English/20251130_065941_4763.wav","","","" +"Number two, can't.","Korean English","Number two, can't.","---","---","\bnumber\s?two,\s?can't.\b","---","audio/Korean English/20251130_071156_4171.wav","","","" +"Don't tell me what to do.","Korean English","Don't tell me what to do.","---","---","\bdon't\s?tell\s?me\s?what\s?to\s?do.\b","---","audio/Korean English/20251130_071401_6635.wav","","","" +"Why you're laughing?","Korean English","Why are you laughing?","---","---","\bwhy\s?you're\s?laughing?\b","---","audio/Korean English/20251130_071554_6166.wav","","","" \ No newline at end of file diff --git a/IEDID/English/data/Malaysian English.csv b/IEDID/English/data/Malaysian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..eb65be8ec3b0759dc5319fdcf97337f0a2c56b63 --- /dev/null +++ b/IEDID/English/data/Malaysian English.csv @@ -0,0 +1,21 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"Can or not?","Malaysian English","Is that possible?","---","---","\bcan\s?or\s?not\b","---","","","","" +"I send you to airport.","Malaysian English","I will drive you to the airport.","---","---","\bi\s?send\s?you\b","---","","","","" +"Why you so like that?","Malaysian English","Why are you behaving that way?","---","---","\bso\s?like\s?that\b","---","","","","" +"Got problem ah?","Malaysian English","Is there a problem?","---","---","\bgot\s?problem\b","---","","","","" +"Where got?","Malaysian English","That's not true / I don't have that.","---","---","\bwhere\s?got\b","---","","","","" +"Don't play play.","Malaysian English","Don't fool around / Take this seriously.","---","---","\bplay\s?play\b","---","","","","" +"Open the light.","Malaysian English","Turn on the light.","---","---","\bopen\s?the\s?light\b","---","","","","" +"Close the radio.","Malaysian English","Turn off the radio.","---","---","\bclose\s?the\s?radio\b","---","","","","" +"Are you coming onot?","Malaysian English","Are you coming or not?","---","---","\bonot\b","---","","","","" +"He terror at math.","Malaysian English","He is excellent at math.","---","---","\bterror\s?at\b","---","","","","" +"Can lah.","Malaysian English","It is certainly possible.","---","---","\bcan\s?lah\b","---","","","","" +"You sit first.","Malaysian English","Please take a seat.","---","---","\bsit\s?first\b","---","","","","" +"Gostan the car.","Malaysian English","Reverse the car.","---","---","\bgostan\b","---","","","","" +"Simply say only.","Malaysian English","Just guessing / Just saying.","---","---","\bsimply\s?say\b","---","","","","" +"One two jus.","Malaysian English","Rock, paper, scissors.","---","---","\bjus\b","---","","","","" +"Also can.","Malaysian English","That works too.","---","---","\balso\s?can\b","---","","","","" +"Sure mou?","Malaysian English","Are you sure?","---","---","\bsure\s?mou\b","---","","","","" +"Action only.","Malaysian English","He is just showing off.","---","---","\baction\s?only\b","---","","","","" +"Please off the fan.","Malaysian English","Please turn off the fan.","---","---","\bplease\s?off\b","---","","","","" +"He is outstation.","Malaysian English","He is out of town.","---","---","\boutstation\b","---","","","","" \ No newline at end of file diff --git a/IEDID/English/data/Nigerian English.csv b/IEDID/English/data/Nigerian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..6ebc0af3d751209aeefaab76b5adcb9986aebd11 --- /dev/null +++ b/IEDID/English/data/Nigerian English.csv @@ -0,0 +1,64 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User","Acoustic_Profile" +"I beg, let's go.","Nigerian English","Please, let's leave now.","---","---","\bi\s?beg\b","---","","","","","","" +"Do quick.","Nigerian English","Hurry up.","---","---","\bdo\s?quick\b","---","","","","","","" +"I am coming.","Nigerian English","I will be back in a moment.","---","---","\bi\s?am\s?coming\b","---","","","","","","" +"He is not on seat.","Nigerian English","He is not currently at his desk.","---","---","\bon\s?seat\b","---","","","","","","" +"Don't flash me.","Nigerian English","Don't call and hang up immediately.","---","---","\bflash\s?me\b","---","","","","","","" +"How far?","Nigerian English","How are you doing?","---","---","\bhow\s?far\b","---","","","","","","" +"I want to dash him money.","Nigerian English","I want to give him a gift/tip.","---","---","\bdash\b","---","","","","","","" +"The traffic was a go-slow.","Nigerian English","The traffic was moving very slowly.","---","---","\bgo-?slow\b","---","","","","","","" +"Have you eaten?","Nigerian English","How are you? (Greeting)","---","---","\bhave\s?you\s?eaten\b","---","","","","","","" +"Can you branch at the shop?","Nigerian English","Can you stop by the shop?","---","---","\bbranch\s?at\b","---","","","","","","" +"I will escort you out.","Nigerian English","I will walk you to the door.","---","---","\bescort\s?you\b","---","","","","","","" +"Stop horn-ing.","Nigerian English","Stop honking the horn.","---","---","\bhorn(ing)?\b","---","","","","","","" +"He is my junior brother.","Nigerian English","He is my younger brother.","---","---","\bjunior\s?brother\b","---","","","","","","" +"I will alight here.","Nigerian English","I will get off the bus here.","---","---","\balight\b","---","","","","","","" +"She has taken in.","Nigerian English","She has become pregnant.","---","---","\btaken\s?in\b","---","","","","","","" +"More grease to your elbow.","Nigerian English","Good job / Keep it up.","---","---","\bmore\s?grease\b","---","","","","","","" +"No wahala.","Nigerian English","No problem / No trouble.","---","---","\bwahala\b","---","","","","","","" +"You are talking rubbish.","Nigerian English","You are not making sense.","---","---","\brubbish\b","---","","","","","","" +"Let me gist you.","Nigerian English","Let me tell you the gossip/story.","---","---","\bgist\b","---","","","","","","" +"Are you tight?","Nigerian English","Are you busy?","---","---","\bare\s?you\s?tight\b","---","","","","","","" +"I beg, let go of me.","Nigerian English","Please let go of me.","---","---","\bi\s?beg,\s?let\s?go\s?of\s?me.\b","---","","","","","","" +"Can you borrow me some money?","Nigerian English","Can you lend me some money?","---","---","\bcan\s?you\s?borrow\s?me\s?some\s?money?\b","---","audio/Nigerian English/20251126_174644_1153.wav","","","","","" +"Don't find his trouble.","Nigerian English","Don't look for his trouble.","---","---","\bdon't\s?find\s?his\s?trouble.\b","---","audio/Nigerian English/20251126_174803_3971.wav","","","","","" +"I beg, borrow me some money.","Nigerian English","Please, lend me some money.","---","---","\bi\s?beg,\s?borrow\s?me\s?some\s?money.\b","---","audio/Nigerian English/20251127_081428_7595.wav","","","","","" +"Why are you looking for my trouble?","Nigerian English","Why are you picking a fight with me?","---","---","\bwhy\s?are\s?you\s?looking\s?for\s?my\s?trouble?\b","---","audio/Nigerian English/20251127_151603_7544.wav","","","","","" +"I beg, let me know when it's time to go home.","Nigerian English","Please, let me know when it's time to go home.","---","---","\bi\s?beg,\s?let\s?me\s?know\s?when\s?it's\s?time\s?to\s?go\s?home.\b","---","audio/Nigerian English/20251127_165735_5852.wav","","","","","" +"Please, borrow me some money.","Nigerian English","Please, lend me some money.","---","---","\bplease,\s?borrow\s?me\s?some\s?money.\b","---","audio/Nigerian English/20251127_170012_2691.wav","","","","","" +"Therapy for Mgbanwe (Transformation)","Nigerian English","Therapy for Mgbanwe (Transformation)","---","---","\btherapy\s?for\s?mgbanwe\b","---","audio/Nigerian English/20251127_171058_1662.webm","","","","","" +"I beg, I'm tired, I want to go and sleep.","Nigerian English","Please, I am tired and would love to go to sleep.","---","---","\bi\s?beg,\s?i'm\s?tired\b","---","audio/Nigerian English/20251128_033505_2773.wav","","","","","" +"I beg, just leave me alone.","Nigerian English","Please, just let me be.","---","---","\bi\s?beg,\s?just\s?leave\s?me\s?alone.\b","---","audio/Nigerian English/20251130_053949_8382.wav","","","","","" +"I beg, just take things easy.","Nigerian English","Please, take things easy.","---","---","\bi\s?beg,\s?just\s?take\s?things\s?easy.\b","---","audio/Nigerian English/20251130_054133_8334.wav","","","","","" +"I beg, I'm going home.","Nigerian English","Please, I am going home.","---","---","\bi\s?beg,\s?i'm\s?going\s?home.\b","---","audio/Nigerian English/20251130_055508_8623.wav","","","","","" +"I want to go and eat, please.","Nigerian English","I want to go and eat, please.","---","---","\bi\s?want\s?to\s?go\s?and\s?eat,\s?please.\b","---","audio/Nigerian English/20251130_070819_5824.wav","","","","","" +"Give me some time. I'm coming.","Nigerian English","Give me some time, I'll be right back.","---","---","\bgive\s?me\s?some\s?time.\s?i'm\s?coming.\b","---","audio/Nigerian English/20251130_072414_6192.wav","","","","","" +"I am coming, give me some time.","Nigerian English","I am on my way, give me some time.","---","---","\bi\s?am\s?coming,\s?give\s?me\s?some\s?time.\b","---","audio/Nigerian English/20251130_072531_7096.wav","","","","","" +"I beg, what are we going to eat tonight?","Nigerian English","Please, what is the plan for dinner tonight?","Casual/Polite","Used to mean ""Please,"" or to soften a command.","\bi\s?beg,\s?what\s?are\s?we\s?going\s?to\s?eat\s?tonight?\b","---","audio/Nigerian English/20251130_091251_5939.wav","","","","","" +"I beg, don't find my trouble oh!","Nigerian English","Please, do not provoke me.","Formal/Cold","Professional/formal environments to maintain composure.","\bi\s?beg,\s?don't\s?find\s?my\s?trouble\s?oh!\b","Functions as boundary setting; resisting provocation.","audio/Nigerian English/20251130_094753_6762.wav","","","","","" +"Don't find my trouble","Nigerian English","Don't look for my trouble.","Exasperated","Casual settings, between friends or parent-to-child.","\bdon't\s?find\s?my\s?trouble\b","Implies antagonist is seeking unnecessary drama.","audio/Nigerian English/20251130_095152_6397.wav","","","","","" +"It's like you like looking for trouble.","Nigerian English","You always seem to be looking for a fight.","Casual/Figurative","Common structure translating emphasis from local language.","\bit's\s?like\s?you\s?like\s?looking\s?for\s?trouble.\b","Accusation of consistently provocative behavior.","audio/Nigerian English/20251130_191610_1515.wav","","","","","" +"I beg, let's go home and continue tomorrow.","Nigerian English","Please, guys, let's head home and finish tomorrow.","Casual/Weary","Used as a polite discourse marker (softener).","\bi\s?beg,\s?let's\s?go\s?home\b","Suggestion rather than demand; smooths over friction.","audio/Nigerian English/20260121_090426_8285.wav","","","","","" +"Stop flashing me please.","Nigerian English","Please, stop giving me dropped calls.","---","---","\bstop\s?flashing\s?me\b","---","audio/Nigerian English/20260121_093447_5988.wav","","","","","" +"What kind of wahala is this?","Nigerian English","Frustration/annoyance at a difficult situation.","Exasperated","Discovering car is blocked when already late.","(?i)What\s+kind of\s+wahala\s+is this","Venting frustration; highlights absurdity of problem.","audio/Nigerian English/20260126_084922_9339.wav","","","","","" +"Borrow me your pen, please.","Nigerian English","Lend me your pen, please.","Casual","School, workplace, or among friends.","Borrow me your pen","'Borrow me' is a standard structure for 'lend me'.","audio/Nigerian English/20260127_044034_3942.wav","","","","","" +"I will revert to you tomorrow.","Nigerian English","I will get back to you tomorrow.","Corporate","A co-worker needs an update on a project.","I will revert to you tomorrow","Way of promising an update the next day.","audio/Nigerian English/20260128_082748_6879.wav","","","","","" +"Hey, how far? What's going on?","Nigerian English","How are you? What's happening?","Casual","Approaching a friend involved in an altercation.","Hey, how far","Casual greeting followed by situational inquiry.","audio/Nigerian English/20260130_033152_6940.wav","","","","","" +"What kind of wahala is this?","Nigerian English","Seeking validation for frustration.","Exasperated","Discovering car is blocked when late.","\bwhat\ kind\ of\ wahala\ is\ this\?\b","The question is rhetorical, seeking sympathy.","audio/Nigerian English/audio.wav","---","---","---","","" +"How about we talk about Nigerian food?","Nigerian English","Shall we discuss Nigerian cuisine?","Conversational","Chat","\bhow\ about\ we\ talk\ about\ nigerian\ food\?\b","Active Listening","","---","---","---","","" +"My job!","Nigerian English","This is my job!","Conversational","Chat","\bmy\ job!\b","Game: Listener","","---","---","---","","" +"food, Nigerian food.","Nigerian English","Specifically Nigerian cuisine.","Conversational","Chat","\bfood,\ nigerian\ food\.\b","Game: Listener","","---","---","---","","" +"Nigerian food","Nigerian English","Food from Nigeria.","Conversational","Chat","\bnigerian\ food\b","Game: Listener","","---","---","---","","" +"Do you mean like what I know how to cook?","Nigerian English","Asking about dishes they can prepare.","Conversational","Chat","\bdo\ you\ mean\ like\ what\ i\ know\ how\ to\ cook\?\b","Game: Listener","","---","---","---","","" +"Honestly, I have no idea.","Nigerian English","Truthfully stating lack of information.","Conversational","Chat","\bhonestly,\ i\ have\ no\ idea\.\b","Game: Listener","","---","---","---","","" +"I want one carton of biscuits.","Nigerian English","I want a box of biscuits.","Neutral / Conversational","","","Nigerians often use ""carton"" in place of ""box"".","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Stop finding my trouble.","Nigerian English","Stop causing problems for me; stop interfering in my affairs and creating difficulties for me.","Annoyed, exasperated, possibly aggressive depending on the context and speaker.","Likely spoken in a situation where the speaker feels someone is deliberately provoking them, interfering with their plans, or creating unnecessary obstacles.","","A request or demand for cessation of unwanted interference or provocation. It carries a strong implication that the 'trouble' is intentionally or carelessly caused by the addressee.","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Stop trying me.","Nigerian English","Please, stop pushing my buttons","Neutral / Conversational","The speaker is giving a warning to someone who might be aggravating. ""Trying me"" in the Nigerian context could be short for ""trying my patience.""","","Verified via local Regex and RLHF","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Stop testing me, stop testing me.","Nigerian English","Stop provoking me; stop challenging my patience; stop trying to make me angry.","Frustrated, irritated, potentially angry or warning.","This utterance typically arises in situations where someone feels they are being deliberately pushed to their limits, either through persistent questioning, unreasonable demands, or provocative actions. It's often a prelude to an outburst or a declaration of boundaries.","","The repetition emphasizes the speaker's heightened emotional state. It functions as a direct and forceful request for the other person to cease their current behavior. The repeated 'testing' implies that the speaker perceives the other party's actions as intentional and manipulative.","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Hello, it's like there's something wrong with you.","Nigerian English","Hello, you seem unwell or behaving oddly.","Concerned, Slightly Confrontational, Casual","Everyday conversation between acquaintances or friends; could occur in any setting where odd behavior is observed.","","Expressing concern while simultaneously pointing out an unusual behavior, potentially initiating a conversation about the issue.","audio/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Hello, it's like there's something wrong with you.","Nigerian English","Hello, you seem unwell or behaving oddly.","Concerned, Slightly Confrontational, Casual","Everyday conversation between acquaintances or friends; could occur in any setting where odd behavior is observed.","","Expressing concern while simultaneously pointing out an unusual behavior, potentially initiating a conversation about the issue.","","User","Web","","","" +"Hey, stop looking for my trouble oh!","Nigerian English","I am warning you to cease provoking me or creating problems for me.","Warning, slightly exasperated but not extremely aggressive.","A situation where one person feels another is deliberately trying to cause problems or antagonize them, often used in informal settings between acquaintances or people who know each other well.","","Issuing a warning and setting a boundary to prevent escalation of a conflict; asserting oneself.","audio/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Why are you look for somebody's trouble?","Nigerian English","Why are you deliberately seeking problems or conflict with someone?","Reproachful, possibly exasperated or concerned","A situation where someone is perceived to be intentionally provoking or antagonizing another person or group.","","Discouraging conflict, expressing disapproval of provocative behavior","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"I see a red truck in the middle of the street with a man on a pink shirt beside it and other people beside him and bikes across the other side of the road with trees and houses. Palm trees.","General English","There's a red truck on the street. A man wearing a pink shirt is standing next to the truck, and other people are standing near him. Across the street, there are motorcycles parked, along with trees and houses. The speaker specifies that palm trees are present.","Neutral / Conversational","General","","","audio/General/audio.wav","Web","User","","","" +"normalization were used to changing up when cool down.","Nigerian English","Normal power supply adjustment was done to change to generator power when the electricity goes off.","Formal / Professional","Everyday conversation about power supply issues, common in Nigeria due to unreliable electricity.","","Explaining a technical adjustment in a straightforward manner.","audio/rec_1772695224_b24f11.wav","Lab Admin","Gradio Admin UI","","0xbd73a9d36bb64c789482b04437809f113f2d8944","" +"Hello, what's going on?","Nigerian English","A casual greeting to initiate conversation, often used in informal settings with friends or acquaintances to show interest in current events or general well-being.","Casual","Social gatherings, casual meetups, or during conversations with friends or family in public spaces.","","Establishing connection and showing interest in the other person's life.","audio/rec_1778811562_1fc36a.wav","Lab Admin","Gradio Admin UI","","0xdfc546c71a11426eb8620cdf8995ba2a6e605fe7","{}" diff --git a/IEDID/French/data/African French.csv b/IEDID/French/data/African French.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/French/data/African French.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/French/data/Belgian French.csv b/IEDID/French/data/Belgian French.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/French/data/Belgian French.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/French/data/Metropolitan French.csv b/IEDID/French/data/Metropolitan French.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/French/data/Metropolitan French.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/French/data/Quebec French.csv b/IEDID/French/data/Quebec French.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/French/data/Quebec French.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/French/data/Swiss French.csv b/IEDID/French/data/Swiss French.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/French/data/Swiss French.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gan Chinese/data/Ji'an.csv b/IEDID/Gan Chinese/data/Ji'an.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gan Chinese/data/Ji'an.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gan Chinese/data/Nanchang.csv b/IEDID/Gan Chinese/data/Nanchang.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gan Chinese/data/Nanchang.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gan Chinese/data/Yichun.csv b/IEDID/Gan Chinese/data/Yichun.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gan Chinese/data/Yichun.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/German/data/Austrian German.csv b/IEDID/German/data/Austrian German.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/German/data/Austrian German.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/German/data/Bavarian.csv b/IEDID/German/data/Bavarian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/German/data/Bavarian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/German/data/High German.csv b/IEDID/German/data/High German.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/German/data/High German.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/German/data/Low German.csv b/IEDID/German/data/Low German.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/German/data/Low German.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/German/data/Swiss German.csv b/IEDID/German/data/Swiss German.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/German/data/Swiss German.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Greek/data/Cretan Greek.csv b/IEDID/Greek/data/Cretan Greek.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Greek/data/Cretan Greek.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Greek/data/Cypriot Greek.csv b/IEDID/Greek/data/Cypriot Greek.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Greek/data/Cypriot Greek.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Greek/data/Pontic Greek.csv b/IEDID/Greek/data/Pontic Greek.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Greek/data/Pontic Greek.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Greek/data/Standard Greek.csv b/IEDID/Greek/data/Standard Greek.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Greek/data/Standard Greek.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gujarati/data/Kathiawadi.csv b/IEDID/Gujarati/data/Kathiawadi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gujarati/data/Kathiawadi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gujarati/data/Pattani.csv b/IEDID/Gujarati/data/Pattani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gujarati/data/Pattani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gujarati/data/Standard Gujarati.csv b/IEDID/Gujarati/data/Standard Gujarati.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gujarati/data/Standard Gujarati.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Gujarati/data/Surati.csv b/IEDID/Gujarati/data/Surati.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Gujarati/data/Surati.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hakka Chinese/data/Hailu.csv b/IEDID/Hakka Chinese/data/Hailu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hakka Chinese/data/Hailu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hakka Chinese/data/Meixian.csv b/IEDID/Hakka Chinese/data/Meixian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hakka Chinese/data/Meixian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hakka Chinese/data/Sixian.csv b/IEDID/Hakka Chinese/data/Sixian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hakka Chinese/data/Sixian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hausa/data/Kano.csv b/IEDID/Hausa/data/Kano.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hausa/data/Kano.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hausa/data/Katsina.csv b/IEDID/Hausa/data/Katsina.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hausa/data/Katsina.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hausa/data/Sokoto.csv b/IEDID/Hausa/data/Sokoto.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hausa/data/Sokoto.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hausa/data/Zaria.csv b/IEDID/Hausa/data/Zaria.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hausa/data/Zaria.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hejazi Arabic/data/Jeddawi.csv b/IEDID/Hejazi Arabic/data/Jeddawi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hejazi Arabic/data/Jeddawi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hejazi Arabic/data/Meccan.csv b/IEDID/Hejazi Arabic/data/Meccan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hejazi Arabic/data/Meccan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hejazi Arabic/data/Medani.csv b/IEDID/Hejazi Arabic/data/Medani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hejazi Arabic/data/Medani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hindi/data/Awadhi.csv b/IEDID/Hindi/data/Awadhi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hindi/data/Awadhi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hindi/data/Bhojpuri.csv b/IEDID/Hindi/data/Bhojpuri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hindi/data/Bhojpuri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hindi/data/Haryanvi.csv b/IEDID/Hindi/data/Haryanvi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hindi/data/Haryanvi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hindi/data/Rajasthani.csv b/IEDID/Hindi/data/Rajasthani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hindi/data/Rajasthani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hindi/data/Standard Hindi.csv b/IEDID/Hindi/data/Standard Hindi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hindi/data/Standard Hindi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Hungarian/data/Alf\342\224\234\342\225\242ld.csv" "b/IEDID/Hungarian/data/Alf\342\224\234\342\225\242ld.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Hungarian/data/Alf\342\224\234\342\225\242ld.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Hungarian/data/Sz\342\224\234\342\214\220kely.csv" "b/IEDID/Hungarian/data/Sz\342\224\234\342\214\220kely.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Hungarian/data/Sz\342\224\234\342\214\220kely.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Hungarian/data/Transdanubian.csv b/IEDID/Hungarian/data/Transdanubian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Hungarian/data/Transdanubian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Igbo/data/Onitsha.csv b/IEDID/Igbo/data/Onitsha.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Igbo/data/Onitsha.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Igbo/data/Orlu.csv b/IEDID/Igbo/data/Orlu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Igbo/data/Orlu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Igbo/data/Owerri.csv b/IEDID/Igbo/data/Owerri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Igbo/data/Owerri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Igbo/data/Standard Igbo.csv b/IEDID/Igbo/data/Standard Igbo.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Igbo/data/Standard Igbo.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Igbo/data/Umuahia.csv b/IEDID/Igbo/data/Umuahia.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Igbo/data/Umuahia.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Indian English.csv b/IEDID/Indian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..6375a1603ec0dca8299e59f23f77661f4afef998 --- /dev/null +++ b/IEDID/Indian English.csv @@ -0,0 +1,25 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"I will prepone the meeting.","Indian English","I will bring the meeting forward.","---","---","\bprepone\b","---","","","","" +"Do the needful.","Indian English","Please do what is required.","---","---","\bdo\s?the\s?needful\b","---","","","","" +"He passed out last year.","Indian English","He graduated last year.","---","---","\bpassed\s?out\b","---","","","","" +"I have a doubt.","Indian English","I have a question.","---","---","\bhave\s?a\s?doubt\b","---","","","","" +"Please revert back.","Indian English","Please reply.","---","---","\brevert\s?back\b","---","","","","" +"She is my cousin sister.","Indian English","She is my female cousin.","---","---","\bcousin\s?sister\b","---","","","","" +"What is your good name?","Indian English","What is your name.","---","---","\bgood\s?name\b","---","","","","" +"I am out of station.","Indian English","I am out of town.","---","---","\bout\s?of\s?station\b","---","","","","" +"Tell me only.","Indian English","Just tell me.","---","---","\btell\s?me\s?only\b","---","","","","" +"He is eating my head.","Indian English","He is annoying me.","---","---","\beating\s?my\s?head\b","---","","","","" +"Are you coming, na?","Indian English","Are you coming?","---","---",",\s?na\b","---","","","","" +"Let us discuss about this.","Indian English","Let us discuss this.","---","---","\bdiscuss\s?about\b","---","","","","" +"Kindly adjust.","Indian English","Please make room / accommodate.","---","---","\bkindly\s?adjust\b","---","","","","" +"Timepass.","Indian English","Something to pass the time / trivial.","---","---","\btimepass\b","---","","","","" +"He is sitting on my head.","Indian English","He is pressuring me.","---","---","\bsitting\s?on\s?my\s?head\b","---","","","","" +"Today morning.","Indian English","This morning.","---","---","\btoday\s?morning\b","---","","","","" +"Years back.","Indian English","Years ago.","---","---","\byears\s?back\b","---","","","","" +"First-class.","Indian English","Excellent / Very good.","---","---","\bfirst-?class\b","---","","","","" +"Don't eat my brain.","Indian English","Stop bothering me.","---","---","\beat\s?my\s?brain\b","---","","","","" +"Shift a bit.","Indian English","Move over slightly.","---","---","\bshift\s?a\s?bit\b","---","","","","" +"Better","Indian English","Better","---","---","\bbetter\b","---","audio/Indian English/20251130_071733_9980.wav","","","" +"Can't","Indian English","Can't","---","---","\bcan't\b","---","audio/Indian English/20251130_071849_5419.wav","","","" +"Naughty","Indian English","Naughty","---","---","\bnaughty\b","---","audio/Indian English/20251130_072004_4175.wav","","","" +"You're naughty girl!","Indian English","You're a naughty girl!","---","---","\byou're\s?naughty\s?girl!\b","---","audio/Indian English/20251130_072121_8390.wav","","","" diff --git a/IEDID/Indonesian English.csv b/IEDID/Indonesian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..31eae533ddde5f5b5577025b2cb85754b80f7862 --- /dev/null +++ b/IEDID/Indonesian English.csv @@ -0,0 +1,24 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"Please open your shoes.","Indonesian English","Please take off your shoes.","---","---","\bopen\s?(your|the)?\s?shoes\b","---","","","","" +"Close the light.","Indonesian English","Turn off the light.","---","---","\bclose\s?(the)?\s?light\b","---","","","","" +"Thanks before.","Indonesian English","Thanks in advance.","---","---","\bthanks\s?before\b","---","","","","" +"I will follow you.","Indonesian English","I will accompany/join you.","---","---","\bfollow\s?you\b","---","","","","" +"Join with us.","Indonesian English","Join us.","---","---","\bjoin\s?with\s?us\b","---","","","","" +"I am boring here.","Indonesian English","I am bored here.","---","---","\bam\s?boring\b","---","","","","" +"Don't be arrogant.","Indonesian English","Don't be snobbish.","---","---","\barrogant\b","---","","","","" +"Keep your bag.","Indonesian English","Put away your bag.","---","---","\bkeep\s?your\b","---","","","","" +"Have you ever go to Bali?","Indonesian English","Have you ever been to Bali?","---","---","\bhave\s?you\s?ever\s?go\b","---","","","","" +"Same same.","Indonesian English","It is the same.","---","---","\bsame\s?same\b","---","","","","" +"First first.","Indonesian English","Wait a moment / Me first.","---","---","\bfirst\s?first\b","---","","","","" +"Ask to him.","Indonesian English","Ask him.","---","---","\bask\s?to\b","---","","","","" +"I already eat.","Indonesian English","I have already eaten.","---","---","\balready\s?eat\b","---","","","","" +"Buy for me food.","Indonesian English","Buy food for me.","---","---","\bbuy\s?for\s?me\b","---","","","","" +"The food is very delicious.","Indonesian English","The food is delicious.","---","---","\bvery\s?delicious\b","---","","","","" +"Make it fast.","Indonesian English","Hurry up.","---","---","\bmake\s?it\s?fast\b","---","","","","" +"Is it?","Indonesian English","Really? / Is that so?","---","---","\bis\s?it\??$","---","","","","" +"Where you stay?","Indonesian English","Where do you live?","---","---","\bwhere\s?you\s?stay\b","---","","","","" +"Take profit.","Indonesian English","Benefit from / Take advantage.","---","---","\btake\s?profit\b","---","","","","" +"Please enter inside.","Indonesian English","Please come in.","---","---","\benter\s?inside\b","---","","","","" +"How long did you take to prepare for the presentation?","Indonesian English","How long did it take you to prepare for the presentation?","---","---","\bhow\s?long\s?did\s?you\s?take\s?to\s?prepare\s?for\s?the\s?presentation?\b","---","","","","" +"I think our lab also have like similar thing but not that bad, right?","Indonesian English","In our lab, we have a similar issue, but thankfully it's not as severe.","---","---","\bi\s?think\s?our\s?lab\s?also\s?have\s?like\s?similar\s?thing\s?but\s?not\s?that\s?bad,\s?right?\b","---","audio/Indonesian English/20251130_055349_2411.wav","","","" +"Our lab also have like similar thing.","Indonesian English","Our lab also has something similar.","---","---","\bour\s?lab\s?also\s?have\s?like\s?similar\s?thing.\b","---","audio/Indonesian English/20251130_072319_6314.wav","","","" \ No newline at end of file diff --git a/IEDID/Indonesian/data/Jakarta Indonesian.csv b/IEDID/Indonesian/data/Jakarta Indonesian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Indonesian/data/Jakarta Indonesian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Indonesian/data/Papuan Malay.csv b/IEDID/Indonesian/data/Papuan Malay.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Indonesian/data/Papuan Malay.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Indonesian/data/Standard Indonesian.csv b/IEDID/Indonesian/data/Standard Indonesian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Indonesian/data/Standard Indonesian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Iranian Persian/data/Isfahani.csv b/IEDID/Iranian Persian/data/Isfahani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Iranian Persian/data/Isfahani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Iranian Persian/data/Mashhadi.csv b/IEDID/Iranian Persian/data/Mashhadi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Iranian Persian/data/Mashhadi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Iranian Persian/data/Shirazi.csv b/IEDID/Iranian Persian/data/Shirazi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Iranian Persian/data/Shirazi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Iranian Persian/data/Tehrani.csv b/IEDID/Iranian Persian/data/Tehrani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Iranian Persian/data/Tehrani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Italian/data/Neapolitan.csv b/IEDID/Italian/data/Neapolitan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Italian/data/Neapolitan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Italian/data/Sicilian.csv b/IEDID/Italian/data/Sicilian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Italian/data/Sicilian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Italian/data/Standard Italian.csv b/IEDID/Italian/data/Standard Italian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Italian/data/Standard Italian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Italian/data/Venetian.csv b/IEDID/Italian/data/Venetian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Italian/data/Venetian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Jamaican Patois.csv b/IEDID/Jamaican Patois.csv new file mode 100644 index 0000000000000000000000000000000000000000..9663fc27b59e27a5db17d231a12f81334cbf9b89 --- /dev/null +++ b/IEDID/Jamaican Patois.csv @@ -0,0 +1,2 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","audio_file_name","Data_Origin","Clarification_Source","User" +"Wah gwaan inna di area?","Jamaican Patois","What's going on in the area? What's the news or happenings around here?","Conversational","Chat","","Interactive Chat Session","","","Gradio App","User","Admin | Net-IP: 119.56.184.37" diff --git a/IEDID/Japanese/data/Kansai.csv b/IEDID/Japanese/data/Kansai.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Japanese/data/Kansai.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Japanese/data/Kanto.csv b/IEDID/Japanese/data/Kanto.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Japanese/data/Kanto.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Japanese/data/Kyushu.csv b/IEDID/Japanese/data/Kyushu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Japanese/data/Kyushu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Japanese/data/Tohoku.csv b/IEDID/Japanese/data/Tohoku.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Japanese/data/Tohoku.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Javanese/data/Central Javanese.csv b/IEDID/Javanese/data/Central Javanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Javanese/data/Central Javanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Javanese/data/Eastern Javanese.csv b/IEDID/Javanese/data/Eastern Javanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Javanese/data/Eastern Javanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Javanese/data/Western Javanese.csv b/IEDID/Javanese/data/Western Javanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Javanese/data/Western Javanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Jin Chinese/data/Bingzhou.csv b/IEDID/Jin Chinese/data/Bingzhou.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Jin Chinese/data/Bingzhou.csv @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Jin Chinese/data/L\342\224\234\342\225\235liang.csv" "b/IEDID/Jin Chinese/data/L\342\224\234\342\225\235liang.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Jin Chinese/data/L\342\224\234\342\225\235liang.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Jin Chinese/data/Zhangjiakou-Hohhot.csv b/IEDID/Jin Chinese/data/Zhangjiakou-Hohhot.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Jin Chinese/data/Zhangjiakou-Hohhot.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kannada/data/Hubli.csv b/IEDID/Kannada/data/Hubli.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kannada/data/Hubli.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kannada/data/Kundapura.csv b/IEDID/Kannada/data/Kundapura.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kannada/data/Kundapura.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kannada/data/Mangalore.csv b/IEDID/Kannada/data/Mangalore.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kannada/data/Mangalore.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kannada/data/Mysore.csv b/IEDID/Kannada/data/Mysore.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kannada/data/Mysore.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kazakh/data/Northeastern Kazakh.csv b/IEDID/Kazakh/data/Northeastern Kazakh.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kazakh/data/Northeastern Kazakh.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kazakh/data/Southern Kazakh.csv b/IEDID/Kazakh/data/Southern Kazakh.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kazakh/data/Southern Kazakh.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kazakh/data/Western Kazakh.csv b/IEDID/Kazakh/data/Western Kazakh.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kazakh/data/Western Kazakh.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Khmer/data/Northern Khmer.csv b/IEDID/Khmer/data/Northern Khmer.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Khmer/data/Northern Khmer.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Khmer/data/Standard Khmer.csv b/IEDID/Khmer/data/Standard Khmer.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Khmer/data/Standard Khmer.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Khmer/data/Western Khmer.csv b/IEDID/Khmer/data/Western Khmer.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Khmer/data/Western Khmer.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Kinyarwanda/data/Standard Kinyarwanda.csv b/IEDID/Kinyarwanda/data/Standard Kinyarwanda.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Kinyarwanda/data/Standard Kinyarwanda.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Korean English.csv b/IEDID/Korean English.csv new file mode 100644 index 0000000000000000000000000000000000000000..6fd5c0f4c22f84fc939ea1be739facbba537a123 --- /dev/null +++ b/IEDID/Korean English.csv @@ -0,0 +1,27 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"He was living.","Korean English","He was alive.","---","---","\bwas\s?living\b","---","","","","" +"Please check once.","Korean English","Please check it briefly.","---","---","\bcheck\s?once\b","---","","","","" +"I need your sign.","Korean English","I need your signature/autograph.","---","---","\byour\s?sign\b","---","","","","" +"We had a meeting.","Korean English","We went on a group blind date.","---","---","\ba\s?meeting\b","---","","","","" +"Turn the handle.","Korean English","Turn the steering wheel.","---","---","\bhandle\b","---","","","","" +"This service is free.","Korean English","This extra item is on the house.","---","---","\bservice\b","---","","","","" +"Don't do over.","Korean English","Don't exaggerate.","---","---","\bdo\s?over\b","---","","","","" +"My condition is bad.","Korean English","I am not feeling well.","---","---","\bcondition\s?is\s?bad\b","---","","","","" +"Did you eat lunch?","Korean English","How are you?","---","---","\bdid\s?you\s?eat\b","---","","","","" +"Fighting!","Korean English","Cheer up! / You can do it!","---","---","\bfighting!?\b","---","","","","" +"He is a gag man.","Korean English","He is a comedian.","---","---","\bgag\s?man\b","---","","","","" +"I watched a cunning movie.","Korean English","I watched a cheating/affair movie.","---","---","\bcunning\b","---","","","","" +"Use the concent.","Korean English","Use the power outlet/socket.","---","---","\bconcent\b","---","","","","" +"Did you see the grand open?","Korean English","Did you see the grand opening?","---","---","\bgrand\s?open\b","---","","","","" +"Too much skinship.","Korean English","Too much physical affection.","---","---","\bskinship\b","---","","","","" +"I will dutch pay.","Korean English","Let's split the bill.","---","---","\bi\s?will\s?dutch\s?pay.\b","---","audio/Korean English/20251127_151123_3372.wav","","","" +"She is glamour.","Korean English","She is curvaceous/voluptuous.","---","---","\bglamour\b","---","","","","" +"One shot!","Korean English","Bottoms up.","---","---","\bone\s?shot\b","---","","","","" +"It is hard training.","Korean English","It is intensive training.","---","---","\bhard\s?training\b","---","","","","" +"Keep the promise.","Korean English","Keep your word.","---","---","\bkeep\s?the\s?promise\b","---","","","","" +"kicking this back up to the top","Korean English","I'm bringing this back to your attention.","---","---","\bkicking\s?this\s?back\s?up\s?to\s?the\s?top\b","---","audio/Korean English/20251127_151823_1187.m4a","","","" +"and he might soon have company.","Korean English","and he may soon be joined by others.","---","---","\band\s?he\s?might\s?soon\s?have\s?company.\b","---","audio/Korean English/20251127_152057_6916.m4a","","","" +"Number one, better.","Korean English","Number one, better.","---","---","\bnumber\s?one,\s?better.\b","---","audio/Korean English/20251130_065941_4763.wav","","","" +"Number two, can't.","Korean English","Number two, can't.","---","---","\bnumber\s?two,\s?can't.\b","---","audio/Korean English/20251130_071156_4171.wav","","","" +"Don't tell me what to do.","Korean English","Don't tell me what to do.","---","---","\bdon't\s?tell\s?me\s?what\s?to\s?do.\b","---","audio/Korean English/20251130_071401_6635.wav","","","" +"Why you're laughing?","Korean English","Why are you laughing?","---","---","\bwhy\s?you're\s?laughing?\b","---","audio/Korean English/20251130_071554_6166.wav","","","" \ No newline at end of file diff --git a/IEDID/Korean/data/Chungcheong Satoori.csv b/IEDID/Korean/data/Chungcheong Satoori.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Korean/data/Chungcheong Satoori.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Korean/data/Gyeongsang Satoori.csv b/IEDID/Korean/data/Gyeongsang Satoori.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Korean/data/Gyeongsang Satoori.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Korean/data/Jeju Dialect.csv b/IEDID/Korean/data/Jeju Dialect.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Korean/data/Jeju Dialect.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Korean/data/Jeolla Satoori.csv b/IEDID/Korean/data/Jeolla Satoori.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Korean/data/Jeolla Satoori.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Korean/data/Seoul Dialect.csv b/IEDID/Korean/data/Seoul Dialect.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Korean/data/Seoul Dialect.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Magahi/data/Khortha.csv b/IEDID/Magahi/data/Khortha.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Magahi/data/Khortha.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Magahi/data/Standard Magahi.csv b/IEDID/Magahi/data/Standard Magahi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Magahi/data/Standard Magahi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Maithili/data/Angika.csv b/IEDID/Maithili/data/Angika.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Maithili/data/Angika.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Maithili/data/Bajjika.csv b/IEDID/Maithili/data/Bajjika.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Maithili/data/Bajjika.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Maithili/data/Standard Maithili.csv b/IEDID/Maithili/data/Standard Maithili.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Maithili/data/Standard Maithili.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malay/data/Kelantanese.csv b/IEDID/Malay/data/Kelantanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Malay/data/Kelantanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malay/data/Standard Malay.csv b/IEDID/Malay/data/Standard Malay.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Malay/data/Standard Malay.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malay/data/Terengganu.csv b/IEDID/Malay/data/Terengganu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Malay/data/Terengganu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malayalam/data/Central Kerala.csv b/IEDID/Malayalam/data/Central Kerala.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Malayalam/data/Central Kerala.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malayalam/data/North Kerala.csv b/IEDID/Malayalam/data/North Kerala.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Malayalam/data/North Kerala.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malayalam/data/South Kerala.csv b/IEDID/Malayalam/data/South Kerala.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Malayalam/data/South Kerala.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Malaysian English.csv b/IEDID/Malaysian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..eb65be8ec3b0759dc5319fdcf97337f0a2c56b63 --- /dev/null +++ b/IEDID/Malaysian English.csv @@ -0,0 +1,21 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name" +"Can or not?","Malaysian English","Is that possible?","---","---","\bcan\s?or\s?not\b","---","","","","" +"I send you to airport.","Malaysian English","I will drive you to the airport.","---","---","\bi\s?send\s?you\b","---","","","","" +"Why you so like that?","Malaysian English","Why are you behaving that way?","---","---","\bso\s?like\s?that\b","---","","","","" +"Got problem ah?","Malaysian English","Is there a problem?","---","---","\bgot\s?problem\b","---","","","","" +"Where got?","Malaysian English","That's not true / I don't have that.","---","---","\bwhere\s?got\b","---","","","","" +"Don't play play.","Malaysian English","Don't fool around / Take this seriously.","---","---","\bplay\s?play\b","---","","","","" +"Open the light.","Malaysian English","Turn on the light.","---","---","\bopen\s?the\s?light\b","---","","","","" +"Close the radio.","Malaysian English","Turn off the radio.","---","---","\bclose\s?the\s?radio\b","---","","","","" +"Are you coming onot?","Malaysian English","Are you coming or not?","---","---","\bonot\b","---","","","","" +"He terror at math.","Malaysian English","He is excellent at math.","---","---","\bterror\s?at\b","---","","","","" +"Can lah.","Malaysian English","It is certainly possible.","---","---","\bcan\s?lah\b","---","","","","" +"You sit first.","Malaysian English","Please take a seat.","---","---","\bsit\s?first\b","---","","","","" +"Gostan the car.","Malaysian English","Reverse the car.","---","---","\bgostan\b","---","","","","" +"Simply say only.","Malaysian English","Just guessing / Just saying.","---","---","\bsimply\s?say\b","---","","","","" +"One two jus.","Malaysian English","Rock, paper, scissors.","---","---","\bjus\b","---","","","","" +"Also can.","Malaysian English","That works too.","---","---","\balso\s?can\b","---","","","","" +"Sure mou?","Malaysian English","Are you sure?","---","---","\bsure\s?mou\b","---","","","","" +"Action only.","Malaysian English","He is just showing off.","---","---","\baction\s?only\b","---","","","","" +"Please off the fan.","Malaysian English","Please turn off the fan.","---","---","\bplease\s?off\b","---","","","","" +"He is outstation.","Malaysian English","He is out of town.","---","---","\boutstation\b","---","","","","" \ No newline at end of file diff --git a/IEDID/Mandarin Chinese/data/Beijing Dialect.csv b/IEDID/Mandarin Chinese/data/Beijing Dialect.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mandarin Chinese/data/Beijing Dialect.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Mandarin Chinese/data/Singaporean Mandarin.csv b/IEDID/Mandarin Chinese/data/Singaporean Mandarin.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mandarin Chinese/data/Singaporean Mandarin.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Mandarin Chinese/data/Standard Mandarin.csv b/IEDID/Mandarin Chinese/data/Standard Mandarin.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mandarin Chinese/data/Standard Mandarin.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Mandarin Chinese/data/Taiwanese Mandarin.csv b/IEDID/Mandarin Chinese/data/Taiwanese Mandarin.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mandarin Chinese/data/Taiwanese Mandarin.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Marathi/data/Deshi.csv b/IEDID/Marathi/data/Deshi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Marathi/data/Deshi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Marathi/data/Konkani.csv b/IEDID/Marathi/data/Konkani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Marathi/data/Konkani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Marathi/data/Standard Marathi.csv b/IEDID/Marathi/data/Standard Marathi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Marathi/data/Standard Marathi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Marathi/data/Varhadi.csv b/IEDID/Marathi/data/Varhadi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Marathi/data/Varhadi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Mesopotamian Arabic/data/Baghdadi.csv b/IEDID/Mesopotamian Arabic/data/Baghdadi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mesopotamian Arabic/data/Baghdadi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Mesopotamian Arabic/data/Basrawi.csv b/IEDID/Mesopotamian Arabic/data/Basrawi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mesopotamian Arabic/data/Basrawi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Mesopotamian Arabic/data/Moslawi.csv b/IEDID/Mesopotamian Arabic/data/Moslawi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Mesopotamian Arabic/data/Moslawi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Min Bei Chinese/data/Jian'ou.csv b/IEDID/Min Bei Chinese/data/Jian'ou.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Min Bei Chinese/data/Jian'ou.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Min Dong Chinese/data/Fuzhou.csv b/IEDID/Min Dong Chinese/data/Fuzhou.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Min Dong Chinese/data/Fuzhou.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Min Nan Chinese/data/Hainanese.csv b/IEDID/Min Nan Chinese/data/Hainanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Min Nan Chinese/data/Hainanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Min Nan Chinese/data/Hokkien.csv b/IEDID/Min Nan Chinese/data/Hokkien.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Min Nan Chinese/data/Hokkien.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Min Nan Chinese/data/Teochew.csv b/IEDID/Min Nan Chinese/data/Teochew.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Min Nan Chinese/data/Teochew.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Moroccan Arabic/data/Casablanca.csv b/IEDID/Moroccan Arabic/data/Casablanca.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Moroccan Arabic/data/Casablanca.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Moroccan Arabic/data/Fes.csv b/IEDID/Moroccan Arabic/data/Fes.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Moroccan Arabic/data/Fes.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Moroccan Arabic/data/Rabat.csv b/IEDID/Moroccan Arabic/data/Rabat.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Moroccan Arabic/data/Rabat.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nepali/data/Eastern Nepali.csv b/IEDID/Nepali/data/Eastern Nepali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Nepali/data/Eastern Nepali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nepali/data/Standard Nepali.csv b/IEDID/Nepali/data/Standard Nepali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Nepali/data/Standard Nepali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nepali/data/Western Nepali.csv b/IEDID/Nepali/data/Western Nepali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Nepali/data/Western Nepali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nigerian English.csv b/IEDID/Nigerian English.csv new file mode 100644 index 0000000000000000000000000000000000000000..6ebc0af3d751209aeefaab76b5adcb9986aebd11 --- /dev/null +++ b/IEDID/Nigerian English.csv @@ -0,0 +1,64 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User","Acoustic_Profile" +"I beg, let's go.","Nigerian English","Please, let's leave now.","---","---","\bi\s?beg\b","---","","","","","","" +"Do quick.","Nigerian English","Hurry up.","---","---","\bdo\s?quick\b","---","","","","","","" +"I am coming.","Nigerian English","I will be back in a moment.","---","---","\bi\s?am\s?coming\b","---","","","","","","" +"He is not on seat.","Nigerian English","He is not currently at his desk.","---","---","\bon\s?seat\b","---","","","","","","" +"Don't flash me.","Nigerian English","Don't call and hang up immediately.","---","---","\bflash\s?me\b","---","","","","","","" +"How far?","Nigerian English","How are you doing?","---","---","\bhow\s?far\b","---","","","","","","" +"I want to dash him money.","Nigerian English","I want to give him a gift/tip.","---","---","\bdash\b","---","","","","","","" +"The traffic was a go-slow.","Nigerian English","The traffic was moving very slowly.","---","---","\bgo-?slow\b","---","","","","","","" +"Have you eaten?","Nigerian English","How are you? (Greeting)","---","---","\bhave\s?you\s?eaten\b","---","","","","","","" +"Can you branch at the shop?","Nigerian English","Can you stop by the shop?","---","---","\bbranch\s?at\b","---","","","","","","" +"I will escort you out.","Nigerian English","I will walk you to the door.","---","---","\bescort\s?you\b","---","","","","","","" +"Stop horn-ing.","Nigerian English","Stop honking the horn.","---","---","\bhorn(ing)?\b","---","","","","","","" +"He is my junior brother.","Nigerian English","He is my younger brother.","---","---","\bjunior\s?brother\b","---","","","","","","" +"I will alight here.","Nigerian English","I will get off the bus here.","---","---","\balight\b","---","","","","","","" +"She has taken in.","Nigerian English","She has become pregnant.","---","---","\btaken\s?in\b","---","","","","","","" +"More grease to your elbow.","Nigerian English","Good job / Keep it up.","---","---","\bmore\s?grease\b","---","","","","","","" +"No wahala.","Nigerian English","No problem / No trouble.","---","---","\bwahala\b","---","","","","","","" +"You are talking rubbish.","Nigerian English","You are not making sense.","---","---","\brubbish\b","---","","","","","","" +"Let me gist you.","Nigerian English","Let me tell you the gossip/story.","---","---","\bgist\b","---","","","","","","" +"Are you tight?","Nigerian English","Are you busy?","---","---","\bare\s?you\s?tight\b","---","","","","","","" +"I beg, let go of me.","Nigerian English","Please let go of me.","---","---","\bi\s?beg,\s?let\s?go\s?of\s?me.\b","---","","","","","","" +"Can you borrow me some money?","Nigerian English","Can you lend me some money?","---","---","\bcan\s?you\s?borrow\s?me\s?some\s?money?\b","---","audio/Nigerian English/20251126_174644_1153.wav","","","","","" +"Don't find his trouble.","Nigerian English","Don't look for his trouble.","---","---","\bdon't\s?find\s?his\s?trouble.\b","---","audio/Nigerian English/20251126_174803_3971.wav","","","","","" +"I beg, borrow me some money.","Nigerian English","Please, lend me some money.","---","---","\bi\s?beg,\s?borrow\s?me\s?some\s?money.\b","---","audio/Nigerian English/20251127_081428_7595.wav","","","","","" +"Why are you looking for my trouble?","Nigerian English","Why are you picking a fight with me?","---","---","\bwhy\s?are\s?you\s?looking\s?for\s?my\s?trouble?\b","---","audio/Nigerian English/20251127_151603_7544.wav","","","","","" +"I beg, let me know when it's time to go home.","Nigerian English","Please, let me know when it's time to go home.","---","---","\bi\s?beg,\s?let\s?me\s?know\s?when\s?it's\s?time\s?to\s?go\s?home.\b","---","audio/Nigerian English/20251127_165735_5852.wav","","","","","" +"Please, borrow me some money.","Nigerian English","Please, lend me some money.","---","---","\bplease,\s?borrow\s?me\s?some\s?money.\b","---","audio/Nigerian English/20251127_170012_2691.wav","","","","","" +"Therapy for Mgbanwe (Transformation)","Nigerian English","Therapy for Mgbanwe (Transformation)","---","---","\btherapy\s?for\s?mgbanwe\b","---","audio/Nigerian English/20251127_171058_1662.webm","","","","","" +"I beg, I'm tired, I want to go and sleep.","Nigerian English","Please, I am tired and would love to go to sleep.","---","---","\bi\s?beg,\s?i'm\s?tired\b","---","audio/Nigerian English/20251128_033505_2773.wav","","","","","" +"I beg, just leave me alone.","Nigerian English","Please, just let me be.","---","---","\bi\s?beg,\s?just\s?leave\s?me\s?alone.\b","---","audio/Nigerian English/20251130_053949_8382.wav","","","","","" +"I beg, just take things easy.","Nigerian English","Please, take things easy.","---","---","\bi\s?beg,\s?just\s?take\s?things\s?easy.\b","---","audio/Nigerian English/20251130_054133_8334.wav","","","","","" +"I beg, I'm going home.","Nigerian English","Please, I am going home.","---","---","\bi\s?beg,\s?i'm\s?going\s?home.\b","---","audio/Nigerian English/20251130_055508_8623.wav","","","","","" +"I want to go and eat, please.","Nigerian English","I want to go and eat, please.","---","---","\bi\s?want\s?to\s?go\s?and\s?eat,\s?please.\b","---","audio/Nigerian English/20251130_070819_5824.wav","","","","","" +"Give me some time. I'm coming.","Nigerian English","Give me some time, I'll be right back.","---","---","\bgive\s?me\s?some\s?time.\s?i'm\s?coming.\b","---","audio/Nigerian English/20251130_072414_6192.wav","","","","","" +"I am coming, give me some time.","Nigerian English","I am on my way, give me some time.","---","---","\bi\s?am\s?coming,\s?give\s?me\s?some\s?time.\b","---","audio/Nigerian English/20251130_072531_7096.wav","","","","","" +"I beg, what are we going to eat tonight?","Nigerian English","Please, what is the plan for dinner tonight?","Casual/Polite","Used to mean ""Please,"" or to soften a command.","\bi\s?beg,\s?what\s?are\s?we\s?going\s?to\s?eat\s?tonight?\b","---","audio/Nigerian English/20251130_091251_5939.wav","","","","","" +"I beg, don't find my trouble oh!","Nigerian English","Please, do not provoke me.","Formal/Cold","Professional/formal environments to maintain composure.","\bi\s?beg,\s?don't\s?find\s?my\s?trouble\s?oh!\b","Functions as boundary setting; resisting provocation.","audio/Nigerian English/20251130_094753_6762.wav","","","","","" +"Don't find my trouble","Nigerian English","Don't look for my trouble.","Exasperated","Casual settings, between friends or parent-to-child.","\bdon't\s?find\s?my\s?trouble\b","Implies antagonist is seeking unnecessary drama.","audio/Nigerian English/20251130_095152_6397.wav","","","","","" +"It's like you like looking for trouble.","Nigerian English","You always seem to be looking for a fight.","Casual/Figurative","Common structure translating emphasis from local language.","\bit's\s?like\s?you\s?like\s?looking\s?for\s?trouble.\b","Accusation of consistently provocative behavior.","audio/Nigerian English/20251130_191610_1515.wav","","","","","" +"I beg, let's go home and continue tomorrow.","Nigerian English","Please, guys, let's head home and finish tomorrow.","Casual/Weary","Used as a polite discourse marker (softener).","\bi\s?beg,\s?let's\s?go\s?home\b","Suggestion rather than demand; smooths over friction.","audio/Nigerian English/20260121_090426_8285.wav","","","","","" +"Stop flashing me please.","Nigerian English","Please, stop giving me dropped calls.","---","---","\bstop\s?flashing\s?me\b","---","audio/Nigerian English/20260121_093447_5988.wav","","","","","" +"What kind of wahala is this?","Nigerian English","Frustration/annoyance at a difficult situation.","Exasperated","Discovering car is blocked when already late.","(?i)What\s+kind of\s+wahala\s+is this","Venting frustration; highlights absurdity of problem.","audio/Nigerian English/20260126_084922_9339.wav","","","","","" +"Borrow me your pen, please.","Nigerian English","Lend me your pen, please.","Casual","School, workplace, or among friends.","Borrow me your pen","'Borrow me' is a standard structure for 'lend me'.","audio/Nigerian English/20260127_044034_3942.wav","","","","","" +"I will revert to you tomorrow.","Nigerian English","I will get back to you tomorrow.","Corporate","A co-worker needs an update on a project.","I will revert to you tomorrow","Way of promising an update the next day.","audio/Nigerian English/20260128_082748_6879.wav","","","","","" +"Hey, how far? What's going on?","Nigerian English","How are you? What's happening?","Casual","Approaching a friend involved in an altercation.","Hey, how far","Casual greeting followed by situational inquiry.","audio/Nigerian English/20260130_033152_6940.wav","","","","","" +"What kind of wahala is this?","Nigerian English","Seeking validation for frustration.","Exasperated","Discovering car is blocked when late.","\bwhat\ kind\ of\ wahala\ is\ this\?\b","The question is rhetorical, seeking sympathy.","audio/Nigerian English/audio.wav","---","---","---","","" +"How about we talk about Nigerian food?","Nigerian English","Shall we discuss Nigerian cuisine?","Conversational","Chat","\bhow\ about\ we\ talk\ about\ nigerian\ food\?\b","Active Listening","","---","---","---","","" +"My job!","Nigerian English","This is my job!","Conversational","Chat","\bmy\ job!\b","Game: Listener","","---","---","---","","" +"food, Nigerian food.","Nigerian English","Specifically Nigerian cuisine.","Conversational","Chat","\bfood,\ nigerian\ food\.\b","Game: Listener","","---","---","---","","" +"Nigerian food","Nigerian English","Food from Nigeria.","Conversational","Chat","\bnigerian\ food\b","Game: Listener","","---","---","---","","" +"Do you mean like what I know how to cook?","Nigerian English","Asking about dishes they can prepare.","Conversational","Chat","\bdo\ you\ mean\ like\ what\ i\ know\ how\ to\ cook\?\b","Game: Listener","","---","---","---","","" +"Honestly, I have no idea.","Nigerian English","Truthfully stating lack of information.","Conversational","Chat","\bhonestly,\ i\ have\ no\ idea\.\b","Game: Listener","","---","---","---","","" +"I want one carton of biscuits.","Nigerian English","I want a box of biscuits.","Neutral / Conversational","","","Nigerians often use ""carton"" in place of ""box"".","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Stop finding my trouble.","Nigerian English","Stop causing problems for me; stop interfering in my affairs and creating difficulties for me.","Annoyed, exasperated, possibly aggressive depending on the context and speaker.","Likely spoken in a situation where the speaker feels someone is deliberately provoking them, interfering with their plans, or creating unnecessary obstacles.","","A request or demand for cessation of unwanted interference or provocation. It carries a strong implication that the 'trouble' is intentionally or carelessly caused by the addressee.","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Stop trying me.","Nigerian English","Please, stop pushing my buttons","Neutral / Conversational","The speaker is giving a warning to someone who might be aggravating. ""Trying me"" in the Nigerian context could be short for ""trying my patience.""","","Verified via local Regex and RLHF","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Stop testing me, stop testing me.","Nigerian English","Stop provoking me; stop challenging my patience; stop trying to make me angry.","Frustrated, irritated, potentially angry or warning.","This utterance typically arises in situations where someone feels they are being deliberately pushed to their limits, either through persistent questioning, unreasonable demands, or provocative actions. It's often a prelude to an outburst or a declaration of boundaries.","","The repetition emphasizes the speaker's heightened emotional state. It functions as a direct and forceful request for the other person to cease their current behavior. The repeated 'testing' implies that the speaker perceives the other party's actions as intentional and manipulative.","audio/Nigerian English/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Hello, it's like there's something wrong with you.","Nigerian English","Hello, you seem unwell or behaving oddly.","Concerned, Slightly Confrontational, Casual","Everyday conversation between acquaintances or friends; could occur in any setting where odd behavior is observed.","","Expressing concern while simultaneously pointing out an unusual behavior, potentially initiating a conversation about the issue.","audio/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Hello, it's like there's something wrong with you.","Nigerian English","Hello, you seem unwell or behaving oddly.","Concerned, Slightly Confrontational, Casual","Everyday conversation between acquaintances or friends; could occur in any setting where odd behavior is observed.","","Expressing concern while simultaneously pointing out an unusual behavior, potentially initiating a conversation about the issue.","","User","Web","","","" +"Hey, stop looking for my trouble oh!","Nigerian English","I am warning you to cease provoking me or creating problems for me.","Warning, slightly exasperated but not extremely aggressive.","A situation where one person feels another is deliberately trying to cause problems or antagonize them, often used in informal settings between acquaintances or people who know each other well.","","Issuing a warning and setting a boundary to prevent escalation of a conflict; asserting oneself.","audio/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"Why are you look for somebody's trouble?","Nigerian English","Why are you deliberately seeking problems or conflict with someone?","Reproachful, possibly exasperated or concerned","A situation where someone is perceived to be intentionally provoking or antagonizing another person or group.","","Discouraging conflict, expressing disapproval of provocative behavior","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"I see a red truck in the middle of the street with a man on a pink shirt beside it and other people beside him and bikes across the other side of the road with trees and houses. Palm trees.","General English","There's a red truck on the street. A man wearing a pink shirt is standing next to the truck, and other people are standing near him. Across the street, there are motorcycles parked, along with trees and houses. The speaker specifies that palm trees are present.","Neutral / Conversational","General","","","audio/General/audio.wav","Web","User","","","" +"normalization were used to changing up when cool down.","Nigerian English","Normal power supply adjustment was done to change to generator power when the electricity goes off.","Formal / Professional","Everyday conversation about power supply issues, common in Nigeria due to unreliable electricity.","","Explaining a technical adjustment in a straightforward manner.","audio/rec_1772695224_b24f11.wav","Lab Admin","Gradio Admin UI","","0xbd73a9d36bb64c789482b04437809f113f2d8944","" +"Hello, what's going on?","Nigerian English","A casual greeting to initiate conversation, often used in informal settings with friends or acquaintances to show interest in current events or general well-being.","Casual","Social gatherings, casual meetups, or during conversations with friends or family in public spaces.","","Establishing connection and showing interest in the other person's life.","audio/rec_1778811562_1fc36a.wav","Lab Admin","Gradio Admin UI","","0xdfc546c71a11426eb8620cdf8995ba2a6e605fe7","{}" diff --git a/IEDID/Nigerian Fulfulde/data/Kano.csv b/IEDID/Nigerian Fulfulde/data/Kano.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Nigerian Fulfulde/data/Kano.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nigerian Fulfulde/data/Katsina.csv b/IEDID/Nigerian Fulfulde/data/Katsina.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Nigerian Fulfulde/data/Katsina.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nigerian Fulfulde/data/Sokoto.csv b/IEDID/Nigerian Fulfulde/data/Sokoto.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Nigerian Fulfulde/data/Sokoto.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Nigerian Pidgin English.csv b/IEDID/Nigerian Pidgin English.csv new file mode 100644 index 0000000000000000000000000000000000000000..7231b9a6f234a9929c5a397ea82a3287a87241a8 --- /dev/null +++ b/IEDID/Nigerian Pidgin English.csv @@ -0,0 +1,85 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","Clarification_Source","Data_Origin","audio_file_name","User","Acoustic_Profile" +"Abeg, wetin dey sup?","Nigerian Pidgin English","Please, what's going on?","Neutral / Conversational","Friendly setting/acquaintance. ""Abeg"" may deflect from a disturbing situation.","\babeg,\ wetin\ dey\ sup\?\b","Abeg (social lubricant), Wetin (interrogative 'what'), Sup (latest news/current reality).","audio/NaijaPidgin English/audio.wav","","","","","" +"When I wake for morning like this, I dey quick look my phone first.","Nigerian Pidgin English","When I wake up in the morning, I quickly check my phone first.","Neutral / Conversational","General","\bwhen\ i\ wake\ for\ morning\ like\ this,\ i\ dey\ quick\ look\ my\ phone\ first\.\b","Game: Archivist","","","","","","" +"hobbies ke? You mean wetin I dey like do?","Nigerian Pidgin English","['Hobbies? Are you asking what I enjoy doing?']","Neutral / Conversational","General","\bhobbies\ ke\?\ you\ mean\ wetin\ i\ dey\ like\ do\?\b","Game: SpeedChat","","","","","","" +"Me I dey like play piano well well","Nigerian Pidgin English","['I really enjoy playing the piano.']","Neutral / Conversational","General","","","","AI","Web","","","" +"Because of the work wey I dey do, I no dey quick chop for morning.","Nigerian Pidgin English","Because of the job I do, I don't usually eat breakfast.","Neutral / Conversational","General","","","","AI","Web","","","" +"So, when we dey grow, we been dey six children and my papa and my mama.","Nigerian Pidgin English","['So, when we were growing up, there were six children, my father, and my mother in the family.']","Neutral / Conversational","General","","","","AI","Web","","","" +"I dey like to play piano wella.","Nigerian Pidgin English","['I enjoy playing the piano very much.']","Neutral / Conversational","General","","","","AI","Web","","","" +"I dey plan to waka go climb dat mountain wey dem dey call Geumosan again.","Nigerian Pidgin English","I am planning to get to the Geeumosan mountain, so that I can climb it.","Neutral / Conversational","General","","","","AI","Web","","","" +"I no get any particular thing wey I want to talk about. Wetin you fit talk about?","Nigerian Pidgin English","[""I don't have anything specific I want to talk about. What can you talk about?""]","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"Ah! You dey speak Pidgin? Stress dey. I dey work since.","Nigerian Pidgin English","Oh! You speak Pidgin? I'm stressed out. I've been working for a long time..","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"Ah! Wetin dey sup, my brother?","Nigerian Pidgin English","[""Hey! What's up, my friend?""]","Neutral / Conversational","General","","","","AI","Web","","","" +"Na anytime wey I dey talk to my babe.","Nigerian Pidgin English","[""It's whenever I am talking to my girlfriend.""]","Neutral / Conversational","General","","","","AI","Web","","","" +"Me I dey like pesin wey dey sabi criticize imself make e improve how e dey behave..","Nigerian Pidgin English","I prefer a person who is self-reflective, and who is big on self-improvement.","Neutral / Conversational","General","","","","AI","Web","","","" +"Pretty much anything, Make we just talk life.","Nigerian Pidgin English","[""Let's talk about anything, but mostly about life in general.""]","Conversational","Chat","","Interactive Chat Session","","AI","Web","","","" +"Na luxurious bus be dat nau.","Nigerian Pidgin English","['That is definitely a luxurious bus.']","Neutral / Conversational","General","","","","AI","Web","","","" +"two people wen dey on top canoe, wey dey on top water.","Nigerian Pidgin English","Two people in a canoe, on the water.","Neutral / Conversational","General","","","","AI","Web","","","" +"My mind just blank. Nothing dey inside.","Nigerian Pidgin English","I have absolutely nothing on my mind.","Conversational","Chat","","Interactive Chat Session","","AI","Web","","","" +"Ah, bros, the weather here, e hot sha.","Nigerian Pidgin English","['Ah, brother, the weather here is really hot.']","Neutral / Conversational","General","","","","AI","Web","","","" +"Abeg, me, I dey like waka for city pass beach oh.","Nigerian Pidgin English","['Please, I prefer walking around the city to going to the beach.']","Neutral / Conversational","General","","","","AI","Web","","","" +"mmm, small small sha","Nigerian Pidgin English","['Yes, but only a little bit.']","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"I dey like to ride bicycle.","Nigerian Pidgin English","['I enjoy riding a bicycle.']","Neutral / Conversational","General","","","","AI","Web","","","" +"Abeg, cat better pass dog. Cat dey sabi dey on im own. Dog, e no dey fit dey on im own.","Nigerian Pidgin English","Please, cats are better than dogs. A cat knows how to be independent. A dog cannot be independent.","Neutral / Conversational","General","","","","AI","Web","","","" +"eh, if you fit find pesin, make you find am nau. Me, I no get any work to do work you.","Nigerian Pidgin English","Hey, if you can find someone else, go ahead and find them now. As for me, I have nothing to do for you.","Conversational","Chat","","Game: Listener","","AI","Web","","","" +"E be like advertisement for people wey wan tgo back school.","Nigerian Pidgin English","['It seems like an advertisement for people who want to return to school.']","Neutral / Conversational","General","","","","AI","Web","","","" +"My guy, wetin dey happen?","Nigerian Pidgin English","What's going on, my friend?","Casual / Slang","The speaker walks in on someone familiar, says hi, and then asks what's going on.","","""My guy"" is Nigerian pidgin for ""my friend"", but can also be used for others who aren't friends. +""Wetin' is Pidgin for ""what"". +""Dey"" could mean ""is"" in some occasions, but something else in others.","","AI","Web","audio_files/Nigerian_Pidgin_English/audio.wav","","" +"No dey try me oh!","Nigerian Pidgin English","Stop testing my patience.","Emphatic / Serious","A neighbour has been testing your patience by parking his vehicle near your door entrance, so that you can't get in or out without squeezing through. When you finally see him, you tell him not to keep trying your patience.","","""No dey"" is a Nigerian Pidgin English word for ""stop"". ""Try me"" means pushing one to a limit, or testing one's patience.","","AI","Web","audio_files/Nigerian_Pidgin_English/57dd0d5f-9edf-463f-a00a-4354a5bb5649.wav","","" +"Ah ah! Wetin dey happen nau?","Nigerian Pidgin English","Yo! What's going on?","","","regex +Ah ah! Wetin dey happen nau\? +","","audio/Nigerian Pidgin English/20260220_193854_9339.wav","","","","","" +"We fit talk about food?","Nigerian Pidgin English","'Shall we talk about food?' or 'Do you want to talk about food?'","Conversational","Chat","","Interactive Chat Session","","User","Web","","","" +"E go be Reggae oh..","Nigerian Pidgin English","It'd definitely be Reggae.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E go be Thailand because I hear say the women there dey like take care of the men.","Nigerian Pidgin English","It will probably be Thailand because I heard the women there really like to take care of men.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Babe wey dey stand beside guy wey siddon.","Nigerian Pidgin English","A girl that's standing next to a guy who is seated.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"No be electric pole be dat?","Nigerian Pidgin English","Isn't that an electric pole?","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"You dey watch football?","Nigerian Pidgin English","'Are you watching football?' or 'Do you watch football?'","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"I no dey too support teams. I just like when Lionel Messi dey play.","Nigerian Pidgin English","I don't usually support football teams very much. I just enjoy watching Lionel Messi play.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Na on top roof of houses wey I dey see like this.","Nigerian Pidgin English","I see the rooftops of houses.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Na very big wall clock wey dey for wall of building.","Nigerian Pidgin English","It's a very large wall clock that is on the wall of a building.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Ah, I no get anything.","Nigerian Pidgin English","Oh, I don't have anything.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Yo nor dey speak Pidgin English?","Nigerian Pidgin English","Don't you speak Pidgin English?","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Nor dey do anyhow.","Nigerian Pidgin English","Stop misbehaving.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E go be Reggae.","Nigerian Pidgin English","It'd be Reggae.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E be like me and you dey play?","Nigerian Pidgin English","Is this some kind of joke? Are you taking me for granted? I am not to be trifled with. You think we are equals in this situation to engage in frivolous play?","Sarcastic, Aggrieved, Challenging","A situation where someone feels disrespected, undervalued, or taken advantage of; potentially a tense situation where boundaries are being tested.","","Expressing annoyance and disapproval; challenging perceived disrespect; establishing dominance or setting boundaries.","audio/audio.wav","User","Lab_Admin_119.56.184.37","","","" +"me, I be Waffi boy sha","Nigerian Pidgin English","I am definitely a Waffi boy.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Na my guy Bruce Lee. I wan sabi wetin been dey happen for im mind when e kpai.","Nigerian Pidgin English","It's my main man, Bruce Lee. I'm really curious to know what he was thinking about when he died.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"E be like two big buildings with trees wey dey in front of dem.","Nigerian Pidgin English","It's like two large buildings with trees in front of them.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"Me, I dey rep, I dey rep Delta side sha.","Nigerian Pidgin English","As for me, I represent, I represent the Delta region, you know?","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Guy, wetin dey work you?","Nigerian Pidgin English","Hey man, what's bothering you?","Concerned, Casual","Everyday conversation between acquaintances or friends when one notices the other seems troubled or preoccupied.","","Expressing concern and offering a listening ear; showing empathy.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001","" +"Guy, wetin dey work you!?","Nigerian Pidgin English","Hey, why are you misbehaving!?","Concerned, Casual","A stern warning from an acquaintances or close friend where the speaker is getting troubled or annoyed by the listener.","","Expressing frustration to the other person.","audio/audio 1.wav","User","Lab_Admin_119.56.184.37","","","" +"Why you dey stress me?","Nigerian Pidgin English","Why are you bothering or stressing me? What's the reason for your actions that are causing me stress or annoyance?","Annoyed, Frustrated, Exasperated","A casual conversation, potentially between friends, family members, or acquaintances, where one person feels they are being bothered or pressured by the other's actions or words.","","Expressing annoyance and requesting the other person to stop their behavior that is causing stress; setting a boundary.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001","" +"No dey show yourself!","Nigerian Pidgin English","Stop showing off! or Don't make yourself so conspicuous/noticeable!","Admonishing, Impatient, Irritated (can also be playful depending on context)","A situation where someone is behaving in a boastful, ostentatious, or attention-seeking manner, or drawing unwanted attention to themselves.","","Expressing disapproval of someone's behavior and urging them to stop; can also serve as a warning to be more discreet.","","๐Ÿง  Gemini 2.0 (Cultural Context)","Lab_Admin_119.56.184.37","","Admin_001","" +"I wan talk about work.","Nigerian Pidgin English","I want to talk about work.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Man, we just dey rush make we do work, make we post on. Man, we just the rush to walk. Man, we just the rush maker to walk make we post am.","Nigerian Pidgin English","Damn, we're just hustling, trying to get this work done and post it. Damn, we're just rushing to move forward. Damn, we're just making a big effort to move forward and post it.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_119.56.184.37","","","" +"Na one very big building like that.","Nigerian Pidgin English","It's a very large building, quite impressive.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"You no go believe am o. Na Geumosan, one devil mountain like dat for Korea.","Nigerian Pidgin English","You won't believe this! It's Geumosan, which is one of the really scary, devil mountains in Korea.","Neutral / Conversational","General","","","","User","Lab_Admin_119.56.184.37","","","" +"May we yarn food.","Nigerian Pidgin English","Let's chat about food.","Conversational","Chat","","Interactive Chat Session","","User","Lab_Admin_106.101.137.222","","","" +"Make we yarn about house.","Nigerian Pidgin English","Let's chat about housing.","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 106.101.137.222","" +"You dey feel football?","Nigerian Pidgin English","Do you enjoy football?/Do you feel the excitement of football?/Are you into football?","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Normally, na Arsenal. But I dey also gbadu Barca.","Nigerian Pidgin English","Usually, I support Arsenal. But I also really admire Barcelona.","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Ah! Na goat meat nau. Dat thing make sense die!","Nigerian Pidgin English","Ah! It's freely definitely goat meat. That stuff is incredibly delicious!","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Na say I deploy my app for online nau.","Nigerian Pidgin English","It's that I successfully deployed my app online.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"E go be mixed martial arts wey I fit dey defend myself.E go...","Nigerian Pidgin English","It would be some mixed martial arts so I can defend myself. It would...","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"E go be lime.","Nigerian Pidgin English","It'd be line.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"e go be to play piano oh","Nigerian Pidgin English","It's going to be playing the piano!","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 119.56.184.37","" +"Food","Nigerian Pidgin English","A request or expression of need for sustenance; could also be a simple statement of fact or observation.","Conversational","Chat","","Interactive Chat Session","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 202.31.143.81","" +"E go be Reggae","Nigerian Pidgin English","It's gonna be Reggae music.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 202.31.143.81","" +"and talk with the teleto-descriptives.","Nigerian Pidgin English","And chat with the people who specialize in describing things for television or visual media.","Neutral / Conversational","General","","","audio/audio.wav","User","Gradio App","","Admin | Net-IP: 1.212.70.3","" +"We fit yarn about wetin pesin fit chop?","Nigerian Pidgin English","Are we Can we discuss what to to eat?","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096716_7f4033.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317","" +"I say make we just order out abeg. I no fit shout.","Nigerian Pidgin English","I suggest we simply order food. Please, I'm too tired to argue or exert myself.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772096832_221852.wav","User/AI Hybrid","Game: Listener","","0x73f623805b274bf28421553add89f317","" +"E be like na woman wey carry two bags.","Nigerian Pidgin English","It seems like (or, It's probably) a woman carrying two bags.","Neutral / Conversational","General","","","audio/rec_1772101586_f4c973.wav","User/AI Hybrid","Game: Vision | Op: 0x366afaf524a843aabba022e1968a3181","","0x366afaf524a843aabba022e1968a3181","" +"Na when dis app start to dey work, and the pending file start to dey work.","Nigerian Pidgin English","It was when this app finally started functioning properly, and when the pending files finally start processing.","Neutral / Conversational","General","","","audio/rec_1772101844_c656a9.wav","User/AI Hybrid","Game: Archivist | Op: 0x366afaf524a843aabba022e1968a3181","","0x366afaf524a843aabba022e1968a3181","" +"People just plenty for front of building.","Nigerian Pidgin English","There are many people in front of the building.","Neutral / Conversational","General","","","audio/rec_1772131337_745991.wav","User/AI Hybrid","Game: Vision | Op: 0x3eff72b669704e9fba2e55a80cdce8c7","","0x3eff72b669704e9fba2e55a80cdce8c7","" +"Forget that thing wey you dey yarn!","Nigerian Pidgin English","Ignore or dismiss what you are saying! It's irrelevant or nonsense.","Dismissive, Impatient, potentially Confrontational (depending on context and relationship)","An argument, a debate, a situation where someone is perceived to be talking foolishly or irrelevantly, or when someone wants to quickly change the topic.","","Expressing disagreement, dismissing someone's opinion, asserting dominance in a conversation, or quickly changing the subject.","audio/rec_1772131679_24e211.wav","Lab Admin","Gradio Admin UI","","0x9ddf5e209ced4cdeb5d9cfc33096eac2f72d9713","" +"E get as this week just be. E just slow., I no sleep well ","Nigerian Pidgin English","It feels like this week is dragging on forever. It's just so slow. Also, I haven't been sleeping well.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772181210_8367eb.wav","User/AI Hybrid","Game: Listener","","0x3eff72b669704e9fba2e55a80cdce8c7","" +"Correct goat meat.","Nigerian Pidgin English","Well-made goat meat.","Neutral / Conversational","General","","","audio/rec_1772454639_66a9a6.wav","Admin Edit","Game: Archivist","","0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe","" +"Goat wey dem roast.","Nigerian Pidgin English","Roast/roasted goat meat.","Neutral / Conversational","General","","","audio/rec_1772295393_23f398.wav","Admin Edit","Game: SpeedChat","","0x0d49d2d6b1d34f17a038428cd9b991fb","" +"E get dis guy, Sean, wey dey make video for Facebook. The guy funny bad bad","Nigerian Pidgin English","There's this guy, Sean, who makes videos on Facebook. He's extremely funny.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772291700_f5e507.wav","Admin Edit","Game: Listener","","0x0d49d2d6b1d34f17a038428cd9b991fb","" +"Trees just plenty outside.","Nigerian Pidgin English","There are a lot of trees outside.","Neutral / Conversational","General","","","audio/rec_1772290880_129d5c.wav","Admin Edit","Game: Vision | Op: 0x3eff72b669704e9fba2e55a80cdce8c7","","0x3eff72b669704e9fba2e55a80cdce8c7","" +"Wetin I dey like do","Nigerian Pidgin English","What I usually like to do.","Conversational","Chat","","Interactive Chat Session","audio/rec_1772291149_4e7e42.wav","Admin Edit","Game: Listener","","0x0d49d2d6b1d34f17a038428cd9b991fb","" +"I dey see yellow houses","Nigerian Pidgin English","I am seeing yellow houses.","Neutral / Conversational","General","","","audio/rec_1772531698_ab0560.wav","Admin Edit","Game: Vision","","0x82be5a07eda4408cb507bd13b84b2343ac73f617","" +"Wetin dey happen happen nau?","Nigerian Pidgin English","What is happening?","Casual","Informal conversations among friends or acquaintances, possibly in a situation of surprise or shock.","","Showing interest and curiosity about a situation, while possibly establishing solidarity with the speaker or engaging in lighthearted conversation.","audio/rec_1778637109_ad3e72.wav","Lab Admin","Gradio Admin UI","","0x432ce4178d724128ba50e934fac66cb90f453a6a","" +"Wetin dey happen jor?","Nigerian Pidgin English","What is happening, really?","Concerned or Exasperated Inquiry","Informal conversation among friends, family, or in a casual setting, often used to express surprise, concern, or frustration about a situation","","Seeking information or clarification while expressing emotional investment in the outcome or situation","audio/rec_1779585721_272581.wav","Lab Admin","Gradio Admin UI","","0x4deaa09470db471fa960789839766e41da6df956","{}" diff --git a/IEDID/North Levantine Arabic/data/Lebanese.csv b/IEDID/North Levantine Arabic/data/Lebanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/North Levantine Arabic/data/Lebanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/North Levantine Arabic/data/Syrian.csv b/IEDID/North Levantine Arabic/data/Syrian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/North Levantine Arabic/data/Syrian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Kurdish/data/Badini.csv b/IEDID/Northern Kurdish/data/Badini.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Kurdish/data/Badini.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Kurdish/data/Kurmanji.csv b/IEDID/Northern Kurdish/data/Kurmanji.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Kurdish/data/Kurmanji.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Pashto/data/Kabul.csv b/IEDID/Northern Pashto/data/Kabul.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Pashto/data/Kabul.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Pashto/data/Peshawari.csv b/IEDID/Northern Pashto/data/Peshawari.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Pashto/data/Peshawari.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Uzbek/data/Fergana.csv b/IEDID/Northern Uzbek/data/Fergana.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Uzbek/data/Fergana.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Uzbek/data/Khorezm.csv b/IEDID/Northern Uzbek/data/Khorezm.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Uzbek/data/Khorezm.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Northern Uzbek/data/Tashkent.csv b/IEDID/Northern Uzbek/data/Tashkent.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Northern Uzbek/data/Tashkent.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Odia/data/Desia.csv b/IEDID/Odia/data/Desia.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Odia/data/Desia.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Odia/data/Ganjami.csv b/IEDID/Odia/data/Ganjami.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Odia/data/Ganjami.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Odia/data/Mughalbandi.csv b/IEDID/Odia/data/Mughalbandi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Odia/data/Mughalbandi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Odia/data/Sambalpuri.csv b/IEDID/Odia/data/Sambalpuri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Odia/data/Sambalpuri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Polish/data/Greater Polish.csv b/IEDID/Polish/data/Greater Polish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Polish/data/Greater Polish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Polish/data/Lesser Polish.csv b/IEDID/Polish/data/Lesser Polish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Polish/data/Lesser Polish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Polish/data/Masovian.csv b/IEDID/Polish/data/Masovian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Polish/data/Masovian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Polish/data/Silesian.csv b/IEDID/Polish/data/Silesian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Polish/data/Silesian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Portuguese/data/Angolan Portuguese.csv b/IEDID/Portuguese/data/Angolan Portuguese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Portuguese/data/Angolan Portuguese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Portuguese/data/Brazilian Portuguese.csv b/IEDID/Portuguese/data/Brazilian Portuguese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Portuguese/data/Brazilian Portuguese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Portuguese/data/European Portuguese.csv b/IEDID/Portuguese/data/European Portuguese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Portuguese/data/European Portuguese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Portuguese/data/Mozambican Portuguese.csv b/IEDID/Portuguese/data/Mozambican Portuguese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Portuguese/data/Mozambican Portuguese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Romanian/data/Moldavian.csv b/IEDID/Romanian/data/Moldavian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Romanian/data/Moldavian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Romanian/data/Transylvanian.csv b/IEDID/Romanian/data/Transylvanian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Romanian/data/Transylvanian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Romanian/data/Wallachian.csv b/IEDID/Romanian/data/Wallachian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Romanian/data/Wallachian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Rundi/data/Standard Kirundi.csv b/IEDID/Rundi/data/Standard Kirundi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Rundi/data/Standard Kirundi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Russian/data/Central Russian.csv b/IEDID/Russian/data/Central Russian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Russian/data/Central Russian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Russian/data/Northern Russian.csv b/IEDID/Russian/data/Northern Russian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Russian/data/Northern Russian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Russian/data/Southern Russian.csv b/IEDID/Russian/data/Southern Russian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Russian/data/Southern Russian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sanaani Arabic/data/Sana'a.csv b/IEDID/Sanaani Arabic/data/Sana'a.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sanaani Arabic/data/Sana'a.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Saraiki/data/Derawali.csv b/IEDID/Saraiki/data/Derawali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Saraiki/data/Derawali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Saraiki/data/Multani.csv b/IEDID/Saraiki/data/Multani.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Saraiki/data/Multani.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Saraiki/data/Thali.csv b/IEDID/Saraiki/data/Thali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Saraiki/data/Thali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Sa\342\225\251\342\225\234idi Arabic/data/Upper Egyptian.csv" "b/IEDID/Sa\342\225\251\342\225\234idi Arabic/data/Upper Egyptian.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Sa\342\225\251\342\225\234idi Arabic/data/Upper Egyptian.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sindhi/data/Kachhi.csv b/IEDID/Sindhi/data/Kachhi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sindhi/data/Kachhi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sindhi/data/Lari.csv b/IEDID/Sindhi/data/Lari.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sindhi/data/Lari.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sindhi/data/Thari.csv b/IEDID/Sindhi/data/Thari.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sindhi/data/Thari.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sindhi/data/Vicholi.csv b/IEDID/Sindhi/data/Vicholi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sindhi/data/Vicholi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sinhalese/data/Kandyan.csv b/IEDID/Sinhalese/data/Kandyan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sinhalese/data/Kandyan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sinhalese/data/Southern Sinhala.csv b/IEDID/Sinhalese/data/Southern Sinhala.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sinhalese/data/Southern Sinhala.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sinhalese/data/Standard Sinhala.csv b/IEDID/Sinhalese/data/Standard Sinhala.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sinhalese/data/Standard Sinhala.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Somali/data/Benaadir.csv b/IEDID/Somali/data/Benaadir.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Somali/data/Benaadir.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Somali/data/Maay.csv b/IEDID/Somali/data/Maay.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Somali/data/Maay.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Somali/data/Northern Somali.csv b/IEDID/Somali/data/Northern Somali.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Somali/data/Northern Somali.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/South Azerbaijani/data/Tabrizi.csv b/IEDID/South Azerbaijani/data/Tabrizi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/South Azerbaijani/data/Tabrizi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/South Azerbaijani/data/Urmia.csv b/IEDID/South Azerbaijani/data/Urmia.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/South Azerbaijani/data/Urmia.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/South Levantine Arabic/data/Jordanian.csv b/IEDID/South Levantine Arabic/data/Jordanian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/South Levantine Arabic/data/Jordanian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/South Levantine Arabic/data/Palestinian.csv b/IEDID/South Levantine Arabic/data/Palestinian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/South Levantine Arabic/data/Palestinian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Southern Pashto/data/Kandahari.csv b/IEDID/Southern Pashto/data/Kandahari.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Southern Pashto/data/Kandahari.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Southern Pashto/data/Quetta.csv b/IEDID/Southern Pashto/data/Quetta.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Southern Pashto/data/Quetta.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Spanish Creole.csv b/IEDID/Spanish Creole.csv new file mode 100644 index 0000000000000000000000000000000000000000..1c77a535dbf5b296e2a24ebca27ca36d92dc207a --- /dev/null +++ b/IEDID/Spanish Creole.csv @@ -0,0 +1,4 @@ +"Utterance","Dialect","Clarification","Tone_Category","Linguistic_Context","Syntax_Pattern","Pragmatic_Analysis","file_name","audio_file_name","Data_Origin","Clarification_Source","User" +"Goatmeat","Spanish Creole","Could be referencing the meat itself. Depending on tone and situation, it could also be a playful, teasing jab at someone considered stubborn or foolish, similar to calling someone a 'goat' in English. The literal meaning also needs to be considered if a recipe is being discussed.","Neutral / Conversational","General","","","audio/rec_1772101388_5601c2.wav","","Game: Archivist | Op: 0x366afaf524a843aabba022e1968a3181","User/AI Hybrid","0x366afaf524a843aabba022e1968a3181" +"whatever","Spanish Creole","Eh, whatever. I don't care. Forget about it.","Neutral / Conversational","General","","","audio/rec_1772105787_2837a7.wav","","Game: Vision | Op: 0x366afaf524a843aabba022e1968a3181","User/AI Hybrid","0x366afaf524a843aabba022e1968a3181" +"fry me some bread","Spanish Creole","Fix me some fried bread, please. (Implied: likely expecting it to be a comforting or familiar dish)","Neutral / Conversational","General","","","audio/rec_1772134229_e6e237.wav","","Game: Archivist | Op: 0xafb4b73208e242b2baa04e1633cfd57d6ff5d48f","User/AI Hybrid","0xafb4b73208e242b2baa04e1633cfd57d6ff5d48f" diff --git a/IEDID/Spanish/data/Argentine Spanish.csv b/IEDID/Spanish/data/Argentine Spanish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Spanish/data/Argentine Spanish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Spanish/data/Caribbean Spanish.csv b/IEDID/Spanish/data/Caribbean Spanish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Spanish/data/Caribbean Spanish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Spanish/data/Castilian Spanish.csv b/IEDID/Spanish/data/Castilian Spanish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Spanish/data/Castilian Spanish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Spanish/data/Colombian Spanish.csv b/IEDID/Spanish/data/Colombian Spanish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Spanish/data/Colombian Spanish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Spanish/data/Mexican Spanish.csv b/IEDID/Spanish/data/Mexican Spanish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Spanish/data/Mexican Spanish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sudanese Arabic/data/Khartoum.csv b/IEDID/Sudanese Arabic/data/Khartoum.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sudanese Arabic/data/Khartoum.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sudanese Arabic/data/Western Sudanese.csv b/IEDID/Sudanese Arabic/data/Western Sudanese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sudanese Arabic/data/Western Sudanese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sunda/data/Banten.csv b/IEDID/Sunda/data/Banten.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sunda/data/Banten.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sunda/data/Cirebon.csv b/IEDID/Sunda/data/Cirebon.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sunda/data/Cirebon.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sunda/data/Priangan.csv b/IEDID/Sunda/data/Priangan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sunda/data/Priangan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Swahili/data/Amu.csv b/IEDID/Swahili/data/Amu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Swahili/data/Amu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Swahili/data/Kimvita.csv b/IEDID/Swahili/data/Kimvita.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Swahili/data/Kimvita.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Swahili/data/Kiunguja.csv b/IEDID/Swahili/data/Kiunguja.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Swahili/data/Kiunguja.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Swahili/data/Mrimima.csv b/IEDID/Swahili/data/Mrimima.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Swahili/data/Mrimima.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Swahili/data/Pemba.csv b/IEDID/Swahili/data/Pemba.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Swahili/data/Pemba.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Sylheti/data/Standard Sylheti.csv b/IEDID/Sylheti/data/Standard Sylheti.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Sylheti/data/Standard Sylheti.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tagalog/data/Batangas.csv b/IEDID/Tagalog/data/Batangas.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tagalog/data/Batangas.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tagalog/data/Bulacan.csv b/IEDID/Tagalog/data/Bulacan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tagalog/data/Bulacan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tagalog/data/Manila.csv b/IEDID/Tagalog/data/Manila.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tagalog/data/Manila.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tagalog/data/Tayabas.csv b/IEDID/Tagalog/data/Tayabas.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tagalog/data/Tayabas.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tamil/data/Central Tamil.csv b/IEDID/Tamil/data/Central Tamil.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tamil/data/Central Tamil.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tamil/data/Chennai Tamil.csv b/IEDID/Tamil/data/Chennai Tamil.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tamil/data/Chennai Tamil.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tamil/data/Kongu Tamil.csv b/IEDID/Tamil/data/Kongu Tamil.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tamil/data/Kongu Tamil.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tamil/data/Madurai Tamil.csv b/IEDID/Tamil/data/Madurai Tamil.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tamil/data/Madurai Tamil.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tamil/data/Sri Lankan Tamil.csv b/IEDID/Tamil/data/Sri Lankan Tamil.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tamil/data/Sri Lankan Tamil.csv @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Ta\342\225\251\342\225\234izzi-Adeni Arabic/data/Adeni.csv" "b/IEDID/Ta\342\225\251\342\225\234izzi-Adeni Arabic/data/Adeni.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Ta\342\225\251\342\225\234izzi-Adeni Arabic/data/Adeni.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Ta\342\225\251\342\225\234izzi-Adeni Arabic/data/Ta'izzi.csv" "b/IEDID/Ta\342\225\251\342\225\234izzi-Adeni Arabic/data/Ta'izzi.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Ta\342\225\251\342\225\234izzi-Adeni Arabic/data/Ta'izzi.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Telugu/data/Coastal Telugu.csv b/IEDID/Telugu/data/Coastal Telugu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Telugu/data/Coastal Telugu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Telugu/data/Rayalaseema.csv b/IEDID/Telugu/data/Rayalaseema.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Telugu/data/Rayalaseema.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Telugu/data/Telangana.csv b/IEDID/Telugu/data/Telangana.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Telugu/data/Telangana.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Test Dialect.csv b/IEDID/Test Dialect.csv new file mode 100644 index 0000000000000000000000000000000000000000..bc42975faefc7073456c990a2c65dfa61bc8f7fa --- /dev/null +++ b/IEDID/Test Dialect.csv @@ -0,0 +1,2 @@ +Source,Utterance,Dialect,Clarification,Tone_Category,Linguistic_Context,Pragmatic_Analysis,Speaker +Legacy PureChain (PureBi),Hello World,Test Dialect,Recovered from Chain,Recovered,Blockchain Recovery,Recovered from IPFS,Recovered_User diff --git a/IEDID/Thai/data/Central Thai.csv b/IEDID/Thai/data/Central Thai.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Thai/data/Central Thai.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Thai/data/Khorat.csv b/IEDID/Thai/data/Khorat.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Thai/data/Khorat.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Thai/data/Southern Thai.csv b/IEDID/Thai/data/Southern Thai.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Thai/data/Southern Thai.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tunisian Arabic/data/Sahel.csv b/IEDID/Tunisian Arabic/data/Sahel.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tunisian Arabic/data/Sahel.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tunisian Arabic/data/Sfax.csv b/IEDID/Tunisian Arabic/data/Sfax.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tunisian Arabic/data/Sfax.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Tunisian Arabic/data/Tunis.csv b/IEDID/Tunisian Arabic/data/Tunis.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Tunisian Arabic/data/Tunis.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Turkish/data/Anatolian.csv b/IEDID/Turkish/data/Anatolian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Turkish/data/Anatolian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Turkish/data/Istanbul Turkish.csv b/IEDID/Turkish/data/Istanbul Turkish.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Turkish/data/Istanbul Turkish.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Turkish/data/Rumelian.csv b/IEDID/Turkish/data/Rumelian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Turkish/data/Rumelian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Ukrainian/data/Northern Ukrainian.csv b/IEDID/Ukrainian/data/Northern Ukrainian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Ukrainian/data/Northern Ukrainian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Ukrainian/data/Southeastern Ukrainian.csv b/IEDID/Ukrainian/data/Southeastern Ukrainian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Ukrainian/data/Southeastern Ukrainian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Ukrainian/data/Southwestern Ukrainian.csv b/IEDID/Ukrainian/data/Southwestern Ukrainian.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Ukrainian/data/Southwestern Ukrainian.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Urdu/data/Dakhini.csv b/IEDID/Urdu/data/Dakhini.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Urdu/data/Dakhini.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Urdu/data/Rekhta.csv b/IEDID/Urdu/data/Rekhta.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Urdu/data/Rekhta.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Uyghur/data/Central Uyghur.csv b/IEDID/Uyghur/data/Central Uyghur.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Uyghur/data/Central Uyghur.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Uyghur/data/Hotan.csv b/IEDID/Uyghur/data/Hotan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Uyghur/data/Hotan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Uyghur/data/Lop.csv b/IEDID/Uyghur/data/Lop.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Uyghur/data/Lop.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Vietnamese/data/Central Vietnamese.csv b/IEDID/Vietnamese/data/Central Vietnamese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Vietnamese/data/Central Vietnamese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Vietnamese/data/Northern Vietnamese.csv b/IEDID/Vietnamese/data/Northern Vietnamese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Vietnamese/data/Northern Vietnamese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Vietnamese/data/Southern Vietnamese.csv b/IEDID/Vietnamese/data/Southern Vietnamese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Vietnamese/data/Southern Vietnamese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Western Punjabi/data/Jhangochi.csv b/IEDID/Western Punjabi/data/Jhangochi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Western Punjabi/data/Jhangochi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Western Punjabi/data/Majhi.csv b/IEDID/Western Punjabi/data/Majhi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Western Punjabi/data/Majhi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Western Punjabi/data/Pothohari.csv b/IEDID/Western Punjabi/data/Pothohari.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Western Punjabi/data/Pothohari.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Western Punjabi/data/Shahpuri.csv b/IEDID/Western Punjabi/data/Shahpuri.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Western Punjabi/data/Shahpuri.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Wu Chinese/data/Shanghainese.csv b/IEDID/Wu Chinese/data/Shanghainese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Wu Chinese/data/Shanghainese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Wu Chinese/data/Suzhounese.csv b/IEDID/Wu Chinese/data/Suzhounese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Wu Chinese/data/Suzhounese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Wu Chinese/data/Wenzhounese.csv b/IEDID/Wu Chinese/data/Wenzhounese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Wu Chinese/data/Wenzhounese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Xiang Chinese/data/Changyi.csv b/IEDID/Xiang Chinese/data/Changyi.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Xiang Chinese/data/Changyi.csv @@ -0,0 +1 @@ +phrase,clarification diff --git "a/IEDID/Xiang Chinese/data/Chenx\342\224\234\342\225\235.csv" "b/IEDID/Xiang Chinese/data/Chenx\342\224\234\342\225\235.csv" new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ "b/IEDID/Xiang Chinese/data/Chenx\342\224\234\342\225\235.csv" @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Xiang Chinese/data/Loushao.csv b/IEDID/Xiang Chinese/data/Loushao.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Xiang Chinese/data/Loushao.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yoruba/data/Egba.csv b/IEDID/Yoruba/data/Egba.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yoruba/data/Egba.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yoruba/data/Ibadan.csv b/IEDID/Yoruba/data/Ibadan.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yoruba/data/Ibadan.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yoruba/data/Ijebu.csv b/IEDID/Yoruba/data/Ijebu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yoruba/data/Ijebu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yoruba/data/Standard Yoruba.csv b/IEDID/Yoruba/data/Standard Yoruba.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yoruba/data/Standard Yoruba.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yue Chinese (Cantonese)/data/Guangzhou Cantonese.csv b/IEDID/Yue Chinese (Cantonese)/data/Guangzhou Cantonese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yue Chinese (Cantonese)/data/Guangzhou Cantonese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yue Chinese (Cantonese)/data/Hong Kong Cantonese.csv b/IEDID/Yue Chinese (Cantonese)/data/Hong Kong Cantonese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yue Chinese (Cantonese)/data/Hong Kong Cantonese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Yue Chinese (Cantonese)/data/Macau Cantonese.csv b/IEDID/Yue Chinese (Cantonese)/data/Macau Cantonese.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Yue Chinese (Cantonese)/data/Macau Cantonese.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Zulu/data/Lala.csv b/IEDID/Zulu/data/Lala.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Zulu/data/Lala.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Zulu/data/Qwabe.csv b/IEDID/Zulu/data/Qwabe.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Zulu/data/Qwabe.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/Zulu/data/Standard Zulu.csv b/IEDID/Zulu/data/Standard Zulu.csv new file mode 100644 index 0000000000000000000000000000000000000000..51107f858e42bcb203e3ef9979f552e93ee152c9 --- /dev/null +++ b/IEDID/Zulu/data/Standard Zulu.csv @@ -0,0 +1 @@ +phrase,clarification diff --git a/IEDID/minted_history.csv b/IEDID/minted_history.csv new file mode 100644 index 0000000000000000000000000000000000000000..d2485fea7c17bf8e294669e0b681ff8c677b2504 --- /dev/null +++ b/IEDID/minted_history.csv @@ -0,0 +1,2 @@ +Timestamp,Utterance,Dialect,Data_Origin,Block,Speed,TX Hash,IPFS CID +2026-02-26 07:54:50,This is a blockchain test.,African American Vernacular English,Lab UI,899370,0.0s,0x9302b6b1aa121a69c1310a5636463b7ea060a47b770d532d67659478eae63cc1,pending_ipfs_hash diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8316f8be80b9ca315bd3822e703543a6b22b0914 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +--- +title: PACYCx +emoji: โšก +colorFrom: red +colorTo: yellow +sdk: gradio +app_file: main.py +pinned: false +license: mit +python_version: '3.10' +short_description: PureChain and EEQ-s dashboard mirror for PACYCx +--- + +Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference diff --git a/api.py b/api.py new file mode 100644 index 0000000000000000000000000000000000000000..107577727c6b2571e6697b724f25c5be5f73855b --- /dev/null +++ b/api.py @@ -0,0 +1,384 @@ +import os +import pandas as pd +from datetime import datetime +import threading +import uuid +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel, Field +from openai import AsyncOpenAI +from dotenv import load_dotenv +from src.dialect_rules import ( + hausa_variety_instruction, + nigerian_variety_instruction, + nigerian_variety_retry_prompt, + nigerian_variety_retry_reason, +) + +load_dotenv() + +app = FastAPI(title="PACYCx Hybrid Backend", version="1.0.0") + +# Enable CORS for the Vite SPA +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# Attempt Qwen first, fallback to Groq +QWEN_API_KEY = os.getenv("QWEN_API_KEY") +QWEN_BASE_URL = os.getenv("QWEN_BASE_URL", "https://dashscope-intl.aliyuncs.com/compatible-mode/v1") +QWEN_MODEL_NAME = os.getenv("QWEN_MODEL_NAME", "qwen3-coder-80b-instruct") + +GROQ_API_KEY = os.getenv("GROQ_API_KEY") +GROQ_MODEL_NAME = os.getenv("GROQ_MODEL_NAME", "llama-3.3-70b-versatile") +DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") +DEEPSEEK_BASE_URL = os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com") +DEEPSEEK_MODEL_NAME = os.getenv("DEEPSEEK_MODEL_NAME", "deepseek-chat") +GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") +GEMINI_BASE_URL = os.getenv("GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta/openai/") +GEMINI_MODEL_NAME = os.getenv("GEMINI_MODEL_NAME", "gemini-2.5-flash") +OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY") +OPENROUTER_BASE_URL = os.getenv("OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1") +OPENROUTER_FREE_MODEL_NAME = os.getenv("OPENROUTER_FREE_MODEL_NAME", "openrouter/free") +OPENROUTER_NEMOTRON_MODEL_NAME = os.getenv("OPENROUTER_NEMOTRON_MODEL_NAME", "nvidia/nemotron-3-nano-30b-a3b:free") +OPENROUTER_GPT_OSS_MODEL_NAME = os.getenv("OPENROUTER_GPT_OSS_MODEL_NAME", "openai/gpt-oss-20b:free") +OPENROUTER_LFM_MODEL_NAME = os.getenv("OPENROUTER_LFM_MODEL_NAME", "liquid/lfm-2.5-1.2b-instruct:free") + +AI_ROUTES = {} +if QWEN_API_KEY and QWEN_API_KEY != "your-api-key-here": + AI_ROUTES["qwen"] = (AsyncOpenAI(api_key=QWEN_API_KEY, base_url=QWEN_BASE_URL), QWEN_MODEL_NAME, "Qwen Hybrid Node") +if GROQ_API_KEY: + AI_ROUTES["llama"] = (AsyncOpenAI(api_key=GROQ_API_KEY, base_url="https://api.groq.com/openai/v1"), GROQ_MODEL_NAME, "Groq Llama Hybrid Node") +if DEEPSEEK_API_KEY: + AI_ROUTES["deepseek"] = (AsyncOpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL), DEEPSEEK_MODEL_NAME, "DeepSeek Hybrid Node") +if GEMINI_API_KEY: + AI_ROUTES["gemini"] = (AsyncOpenAI(api_key=GEMINI_API_KEY, base_url=GEMINI_BASE_URL), GEMINI_MODEL_NAME, "Gemini Hybrid Node") +if OPENROUTER_API_KEY: + openrouter_client = AsyncOpenAI(api_key=OPENROUTER_API_KEY, base_url=OPENROUTER_BASE_URL) + AI_ROUTES["openrouter-free"] = (openrouter_client, OPENROUTER_FREE_MODEL_NAME, "OpenRouter Free Node") + AI_ROUTES["nemotron"] = (openrouter_client, OPENROUTER_NEMOTRON_MODEL_NAME, "OpenRouter Nemotron Free Node") + AI_ROUTES["gpt-oss"] = (openrouter_client, OPENROUTER_GPT_OSS_MODEL_NAME, "OpenRouter GPT-OSS Free Node") + AI_ROUTES["lfm"] = (openrouter_client, OPENROUTER_LFM_MODEL_NAME, "OpenRouter LFM Free Node") + +if "qwen" in AI_ROUTES: + client, MODEL_NAME, NODE_TYPE = AI_ROUTES["qwen"] +elif "llama" in AI_ROUTES: + client, MODEL_NAME, NODE_TYPE = AI_ROUTES["llama"] +elif "deepseek" in AI_ROUTES: + client, MODEL_NAME, NODE_TYPE = AI_ROUTES["deepseek"] +elif "gemini" in AI_ROUTES: + client, MODEL_NAME, NODE_TYPE = AI_ROUTES["gemini"] +elif "openrouter-free" in AI_ROUTES: + client, MODEL_NAME, NODE_TYPE = AI_ROUTES["openrouter-free"] +else: + client = None + MODEL_NAME = None + NODE_TYPE = "Offline" + +def resolve_ai_route(ai_model: str, source_label: str, target_label: str, text: str): + choice = (ai_model or "auto").strip().lower() + if choice == "auto": + hint = f"{source_label} {target_label} {text}".lower() + if any(token in hint for token in [ + "korean", "hangul", "chinese", "mandarin", "cantonese", "arabic", + "japanese", "thai", "vietnamese", "code-switch", "multilingual" + ]): + choice = "qwen" + elif any(token in hint for token in [ + "reason", "explain", "ambiguity", "semantic", "pragmatic", "cultural", "review", "oracle" + ]): + choice = "nemotron" + else: + choice = "llama" + + ordered = [choice, "qwen", "llama", "nemotron", "gpt-oss", "lfm", "openrouter-free", "deepseek", "gemini"] + for route_name in ordered: + if route_name in AI_ROUTES: + return AI_ROUTES[route_name] + return client, MODEL_NAME, NODE_TYPE + +class TranslationRequest(BaseModel): + text: str + source_language: str = "Unknown" + source_dialect: str = "Standard" + target_language: str + target_dialect: str + user_key: str = "Polyglot Player" + ai_model: str = "auto" + +class TranslationResponse(BaseModel): + original_text: str + translated_text: str + target_dialect: str + node: str + +class PolyglotReviewSubmission(BaseModel): + interaction_id: str = Field(min_length=8, max_length=128) + supersedes_interaction_id: str = Field(default="", max_length=128) + app_source: str = Field(default="PACYCx", min_length=2, max_length=64) + user_key: str = Field(default="Polyglot Player", max_length=256) + source_text: str = Field(min_length=1, max_length=10000) + source_input_mode: str = Field(default="text", max_length=32) + machine_transcript_initial: str = Field(default="", max_length=10000) + user_transcript_final: str = Field(default="", max_length=10000) + machine_translation_initial: str = Field(min_length=1, max_length=10000) + user_translation_final: str = Field(min_length=1, max_length=10000) + source_language: str = Field(default="Unknown", max_length=128) + source_dialect: str = Field(default="Standard", max_length=256) + target_language: str = Field(default="Unknown", max_length=128) + target_dialect: str = Field(default="Standard", max_length=256) + asr_model: str = Field(default="", max_length=128) + audio_sanitation: bool = False + ai_model: str = Field(default="auto", max_length=128) + translation_route: str = Field(default="frontend-reviewed", max_length=128) + consent_confirmed: bool = False + consent_version: str = Field(default="polyglot-reviewed-submit-v1", max_length=128) + + +_PENDING_QUEUE_LOCK = threading.Lock() + + +def _pending_queue_path(): + configured = os.environ.get("PENDING_APPROVALS_FILE", "").strip() + if configured: + return configured + return "/app/pending_approvals.csv" if os.path.exists("/app") else "pending_approvals.csv" + + +def _translation_edit_distance(initial_text: str, final_text: str): + initial = str(initial_text or "").casefold().split() + final = str(final_text or "").casefold().split() + if not initial and not final: + return 0.0 + + previous = list(range(len(final) + 1)) + for row_index, initial_token in enumerate(initial, start=1): + current = [row_index] + for column_index, final_token in enumerate(final, start=1): + substitution_cost = 0 if initial_token == final_token else 1 + current.append( + min( + current[-1] + 1, + previous[column_index] + 1, + previous[column_index - 1] + substitution_cost, + ) + ) + previous = current + + return round(previous[-1] / max(len(initial), len(final), 1), 4) + + +def _sync_pending_queue_to_hub(pending_file: str, queue_id: str): + hf_token = os.environ.get("HF_TOKEN") + if not hf_token: + return False + + from huggingface_hub import HfApi + + api = HfApi(token=hf_token) + api.upload_file( + path_or_fileobj=pending_file, + path_in_repo="pending_approvals.csv", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message=f"Reviewed Polyglot Chat submission {queue_id}", + ) + return True + + +def _append_polyglot_review(request: PolyglotReviewSubmission): + pending_file = _pending_queue_path() + submitted_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + queue_id = f"polyglot-{uuid.uuid4()}" + final_source_text = (request.user_transcript_final or request.source_text).strip() + new_entry = { + "User": request.user_key, + "Data_Origin": "Game: Polyglot Chat", + "Utterance": final_source_text, + "Dialect": request.target_dialect.strip(), + "Clarification": request.user_translation_final.strip(), + "Clarification_Source": f"User-reviewed / {request.ai_model}", + "Tone": "Neutral / Conversational", + "Context": f"Translated from {request.source_language} ({request.source_dialect})", + "Pragmatic_Analysis": "", + "Audio": "", + "Timestamp": submitted_at, + "Chain_ID": "", + "Approvers": "", + "Language": request.target_language.strip(), + "Queue_ID": queue_id, + "Interaction_ID": request.interaction_id.strip(), + "Supersedes_Interaction_ID": request.supersedes_interaction_id.strip(), + "App_Source": request.app_source.strip(), + "Submission_Status": "Pending Review", + "Consent_Confirmed": "true", + "Consent_Version": request.consent_version.strip(), + "Source_Language": request.source_language.strip(), + "Source_Dialect": request.source_dialect.strip(), + "Source_Input_Mode": request.source_input_mode.strip().lower() or "text", + "Machine_Transcript_Initial": request.machine_transcript_initial.strip(), + "User_Transcript_Final": final_source_text, + "Transcript_Edit_Distance": _translation_edit_distance( + request.machine_transcript_initial, + final_source_text, + ) if request.machine_transcript_initial.strip() else 0.0, + "ASR_Model": request.asr_model.strip(), + "Audio_Sanitation": str(request.audio_sanitation).lower(), + "Audio_Retained": "false", + "Target_Language": request.target_language.strip(), + "Target_Dialect": request.target_dialect.strip(), + "Machine_Translation_Initial": request.machine_translation_initial.strip(), + "User_Translation_Final": request.user_translation_final.strip(), + "Translation_Edit_Distance": _translation_edit_distance( + request.machine_translation_initial, + request.user_translation_final, + ), + "AI_Model": request.ai_model.strip(), + "Translation_Route": request.translation_route.strip(), + "Review_Submitted_At": submitted_at, + } + + with _PENDING_QUEUE_LOCK: + if os.path.exists(pending_file): + df = pd.read_csv(pending_file, dtype=str).fillna("") + else: + parent = os.path.dirname(os.path.abspath(pending_file)) + os.makedirs(parent, exist_ok=True) + df = pd.DataFrame() + + if "Interaction_ID" in df.columns: + duplicate = df[df["Interaction_ID"].astype(str) == request.interaction_id.strip()] + if not duplicate.empty: + existing = duplicate.iloc[0] + existing_final = str( + existing.get("User_Translation_Final", "") + or existing.get("Clarification", "") + ).strip() + if existing_final != request.user_translation_final.strip(): + raise HTTPException( + status_code=409, + detail="This interaction ID already belongs to a different reviewed translation.", + ) + existing_queue_id = str(existing.get("Queue_ID", "")) + synced_to_hub = _sync_pending_queue_to_hub( + pending_file, + existing_queue_id or request.interaction_id.strip(), + ) + return { + "queued": True, + "duplicate": True, + "queue_id": existing_queue_id, + "status": str(existing.get("Submission_Status", "Pending Review")), + "synced_to_hub": synced_to_hub, + } + + for column in new_entry: + if column not in df.columns: + df[column] = "" + row = {column: new_entry.get(column, "") for column in df.columns} + df.loc[len(df)] = row + + temp_file = f"{pending_file}.tmp" + df.to_csv(temp_file, index=False) + os.replace(temp_file, pending_file) + synced_to_hub = _sync_pending_queue_to_hub(pending_file, queue_id) + + return { + "queued": True, + "duplicate": False, + "queue_id": queue_id, + "status": "Pending Review", + "synced_to_hub": synced_to_hub, + } + + +@app.post("/api/polyglot-chat/submit") +def submit_polyglot_review(request: PolyglotReviewSubmission): + if not request.consent_confirmed: + raise HTTPException( + status_code=400, + detail="Explicit consent is required before a translation can enter pending review.", + ) + try: + return _append_polyglot_review(request) + except HTTPException: + raise + except Exception as exc: + print(f"Failed to submit reviewed Polyglot Chat entry: {exc}") + raise HTTPException(status_code=503, detail="Pending review submission failed.") from exc + +@app.post("/api/translate", response_model=TranslationResponse) +async def translate_text(request: TranslationRequest): + source_label = f"{request.source_language} ({request.source_dialect})" + target_label = f"{request.target_language} ({request.target_dialect})" + route_client, route_model, route_node = resolve_ai_route(request.ai_model, source_label, target_label, request.text) + if not route_client: + raise HTTPException(status_code=500, detail="No LLM API key configured for Qwen, Llama/Groq, OpenRouter, DeepSeek, or Gemini.") + + variety_instruction = "\n".join(filter(None, [ + nigerian_variety_instruction(source_label, target_label), + hausa_variety_instruction(source_label, target_label), + ])) + + system_prompt = ( + f"You are an expert polyglot interpreter specializing in deep cultural and linguistic dialects.\n" + f"Translate the following text from {source_label} " + f"into {target_label}.\n" + f"Output ONLY the raw translated string. Do not include quotes, explanations, or thinking traces.\n" + f"Use the target language's native writing system. Korean, Jeju, and Satoori outputs must use Hangul only, not romanization and not Chinese or Japanese characters. " + f"Arabic outputs must use Arabic script. Igbo outputs must keep proper Igbo letters and tone/dot marks such as แป‹, แปฅ, แป, แน…, แบน, รก, and ร  where natural.\n" + f"{variety_instruction}" + ) + + try: + response = await route_client.chat.completions.create( + model=route_model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": request.text} + ], + temperature=0.3, + max_tokens=256 + ) + + translated_text = response.choices[0].message.content.strip() + boundary_reason = nigerian_variety_retry_reason(translated_text, target_label) + if boundary_reason: + retry_prompt = system_prompt + "\n" + nigerian_variety_retry_prompt( + request.text, source_label, target_label, translated_text, boundary_reason + ) + retry_response = await route_client.chat.completions.create( + model=route_model, + messages=[ + {"role": "system", "content": retry_prompt}, + {"role": "user", "content": request.text} + ], + temperature=0.2, + max_tokens=256 + ) + retry_text = retry_response.choices[0].message.content.strip() + if retry_text and not nigerian_variety_retry_reason(retry_text, target_label): + translated_text = retry_text + + return TranslationResponse( + original_text=request.text, + translated_text=translated_text, + target_dialect=f"{request.target_language} ({request.target_dialect})", + node=route_node + ) + + except Exception as e: + print(f"Error calling {route_node} API: {e}") + raise HTTPException(status_code=500, detail=str(e)) + +@app.get("/api/health") +async def root(): + return {"message": f"PACYCx Hybrid Backend Online ({NODE_TYPE})"} + +if __name__ == "__main__": + import uvicorn + uvicorn.run("api:app", host="0.0.0.0", port=8000, reload=True) diff --git a/app.py b/app.py new file mode 100644 index 0000000000000000000000000000000000000000..ab7c6101989b3253820e30a5d32120c168db7ca5 --- /dev/null +++ b/app.py @@ -0,0 +1,34 @@ +import gradio as gr +from fastapi import FastAPI +import sys +import os + +# Ensure the current directory is in the path so imports work correctly +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +# 1. Import the PureVersation Gradio UI +# The original UI is defined in main.py as 'demo' +try: + from main import demo as pureversation_ui +except ImportError as e: + print(f"Warning: Could not import main.py demo: {e}") + # Fallback placeholder + with gr.Blocks() as pureversation_ui: + gr.Markdown("# PureVersation UI Loading...") + +# 2. Import the PureKITchat FastAPI app +try: + from api import app as purekitchat_api +except ImportError as e: + print(f"Warning: Could not import api.py: {e}") + purekitchat_api = FastAPI() + +# 3. Mount the Gradio UI onto the FastAPI app +# This makes FastAPI the master server. It handles /api routes natively, +# and passes all other traffic (like /) to the Gradio UI. +app = gr.mount_gradio_app(purekitchat_api, pureversation_ui, path="/") + +if __name__ == "__main__": + import uvicorn + # HuggingFace Spaces defaults to port 7860 + uvicorn.run("app:app", host="0.0.0.0", port=7860, reload=False) diff --git a/auto_train_watcher.py b/auto_train_watcher.py new file mode 100644 index 0000000000000000000000000000000000000000..d5a8b92f395c3906585e38daefa71e8f28e2337c --- /dev/null +++ b/auto_train_watcher.py @@ -0,0 +1,65 @@ +import os +import time +from huggingface_hub import HfApi, snapshot_download +from datasets import load_dataset + +# CONFIGURATION +DATASET_ID = "toecm/IEDID" # Where the app saves data +MODEL_ID = "toecm/PureVersation_Model" # The model to train +THRESHOLD = 1000 # How many new clips before training? +HF_TOKEN = os.environ.get("HF_TOKEN") # Your Write Access Token + +api = HfApi(token=HF_TOKEN) + +def check_and_trigger_training(): + print("๐Ÿ” Checking Pure Chain status...") + + # 1. Load the dataset (Streaming mode is faster for just counting) + try: + ds = load_dataset(DATASET_ID, split="train", streaming=True, token=HF_TOKEN) + # Count verified clips (This is an estimate for streaming, or load full if small) + # For robustness, we'll load the dataset info + dataset_info = api.dataset_info(DATASET_ID) + last_modified = dataset_info.lastModified + + # LOGIC: Check if 'verified' count > 1000 since last tag + # This requires reading a 'metadata.json' or counting rows + # Simplified: + count = 0 + for row in ds: + if row.get('status') == 'verified': + count += 1 + + print(f"โœ… Found {count} verified clips.") + + if count >= THRESHOLD: + print("๐Ÿš€ Threshold reached! Triggering AutoTrain...") + trigger_autotrain(count) + else: + print(f"๐Ÿ’ค Not enough data yet ({count}/{THRESHOLD}). Sleeping.") + + except Exception as e: + print(f"โŒ Error checking dataset: {e}") + +def trigger_autotrain(data_count): + # This uses the AutoTrain Advanced API (or simply launches a Space) + # The simplest way is to create a new AutoTrain Project via API + + from autotrain.api import AutoTrainClient + client = AutoTrainClient(hf_token=HF_TOKEN) + + # Create project + project_name = f"pure-versation-finetune-{int(time.time())}" + client.create_project(project_name, task="speech-recognition") + + # Add data & Start + print(f"๐Ÿ”ฅ Training job '{project_name}' started with {data_count} clips.") + + # TODO: Reset the 'verified' counter or tag the dataset rows as 'trained' + # so we don't train on them again next time. + +if __name__ == "__main__": + # Run loop (e.g., every 24 hours) + while True: + check_and_trigger_training() + time.sleep(86400) # Sleep for 24 hours \ No newline at end of file diff --git a/check_commits.py b/check_commits.py new file mode 100644 index 0000000000000000000000000000000000000000..d8cd640d0c930bdc97eff297f0e031c13d33bedd --- /dev/null +++ b/check_commits.py @@ -0,0 +1,13 @@ +from huggingface_hub import HfApi +import pandas as pd +import io +api = HfApi() + +commits = api.list_repo_commits(repo_id='toecm/IEDID', repo_type='dataset') +for c in commits: + try: + content = api.hf_hub_download(repo_id='toecm/IEDID', filename='Nigerian Pidgin English.csv', repo_type='dataset', revision=c.commit_id) + df = pd.read_csv(content) + print(f"Commit {c.commit_id} at {c.created_at}: {len(df)} rows") + except Exception as e: + pass diff --git a/check_igbo_files.py b/check_igbo_files.py new file mode 100644 index 0000000000000000000000000000000000000000..412e55d21081178cac5ab0f03f02169886e471e3 --- /dev/null +++ b/check_igbo_files.py @@ -0,0 +1,17 @@ +from huggingface_hub import HfFileSystem +import ast + +fs = HfFileSystem() +commits = ast.literal_eval(open('commits_utf8.txt', 'r', encoding='utf-8').read()) +igbo_files = set() + +for c in commits[:20]: + try: + files = fs.ls(f'datasets/toecm/IEDID@{c}', detail=False) + for f in files: + if 'Igbo' in f: + igbo_files.add(f.split('/')[-1]) + except Exception as e: + pass + +print("Igbo files in history:", igbo_files) diff --git a/check_sync.py b/check_sync.py new file mode 100644 index 0000000000000000000000000000000000000000..c499464b29cefcd8c3ea5a4413901c863e513c47 --- /dev/null +++ b/check_sync.py @@ -0,0 +1,72 @@ +# This is a standalone reconciliation utility script that helps verify if the +# local fallback system actually worked and successfully pushed those temporary +# entries to the cloud backup. It checks the live sync status of the repository +from huggingface_hub import HfApi +from datetime import datetime + +def check_dataset_sync(hf_token=None): + api = HfApi(token=hf_token) + repo_id = "toecm/PureChain_Dataset" + + print(f"๐Ÿ” Checking sync status for cloud repository: {repo_id}\n") + + try: + # 1. Check if the files actually exist in the cloud + files = api.list_repo_files(repo_id=repo_id, repo_type="dataset") + print("๐Ÿ“ Files currently synced in the cloud:") + for f in files: + if f.endswith('.csv') or f.endswith('.json'): + print(f" โ””โ”€ {f}") + + # 2. Check the most recent automated pushes (commits) + print("\n๐Ÿ•’ Recent Sync History:") + commits = api.list_repo_commits(repo_id=repo_id, repo_type="dataset") + + # Display the last 3 pushes + for commit in commits[:3]: + # Formatting the timestamp for readability + time_str = commit.created_at.strftime("%Y-%m-%d %H:%M:%S") + print(f" [{time_str}] {commit.title}") + + except Exception as e: + print(f"โŒ Sync Check Failed: {e}") + print("Make sure the repository is created and your token has Read access.") + +import os# This is a standalone reconciliation utility script that helps verify if the +# local fallback system actually worked and successfully pushed those temporary +# entries to the cloud backup. It checks the live sync status of the repository +from huggingface_hub import HfApi +from datetime import datetime + +def check_dataset_sync(hf_token=None): + api = HfApi(token=hf_token) + repo_id = "toecm/PureChain_Dataset" + + print(f"๐Ÿ” Checking sync status for cloud repository: {repo_id}\n") + + try: + # 1. Check if the files actually exist in the cloud + files = api.list_repo_files(repo_id=repo_id, repo_type="dataset") + print("๐Ÿ“ Files currently synced in the cloud:") + for f in files: + if f.endswith('.csv') or f.endswith('.json'): + print(f" โ””โ”€ {f}") + + # 2. Check the most recent automated pushes (commits) + print("\n๐Ÿ•’ Recent Sync History:") + commits = api.list_repo_commits(repo_id=repo_id, repo_type="dataset") + + # Display the last 3 pushes + for commit in commits[:3]: + # Formatting the timestamp for readability + time_str = commit.created_at.strftime("%Y-%m-%d %H:%M:%S") + print(f" [{time_str}] {commit.title}") + + except Exception as e: + print(f"โŒ Sync Check Failed: {e}") + print("Make sure the repository is created and your token has Read access.") + +# Run the checker +check_dataset_sync("HF_TOKEN") +# Run the checker +check_dataset_sync(os.environ.get("HF_TOKEN")) \ No newline at end of file diff --git a/commits.txt b/commits.txt new file mode 100644 index 0000000000000000000000000000000000000000..a325fde57551e7fb83cbbe48431bf75f15b2c61c Binary files /dev/null and b/commits.txt differ diff --git a/commits_utf8.txt b/commits_utf8.txt new file mode 100644 index 0000000000000000000000000000000000000000..f3e23e00fafa76fcf818b2209dcbbb3abf378bf5 --- /dev/null +++ b/commits_utf8.txt @@ -0,0 +1 @@ +['eabd2516e4910ddfea03eab9b8c9c9ef784bae81', '2d7ece226b60f6e295fa22f533354a72f8b68cae', '37a5a5aa04de28632f8e9f7e15a52d51f6d3ead6', 'b2b30d1e895e5de925ca9c668415e43897c49ecf', '9bd61a137a860dfa0487519fb11d8823390a19ba', '7f2a03a5b06db7fe9e8ad26355f956dbb5f6af4e', '86ff6ec37ba60b69ad66d1a07ba628db6b76a712', 'bac7e304dd760d48f484ce59471c26291b6d8012', '6ec5d7abc6730415959762b9e56b99d1946f098a', 'd14d0912382705fe4d0bb95a40d3c986a91c3b54', '108346d65d2a0c8f0338e44fb7feee8e76833804', 'd653cc0c30c76aaf4785204e9b48786e1e7449ef', '08f56a16c8e0294188f71e042f5a40945f7e1611', '48d9c52dfe65fa5461f6e82190eac434f9a35caf', '5a0382a7ce8c85caa22e37f585a6cee129ccab10', 'a84fd1e75b28fa854ec2d54025807b3e3d811214', 'b51db31f1a2359fc62a38fcd9aec649d025382a3', '197a9848541ab17aefa82008c3b883da7f1b4c50', '7b56b73a49de31484f76497e48bfdf6821c004a0', 'aaff2d66b2d0c766323863459fc3be6f354d39f0', '34b595592fec216834d3fe829c7952ff43320cad', '8d87bd77639550ead570184274cb5b887263cf09', '608aae4e3e03deb2c3da9e4056af993f27df78a9', 'c74bc78110cc39c9f4bd951329d54fb9cac2b82f', 'ff8550d013976ed5aa5dcd1d496fafaf3aba10ae', '806aef9d7ab53ec489359381434c29625435b6b4', '703ed420768d14520daab490266ce8590bae8bb5', '8973bd4f0402f69525b6f3545c72fc705f5ce6a5', '153c1f6424b28c42e568d563309754eedcbc1bae', '53746ec2e15e77d907285b405635f62fd940e3a6', '33aa4bffe9d90719c62bac9910a7bce0ca661d57', '5f439e1f935e9dd28598a50b0ef47c551c1fc002', '29227f6739b68fbfdc936df843527fff382612f2', '0074ffce0e66989341118c062c775b50121157cf', '5bf1fcaed8538400f3832f85358a8c7eb2b6539e', '36ae67cb51111ba6da213c3ef5c0dbc5a210f23f', '7fd96e8bb109dd220163c85a3400b2333513f79b', '1a6225becc97fea4691415bd60933e3a18e0fbc0', 'f1f7186ca2c5ec9a7f1fa8f88b1bd911cd277a63', 'c94fa889873ea691e34415f3f776cf7fbb9c78d8', '912dfb774771f3911844745292180761bda899ec', '0f820144b4c9951f3cbd8f41b49c6ca19b87348c', 'd6423bfddf22b8bfadf16705c0fcefece403e884', 'f18f65785c8c140f716a24853a47640f8eeda34c', '60a269d6e948b3999dafa1acaceea80f3effea4d', '4155fc8cadbde2c60920468548dded83767bfebe', '6a2accac519526c9de97aee671220e27415c76f7', 'f7768763f66bf61f01534388a3f0d7177fb67946', '1ece9e6c078406d8d0bedbb1d921b5187b09f115', '3a2ae2b2f7224768ae4b54739f6d517262a83f97', '3a102ea5f7eb06b450b2ff952a7d6337f2e67d80', 'ca08dff3688e2f6f847661b45e6e4e24323c787b', '620cf514e65152faa1b7597a8ee87fdb2995f0be', '313b42e8f6f183f2facce24719b5a4b4a4dc0bf7', '4dad21c235eeb91ce0f43a4a017d2ec438024998', '12071548cd0e181620e3a0782df3f70eeccadc2b', 'e5bb79b8eb52834bb50b9bcde7c7a0958a5bac56', '0f04981f7eafcc7680c084bf16ce1a607ce10b5b', '87347fd03245fbdcb1f49648142619d73c0c29a1', 'e6ee0e8e7458718eacf884ee2940fde4bb49ba18', '6b2b9feb71565038a8629ec59bc18c163cf0717e', '006c88fcd0f7eeb36d4caacb7ae6cd0e57cde547', 'd305a561df27b2c7edf18390944265efd19abc08', '0e3f52db95bf586fd3665ecc9009f6bf0834e325', 'e3d6487aac7ff6f42442ca841686b31cd1cbdade', '908cefe7906c3cf6db859f38ee06be6eb7b3274f', 'f1eade78a2d5d89b8672200d0def9d973094b733', 'fafcec62e1eae1a44451ad19b63be5b43d561f06', 'a9027131dd385306163516260665d195f4d0207f', 'c5a5a9b7432462e00d5e1ed0a7423fdb98a9e36d', '64784a2a6c17305e12b4fb9ea1f55fa80e248daa', 'e45ffe82c36591ec085f3b7dd0745d9e557b2836', '7dc0ce28f3b5a87f61f163bdec1cad3c1566a4e3', '1d6f3d60f8ccc676cef5a615e56f0fcdf96c1b3f', 'a4be0753b8ee415a3be916efebc9f92c6e1f5539', '4678c52e488819855687fcb06de5a3631d41a506', '4fc2f309364004c2683c111c37e96b645d65ccbd', 'b5e1d62b0a9321f4d6a3bf6b43a9c36aebbc8740', '66ad7ce8264ff8aa1a835b476d3395d02b762c9d', 'cd3d6ac866653eedc0fd6d9f41097f3936ce06b4', '2abc0e388f4ee9eb9e970d025a46704f7dc6cc0e', 'e9a4a6d1c41104d38ef7ec4a19d3a7552bfd740a', '66c5c2b508ca389609c4a714fc2a7c9518ebfa41', 'ab1102eb57e5282b20b766be82a442494bf956cb', '0a93075a898a9b9bc4aafed2b5a043636ce211f6', '1d5652a34c49fcf2a7ea5d78895ce9734d15c94a', '3c069871a72edcb49e9750d17b1e3fbb645b6c0e', '8c389e3c3276239ee6a77f321574e053036ef713', '813b4adc943719acc2ccd5001a15ac760d1bf72c', 'a9e75bea70d84c80fd46d7edfb6ae1ba5965e380', 'c90141108f11240ea24d732c1416d833a386a7f9', 'de72d66f5ce120a208cec714849a63d14dad0f19', '2d7307b5b4dcdeb9ef396037b79b8815efe253f0', '0e02a4e80b4c111ce307eb753659e0e6990a8441', '4b36ffe11389b08a4dc902b4b0e54c7b89b9a529', '299ae7ef2069467508696a06e1b127f158d8b13d', '85ff26460de54b15254c1a7c056e823c9fefb6ae', '88de2965883968d0d3be8eaaca6a826607ad562d', '5e06f6ae257d3c861465e85e03fb104328197fe4', '0a13f8eb4ddd96f1ac7b4f7230499abcb58205ea', '4d8668fc9973fe2788421e121bf0ff70937eb85b', 'a7cdb26672d5159f14947f094fe6811124e1d3b2', '5ab68e0ab1410e638f3ca0cb725ed1cd2acf639c', 'ddd84a5f9699c884f59cc063db5919a7f57f03e4', 'a4705c254c142fae344a8d789f875ef398216434', '9e1b07d64d81635e00fd691a96b0da8b301400eb', 'c986399430664be28723ef269cc8b853f74d3668', '16b4881f32cdca08732fa355b73d52e181411c02', 'dc61591aee31916edbdd897e86904fad3ca0831a', '2db2e7247de4e284cf818431132a060ab9ba4dae', 'b4a7d9208b35b7b72b16aecb29783f93cc1386ba', '52a6c598ff43c629cab6b493cbe5e5e11ec28e83', 'a2fe00ec3826109d2f907b7bae712cc83e77454c', '246a2df028807a4521a8bfc319a466d889720890', 'c38bf181c112671905f5e2dbe14c2a03803457a3', 'a045d19278e7686e75bde670e6c2b0e52b8407f8', '7b40509965c498b87b6424e30e99611b8721e648', '3dd25df58e1120900914ddaa25f53da1756e7e24', '5bcdcfd1d3c8ecfeb9f860597f8fec2edf75a773', '93418d7f933130572d62bdefd10365be93028816', '623c10251178d0b5c01a539e1a990f990c42d114', 'ab8d128db492b620837eec10102adb2b96440387', '080aff11df734d7c4372d2cfe44c075593e792d8', '0df91be5690b4d6405ab51dc251704963297a84b', '5db3583060fecc32da1a1ecebdae68a004db2219', 'f655aa9f33c97689fcacfa545a2aeeaa3a127638', '1711acf5182ccff9132ca76bafbf67d5495be9ab', '659e6276864ed65f94c7c66f60bfa9c95ada9514', '4af16dc3fbf9f8c2bf0fcaa1c42ffdb6c6daf2fd', '1cc26122ca2ab1f058115b92d8fa1f2e6658baa9', '190d3cbf6a1fab2b1a55a62f0000707635610491', '6285e89169f7e30278bd1d017d0dd1e499b5978c', '867436e751b978535de9bf14f5f92cef606aae5e', '886a36f9c8ed3b1a661186c26344a477095279cc', '24ce5d6b6acaf54d5430fb77423510b0e836d7d3', '2aad9a6a24817da4dae617ee6a355d4f3b099bef', '7de40e05c53a4d6cd116f5efb93f86ba6558a682', '9b5cbe8c2e8ce37f8329d9977446774d529bd4e2', 'a2ebedc447ef40f5b441d43acb9d2afe0d2271ab', 'a3ca5a89beeb06ab8a16d949e959aacf6f64ee6b', 'a06bf1eee473f7b52b386f836842fd9ac0bfb3e2', '35a5e4ac88b6eaf284e8c34785fae6006be1b428', 'b1f8dc989595e7a12be28c16cd07b7c9510f0bee', '91a6f32a145749522b583cd9bdbe178422f2f78a', '22cb9c04b3f06583934581c5550e64a1535e67c7', 'cafba7b1caf6c78b3df9b7707be640052c3fe273', 'b0808327a65122dac5fadc4158896858bfe417b7', '6e1c0ba724cf38c008fbe22573ed920eb1c12da4', '0a14d38406c50b81ac0457f82fe7d090d4d065dd', '8b60bd0590d7a999afe3f183d56b128ee571dd36', '88d75eda7d3ea7e196c5bf14cd7b31242a0887f2', '0cc050999f91c9470154f005c7d14f4a25a2242a', 'ee1e6a4b50d7e376c128eabc330342ddab23f8ce', 'ab35d28962938c6af04b173fbdd67740ed28834a', 'ecea5cb1936881daa3fd6df9e759469e40ea1a7b', '7fc9fb5bfc7dd774ba8198df04f7477bf06431d3', '507fb15a1933105c5612866ae278f20346aded39', 'c2d2d87b4a6bcf43472f30a83a88dc288bab955c', '63faa24ab953c8a262fdbcb0e8177878b6aa9ac9', '696afc07e5872e2147450fa0a1998bf6c9952d9b', 'b185bd6a052d05c49f81e2dff4021651c090e5ac', '9e01e6b5009c2b56484cf21e1052f39c32a92324', 'ad7fdb1d7e50d349c84438102ee4c353b994ad4a', '89ecde6c22a50285e13c169cb40aed0e4ef22468', 'cb61d87c84edf0fa4bdd0e91f9a99efc71403de6', 'b8faca4ba191be71da5f23cd066cdccd3ed28aa3', '8545cec0bb5bc4392e965ff186ed2baf79d51897', '0b4684e1f1f98c368d6f6e0c1bffc5a90cda8278', '6bef27b69bc2e7514b49f677057accea8e59c6ac', '2664b805b5968be4dcd53ff51f2dbf5fd241f284', '0dc47977bbb21cd5d5e71d431d236a3b5c4d3a7a', '2e6c00f560c5e2d59e0ca35f025a9daa4a4452eb', '54e85e49a1a4502d61024dab5eb972b1054d651d', '52431b45e0993abcb9a223c29b3c17bc89e20f19', '7017fb82df52c337458e5cd4856090ad33441992', '53992e171a657006edf78288ffeb1a233c3f6dca', 'bcb9ba3617e1ba21689b835eaeb08682f52ab950', '50e4197be28b46dd4abb71338e5cf3aa540c473f', '5ef2be8d0f1d74a0f63ec24f1436becb050dec56', 'e8e45e50ef1a6935aebb1371313ff314544cb030', '77d70c3a16051b92db843cf92e75ff4a3970e8be', 'a0b57963318a2afca78fc4ea8930de5bb0185f2b', 'f22aab20a463f00ed3d10551cb088e22b9f4f633', 'caf483ee7eda280cedd83a4a573707e0328c5298', '747f4ebce3c0e2099b24a74327d9847c943b1333', '23b2fcaaf13dedbb76c06ec14cfb42ea8106fc48', '3f82ce2ba248c9172e7f3e0c03e712411a40659a', 'e7fa6d5f4981eabb700d39ea850373e50c2c4d1b', 'aec4f5bca05bbbcfa2941fb8506298388403c403', '177748463546b894628b5fdb21a0d977a1339aae', 'e6c994cf7fc67e3a2bcca7bd73a826d22529dcab', '40454865004bec3307ef1f99fdbefb5bb442fb21', '07e5274a2916d0fb0443babc4db5c0f3199d3cf5', 'e70a8983da22b1f49a25582a27ce2fe46f77a7f2', '60d7edd793071245c80f1d6b7cca09c3b076adcb', '43b35f78de5a62194010755f269619aa07769e1a', '9670df8687c48e320ba7e91e7a12433af9c6175e', 'bcf8ce464cc9e6a5c70dbe2510625d9e90c27198', 'fe328d1cf637f9564248b201845a1ad7f5e4e726', '890f966e275148546a63b8a239cc7e636f9bbe16', '6aebc3bd079afb48aed9d5e2bab3634333a07b1a', 'caa7269486fab652f79b0d2d61395597400ccd75', 'e19fa2651979008f732a66f3eac09cfd95a11498', '51c8fcfcb32765be01632679c0be00191ee0e96a', '03a53a4a3e8e2e18ededfb21fe9575f8a5642407', 'fe8ef1a7c3539f1d5fd548326e9e71a29e2ba676', 'a90730f128a9d90020b80646442ec02fe3e72bed', '2d3ab37663a3892e458d673da54a6ef269d969fe', '56a2fccbb9acafe34b74dbfd0db7ed31054ec755', '8dfd79ce73a3a605689d3580c5f8620b23e3e5af', 'c859de6c00e3fd3fdfbcbbdc9966f7736436f377', 'ca22e106126a6fe58211652358328a13d0214dc4', '1e8da290b97205cafeafa054ed8de0489f3c13cc', 'f82902a8fefa9c54be7355724c837755c60dd1c5', '8031560972eafc0facf7b6dcf0657c7b7e1c5b37', 'e8ca0d20027e2a4933a500396ed1e14e35e27133', 'a83c0f21c8378825ad78cd065939605e3ea53a27', '316d3ed78326c29ba3557641221c02a5ce4f824f', '8d3bede815ccd57fe03f05dda2be3d815ae04df2', '7939a0772d697d977e5cb2cca0af62e8e1314d53', 'b916eb854d458f340868ef6b30d166e8511cfa48', '33adc8d2eccd8fb2939d58300dae39749f3297bc', 'f095e512f5d959577ef59d4af36f89511f3daf3c', '5cb13d88a08cc10b9082a19e2491c684ed5131dc', 'bdd44529fd2dee12a8ea20e55148b6cc18d61fd1', '6eba692e6dda91c99be4e256d46f108aa55e5a8f', '9b1856ef3b12379e7330a8393f6369989f912696', 'a3d901e4b0f8f4af5bb97b1427cd37befdc5adaf', 'daae2e694caaf4ff518a24be81bf6323128532b1', '3001d227a198996ad92c9eb241fc97de1c9540f6', '3756261523f9be2bb71233c233789b8d5ef4a7ec', 'f00e714c5b109c84c36cb793d4bdc26e74a30a23', '136e824094417609150c74ca7101967eb3ff1ebc', 'a392d8f2d2d639399dd01e514c700d7146c4b604', 'bff4bcdfb5c07dcfe411b01eae87ecc9898c9820', '02cbc4e8ea81ddc8ce76e7d0b07908c49b27ffe2', '3507e229cfcf76a7173c345befba96f5f10cb302', '9746ca40358049980073a93957ec8b4357176957', 'c2228f93321552af313e47f785e7f5f53c2fa520', '9b69d4ee76a505869fd4c2ca3a21782128519ddd', '881063dd34cd7a0abced32d029f5a6d6ce64554b', '62d345ecc6d40a723645c43c16778ad1196d2c28', 'a6fd2331a7254ece8a9e28e6d22b1f96eee62587', '01309c53a10777efc55ff8c5e21559e1f61fe456', '95ccaeb57995bc44d3a543df47720db49c9b48eb', '14dd9eab1eba8fe503d8c93d09ac2d55ed6f951c', 'ad59b289f9cc100095c2165e6e5c81bd406648a1', '914dc80e8146c9074636201fa3e9fdf532b0b5ee', '2f212de827491e3dd846f0e8c6fb07c6b5e0262a', '415479f4ae5e19ddbe4602958b7d7b986d8a4ae2', 'e0c41c87a46bb4c593701145f6677d4ab9c356ca', 'df3097b88e0635563ce6e7af854fd021722f9255', 'd97f7cb4501dc9ddf7d8c4a379042c590bb37728', 'f4b55b6559cd37d5e8b1c6dd6220159ca4b03c67', '3cc6de1e1a6753cbe3e223086b515867a2a1542a', '0960c95f9b0de12f5e435e2fa7c8b1d8cb235dd4', '186f631cfb44e49868ff1994349a64f77fa074ae', '448436f9c06ceafb50e478df0e022f491932cb42', '6248af4ae3321481408f53b87a2e0e2fe9172c23', '45bfef8cf0893b9fce2875e2290ae6ea70200695', '8b3aa8d599ac5d197a62b5fbc4121c70a660b145', '9af9deadf88b2dd7afc33fc4c713fb25ccbbe29c', '69aa427e0346f2e58ef7998a435b1a1be1f23c23', '068f420ca18bf47adb4723589f01f4c783757228', '17ba03fe251a324268f45827a8d7d0ad80d3e527', '419dd93851d73783a37dee9ad27bbb1f8d9bd062', '7e1e1f9b1a85b14562cebd6288d5a2ab0f7008ab', '6dfece5f8d2aac66dd251088c348b7af936d7d2a', 'a6d07b7a80473efc479c3da512bdda152df002eb', '421709bd3e6c3159ae53020c61b381c213b0e115', 'e6347e369f32730ac88cd78ee1ede8622f745b22', 'ffe579b3503cada2261a393e4dee4ae928655fff', '78e3e2209017c5146ff35309ef95961c42c8c643', '4d9c5f2a427b93bfb7dd03cd4ee4e14547b24609', '2262a28965001df4aa65247d5f24131d92d9f354', '0ba44eb103e02d952997e1dfba37d75c5ec90f1d', '5d80dafaeab55234ce489234168e8b03cc524f8a', 'bf7b8e7652ae7a077056a9fcee3ad03d51617720', '28818d37e4428b927398c5960968e29f07acd566', '95dc3696e2de45179f62c9403c340c2990c0b932', 'a8be25f6da258ad00c19980dc38f01b2160a52e4', 'c05ebcf77a63f0fe055e500dccae8d2b0e5c2632', '4efe597a0ad0e63fb63d9df0713b0d992dd5dc2d', 'c063af345514bb016748e2081bdc75012dd3830a', '458ea6826cfde751923a8a8667b348ce762d7aee', 'eeadd353387f5733db21d4ba67e072e3a91154e8', '50283c487ec6a49f401234d0bef28646ea4f37bc', '0fdd6dee5fd7ecdf4373846a7c696efb95743621', 'c97901ffe6c852c246339b11020bc71b69afad26', '231014033779e29a9eea8caea72843a326c8dba1', '83fa02910c5912314f8fc4fca22e9242676d5ba1', '1a8602312e187863f7581e6438d168b3630285e6', 'e5d41ef3f2dafa41fcf1360a70287a349186110c', '449b697c1f2ec43f0997e2482b744b6affcd9314', '6f9777abbe47ad7bb51dce391003a0037cf9384b', 'ad9fe5fbe7075352aa9d0087cfb40cede3da2169', 'c9fb9ee3c93c8ed98bc059c99be47dfdb993b8c4', '6d24495e16a27e9e1428bceac7cfa749556ffb43', '691602b791029c2af20de119c1a045097a40262d', '3133a33a366e434ed35c6a3b170bddb15f50c889', 'b9f1b7b33b2beb5182207520b2c2af55847c0c5d', '8c60a28c1d0edf08969aa3f7fdd2f7307923921e', 'dabc8b24122027b8703b665ec281a9cb66b5613b', 'b2f4622b53732a0eab819cf187fa69d2189c3ad1', 'b90ad9a3f851883bb10c87ceda4c994decd1d8b5', 'b18052a2575185d0fd2c21277d82b6a8d45f8486', '1576d240c7c87bb512c0fc761a5eefc5bc94b903', 'c0f9e8bdc68a1ab8226c35ac2965aa295ea8e5be', 'c348f62eab3e595f25ef7eb0d8ac9992050f42e9', 'c233f4c434b30230225139422313989f4b61e83f', 'a859d09445d2ecc145bdbb1605f14a32aab1ad4b', 'b0bac200d8f31d3cdb4a6313d3e74608b15dc799', 'b857925cca12751c75eb8005213d82312ae650bd', 'd305b2c3abe6cf93afcb6f059618839626c81798', 'a0601bebeacb4c9e3fa60912df1e1acb744c0d2e', '26f2b5342fba1fd5e47686130519e1e45188110f', '30ab4e78da65b33cf17dddbe38106d1fbff40159', '3828f55f68a9c8d5d5faf4aa4b59c531cbc63462', 'b328543c4e5684b0f31e630b71b34fa1410b0e47', 'e2f8564dee3efce39ddb50c7c26f032e34e0ba20', 'e15f4806652b136161585f731b128f0ade56a35c', '7b470355e0de3c2617dc12e7ecff54be3686b156', 'e037a95262dc9f96ab3f70a2a644cc7a2d0a6cf2', 'd07fb5d2003fa7a3712ee7356998bb7fe7617cf3', 'dad9a376e4a8b4f7ee5442f05bade4bd8c016d4a', '06612896ee2ac212eec9347a5b1c2c8fa2f17625', '4c6e375127840ae6ceaff39f66053e1dab5f800f', '40918afc50f360181f33b7fa3146980915178fb2', 'd5368e893fc2d8b28f724d85d0cc1620ab9309c1', 'f95b26c8481e7e34df90173326a7617d57058eee', '80c9fc9a83ad888aa8ba737e040e9acef9470770', 'c57a5ec030f0d1459193a3aab5e01ae4d7567fb9', 'caef83bf182a678c76ef0b325d730547a0aab818', 'dce0e734dbcb5d95cbf35cd6af5749a98931b5cc', '721e8db0122ab8050798338e6f3b51b1f87d1afa', 'd7ff11ad33a50f6586ca616d90296764fc8209d3', '7cedd2c8f32055e2f7402ffdcca750d9cb4d11d0', '85d69d2b999b19fc3e97c144277c7a2e46f8bfdb', '7803c1730c31ab6403ce60353c48c7aff051a246', 'ca7e12ae798b8276c07b4917a5db5039378c043d', '2af8b85e3f4cae39fcc0af36c5904734da8684b3', 'ba3b4a4c2ed5c8d353629c62ba02024fc8cb6b59', 'a1b2ddc8c4cd69a1f1af9bf5c8e98584fa40287a', '3194bf0c9a292a70c57050bd8d70f2b06119d52f', '05a04809cb9dc2e33c4a691ab81a07907ab237f0', '334912b285256db63f8762ebd3b0646982fb1ed9', '7034f15736274ba8c0fe7fb46c7e5ca8cbcc797b', 'ff0663153a6470d03a5cf77f53d887292e3fbd92', '15a5377d6f78539edc2978bcbbf920bc2d944819', '2a21e0d14cad6c6da612f1b9cc58e48aa2af89f5', 'b10628a717360b8eba1f0304880a549b3e4151f6', 'cef0b158db0e96ee5d5a85a15fb935c5d2b827d3', '6c7b5a56600cfcc8a31ed895a79bde4913c695ca', 'f1b0217b51be534ca4e2afad23fc327662086958', '36883ff994d8687b4e2aa763ab380481615964cb', '07cd9465f24f6c5558377ad8f0cb17f196ead732', '97a8507690b9707415b3be47e2d7153cbeefbca4', 'e1be900860029c84eda744c72672873af8617f8d', '85087e09bb1bd4863f5fcca2dd6fe3141b8de98b', '764013422df0a7ad28ffaa747d07396b5139514f', '96b17d2295345e5e50f625eb84c0770c331d7fc2', '6976f0f42fa4fe969b8dac52bd9443dff7f6483a', '8266b8d4a2956819b55bfbb61077d44bc5579be5', 'a701661066c2f326d476a732729e8d9d9b3fbbe5', 'e6f983c3f85e8567aeda057bfa6c85af6596a165', '9bdda4bc61c46f743cd08fc3d46acb56ed845267', 'a39d1adb3fc3628b3db7d546297a76f6a06fadb7', '108a06dc0ac010e2869da52ab5838d779b054249', '6ea1b99578e5b42dfc3568c8ac9df4815f3c7130', '48ca3f10f59e02b3437444b26aae3760ef299157', 'e55dd48c0409d4f377ea32f30079d4474b492637', 'b6a01583afb1f5142bb7434ad4a33d0c0031d294', '655159f24641cb278e59192f9b9b93943b63e4ef', '76ae05942f2665e797e8eb60130c462eb7b997d8', '46f91049ee6f83cb26bc51bc27fbebe52ee22d39', '6af02de18b38947cb0071d76fd3ae76dfb653db6', '098811767245e8c464fcbc36eace50a1869f63f4', '6c737ce238e359d50905c888d74b420b97572804', 'fe69230b8ea96b7f6a1adf8fe9e86cd6f8e0e5a4', 'd3d7ad9175029317f452688b43aa8086a57fbaf3', 'b045ee9da43d135188bbd0faf0cb5b5694cad79b', '1813ec3920ff9c6d3f6dc7a6f53da3852f28f2dd', '21b191c6ff15815afdf3f2d566b53c402093d4ec', '1603ed03912b354cea771b94c4ea4a70dd837d36', '750219bd5c4c8574fc93dc2ecaea5916e85bf7fb', 'b13fea743ca16f71f045bc4b5b2920b8135066a7', '54ef8bf939028fba7c04166bd014ce83c6a97410', '11a24d616e519310ea874126f1ed6edd5e5eb94f', 'f625730340da70f7b33b96ae48989987b35fb331', 'e20d0d2042a72c09ba083784b4cb946a96a1393f', 'f16bfb043bc9050648e1cb4e49bbfc9904076acb', 'f410b2154c883176729ba60b844c36636158319c', '502ce5f1cdf7b8d72e60ba523cddd5dd7fb6edad', '698a7edec0459ddf8a4f106acfaa2a3c1280eebe', '73f8d752bc9d77b90699e6120a41a5ba529790a6', '5363ed9a680ef54010e68a489dfd934ca1cf6f27', '10b65990b95fe3cf89fe40a1d69e47ed29104f3b', 'c480d6ecd8ca2f6bf0da12bc0c4764dc41470ff5', 'dcdeaefb998eb2fe0896e1c1faf293a9bb20faea', '47449f495f9cdfab3fe4b727206454e452fed56d', '345ca944296a75f730fa11c31622d04b37557620', '4342305c1bb82a00058739dbb8674f41b3c0a300', 'bcbe6e6205129560d304c51bb3ccc6cebd416676', 'f8865dddc32924b173783f6d93fc5f20477a0d15', '67f93b5d5d73c440ffd12f4ff0154e8c7c4eb355', '555ed315190b7ce885a90ec9a42fef0a17453559', '947acfbf4ce8a4f1955951d8660090796dfcc786', '50f042d2832c8345b61e206ff7c824b78cb160ef', 'c794f0060290909e76d6fd37f0ee3d3bad63db8e', '79da2e973e97af17f10fd4d64b69ca842d29b360', '770068eeae59cb885327c2a7ec8d939324402c2d', '95c3127364a9e5bc6c6ee474a3839c3c5a69c957', 'eeaea7eeb74fb0126578149fe1cf9126b66d2858', 'd6282009239b2759ffcede89825a456e5bf0acc8', '4deb2c53430ab3da7379704de90e8f3e40851a8c', 'c033f27f9bee7034eb8ca7530497b1ec45258f63', '4ce05d8f12e2366b95c550efd0ab50b242c67dca', '377b2c6fcecd9b3756241789005f7487c003c35a', '1d85c42d890f390da82b7b5a6994fd1f3cf18ec9', '3e8cd81ba048b689452684653d1ae8146300663b', '36b2535dccffc43aca575d296dbbca50c22f9354', '649bd1a0ccb060296d8c2c2989fdde2b5beb2c03', 'a298ee92a08f7ab107655bcc27de8015593bceee', 'cb79214d7c1f3b492b5f798e697a76849077ac8b', '85784574864298a74e04a76ab7350c4b0b45fd17', '5ba090ff79bfddbb7b6946d988e2bc4f9f33d13f', '231809f1a9a1b75ee341e681788c0a3f38fa4aee', '493a816db415390eca1ff746ddc3876a79bdc93f', '3750e08a8f5ec1e4986abf6ecc38c27d151221f4', '14683308b2d893045d054c1a8bc557412fb19bdc', '9c48600dc7d4679b178fa1bfdb18201e63afd5e3', '293160665c6ed992f1c90441ee0a18a671f93485', '642dd951cd1d6e31a2f4853db58a89e7a4f144ee', '24940eedf3ee647827a9322a151f55d9a83a958a', 'cb5928c8b91a1b45ee231d8e25813a927a704445', '783bf77a74ac557fe104837fac8407320bd5f26c', '9b9411d256f541f924c079c6962f3d3259fce406', '35f20823868ba7bdd02ac53845f98e2987ee2ae2', '3e274933a9440bffcb64e577881c09070183df2e', 'cb2701764b2b9fa71fa1a09f3b8e5ef92a71b765', 'ea10867683493c6357c5fb5865109092be840e08', '96c40f5585b99dc296f59f5fa6194495cefb4ab1', '46c3c5608dc01152b4171240fb5929a6d40237e2', 'babcc1b4e4abdf52689be222f373f0cbcbbb0566', 'd8ca9ba175a9ed56018e8aabf837e7e41f703cec', '7d8256358989ba74f3c6d3cffbdbd440e41caf8d', '4b4d991ff745b7e1d5ce677362fd8b550c70a7c0', '789421265c9e8c3ed4e0fc94d0d49d197bd33468', '43fbe07bd446a8514fbeddd1cff5dfcef214f153', '076e4b5c8320968f8d066df84931772e0e72d13c', '4e82bbfed3e3da36c029dd0ca4fac7134eaa42bb', '680a6ff637b92a7d88d8d47f050a845b3793f787', '249b5239c383e84b94f4895faecd599554dc1ae6', '8a340e397bc6e9f73d789865de0072adf93498fa', '72dd60a9a458f9773f07f10dbc77d0b13e5ec670', 'c7c95ba59cc6ee2d0fd7459667c641bc65176361', '9150736a8bb03c2580dc90d5dafc5a8d30877488', '81cc68e0335306f33a1bcbb987e56e1e2cc26b2f', '042cef7a5f8fe686531b7972e0657ef51e388018', 'b95288ef1838aadc4dba5dbd4c6e33b8277f334d', '7de30002beeb2137c7c98e381652c89eeb1f5266', '82a88b63bb3066ade2c556fcf8b263ae2a5ce8e3', '46d74b99311df522d2dddc7a0a2271fdd18a49f6', 'd65460bf6f4c525700f6eb87f1a5f65e3a83326c', '52acbf30cfb4819804ada03e3985dd5a5eaece32', '6ac2fce7a5a4a0c65d74c5cf363193047f868c13', '7d2c45e265e7d5bc1997e1e01ea4f03bd9e2098f', '860318a4d7ccaa13a9ee00922e5a55072fabd629', '6afdae3e28bbe7d9130e2a3ec860f72c92b7f047', 'd9c4ceb466d324a9a7c9e2861dfd635c8c8d3e2f', 'b1942d5e38214ba68d2cc910699081338fbdb5cf', '1203ef0a435fd2bf4412cb1ebcae69e2181dc194', '36c165de686257b42e089ae6f1af3538ab4bbaca', '5c665f0a2d380cfb801151cfd365436d99e4a318', '6c1114fb48b8b002a2c77c6dced615c21edb2ab1', 'b1708153f4f72919e67c33761c71edca2d4a94d7', '38fa88c2a902d8def9ddc88f58d8016e042d1fd9', '2222106498f391a4b44349b3b252eca6accb1998', '31962ca3c0879b5156b61a3dbba4b05f0dfd5ffc', 'f50c7777caf911593307347246cb977aa0a63dcf', '693ca2ce64b708dbe2f41d8d825035dfe7f48eb9', 'd1548b8147660330c8b1fc7d5a2b35fe2723bec5', '49251b220aaebb74e2fc184c46e6070a23ea2145', '563fffdf1a2c142a6743a1d10cc11aecf7a2488e', '2268447d422ab401f4f2633f4e90f4c92a947158', '4174579cd9d861715aeec574df44b531784e88f9', '29ca611b0331d94070ee907badc517877d4a8eb5', '50b89a004a71224681d260d35ce6219ceb355f79', '1c017e38767ccfe4e2df9bd9fd5d5c4026c3f0b8', 'eaac0d36723d9dfe2d072fbbc68e8ca9f32c9981', 'abb663bfae3902b9a21818f84c8723923564345f', 'dbce1bcd56eded86b4a28fb570247a7220ca163a', '20b77ae74826799ab5e3978ef34023e8c0687fb7', '3fe16bb309165d0215ff792a425bbca87288d0ef', '5ebafb5971b0c6f13a5750b1cd019892393c71ac', 'f7baad9f9608c0ad8f37e9f2040c37fc7072a4d7', '7fc834fa6deeb2f93cb9d0621d720e60a1938d82', 'db31f8842e6614df25f79deb1e5c0c9b4f1e441a', '070615585a67d4ba413085e6d08350e14cbd1850', '723b5dd77968af37fb96f61f8ba5abf33ef58110', '7b30870684d72a03055a927322df7dc6a2ac0e28', '2c8af5b28e34c6ce861ede44cfd19af1bb8326d0', '550f7612574ee14da8e6eaf8223d4f69faf01d32', 'ad1847a6c43c1e124e00f27373f238b1ded66e70', 'd4797218d49234155f0bced04cdbed12e93b546d', '23d94135d5b1f5e77434dc6f9ee3856e0fba0301', 'd28511ac62e0792260787a0cccd8b10f1568464c', 'e8128c7262a82634fd9d26caff3934be4248bbf1', 'cc81e413cae87f041a99b7a98c271e54b57ff83a', 'ebeee531a6cca8e04f9458d15a16912284ad1f05', '2cf5114a4130949bfdf17eaa0a10a2adc1a38de2', '09024e88662354045fe974042a1737b6a3f38a3c', '80f6e576b9e6fd6982677bbefd15b61404e1dbe9', '6a9256434893673dac9c1647f56a3dbf12aa5447', 'f05bbdb83d4913b5701b958b7a37d863d1cc6da3', '54205d5d3f4ae9941c7496ae14413c7c5eb54dea', 'c4e7cf65013c1ddf00e7415cefee611ba0202701', 'd4648035a0281e5b5e28c34a891b94f9f309bbb0', '9b32ee70a75240d07d939fba4566fc80e67ad5cb', 'ae7e01d40a5e5c14a4b9c63a6b9eca87dd033c06', 'af661feef7479569aac577f1de93a856c657669a', 'a5453f361fa4c81e437610fd81d85aaa8cb2e854', '578299c1fb7971b21489026133a572ca20a35fce', 'd2a2881609f19b77f922cb56ce30835a09f1b235', '79163f661e535233da857ceef2a6cd0e7303ee66', '545f0b426d54ffc3970a20b8abd7ddd8297cd278', '955ae7148e816391a7529c887bb21ba4eda1a3eb', '36315922827c3d6f7e6dc8effd4ee7f7f5ac6868', '8ae99e66ee96f3cd7a8a0c104f57156dcef2b36f', '1bab61cebba31ceccd80391a7cbe99c94a0ee73b', '86b937e7c10f665445dd4db47d5afb40fbd2e3a8', '964a8828d75dd575c3024e8e45aaf036ee4f07fe', 'f400a04079c5d8724a30b33f96b8967d0887490e', '6244c5d18beb2f966be60a2cfe97af4f7837aef9', 'b070d498f43ac621b914a0eb283090daa0e777f3', '56e331101685377c5b05e3629207ed881be5c331', '063bbdfe3d3b88f1fef7593a5eacc5cbaa028d3d', '044c3e91ef69285ebbb7c045f66e8c5ab1fd0f5b', '7d7563b96ee3cf44bba2b901d0c24e884e8450e7', 'c38247ca7591f5bf5d557baf4e78c0a073c7db3e', '41200ddbc50f13b1a56391ef32fff4dde50295fe', '430a1f12ea783492c7a09d984adea25cc7577a09', '26eb66fe76467dbfcd8f9d8ced31d3bc89c99345', 'cffa4739fb2a1b8f76ee62f4d1b3971c4d7bb150', '724d81ad75458ecef67162ba37a9c7d61bd7c089', '32f65d83c13b00b32fb402f55690140370271ea4', '2bb004481357f43b75be681a845b08e7735f5e76', 'a627cc798bba74a5480e5dc31fd75f9df2b36841', 'ccd02498805b43caf86efa0e70eb1043e0a4a2ea', '66e637b324ac3a31a8aead4d81ec6cd52b395b28', '2f80b5b606920ca521701d9f495b86746e9774a1', '2d9846059beb835bc3cdac22e1af6fe76c7c931c', 'b2d674f804513014a9a671f4396023dc6bd12e44', 'b12a485af2008de9dc7cac58f28da3e7e5fc6fdf', 'e48da58d27d7a54967ee351887e484fef8d14bbb', '163541912b8c7a8646d17a9f0affeea18a7bb039', '8c190849d0c7663bed535a5017ea2e736807b855', 'e4a8d96a379e57193a282ff73870ba7b563fc79f', '04cd261b4106a80a0b3da5c90ca646b96d4366b3', '0c2b9cd89c13e6eb0220de50ac684cb08665d20e', '2b78ad600b98bc6599c8a8935568d09f5c32cbd9', '8c1c6028215363d92458f282a1b9010b1ffd0305', '536872dc61636b373c8bc7084e7c2f996c746b43', 'ce530f77963955fac5584a68d9fdb76f80043787', '812149e0bae20dee0dc48aa4eb79c4b7115b31b1', '8cdecd9a59b4c2dc815e7d9d37877e74a0000dd1', 'baa583b00296adacc14e479395bb7f1f749aed3a', 'b8703763a1211d558dea4f717ce796c0248e6a89', '750255c31536ad8e04d1ac748a54050ed90bc243', '05290748f4f5e7a1a927ee336ed7c10e92bb383d', 'a8a28363617edd62d5a7945e9157623d40dfa99f', 'b08ba263ede7d753089d0dd239e8db8874818370', '924f429b068120c3bf22dacc0543b8f4fa63222b', '37da32a01747a30c4aa52858182318489006d5a2', 'a7f6343415b72ce6a5d21822e0a2c819f6db336a', '042fbfdef1fa61318d698af4bea04fb10dd370b3', '4db5d363119bd7ebca4b353ce74bfc29319cfa72', '853658d04642950f27060c2f01dc426ff5157715', 'a9e1452c9797fc541df62888755bd43619ccf683', '01b996823462d90c26128c0578fdf6634ed7de90', 'd0d9cef8ed488a72a7b508214f5238cefc944ff1', 'a561e14753aa7cf70a49cdf42d05f32102b3eabe', 'd2cd89117de3ae9f8c7fa01834aa9b41c93de955', '915b2151dc7c5dc5eaece6011338c00c8b1cee28', '702a20bd9a6dc25a22adfebd3a34008a107a281a', 'bdf8d2578cbdcf55bbb613632f7bbbbdf2888592', '905bb6eb744164906dfb5e3fc98bad32e022863a', '4817893ce6628b52264bf47a2dcb12b6e49b8cc9', '40a56ffc58d3bddfa51525beace2e84fc41711e6', 'cfc9a218a9e114969561c458cdedae1d9df02a54', '9f6a3d540b9814f3902e0c8a321f123ba267a814', '00ac9ee8bcc41a3a25b62b444d639d6faf9eeeac', 'a01648cb0d0cd61cdd55080ae16b74dbe7ec3cdd', 'e82feec8ba43930c322761d1062ea60f4332f03c', '99225881fefb0508031f837e045213f44bc0ac07', '0bbfe4e3aacfd266ef8fccb764e1993ad5a5e0d6', 'aad168f832da84edc617160b734ed39e6a46dab2', '74a4c36e85987da9ebaf542f69eca65d095d635f', '9eb2951de310578938ea500035586c72913939d7', 'fecae386b6fb8eb89d2c13321d4b4c7e1bb7e1c6', '36d21b21d414093c5e6cca09810008a3caf2c445', '0561f35a7ee8fd5be9f9ea023d17244663c51f42', '778bb26003446050eb769a25141f6ddd25326508', '861d55d6f7c42370fba5df32b1e29cea04b73de0', '9a669a5b055235385570f72e1b76bec4c033ed44', 'a29df6fb9f0839835cc193a5ef8411a9a6c3307f', 'c5c04dad7f4c25f7ee51d70cbb7a27d33c88c7e1', 'f7253851ffe22d29b76563d7eaae37459a5e43c6', '66298b8b345319cc4d0a4d267ce48ad26439ed76', 'c866bf40e779f0fcced246899447e2afdd9b309f', '208fcd3a54218db67cdf08a0ff69b7b32dddb8e0', 'af56cb70365fc7bf36f1951f7334cfe43c0bfb12', 'c3dfde1f22ba6bb5dc2b2ce0d409c9c9935828a5', '0c238950ae835b907de390ce42d4cbf543b1326c', '766c8a257c8c9b890f4e0f2e0ca207de96134d0b', '45ee5ce00173ac9636c6ffb46aba4925f3bf2890', 'a60eb969715e47add68598ac19672424a738342f', '3fad387b85422a14d0a40145caaae61e170de4fb', 'a8f5950b093ea2c46cd65b9a666e87f62955eb34', '5fb70ed382d62a7cddb15aab640bcccc91308b6f', 'f6d726cb8abb53c681848ef08c01db380287a2b9', '46c9595623f4e55f6446aa783d9bd7446b1a4375', '5032422199e490e9720eaec389b75fd5eb83dc75', '8fb725b86d84b66894c4087d50c23e3d1f6c5707', '33ffcaad2438c68ed1ff1dce93b39930cff3478e', '73b70abe2ed7a84cadd7226d644356743289cc21', '2a45cc067858b15688aa3b23e88b474569d5d6f7', '4b754f7ca91145014e62442ca08b467753ae049f', '4ec7022af8b6229052a294aaa9478f81ac7a58fb', '2e7a50b5a382bf8a4977e90f8c177f4f771fa79c', 'f4f84c43757e882ce8827e63916d712b1020148c', 'c82eaa134e39df538a1cf8b125e1a594e197325e', '8110782125c2b0f4317ef29ff1df44a7b5a3a499', '190c5bcb8dd152856dfcf15ab6c574e99e6e2fe2', 'bbc9a46a0a75ca73d4d52c63e34b26e474750977', '08577523cf306756c8ad47d10f98499c7fc5f1c4', 'f6ad7623cddd4c44e82fd266afd00b6faf467b22', '918ad781afef5f11d43d4033ade4c0584399fb44', 'e903371b28134fb7958bba66fc11bf4791fae77c', 'ce4683799b232e8ed6790f92b37bbb00a3f078b9', 'bfb6a6016ad42101b8ea9868fbcfc7361461c1c0', '3be746ebc1f1c2b9fbf3086008d0ebfbd5284e61', '60aa07f713ef4a1f5fb7a4f53bc3eee721054b3a', '28a3eed02b9a9cbc81ba78fd03718218bd387590', 'a172b13b762b0df21133995e4012c4ff9469b4d1', 'e8511cae867c104ce62f9cca5b1c61cdc4f3de82', 'b4ba8d855eb662107dc11afd4f275fa986e74065', '2b58cb088f7b123b487272794743c86e596f5c8f', '32f7a1300824d67e7ae0963e3c8e6705a0c80413', 'bddd97bbed06634487db470d94178c43704f1ed4', 'e855ae9fb5fd3651d7667728c780e269142f9cf7', 'bc253d2617e9ebca0a6472f485e2342402ef6685', '43fe190fe0e0068eca03917a1e653dcc9e77b5b7', 'd813942ea07178b0f7d3588f2eeabd1935733274', 'aed0385ea4a325a0848376609f31beaa3228212b', '3ad6d3b438b62418bf03475fcab7dc3684ba0663', '1550a57696faae4f45b1f9bcd1a3ced607a2d17e', '6942daad6250706e53d9860f28175d9e769641bf', '0f5976c860f166c1b4ed08e4a82706d28f00c22a', 'cf1902f056421f4625e1ee2d87a22a9938095d24', 'e64dcc4d9bce18f22823089941ea8e0aa3e2bcd1', 'af5000a089e9f618dd9698388862b86f125583fa', '19b9e962c95bb6ec4387be9a55364b42bbd69dbe', '67d885ee249842fb640f01ef3db1985cf6d14424', '7ead2edc8de3fdd307521048e3810895b37a6388', '098c87e50dec9cc07fa6ca104634742cd7734381', 'b05434ba425db216a92b16e8dc5ea6b37e0134e1', '720b68819e6e781f420d7ea6ee8e11a2806501be', 'dd6f633cf8dc2443cc4d14932bee4075a4790ce9', '2f85ce7f5f0d79e5826c78e92ed1a1b2669a9fab'] diff --git a/config.py b/config.py new file mode 100644 index 0000000000000000000000000000000000000000..f1773ad650b3b587a27b9732dbaf4544abfd6ff4 --- /dev/null +++ b/config.py @@ -0,0 +1,83 @@ +import os +import json +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +# Try Loading Keys (Colab support) +try: + from google.colab import userdata + COLAB_HF_TOKEN = userdata.get('HF_TOKEN') + COLAB_GOOGLE_KEY = userdata.get('GOOGLE_API_KEY') + COLAB_PINATA = userdata.get('PINATA_JWT') +except (ImportError, Exception): + COLAB_HF_TOKEN, COLAB_GOOGLE_KEY, COLAB_PINATA = None, None, None + +class AppConfig: + # ========================================== + # โ›“๏ธ BLOCKCHAIN & WEB3 SECRETS + # ========================================== + PRIVATE_KEY = os.environ.get("PRIVATE_KEY") + PURECHAIN_RPC_URL = os.environ.get("PURECHAIN_RPC_URL", "http://3.34.161.207:8548") + PURECHAIN_CONTRACT_ADDRESS = os.environ.get("PURECHAIN_CONTRACT_ADDRESS") + + # Legacy Contract Addresses for History Recovery + PURECHAIN_CONTRACT_ADDRESS_PUREVERSATION = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREVERSATION") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureVersation") + PURECHAIN_CONTRACT_ADDRESS_PURECONVO = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PURECONVO") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureConvo") + PURECHAIN_CONTRACT_ADDRESS_PUREIUUY = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREIUUY") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureIUUY", "0x0a735C97EBd5c645D6B641cBE976FDB26710bAdf") + PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN11 = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN11") + PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN12 = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN12") + PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN13 = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN13") + + CHAIN_ID = int(os.environ.get("PURECHAIN_CHAIN_ID", 900520900520)) + + # ========================================== + # ๐Ÿง  AI & CLOUD STORAGE SECRETS + # ========================================== + GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY") + PINATA_JWT = os.environ.get("PINATA_JWT") + HF_TOKEN = os.environ.get("HF_TOKEN") + GROQ_API_KEY = os.environ.get("GROQ_API_KEY") + + # ========================================== + # ๐Ÿ“‚ DIRECTORY CONFIGURATION + # ========================================== + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + DATASET_DIR = os.environ.get("DATASET_DIR", os.path.join(BASE_DIR, "IEDID")) + PROFILES_DIR = os.environ.get("PROFILES_DIR", os.path.join(BASE_DIR, "lab_profiles")) + + # --- REPO SETTINGS --- + HF_REPO_ID = "toecm/IEDID" + + @classmethod + def setup_directories(cls): + os.makedirs(cls.DATASET_DIR, exist_ok=True) + os.makedirs(cls.PROFILES_DIR, exist_ok=True) + print("๐Ÿ“‚ Directories Ready:") + print(f" - {cls.DATASET_DIR}") + print(f" - {cls.PROFILES_DIR}") + + # --- DYNAMIC ABI LOAD --- + @property + def CONTRACT_ABI(self): + return AppConfig.get_dynamic_abi() + + @classmethod + def get_dynamic_abi(cls): + try: + from src.dynamic_compiler import get_contract_interface + abi, _ = get_contract_interface() + return abi + except Exception as e: + print(f"โš ๏ธ Dynamic ABI load failed: {e}") + return [] + +# For backward compatibility where code uses AppConfig.CONTRACT_ABI directly +# we can initialize it here: +try: + from src.dynamic_compiler import get_contract_interface + AppConfig.CONTRACT_ABI, _ = get_contract_interface() +except Exception as e: + print(f"โš ๏ธ Startup compilation failed: {e}") + AppConfig.CONTRACT_ABI = [] diff --git a/convert.py b/convert.py new file mode 100644 index 0000000000000000000000000000000000000000..d299d71aabdeae0a2a1aa23e86ac76078224713d --- /dev/null +++ b/convert.py @@ -0,0 +1,4 @@ +import codecs +text = codecs.open('hf_files_june12.txt', 'r', 'utf-16le').read() +with codecs.open('hf_files_june12_utf8.txt', 'w', 'utf-8') as f: + f.write(text.replace('\ufeff', '')) diff --git a/delete_invalid.py b/delete_invalid.py new file mode 100644 index 0000000000000000000000000000000000000000..4ba81f43f9f41462a13662be0ac4e39af6de93db --- /dev/null +++ b/delete_invalid.py @@ -0,0 +1,8 @@ +from huggingface_hub import HfApi +api = HfApi() + +try: + api.delete_file("Asusu Igbo English.csv", repo_id="toecm/IEDID", repo_type="dataset") + print("Deleted Asusu Igbo English.csv") +except Exception as e: + print("Failed to delete Asusu Igbo English.csv:", e) diff --git a/deploy_bypass.py b/deploy_bypass.py new file mode 100644 index 0000000000000000000000000000000000000000..ab03e7002c50f9b6180ba49a04b494d7d3003c2c --- /dev/null +++ b/deploy_bypass.py @@ -0,0 +1,80 @@ +import os +import json +from web3 import Web3 +from eth_account import Account +from dotenv import load_dotenv + +# Load your secrets +load_dotenv() + +# --- CONFIGURATION --- +RPC_URL = os.getenv("PURECHAIN_NETWORK_URL") or "https://purechainnode.com:8547" +PRIVATE_KEY = os.getenv("METAMASK_PRIVATE_KEY") # Ensure this is set in .env or secrets + +# 1. PASTE YOUR ABI HERE (Copied from Remix) +CONTRACT_ABI = json.loads(""" +[ + {"inputs": [], "stateMutability": "nonpayable", "type": "constructor"}, + {"inputs": [{"internalType": "string", "name": "_phrase", "type": "string"}, {"internalType": "string", "name": "_dialect", "type": "string"}, {"internalType": "string", "name": "_ipfsCid", "type": "string"}, {"internalType": "string", "name": "_license", "type": "string"}], "name": "proposeEntry", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, + {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "id", "type": "uint256"}, {"indexed": false, "internalType": "string", "name": "phrase", "type": "string"}, {"indexed": true, "internalType": "address", "name": "proposer", "type": "address"}], "name": "EntryProposed", "type": "event"} +] +""") +# (Note: I put a shortened ABI here for safety. Ideally, paste your FULL ABI from Remix to be safe, +# but for deployment, we mostly just need the Bytecode and Constructor.) + +# 2. PASTE YOUR BYTECODE HERE (Copied from Remix "Bytecode" button) +# It will be a massive string like "60806040..." +# Make sure it is inside the quotes! +BYTECODE = "608060405234801561000f575f5ffd5b503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280600115158152602001606481526020016040518060400160405280600581526020017f41646d696e0000000000000000000000000000000000000000000000000000008152508152505f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201908161011c9190610373565b50905050610442565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806101a057607f821691505b6020821081036101b3576101b261015c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101da565b61021f86836101da565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61026361025e61025984610237565b610240565b610237565b9050919050565b5f819050919050565b61027c83610249565b6102906102888261026a565b8484546101e6565b825550505050565b5f5f905090565b6102a7610298565b6102b2818484610273565b505050565b5f5b828110156102d8576102cd5f82840161029f565b6001810190506102b9565b505050565b601f82111561032b578282111561032a576102f7816101b9565b610300836101cb565b610309856101cb565b6020861015610316575f90505b808301610325828403826102b7565b505050505b5b505050565b5f82821c905092915050565b5f61034b5f1984600802610330565b1980831691505092915050565b5f610363838361033c565b9150826002028217905092915050565b61037c82610125565b67ffffffffffffffff8111156103955761039461012f565b5b61039f8254610189565b6103aa8282856102dd565b5f60209050601f8311600181146103db575f84156103c9578287015190505b6103d38582610358565b86555061043a565b601f1984166103e9866101b9565b5f5b82811015610410578489015182556001820191506020850194506020810190506103eb565b8683101561042d5784890151610429601f89168261033c565b8355505b6001600288020188555050505b505050505050565b6122008061044f5f395ff3fe608060405234801561000f575f5ffd5b50600436106100cd575f3560e01c806395d89b411161008a578063d40f299a11610064578063d40f299a1461021b578063e8a3c5a714610237578063efebb0441461026b578063f3c2cf6514610287576100cd565b806395d89b41146101aa578063b30906d4146101c8578063b6602c3a146101ff576100cd565b806301bc237d146100d157806306fdde03146101035780633f633e651461012157806362da83131461013d57806379a0f97b1461015b57806386c8ce7f1461018c575b5f5ffd5b6100eb60048036038101906100e6919061157a565b6102b8565b6040516100fa93929190611647565b60405180910390f35b61010b61036f565b6040516101189190611683565b60405180910390f35b61013b600480360381019061013691906117cf565b6103a8565b005b6101456105d9565b60405161015291906118a3565b60405180910390f35b610175600480360381019061017091906118bc565b6105df565b604051610183929190611903565b60405180910390f35b6101946108dd565b6040516101a19190611940565b60405180910390f35b6101b2610902565b6040516101bf9190611683565b60405180910390f35b6101e260048036038101906101dd9190611983565b61093b565b6040516101f69897969594939291906119ae565b60405180910390f35b610219600480360381019061021491906117cf565b610bc2565b005b61023560048036038101906102309190611a46565b610db9565b005b610251600480360381019061024c9190611aa0565b610ee7565b604051610262959493929190611afa565b60405180910390f35b61028560048036038101906102809190611983565b6110fc565b005b6102a1600480360381019061029c9190611983565b61138a565b6040516102af929190611b60565b60405180910390f35b5f602052805f5260405f205f91509050805f015f9054906101000a900460ff16908060010154908060020180546102ee90611bbb565b80601f016020809104026020016040519081016040528092919081815260200182805461031a90611bbb565b80156103655780601f1061033c57610100808354040283529160200191610365565b820191905f5260205f20905b81548152906001019060200180831161034857829003601f168201915b5050505050905083565b6040518060400160405280601b81526020017f50757265436f6e766f205265736561726368205265676973747279000000000081525081565b5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff16610432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042990611c35565b60405180910390fd5b60025f81548092919061044490611c80565b919050555060405180610100016040528060025481526020018581526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020015f81526020015f151581525060035f60025481526020019081526020015f205f820151815f015560208201518160010190816104cd9190611e78565b5060408201518160020190816104e39190611e78565b5060608201518160030190816104f99190611e78565b506080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050190816105559190611e78565b5060c0820151816006015560e0820151816007015f6101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166002547f41bbb82aa0096a4ef6e73d180bcf005a06dae558a2bd374fefd8e9d3d116d693866040516105cb9190611683565b60405180910390a350505050565b60025481565b60605f5f6004846040516105f39190611f81565b90815260200160405180910390208054905011610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c90611fe1565b60405180910390fd5b5f6004846040516106569190611f81565b908152602001604051809103902060016004866040516106769190611f81565b9081526020016040518091039020805490506106929190611fff565b815481106106a3576106a2612032565b5b905f5260205f2090600502016040518060a00160405290815f82015481526020016001820180546106d390611bbb565b80601f01602080910402602001604051908101604052809291908181526020018280546106ff90611bbb565b801561074a5780601f106107215761010080835404028352916020019161074a565b820191905f5260205f20905b81548152906001019060200180831161072d57829003601f168201915b5050505050815260200160028201805461076390611bbb565b80601f016020809104026020016040519081016040528092919081815260200182805461078f90611bbb565b80156107da5780601f106107b1576101008083540402835291602001916107da565b820191905f5260205f20905b8154815290600101906020018083116107bd57829003601f168201915b505050505081526020016003820180546107f390611bbb565b80601f016020809104026020016040519081016040528092919081815260200182805461081f90611bbb565b801561086a5780601f106108415761010080835404028352916020019161086a565b820191905f5260205f20905b81548152906001019060200180831161084d57829003601f168201915b50505050508152602001600482015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090508060400151815f01519250925050915091565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600581526020017f434f4e564f00000000000000000000000000000000000000000000000000000081525081565b6003602052805f5260405f205f91509050805f01549080600101805461096090611bbb565b80601f016020809104026020016040519081016040528092919081815260200182805461098c90611bbb565b80156109d75780601f106109ae576101008083540402835291602001916109d7565b820191905f5260205f20905b8154815290600101906020018083116109ba57829003601f168201915b5050505050908060020180546109ec90611bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1890611bbb565b8015610a635780601f10610a3a57610100808354040283529160200191610a63565b820191905f5260205f20905b815481529060010190602001808311610a4657829003601f168201915b505050505090806003018054610a7890611bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa490611bbb565b8015610aef5780601f10610ac657610100808354040283529160200191610aef565b820191905f5260205f20905b815481529060010190602001808311610ad257829003601f168201915b505050505090806004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806005018054610b2990611bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5590611bbb565b8015610ba05780601f10610b7757610100808354040283529160200191610ba0565b820191905f5260205f20905b815481529060010190602001808311610b8357829003601f168201915b505050505090806006015490806007015f9054906101000a900460ff16905088565b5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff16610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390611c35565b60405180910390fd5b5f6040518060a001604052804281526020018581526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff168152509050600485604051610c9c9190611f81565b908152602001604051809103902081908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f01556020820151816001019081610cee9190611e78565b506040820151816002019081610d049190611e78565b506060820151816003019081610d1a9190611e78565b506080820151816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505084604051610d719190611f81565b60405180910390207f55e378dbc81cbf3764f2fdc9915435a0de49effbb859d048f04415a779e405518442604051610daa929190611903565b60405180910390a25050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f906120a9565b60405180910390fd5b6040518060600160405280600115158152602001600a8152602001828152505f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff021916908315150217905550602082015181600101556040820151816002019081610edf9190611e78565b509050505050565b6004828051602081018201805184825260208301602085012081835280955050505050508181548110610f18575f80fd5b905f5260205f2090600502015f9150915050805f015490806001018054610f3e90611bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6a90611bbb565b8015610fb55780601f10610f8c57610100808354040283529160200191610fb5565b820191905f5260205f20905b815481529060010190602001808311610f9857829003601f168201915b505050505090806002018054610fca90611bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff690611bbb565b80156110415780601f1061101857610100808354040283529160200191611041565b820191905f5260205f20905b81548152906001019060200180831161102457829003601f168201915b50505050509080600301805461105690611bbb565b80601f016020809104026020016040519081016040528092919081815260200182805461108290611bbb565b80156110cd5780601f106110a4576101008083540402835291602001916110cd565b820191905f5260205f20905b8154815290600101906020018083116110b057829003601f168201915b505050505090806004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b5f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff16611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90611c35565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1660035f8381526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e90612111565b60405180910390fd5b60035f8281526020019081526020015f206007015f9054906101000a900460ff1615611288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127f90612179565b60405180910390fd5b60035f8281526020019081526020015f206006015f8154809291906112ac90611c80565b9190505550600260035f8381526020019081526020015f20600601541061137c57600160035f8381526020019081526020015f206007015f6101000a81548160ff02191690831515021790555061133760035f8381526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032611468565b3373ffffffffffffffffffffffffffffffffffffffff16817f82a82ea54aa0cfb8695810af1805d7f37f71a2683a57dc52567342b0a001f85260405160405180910390a35b61138733600a611468565b50565b60605f60035f8481526020019081526020015f2060050160035f8581526020019081526020015f206004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168180546113e190611bbb565b80601f016020809104026020016040519081016040528092919081815260200182805461140d90611bbb565b80156114585780601f1061142f57610100808354040283529160200191611458565b820191905f5260205f20905b81548152906001019060200180831161143b57829003601f168201915b5050505050915091509150915091565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f8282546114b69190612197565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f42bcf4689d0211adce4e556ee455319d34e671e8b8a762034e146461fb1be82d8260405161150391906118a3565b60405180910390a25050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61154982611520565b9050919050565b6115598161153f565b8114611563575f5ffd5b50565b5f8135905061157481611550565b92915050565b5f6020828403121561158f5761158e611518565b5b5f61159c84828501611566565b91505092915050565b5f8115159050919050565b6115b9816115a5565b82525050565b5f819050919050565b6115d1816115bf565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611619826115d7565b61162381856115e1565b93506116338185602086016115f1565b61163c816115ff565b840191505092915050565b5f60608201905061165a5f8301866115b0565b61166760208301856115c8565b8181036040830152611679818461160f565b9050949350505050565b5f6020820190508181035f83015261169b818461160f565b905092915050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6116e1826115ff565b810181811067ffffffffffffffff82111715611700576116ff6116ab565b5b80604052505050565b5f61171261150f565b905061171e82826116d8565b919050565b5f67ffffffffffffffff82111561173d5761173c6116ab565b5b611746826115ff565b9050602081019050919050565b828183375f83830152505050565b5f61177361176e84611723565b611709565b90508281526020810184848401111561178f5761178e6116a7565b5b61179a848285611753565b509392505050565b5f82601f8301126117b6576117b56116a3565b5b81356117c6848260208601611761565b91505092915050565b5f5f5f5f608085870312156117e7576117e6611518565b5b5f85013567ffffffffffffffff8111156118045761180361151c565b5b611810878288016117a2565b945050602085013567ffffffffffffffff8111156118315761183061151c565b5b61183d878288016117a2565b935050604085013567ffffffffffffffff81111561185e5761185d61151c565b5b61186a878288016117a2565b925050606085013567ffffffffffffffff81111561188b5761188a61151c565b5b611897878288016117a2565b91505092959194509250565b5f6020820190506118b65f8301846115c8565b92915050565b5f602082840312156118d1576118d0611518565b5b5f82013567ffffffffffffffff8111156118ee576118ed61151c565b5b6118fa848285016117a2565b91505092915050565b5f6040820190508181035f83015261191b818561160f565b905061192a60208301846115c8565b9392505050565b61193a8161153f565b82525050565b5f6020820190506119535f830184611931565b92915050565b611962816115bf565b811461196c575f5ffd5b50565b5f8135905061197d81611959565b92915050565b5f6020828403121561199857611997611518565b5b5f6119a58482850161196f565b91505092915050565b5f610100820190506119c25f83018b6115c8565b81810360208301526119d4818a61160f565b905081810360408301526119e8818961160f565b905081810360608301526119fc818861160f565b9050611a0b6080830187611931565b81810360a0830152611a1d818661160f565b9050611a2c60c08301856115c8565b611a3960e08301846115b0565b9998505050505050505050565b5f5f60408385031215611a5c57611a5b611518565b5b5f611a6985828601611566565b925050602083013567ffffffffffffffff811115611a8a57611a8961151c565b5b611a96858286016117a2565b9150509250929050565b5f5f60408385031215611ab657611ab5611518565b5b5f83013567ffffffffffffffff811115611ad357611ad261151c565b5b611adf858286016117a2565b9250506020611af08582860161196f565b9150509250929050565b5f60a082019050611b0d5f8301886115c8565b8181036020830152611b1f818761160f565b90508181036040830152611b33818661160f565b90508181036060830152611b47818561160f565b9050611b566080830184611931565b9695505050505050565b5f6040820190508181035f830152611b78818561160f565b9050611b876020830184611931565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611bd257607f821691505b602082108103611be557611be4611b8e565b5b50919050565b7f4d757374206265207265676973746572656420726573656172636865720000005f82015250565b5f611c1f601d836115e1565b9150611c2a82611beb565b602082019050919050565b5f6020820190508181035f830152611c4c81611c13565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c8a826115bf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611cbc57611cbb611c53565b5b600182019050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611d237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611ce8565b611d2d8683611ce8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611d68611d63611d5e846115bf565b611d45565b6115bf565b9050919050565b5f819050919050565b611d8183611d4e565b611d95611d8d82611d6f565b848454611cf4565b825550505050565b5f5f905090565b611dac611d9d565b611db7818484611d78565b505050565b5f5b82811015611ddd57611dd25f828401611da4565b600181019050611dbe565b505050565b601f821115611e305782821115611e2f57611dfc81611cc7565b611e0583611cd9565b611e0e85611cd9565b6020861015611e1b575f90505b808301611e2a82840382611dbc565b505050505b5b505050565b5f82821c905092915050565b5f611e505f1984600802611e35565b1980831691505092915050565b5f611e688383611e41565b9150826002028217905092915050565b611e81826115d7565b67ffffffffffffffff811115611e9a57611e996116ab565b5b611ea48254611bbb565b611eaf828285611de2565b5f60209050601f831160018114611ee0575f8415611ece578287015190505b611ed88582611e5d565b865550611f3f565b601f198416611eee86611cc7565b5f5b82811015611f1557848901518255600182019150602085019450602081019050611ef0565b86831015611f325784890151611f2e601f891682611e41565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f611f5b826115d7565b611f658185611f47565b9350611f758185602086016115f1565b80840191505092915050565b5f611f8c8284611f51565b915081905092915050565b7f4e6f206261636b75707320666f756e64000000000000000000000000000000005f82015250565b5f611fcb6010836115e1565b9150611fd682611f97565b602082019050919050565b5f6020820190508181035f830152611ff881611fbf565b9050919050565b5f612009826115bf565b9150612014836115bf565b925082820390508181111561202c5761202b611c53565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f6e6c79204c61622041646d696e2063616e20646f20746869730000000000005f82015250565b5f612093601a836115e1565b915061209e8261205f565b602082019050919050565b5f6020820190508181035f8301526120c081612087565b9050919050565b7f43616e6e6f7420766572696679206f776e20656e7472790000000000000000005f82015250565b5f6120fb6017836115e1565b9150612106826120c7565b602082019050919050565b5f6020820190508181035f830152612128816120ef565b9050919050565b7f416c7265616479207665726966696564000000000000000000000000000000005f82015250565b5f6121636010836115e1565b915061216e8261212f565b602082019050919050565b5f6020820190508181035f83015261219081612157565b9050919050565b5f6121a1826115bf565b91506121ac836115bf565b92508282019050808211156121c4576121c3611c53565b5b9291505056fea2646970667358221220e24e0f3ae7d1d6cdaa0b5d8e632515023486c54b35638c88e17922cf89f8202f64736f6c63430008210033" + +def deploy(): + if not PRIVATE_KEY or not RPC_URL: + print("โŒ Error: Missing Private Key or RPC URL in secrets.") + return + + # Connect + w3 = Web3(Web3.HTTPProvider(RPC_URL)) + if not w3.is_connected(): + print("โŒ Failed to connect to PureChain.") + return + + account = Account.from_key(PRIVATE_KEY) + print(f"๐Ÿš€ Deploying from: {account.address}") + print(f"๐Ÿ’ฐ Current Balance: {w3.eth.get_balance(account.address)}") + + # Prepare Contract + Contract = w3.eth.contract(abi=CONTRACT_ABI, bytecode=BYTECODE) + + # 3. BUILD TRANSACTION (The "Antigravity" Part) + # We manually set gasPrice to 0 here. Python won't stop us like MetaMask does. + try: + print("โณ Building Zero-Gas Transaction...") + construct_txn = Contract.constructor().build_transaction({ + 'from': account.address, + 'nonce': w3.eth.get_transaction_count(account.address), + 'gas': 3000000, # Arbitrary limit (since it's free) + 'gasPrice': 0, # <--- THIS IS THE KEY + 'chainId': 900520900520 + }) + + # 4. Sign + signed = w3.eth.account.sign_transaction(construct_txn, private_key=PRIVATE_KEY) + + # 5. Send + print("๐Ÿ“ก Sending to PureChain...") + tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction) + print(f"โœ… Transaction Sent! Hash: {w3.to_hex(tx_hash)}") + + # 6. Wait for Receipt + print("Waiting for deployment confirmation...") + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + + print(f"\n๐ŸŽ‰ SUCCESS! Contract Deployed at:") + print(f"๐Ÿ‘‰ {tx_receipt.contractAddress} ๐Ÿ‘ˆ") + print("\n(Copy this address into your config.py)") + + except Exception as e: + print(f"โŒ Deployment Failed: {e}") + +if __name__ == "__main__": + deploy() \ No newline at end of file diff --git a/deploy_purechain.py b/deploy_purechain.py new file mode 100644 index 0000000000000000000000000000000000000000..93065ae396ec7f7ae0f926cb9b28a8c7ea96c2e8 --- /dev/null +++ b/deploy_purechain.py @@ -0,0 +1,49 @@ +import json +import os +from web3 import Web3 +from config import AppConfig + +# --- 1. SETUP --- +# Connect to Pure Chain using your config +w3 = Web3(Web3.HTTPProvider(AppConfig.PURECHAIN_RPC_URL)) +account = w3.eth.account.from_key(AppConfig.PRIVATE_KEY) + +print(f"๐Ÿ”Œ Connected to: {AppConfig.PURECHAIN_RPC_URL}") +print(f"๐Ÿ‘ค Deploying as: {account.address}") + +# --- 2. DYNAMIC COMPILATION --- +print("โš™๏ธ Dynamically compiling contract...") +from src.dynamic_compiler import get_contract_interface +abi, bytecode = get_contract_interface() + +# --- 3. BUILD TRANSACTION --- +# Prepare the contract object +Contract = w3.eth.contract(abi=abi, bytecode=bytecode) + +# Force a LEGACY transaction (Type 0/1) by manually setting gasPrice +# and avoiding maxFeePerGas/maxPriorityFeePerGas +print("๐Ÿ›  Building Legacy Transaction...") +tx = Contract.constructor().build_transaction({ + 'from': account.address, + 'nonce': w3.eth.get_transaction_count(account.address), + 'gas': 6000000, + 'gasPrice': 0, # <--- This forces Legacy Mode AND 0 cost for PoA! + 'chainId': 900520900520 +}) + +# --- 4. SIGN & SEND --- +print("โœ๏ธ Signing...") +signed_tx = w3.eth.account.sign_transaction(tx, AppConfig.PRIVATE_KEY) + +print("๐Ÿš€ Sending to Pure Chain...") +tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) +print(f"โœ… Transaction Sent! Hash: {w3.to_hex(tx_hash)}") + +# --- 5. WAIT FOR RECEIPT --- +print("โณ Waiting for confirmation...") +tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + +print("-" * 30) +print(f"๐ŸŽ‰ CONTRACT DEPLOYED AT: {tx_receipt.contractAddress}") +print("-" * 30) +print("๐Ÿ‘‰ Copy this address and put it in your config.py!") \ No newline at end of file diff --git a/distill_knowledge.py b/distill_knowledge.py new file mode 100644 index 0000000000000000000000000000000000000000..bc33527cbb1be2b97fcbdb4128b8ed5c9cd78ec1 --- /dev/null +++ b/distill_knowledge.py @@ -0,0 +1,130 @@ +import os +import csv +import json +import asyncio +from openai import AsyncOpenAI +from dotenv import load_dotenv + +load_dotenv() + +# Configure Teacher Model +AI_API_KEY = os.getenv("QWEN_API_KEY", "your-api-key-here") +AI_BASE_URL = os.getenv("QWEN_BASE_URL", "https://dashscope-intl.aliyuncs.com/compatible-mode/v1") +TEACHER_MODEL_NAME = os.getenv("TEACHER_MODEL_NAME", "qwen3-coder-480b-a35b") + +client = AsyncOpenAI( + api_key=AI_API_KEY, + base_url=AI_BASE_URL +) + +IEDID_DIR = "IEDID" +OUTPUT_FILE = "synthetic_slm_dataset.jsonl" + +async def generate_synthetic_data(dialect, utterance, clarification): + system_prompt = ( + f"You are a master linguist specializing in {dialect} and data augmentation for SLM fine-tuning.\n" + f"I will provide a human-verified conversation pair.\n" + f"Dialect Utterance: '{utterance}'\n" + f"Standard English Meaning: '{clarification}'\n\n" + f"Generate 3 highly accurate, synthetically varied conversation pairs that capture the exact same " + f"linguistic rules, phonetic syntax, and cultural tone as the example.\n" + f"Respond ONLY in valid JSON array format, where each object has 'prompt' (Standard English) and 'completion' ({dialect})." + ) + + try: + response = await client.chat.completions.create( + model=TEACHER_MODEL_NAME, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": "Generate 3 synthetic pairs in a JSON array."} + ], + temperature=0.7, + max_tokens=1024 + ) + + content = response.choices[0].message.content.strip() + # Fallback parsing if wrapped in markdown + if content.startswith("```json"): + content = content[7:-3] + elif content.startswith("```"): + content = content[3:-3] + + data = json.loads(content) + # Expected format: [{"prompt": "...", "completion": "..."}, ...] + + # If wrapped in a key + if isinstance(data, dict): + for key in data: + if isinstance(data[key], list): + return data[key] + return [] + + return data if isinstance(data, list) else [] + except Exception as e: + print(f"Error generating data for '{utterance}': {e}") + return [] + +async def process_csv(filepath): + print(f"Processing {filepath}...") + dataset = [] + + with open(filepath, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + rows = list(reader)[:10] # Limit to first 10 per file for demonstration/testing speed + + for row in rows: + utterance = row.get('Utterance') + clarification = row.get('Clarification') + dialect = row.get('Dialect', 'Unknown Dialect') + + if not utterance or not clarification: + continue + + print(f" Distilling variations for: {utterance}") + synthetic_pairs = await generate_synthetic_data(dialect, utterance, clarification) + + for pair in synthetic_pairs: + if "prompt" in pair and "completion" in pair: + dataset.append({ + "system": f"You are an expert polyglot interpreter. Translate Standard English to {dialect}.", + "user": pair["prompt"], + "assistant": pair["completion"] + }) + + return dataset + +PRIORITY_DIALECTS = [ + "African American Vernacular English", + "Nigerian Pidgin English", + "Gyeongsang Satoori", + "Jeolla Satoori", + "Chungcheong Satoori", + "Jeju Satoori", + "Gangwon Satoori", + "Hamgyong Satoori" +] + +async def main(): + print(f"Starting Knowledge Distillation Pipeline (Teacher Model: {TEACHER_MODEL_NAME})...") + all_synthetic_data = [] + + # Read IEDID CSVs + if os.path.exists(IEDID_DIR): + for filename in os.listdir(IEDID_DIR): + # Only process if it's a CSV, not minted, and matches a priority dialect + is_priority = any(dialect in filename for dialect in PRIORITY_DIALECTS) + if filename.endswith(".csv") and "minted" not in filename and is_priority: + filepath = os.path.join(IEDID_DIR, filename) + data = await process_csv(filepath) + all_synthetic_data.extend(data) + + # Save to JSONL + with open(OUTPUT_FILE, 'w', encoding='utf-8') as f: + for entry in all_synthetic_data: + f.write(json.dumps(entry) + '\n') + + print(f"\nSuccessfully generated {len(all_synthetic_data)} synthetic training pairs!") + print(f"Saved to {OUTPUT_FILE}. Ready for HuggingFace AutoTrain or LoRA fine-tuning.") + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/dump_igbo.py b/dump_igbo.py new file mode 100644 index 0000000000000000000000000000000000000000..5e8e61ba4f3327f15634583e15053ac13f9c476f --- /dev/null +++ b/dump_igbo.py @@ -0,0 +1,6 @@ +import pandas as pd +import codecs + +df = pd.read_csv('hf://datasets/toecm/IEDID/Asแปฅsแปฅ Igbo.csv') +with codecs.open('igbo_out_utf8.txt', 'w', 'utf-8') as f: + f.write(str(df.to_dict())) diff --git a/dump_restored_igbo.py b/dump_restored_igbo.py new file mode 100644 index 0000000000000000000000000000000000000000..7c1df8a9552bdda904a3d1bb31f9cb07d4912490 --- /dev/null +++ b/dump_restored_igbo.py @@ -0,0 +1,6 @@ +import pandas as pd +import codecs + +df = pd.read_csv('restored_Asusu_Igbo.csv') +with codecs.open('restored_igbo_out_utf8.txt', 'w', 'utf-8') as f: + f.write(str(df.to_dict())) diff --git a/env.txt b/env.txt new file mode 100644 index 0000000000000000000000000000000000000000..53b41c8c48caf2e602e2d6bea76e8983c8dc1b0b --- /dev/null +++ b/env.txt @@ -0,0 +1,2 @@ +# PURECHAIN_NETWORK_URL is injected by Hugging Face Secrets +# METAMASK_PRIVATE_KEY is injected by Hugging Face Secrets \ No newline at end of file diff --git a/expand_languages.py b/expand_languages.py new file mode 100644 index 0000000000000000000000000000000000000000..b95c1e5c3def9c192aaba935623c96a7a8c3c4ca --- /dev/null +++ b/expand_languages.py @@ -0,0 +1,123 @@ +import os +import json + +iedid_dir = 'c:/Users/toecm/Documents/Pure Versation/pureversation/backend/IEDID' +lab_profiles_dir = 'c:/Users/toecm/Documents/Pure Versation/pureversation/backend/lab_profiles' + +# Top languages and representative dialects +top_languages = { + 'Mandarin Chinese': ['Standard Mandarin', 'Beijing Dialect', 'Taiwanese Mandarin', 'Singaporean Mandarin'], + 'Spanish': ['Castilian Spanish', 'Mexican Spanish', 'Argentine Spanish', 'Colombian Spanish', 'Caribbean Spanish'], + 'Hindi': ['Standard Hindi', 'Bhojpuri', 'Awadhi', 'Haryanvi', 'Rajasthani'], + 'Arabic': ['Modern Standard Arabic', 'Egyptian Arabic', 'Levantine Arabic', 'Gulf Arabic', 'Maghrebi Arabic'], + 'Bengali': ['Rarhi', 'Varendri', 'Kamarupi', 'Bangali', 'Sylheti'], + 'Portuguese': ['Brazilian Portuguese', 'European Portuguese', 'Angolan Portuguese', 'Mozambican Portuguese'], + 'Russian': ['Northern Russian', 'Central Russian', 'Southern Russian'], + 'Japanese': ['Kanto', 'Kansai', 'Kyushu', 'Tohoku'], + 'Western Punjabi': ['Majhi', 'Pothohari', 'Jhangochi', 'Shahpuri'], + 'Marathi': ['Standard Marathi', 'Varhadi', 'Konkani', 'Deshi'], + 'Telugu': ['Coastal Telugu', 'Rayalaseema', 'Telangana'], + 'Wu Chinese': ['Shanghainese', 'Suzhounese', 'Wenzhounese'], + 'Turkish': ['Istanbul Turkish', 'Rumelian', 'Anatolian'], + 'Korean': ['Seoul Dialect', 'Gyeongsang Satoori', 'Jeolla Satoori', 'Chungcheong Satoori', 'Jeju Dialect'], + 'French': ['Metropolitan French', 'Quebec French', 'African French', 'Belgian French', 'Swiss French'], + 'German': ['High German', 'Low German', 'Bavarian', 'Austrian German', 'Swiss German'], + 'Vietnamese': ['Northern Vietnamese', 'Central Vietnamese', 'Southern Vietnamese'], + 'Tamil': ['Central Tamil', 'Madurai Tamil', 'Kongu Tamil', 'Chennai Tamil', 'Sri Lankan Tamil'], + 'Yue Chinese (Cantonese)': ['Guangzhou Cantonese', 'Hong Kong Cantonese', 'Macau Cantonese'], + 'Urdu': ['Dakhini', 'Rekhta'], + 'Javanese': ['Central Javanese', 'Eastern Javanese', 'Western Javanese'], + 'Italian': ['Standard Italian', 'Neapolitan', 'Sicilian', 'Venetian'], + 'Egyptian Arabic': ['Cairene', 'Saidi', 'Alexandrian'], + 'Gujarati': ['Standard Gujarati', 'Kathiawadi', 'Surati', 'Pattani'], + 'Iranian Persian': ['Tehrani', 'Shirazi', 'Isfahani', 'Mashhadi'], + 'Bhojpuri': ['Northern Bhojpuri', 'Southern Bhojpuri', 'Western Bhojpuri'], + 'Min Nan Chinese': ['Hokkien', 'Teochew', 'Hainanese'], + 'Hakka Chinese': ['Meixian', 'Hailu', 'Sixian'], + 'Jin Chinese': ['Bingzhou', 'Lรผliang', 'Zhangjiakou-Hohhot'], + 'Hausa': ['Kano', 'Sokoto', 'Zaria', 'Katsina'], + 'Kannada': ['Mysore', 'Hubli', 'Mangalore', 'Kundapura'], + 'Indonesian': ['Standard Indonesian', 'Jakarta Indonesian', 'Papuan Malay'], + 'Polish': ['Greater Polish', 'Lesser Polish', 'Masovian', 'Silesian'], + 'Yoruba': ['Standard Yoruba', 'Ibadan', 'Egba', 'Ijebu'], + 'Xiang Chinese': ['Changyi', 'Loushao', 'Chenxรผ'], + 'Malayalam': ['South Kerala', 'Central Kerala', 'North Kerala'], + 'Odia': ['Mughalbandi', 'Sambalpuri', 'Ganjami', 'Desia'], + 'Maithili': ['Standard Maithili', 'Bajjika', 'Angika'], + 'Burmese': ['Standard Burmese', 'Mandalay', 'Yangon'], + 'Sunda': ['Priangan', 'Banten', 'Cirebon'], + 'Sudanese Arabic': ['Khartoum', 'Western Sudanese'], + 'Algerian Arabic': ['Algiers', 'Oran', 'Constantine'], + 'Moroccan Arabic': ['Rabat', 'Casablanca', 'Fes'], + 'Ukrainian': ['Northern Ukrainian', 'Southwestern Ukrainian', 'Southeastern Ukrainian'], + 'Igbo': ['Standard Igbo', 'Owerri', 'Onitsha', 'Umuahia', 'Orlu'], + 'Northern Uzbek': ['Tashkent', 'Fergana', 'Khorezm'], + 'Sindhi': ['Vicholi', 'Lari', 'Thari', 'Kachhi'], + 'North Levantine Arabic': ['Syrian', 'Lebanese'], + 'Romanian': ['Moldavian', 'Wallachian', 'Transylvanian'], + 'Tagalog': ['Manila', 'Batangas', 'Bulacan', 'Tayabas'], + 'Dutch': ['Hollandic', 'Brabantian', 'Limburgish'], + 'Saสฝidi Arabic': ['Upper Egyptian'], + 'Gan Chinese': ['Nanchang', 'Yichun', 'Ji\'an'], + 'Amharic': ['Gondar', 'Gojjam', 'Shoa'], + 'Northern Pashto': ['Peshawari', 'Kabul'], + 'Magahi': ['Standard Magahi', 'Khortha'], + 'Thai': ['Central Thai', 'Khorat', 'Southern Thai'], + 'Saraiki': ['Multani', 'Derawali', 'Thali'], + 'Khmer': ['Standard Khmer', 'Northern Khmer', 'Western Khmer'], + 'Chhattisgarhi': ['Kedri', 'Khandi', 'Laria'], + 'Somali': ['Northern Somali', 'Benaadir', 'Maay'], + 'Malay': ['Standard Malay', 'Kelantanese', 'Terengganu'], + 'Cebuano': ['Standard Cebuano', 'Boholano', 'Leyteรฑo'], + 'Nepali': ['Standard Nepali', 'Eastern Nepali', 'Western Nepali'], + 'Mesopotamian Arabic': ['Baghdadi', 'Basrawi', 'Moslawi'], + 'Assamese': ['Eastern Assamese', 'Central Assamese', 'Kamrupi', 'Goalpariya'], + 'Sinhalese': ['Standard Sinhala', 'Kandyan', 'Southern Sinhala'], + 'Northern Kurdish': ['Kurmanji', 'Badini'], + 'Hejazi Arabic': ['Meccan', 'Jeddawi', 'Medani'], + 'Nigerian Fulfulde': ['Kano', 'Katsina', 'Sokoto'], + 'Bavarian': ['North Bavarian', 'Central Bavarian', 'South Bavarian'], + 'South Azerbaijani': ['Tabrizi', 'Urmia'], + 'Greek': ['Standard Greek', 'Cypriot Greek', 'Cretan Greek', 'Pontic Greek'], + 'Chittagonian': ['Standard Chittagonian', 'Rohingya'], + 'Kazakh': ['Northeastern Kazakh', 'Southern Kazakh', 'Western Kazakh'], + 'Deccan': ['Standard Deccani'], + 'Hungarian': ['Alfรถld', 'Transdanubian', 'Szรฉkely'], + 'Kinyarwanda': ['Standard Kinyarwanda'], + 'Zulu': ['Standard Zulu', 'Lala', 'Qwabe'], + 'South Levantine Arabic': ['Palestinian', 'Jordanian'], + 'Tunisian Arabic': ['Tunis', 'Sfax', 'Sahel'], + 'Sanaani Arabic': ['Sana\'a'], + 'Min Bei Chinese': ['Jian\'ou'], + 'Southern Pashto': ['Kandahari', 'Quetta'], + 'Rundi': ['Standard Kirundi'], + 'Czech': ['Common Czech', 'Moravian', 'Silesian'], + 'Taสฝizzi-Adeni Arabic': ['Ta\'izzi', 'Adeni'], + 'Uyghur': ['Central Uyghur', 'Hotan', 'Lop'], + 'Min Dong Chinese': ['Fuzhou'], + 'Sylheti': ['Standard Sylheti'], + 'Swahili': ['Kiunguja', 'Kimvita', 'Amu', 'Mrimima', 'Pemba'] +} + +for lang, dialects in top_languages.items(): + # 1. Create IEDID + lang_data_dir = os.path.join(iedid_dir, lang, 'data') + os.makedirs(lang_data_dir, exist_ok=True) + for dialect in dialects: + csv_path = os.path.join(lang_data_dir, f"{dialect}.csv") + if not os.path.exists(csv_path): + with open(csv_path, 'w', encoding='utf-8') as f: + f.write("phrase,clarification\n") + + # 2. Create lab_profiles + lang_persona_dir = os.path.join(lab_profiles_dir, lang) + os.makedirs(lang_persona_dir, exist_ok=True) + for dialect in dialects: + persona_path = os.path.join(lang_persona_dir, f"{dialect} Persona.json") + if not os.path.exists(persona_path): + with open(persona_path, 'w', encoding='utf-8') as f: + json.dump({"language": lang, "dialect": dialect, "system_prompt": f"You are a native speaker of {dialect} ({lang}, f)."}, f) + # Just a minimal stub json + f.write('{"name": "' + dialect + ' Persona"}') + +print("Languages expanded successfully!") diff --git a/find_best_igbo.py b/find_best_igbo.py new file mode 100644 index 0000000000000000000000000000000000000000..91dc4b6a4655afe52489d8c55724cf904bd47468 --- /dev/null +++ b/find_best_igbo.py @@ -0,0 +1,22 @@ +from huggingface_hub import HfFileSystem +import pandas as pd +import ast + +fs = HfFileSystem() +with open('commits_utf8.txt', 'r', encoding='utf-8') as f: + commits = ast.literal_eval(f.read()) + +max_len = 0 +best_commit = None + +for commit in commits[:50]: + try: + df = pd.read_csv(f'hf://datasets/toecm/IEDID/Asแปฅsแปฅ Igbo.csv@{commit}') + if len(df) > max_len: + max_len = len(df) + best_commit = commit + print(f"Commit {commit[:8]}: {len(df)} rows") + except Exception as e: + pass + +print(f"Max rows: {max_len} at commit {best_commit}") diff --git a/find_best_igbo2.py b/find_best_igbo2.py new file mode 100644 index 0000000000000000000000000000000000000000..77c944a43491ba1b8d5643b6c55da61d00f2ec6f --- /dev/null +++ b/find_best_igbo2.py @@ -0,0 +1,21 @@ +from huggingface_hub import hf_hub_download +import pandas as pd +import ast + +with open('commits_utf8.txt', 'r', encoding='utf-8') as f: + commits = ast.literal_eval(f.read()) + +max_len = 0 +best_commit = None + +for commit in commits[:50]: + try: + path = hf_hub_download(repo_id='toecm/IEDID', filename='Asแปฅsแปฅ Igbo.csv', repo_type='dataset', revision=commit) + df = pd.read_csv(path) + if len(df) > max_len: + max_len = len(df) + best_commit = commit + except Exception as e: + pass + +print(f"Max rows: {max_len} at commit {best_commit}") diff --git a/fixed_Asusu_Igbo.csv b/fixed_Asusu_Igbo.csv new file mode 100644 index 0000000000000000000000000000000000000000..af472860a841b3b788be80e8c652cb19cb6bb041 --- /dev/null +++ b/fixed_Asusu_Igbo.csv @@ -0,0 +1,4 @@ +Utterance,Dialect,Clarification,Tone_Category,Linguistic_Context,Syntax_Pattern,Pragmatic_Analysis,Acoustic_Profile,file_name,audio_file_name,Data_Origin,Clarification_Source,User +Kedแปฅ?,Asแปฅsแปฅ Igbo English,How are you?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,{},,,Game: Relay Pair,Admin Edit,0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7 +Kedแปฅ ka แป‹ mee?,Asแปฅsแปฅ Igbo,How are you?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,{},,,Game: Relay Pair,AI Relay Bouncer,0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7 +"Nna, kee kwanu?",Asแปฅsแปฅ Igbo,"Hey, how are you?",Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,{},,,Game: Relay Pair,AI Relay Bouncer,0x8241C367ac75701951E50b65F92aF74CeaC90075 diff --git a/gitattributes.txt b/gitattributes.txt new file mode 100644 index 0000000000000000000000000000000000000000..22c521f801af94bdabc0b44e47564f117c52e9d6 --- /dev/null +++ b/gitattributes.txt @@ -0,0 +1,74 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +assets/Gemini_Generated_Image_lisgawlisgawlisg[[:space:]](1).png filter=lfs diff=lfs merge=lfs -text +assets/Gemini_Generated_Image_lisgawlisgawlisg[[:space:]](2).png filter=lfs diff=lfs merge=lfs -text +assets/Gemini_Generated_Image_ygxekoygxekoygxe[[:space:]](1).png filter=lfs diff=lfs merge=lfs -text +assets/pure[[:space:]]app[[:space:]]games[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/pure[[:space:]]app[[:space:]]games.png filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist.png filter=lfs diff=lfs merge=lfs -text +assets/The[[:space:]]Bridge[[:space:]]of[[:space:]]Understanding.pdf filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener.png filter=lfs diff=lfs merge=lfs -text +assets/The_Dialects_of_Innovation.pdf filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest.png filter=lfs diff=lfs merge=lfs -text +all[[:space:]]4[[:space:]]games.png filter=lfs diff=lfs merge=lfs -text +assets/all[[:space:]]4[[:space:]]games.png filter=lfs diff=lfs merge=lfs -text +assets/all[[:space:]]4[[:space:]]games[[:space:]]anime[[:space:]]version.png filter=lfs diff=lfs merge=lfs -text +assets/ca-iedi[[:space:]]graphical[[:space:]]abstract.png filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]2.png filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]3.jpg filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]3.png filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]3.jpg filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]3.jpg filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]video.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/speed[[:space:]]chat[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]archivist[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/the[[:space:]]listener[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/vision[[:space:]]quest[[:space:]]mobile.jpg filter=lfs diff=lfs merge=lfs -text +assets/convo[[:space:]]bridge[[:space:]]mobile.png filter=lfs diff=lfs merge=lfs -text +assets/human[[:space:]]convo[[:space:]]mobile.png filter=lfs diff=lfs merge=lfs -text +assets/convo[[:space:]]bridge[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text +assets/human[[:space:]]convo[[:space:]]vid.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/hf_files.txt b/hf_files.txt new file mode 100644 index 0000000000000000000000000000000000000000..4e6529b7c45bee847d706246fb4e61009c22c2a3 Binary files /dev/null and b/hf_files.txt differ diff --git a/hf_files_june12.txt b/hf_files_june12.txt new file mode 100644 index 0000000000000000000000000000000000000000..3ee8d15838cdd19886b540dd7b273fc87c04bc9e Binary files /dev/null and b/hf_files_june12.txt differ diff --git a/hf_files_june12_utf8.txt b/hf_files_june12_utf8.txt new file mode 100644 index 0000000000000000000000000000000000000000..176ddf1379b2f412376451478003171f4fe58dd7 --- /dev/null +++ b/hf_files_june12_utf8.txt @@ -0,0 +1 @@ +['datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/audio', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/audio_files', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/.gitattributes', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/African American Vernacular English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/African%20American%20Vernacular%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/American English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/American%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/AsรŸโ•—ร‘sรŸโ•—ร‘ Igbo.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/British English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Filipino English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Ghanaian Pidgin English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Indian English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Indonesian English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Indonesian%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Jamaican Patois.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Korean English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Korean%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Malaysian English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Nigerian English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Nigerian Pidgin English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Nigerian%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Nigerian%20Pidgin%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Pakistani English.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/README.md', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/South%20African%20Persona.json', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Spanish Creole.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/Tagalog.csv', 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/minted_history.csv'] diff --git a/hf_files_utf8.txt b/hf_files_utf8.txt new file mode 100644 index 0000000000000000000000000000000000000000..eebbbe5d4978c88fce0ca0bbb822a9a3abb90bf8 --- /dev/null +++ b/hf_files_utf8.txt @@ -0,0 +1 @@ +['audio', 'audio_files', '.gitattributes', 'African American Vernacular English.csv', 'African%20American%20Vernacular%20Persona.json', 'American English.csv', 'American%20Persona.json', 'AsรŸโ•—ร‘sรŸโ•—ร‘ Igbo.csv', 'British English.csv', 'Filipino English.csv', 'Ghanaian Pidgin English.csv', 'Indian English.csv', 'Indonesian English.csv', 'Indonesian%20Persona.json', 'Jamaican Patois.csv', 'Korean English.csv', 'Korean%20Persona.json', 'Malaysian English.csv', 'Nigerian English.csv', 'Nigerian Pidgin English.csv', 'Nigerian%20Persona.json', 'Nigerian%20Pidgin%20Persona.json', 'Pakistani English.csv', 'README.md', 'South%20African%20Persona.json', 'Spanish Creole.csv', 'Tagalog.csv', 'minted_history.csv'] diff --git a/igbo_check.txt b/igbo_check.txt new file mode 100644 index 0000000000000000000000000000000000000000..e8d38ec63a51ed6fcabb65fea28ab2e48f095e02 --- /dev/null +++ b/igbo_check.txt @@ -0,0 +1 @@ +[" 'datasets/toecm/IEDID@9bd61a137a860dfa0487519fb11d8823390a19ba/As\u00df\u2557\u00d1s\u00df\u2557\u00d1 Igbo.csv'"] \ No newline at end of file diff --git a/igbo_out.txt b/igbo_out.txt new file mode 100644 index 0000000000000000000000000000000000000000..1731387bbbba56034d6dc772dc9e40a3f32daebf Binary files /dev/null and b/igbo_out.txt differ diff --git a/igbo_out_utf8.txt b/igbo_out_utf8.txt new file mode 100644 index 0000000000000000000000000000000000000000..0cbd96c34d80ad2881841d979edc6ef7726db6e9 --- /dev/null +++ b/igbo_out_utf8.txt @@ -0,0 +1 @@ +{'Utterance': {0: 'Kedแปฅ?'}, 'Dialect': {0: 'Asแปฅsแปฅ Igbo English'}, 'Clarification': {0: 'How are you?'}, 'Tone_Category': {0: 'Conversational'}, 'Linguistic_Context': {0: 'Relay Peer-to-Peer Chat'}, 'Syntax_Pattern': {0: nan}, 'Pragmatic_Analysis': {0: 'Automated Relay Extraction'}, 'Acoustic_Profile': {0: '{}'}, 'file_name': {0: nan}, 'audio_file_name': {0: nan}, 'Data_Origin': {0: 'Game: Relay Pair'}, 'Clarification_Source': {0: 'Admin Edit'}, 'User': {0: '0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7'}} \ No newline at end of file diff --git a/investigate.py b/investigate.py new file mode 100644 index 0000000000000000000000000000000000000000..213eaadc0bc73fa62bba396d9cb1b789ac4820d2 --- /dev/null +++ b/investigate.py @@ -0,0 +1,32 @@ +from web3 import Web3 +from web3.middleware import geth_poa_middleware +from config import AppConfig + +def investigate_ghost_tx(): + print("๐Ÿ•ต๏ธโ€โ™‚๏ธ X-Raying Block 895346...") + w3 = Web3(Web3.HTTPProvider(AppConfig.PURECHAIN_RPC_URL)) + w3.middleware_onion.inject(geth_poa_middleware, layer=0) + + if not w3.is_connected(): + print("โŒ Cannot connect to node.") + return + + # Grab the exact block from your logs + block = w3.eth.get_block(895346, full_transactions=True) + print(f"๐Ÿ“ฆ Transactions found in block: {len(block.transactions)}") + + for tx in block.transactions: + receipt = w3.eth.get_transaction_receipt(tx.hash) + print("-" * 30) + print(f"๐Ÿ”— TX Hash: {tx.hash.hex()}") + + # Status 1 = Success, Status 0 = Reverted + if receipt.status == 1: + print("โœ… Status: SUCCESS (The contract accepted the data)") + else: + print("โŒ Status: REVERTED (The contract rejected the data)") + + print(f"๐Ÿ“œ Logs Emitted: {len(receipt.logs)}") + +if __name__ == "__main__": + investigate_ghost_tx() \ No newline at end of file diff --git a/lab_profiles/African%20American%20Vernacular%20Persona.json b/lab_profiles/African%20American%20Vernacular%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..509dba9b3a7ce89ab40a127aa32737525e511968 --- /dev/null +++ b/lab_profiles/African%20American%20Vernacular%20Persona.json @@ -0,0 +1,188 @@ +{ + "lab_name": "African American Vernacular English", + "cultural_context": "High context, collectivist, and deeply rooted in oral tradition and rhythmic expression. Communication is often performative, utilizing 'call and response' dynamics. Values 'realness' (authenticity) and 'sharpness' (wit/style). Speech patterns are characterized by grammatical markers like the aspectual 'be' (habitual action) and double negatives for emphasis. Heavily influenced by the Black church (cadence, metaphors), Hip-Hop culture, and the historical necessity of 'signifying' (double-talk/coded language). Social structure prioritizes 'fictive kinship' (treating friends as family). There is a high premium on 'reading' or 'roasting' as a form of social bonding and conflict resolution. Pragmatically, it often employs 'indirectness' as a survival strategy or politeness marker, while being intensely direct in communal 'truth-telling' settings.", + "jargon": { + "Ain't": "Am not / Is not / Are not (Universal negator).", + "All that": "Very impressive or attractive (often used in the negative: 'He think he all that').", + "Asf": "As fuck (Extreme emphasis, used as a suffix).", + "Bae": "Before Anyone Else (Significant other).", + "Bag": "A large sum of money or a goal ('Get the bag').", + "Bet": "Affirmative response / I agree / It\u2019s a challenge ('Watch me').", + "Blessing": "A fortunate event, often used to express gratitude ('It's a blessing').", + "Body": "To completely outperform or defeat someone ('He bodied that verse').", + "Brick": "A long period of time ('I haven't seen her in a brick') OR Very cold (NYC specific).", + "Bussin'": "Delicious (Usually refers to food).", + "Cap / No Cap": "A lie / I am telling the truth.", + "Cappin'": "Lying or exaggerating.", + "Certified": "Proven to be authentic or high quality.", + "Chile": "Child (Used as an exclamation of disbelief or to start a story).", + "Clap back": "A quick, sharp, or witty response to an insult.", + "Clean": "Looking very good, stylish, or well-dressed.", + "Clout": "Social influence or fame.", + "Come correct": "Approach a situation with the proper respect or preparation.", + "Deadass": "Completely serious / I am not joking.", + "Dig": "To understand or appreciate ('You dig?').", + "Dip": "To leave quickly.", + "Done": "To be fed up or finished with a situation ('I'm done').", + "Drip": "High-end fashion, style, or jewelry.", + "Everyday": "Ordinary or mediocre ('That's just everyday').", + "Facts": "I agree with what you just said / That is the truth.", + "Fam": "Close friends or family.", + "Feel you": "I understand and empathize with your perspective.", + "Fictive Kin": "Using family terms (Auntie, Unc, Brother) for non-relatives.", + "Finna": "Fixing to / About to (Contraction of 'finally' + 'to' or 'fixing' + 'to').", + "Finesse": "To get what you want through cleverness or manipulation.", + "Flex": "To show off wealth, status, or skill.", + "For real / For real, for real": "Are you serious? / I am being intensely serious.", + "Frontin'": "Faking a persona or pretending to be more than one is.", + "G": "Friend / Gangster / One thousand dollars.", + "Gas": "To hype someone up (sometimes falsely) OR High-quality marijuana.", + "Ghost": "To disappear or stop responding.", + "Glow up": "A significant transformation for the better.", + "GOAT": "Greatest of All Time.", + "Guap": "Large amounts of money.", + "Hands": "Fighting ability ('He got hands').", + "High-key": "Openly / Obviously.", + "Humble": "To bring someone back to reality ('I had to humble him').", + "Hungry": "Ambitious / Desperate for success.", + "Hustle": "To work hard, often in informal economies.", + "I'm weak": "That is hilarious (I am laughing so hard I am physically weak).", + "In my feelings": "Feeling emotional or oversensitive.", + "Istamp": "I agree completely / I vouch for that.", + "It's giving": "It has the vibe of... ('It's giving 90s').", + "Jawn": "A person, place, or thing (Philly origin, widely understood).", + "Keep it 100": "Be completely honest.", + "Kicks": "Shoes / Sneakers.", + "L": "A loss ('Take an L').", + "Low-key": "Secretly / Modestly / Slightly.", + "Mainline": "The most important or central thing.", + "Mad": "Very / Extremely ('I'm mad hungry').", + "Minute": "A long time ('I haven't been there in a minute').", + "No holds barred": "Without limits or rules.", + "No shade": "No offense intended (usually followed by something offensive).", + "On fleek": "Perfectly executed (usually eyebrows or style).", + "On god": "I swear on everything I hold sacred.", + "On my mama": "I swear on my mother's life.", + "On point": "Perfect / Accurate.", + "Opp": "Opposition / Enemy.", + "Out of pocket": "Acting wildly inappropriate or out of line.", + "Period / Periodt": "End of discussion.", + "Pull up": "To arrive at a location (usually by car).", + "Put you on": "To introduce someone to something new or beneficial.", + "Reach": "An exaggeration or an unlikely assumption.", + "Real talk": "I am about to say something serious and honest.", + "Receipts": "Evidence of a claim (usually screenshots).", + "Rent free": "Obsessing over something ('Living in your head rent free').", + "Rizz": "Charisma, specifically in romantic pursuit.", + "Salty": "Bitter or upset about a loss/slight.", + "Savage": "Ruthless or impressively cold-blooded.", + "Say less": "I understand completely; no further explanation needed.", + "Sell out": "To betray one's culture or values for personal gain.", + "Shook": "Shocked, scared, or deeply affected.", + "Sidebar": "A quick tangential comment.", + "Signifyin'": "Coded language, wordplay, or insults.", + "Slaps": "It is of high quality (usually music or food).", + "Slay": "To do something exceptionally well.", + "Smalls": "Insignificant or minor things.", + "Snack": "An attractive person.", + "Snatched": "Looking very good or sharp (specifically hair/outfit).", + "Solid": "Reliable / Trustworthy ('He\u2019s solid').", + "Stan": "An obsessive fan.", + "Stay woke": "Be aware of social/political injustices.", + "Straight": "Okay / I\u2019m fine ('I'm straight').", + "Sus": "Suspicious.", + "Tea": "Gossip ('Spill the tea').", + "The itch": "A craving or habitual need.", + "Thirst / Thirsty": "Desperate for attention or validation.", + "Throw shade": "To insult someone subtly or indirectly.", + "Tight": "Cool / Good OR Angry (Context dependent).", + "Tore up": "In very bad condition / Looking a mess.", + "Triflin'": "Lazy, dishonest, or low-quality (behavior).", + "Trip / Trippin'": "Acting irrationally or overreacting.", + "Tryna": "Trying to.", + "Vibe": "The atmosphere or feeling of a person/place.", + "W": "A win.", + "Wack": "Bad / Corny / Low quality.", + "What's the move?": "What is the plan?", + "Whip": "A car.", + "Whole meal": "Someone who is the 'full package' (attractive/successful).", + "Wildin'": "Acting out of control or crazy.", + "Word / Word up": "I agree / I hear you / Is that true?", + "Y'all": "You all (Second person plural).", + "You good?": "Are you okay? / Is there a problem? / You don't need anything else (Context dependent)." + }, + "pragmatic_rules": [ + { + "trigger": "What's good?", + "speaker_role": "Greeter", + "interpretation": "How are you? / What's happening? Not a literal question about what is 'good'.", + "tone": "Casual" + }, + { + "trigger": "I'm finna be there", + "speaker_role": "Arriver", + "interpretation": "I am preparing to leave. I will be there eventually (likely 20-30 minutes).", + "tone": "Vague" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Elder/Auntie", + "interpretation": "You are making a mistake, or I pity your ignorance.", + "tone": "Paternalistic" + }, + { + "trigger": "I'm not gonna lie", + "speaker_role": "Speaker", + "interpretation": "I am about to be very blunt or share a controversial opinion.", + "tone": "Confessional" + }, + { + "trigger": "Don't get it twisted", + "speaker_role": "Speaker", + "interpretation": "Clarification: Do not misunderstand my kindness for weakness or my meaning for something else.", + "tone": "Warning" + }, + { + "trigger": "You know what I'm saying?", + "speaker_role": "Speaker", + "interpretation": "Phatic expression used to maintain rhythm and engagement. Usually doesn't require an answer.", + "tone": "Rhythmic" + }, + { + "trigger": "Aht aht!", + "speaker_role": "Authority/Parent", + "interpretation": "Stop what you are doing immediately.", + "tone": "Corrective" + }, + { + "trigger": "I see you!", + "speaker_role": "Observer", + "interpretation": "I acknowledge and celebrate your success, style, or effort.", + "tone": "Encouraging" + }, + { + "trigger": "It's the ___ for me", + "speaker_role": "Critic/Jester", + "interpretation": "This specific detail is what I find funny, annoying, or noteworthy.", + "tone": "Observational" + }, + { + "trigger": "You reachin'", + "speaker_role": "Listener", + "interpretation": "Your logic is flawed or you are making a huge assumption.", + "tone": "Dismissive" + }, + { + "trigger": "That's crazy", + "speaker_role": "Listener", + "interpretation": "I am no longer listening, or I have nothing to add to this story.", + "tone": "Exit Strategy" + }, + { + "trigger": "Who all gonna be there?", + "speaker_role": "Invitee", + "interpretation": "I need to know the vibe/safety of the event before I commit.", + "tone": "Precautionary" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Algerian Arabic/Algiers Persona.json b/lab_profiles/Algerian Arabic/Algiers Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..252ce74ebb7205cd9b5972758780e730972a8842 --- /dev/null +++ b/lab_profiles/Algerian Arabic/Algiers Persona.json @@ -0,0 +1 @@ +{"language": "Algerian Arabic", "dialect": "Algiers", "system_prompt": "You are a native speaker of Algiers (Algerian Arabic, f)."}{"name": "Algiers Persona"} \ No newline at end of file diff --git a/lab_profiles/Algerian Arabic/Constantine Persona.json b/lab_profiles/Algerian Arabic/Constantine Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f760e9fc7af24069e80d028e7ce77f92dd4741d8 --- /dev/null +++ b/lab_profiles/Algerian Arabic/Constantine Persona.json @@ -0,0 +1 @@ +{"language": "Algerian Arabic", "dialect": "Constantine", "system_prompt": "You are a native speaker of Constantine (Algerian Arabic, f)."}{"name": "Constantine Persona"} \ No newline at end of file diff --git a/lab_profiles/Algerian Arabic/Oran Persona.json b/lab_profiles/Algerian Arabic/Oran Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..75eab3046e8870a4d34e0bd75a6d80f96331e514 --- /dev/null +++ b/lab_profiles/Algerian Arabic/Oran Persona.json @@ -0,0 +1 @@ +{"language": "Algerian Arabic", "dialect": "Oran", "system_prompt": "You are a native speaker of Oran (Algerian Arabic, f)."}{"name": "Oran Persona"} \ No newline at end of file diff --git a/lab_profiles/American%20Persona.json b/lab_profiles/American%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..73e3b78d43aa3597ebe4b57a5b78a3db15e78fbb --- /dev/null +++ b/lab_profiles/American%20Persona.json @@ -0,0 +1,7014 @@ +{ + "lab_name": "American English", + "cultural_context": "Low context, hyper-individualistic, and achievement-oriented ('The American Dream'). Directness is valued, though criticism is often softened via the 'sandwich method' or modern 'therapy speak'. Social interaction is characterized by superficial friendliness, mandatory small talk, and a transactional service culture (tipping). The lexicon is heavily militarized and sportified, treating business and life as competitive games. High reliance on legal/procedural slang due to a litigious society. Secular speech is deeply saturated with King James Biblical idioms, Hollywood tropes, and 'Wild West' individualism. Strong cultural emphasis on car dependency, homeownership as status, and the 'hustle' of self-made success.", + "jargon": { + "24/7": "Twenty-four seven (All the time).", + "800-pound gorilla": "The most powerful or dominant entity in a room/market.", + "A-game": "One's best performance.", + "Across the board": "Applying to everyone/everything.", + "Action item": "A specific task that needs to be done.", + "All set": "Ready, finished, or 'I don't need anything else'.", + "ASAP": "As Soon As Possible (often implies urgency/stress).", + "At the end of the day": "Ultimately / The most important fact is.", + "Awesome": "Generic positive response. Does not mean 'inspiring awe'.", + "Back to the drawing board": "Start over because the previous attempt failed.", + "Back-to-back": "Consecutive meetings with no break.", + "Ballpark figure": "Rough estimate.", + "Bandwidth": "Energy, time, or mental capacity to do a task.", + "Bang for your buck": "Value for money.", + "Basket case": "Crazy / Stressed person.", + "Behind the eight ball": "In a disadvantageous position.", + "Beltway": "Relating to Washington D.C. politics (Inside the Beltway).", + "Big deal": "Important thing (or sarcastic: 'No big deal').", + "Bio-break": "Restroom break (Corporate/Gamer slang).", + "Bite the bullet": "Endure a painful experience or make a tough decision.", + "Bleeding edge": "Newer and riskier than 'cutting edge'.", + "Blind spot": "Area you cannot see (driving or metaphorical).", + "Blue-sky thinking": "Creative brainstorming with no limits.", + "Bottom line": "The main point / Profit.", + "Brain fart": "Temporary mental lapse or forgetfulness.", + "Break a leg": "Good luck.", + "Buck": "Dollar.", + "Burnout": "Physical/mental collapse caused by overwork.", + "Buy-in": "Agreement or support from stakeholders.", + "Call it a day": "Stop working for the day.", + "Can of worms": "A complex, troublesome situation.", + "Cap / No Cap": "Lie / No lie (Gen Z slang).", + "Catch-22": "No-win situation.", + "Change of heart": "Changing one's opinion or feelings.", + "Check": "The bill at a restaurant.", + "Circle back": "Revisit a topic later.", + "Cold feet": "Loss of nerve/confidence before an event.", + "Cold turkey": "Stopping abruptly.", + "Come to Jesus moment": "A moment of intense realization or a harsh truth-telling meeting.", + "Copy that": "I understand.", + "Couch potato": "Lazy person.", + "Crunch time": "The period just before a deadline.", + "Curveball": "Surprise.", + "Cut corners": "Do something cheaply/poorly.", + "Cut to the chase": "Skip the details and get to the point.", + "Dead in the water": "A plan with no hope of success.", + "Deep dive": "Thorough analysis.", + "Deliverables": "The tangible results/products of a project.", + "Dime a dozen": "Very common and of low value.", + "Double down": "Increase risk.", + "Drill down": "Look at data in more detail.", + "Drive it home": "Make a point clearly understood.", + "Drop the ball": "Fail.", + "Dude": "Person (Gender neutral in CA).", + "Ducks in a row": "Getting organized.", + "Elephant in the room": "An obvious problem no one wants to discuss.", + "Elevator pitch": "A very short summary of an idea (30-60 seconds).", + "EOD / COB": "End of Day / Close of Business (Deadline: 5:00 PM).", + "Face time": "Being seen by the boss.", + "Figure it out": "Solve the problem yourself.", + "Fire drill": "A sudden, urgent, often chaotic task.", + "Flake": "Unreliable person.", + "Flip-flop": "Change opinion (Politics) OR Sandal.", + "For real?": "Are you serious?", + "Full plate": "Very busy.", + "Game changer": "Something that significantly shifts the situation.", + "Game plan": "Strategy.", + "Gaslight": "Manipulating someone to question their reality.", + "Gatekeeper": "Person controlling access.", + "Get the ball rolling": "Start a process.", + "Ghosting": "Ending a relationship by cutting off all communication.", + "Go south": "To deteriorate or fail.", + "Go-getter": "An ambitious person.", + "Grain of salt": "Skepticism.", + "Grand": "Thousand dollars.", + "Green light": "Permission to proceed.", + "Gut check": "Relying on instinct.", + "Hail Mary": "Desperate try.", + "Hardball": "Aggressive tactics.", + "Heads up": "Warning.", + "Hit the ground running": "Start a new job/project effectively immediately.", + "Hit the road": "Leave.", + "Home run": "Success.", + "In the loop": "Informed.", + "In the weeds": "Lost in too many details or overwhelmed.", + "Jump the gun": "Start too early.", + "Keep me posted": "Keep me updated.", + "Kick the can down the road": "Delay a decision/problem.", + "Kill two birds with one stone": "Solve two problems with one action.", + "Lemon": "Defective car.", + "Leverage": "Use something to maximum advantage.", + "Lighten up": "Relax.", + "Loop in": "Add someone to the communication.", + "Low-hanging fruit": "Easy tasks or targets.", + "Monday morning quarterback": "Critic.", + "Move the needle": "Make a measurable difference.", + "No brainer": "An obvious decision.", + "Off the clock": "Not working.", + "Off the cuff": "Spontaneous/Unscripted.", + "Offline": "Discussing something privately/later.", + "On my radar": "I am aware of it.", + "On the same page": "In agreement.", + "Out of pocket": "Unavailable (or paying with own money).", + "Pain point": "A specific problem a customer has.", + "Parking lot": "To set an idea aside for later discussion.", + "Piece of cake": "Easy.", + "Piggyback": "To build on someone else's idea.", + "Ping": "Contact someone.", + "Pitch in": "Help out.", + "Pivot": "Change strategy.", + "Play devil's advocate": "Argue the opposing side to test an idea.", + "Play it by ear": "Improvise.", + "Plead the fifth": "Refuse to answer (incriminating).", + "Pull the plug": "Stop a project.", + "Push the envelope": "Go beyond established limits.", + "Pushback": "Resistance.", + "Put a pin in it": "Pause a discussion for later.", + "Put out fires": "Dealing with emergencies.", + "Quarterback": "Lead.", + "Rain check": "Reschedule.", + "Reach out": "Contact someone.", + "Red tape": "Bureaucracy.", + "Ride shotgun": "Front passenger.", + "Rizz": "Charisma (Gen Z).", + "Rock the boat": "Cause trouble or disrupt status quo.", + "Rule of thumb": "General guideline.", + "Run it up the flagpole": "Test an idea to see reaction.", + "Scalability": "Ability to grow.", + "Screw up": "Mistake.", + "Shoot an email": "Send an email.", + "Side hustle": "Second job.", + "Silver lining": "Positive side of bad situation.", + "Slam dunk": "Success.", + "Sill the tea": "Share gossip.", + "Spin your wheels": "Exert effort with no result.", + "Step up to the plate": "Take responsibility.", + "Stretch goal": "An ambitious target.", + "Strike out": "Fail completely.", + "Sweet spot": "The optimal point.", + "Synergy": "Cooperation interaction (Corporate clich\u00e9).", + "Table it": "Postpone discussion.", + "Take five": "Break.", + "Takeaway": "Key point to remember.", + "The whole nine yards": "Everything / All of it.", + "Think outside the box": "Think creatively.", + "Throw under the bus": "Betray someone for own gain.", + "Touch base": "Contact.", + "Traction": "Momentum.", + "Up in the air": "Undecided.", + "Vibe check": "Assess mood.", + "Wheelhouse": "Area of expertise.", + "Win-win": "Good for all.", + "Wing it": "Improvise.", + "Wrap up": "Finish.", + "Zone out": "Lose focus.", + "Armchair expert": "Someone who asserts knowledge on a subject they know nothing about.", + "Ball is in your court": "It is your turn to make a move/decision.", + "Basic": "Mainstream / Boring (usually female).", + "Batting a thousand": "Doing everything perfectly.", + "Beat around the bush": "Avoiding the main topic.", + "Benchwarmer": "Someone not participating or second-choice.", + "Big picture": "The overall perspective or objective.", + "Binge-watch": "Watch an entire season of a show at once.", + "Black Friday": "The day after Thanksgiving (shopping chaos).", + "Blindside": "Surprise attack (Physical or metaphorical).", + "Bootstrapping": "Building a business with no outside investment.", + "Boujee": "High class / Expensive taste (from Bourgeois).", + "Brainstorming": "Group creativity technique.", + "Breadcrumbing": "Sending sporadic messages to keep a romantic interest hooked without commitment.", + "Break the ice": "Relieve tension in a social setting.", + "Burn bridges": "To destroy relationships so you can never return.", + "Bury the hatchet": "Make peace.", + "Call the shots": "Make decisions.", + "Catfish": "Deceive someone online with a fake persona.", + "Caught red-handed": "Caught in the act of doing something wrong.", + "Cherry-pick": "Select only the best data.", + "Clap back": "A quick, sharp response to criticism.", + "Clean slate": "Fresh start.", + "Close call": "Narrow escape from danger.", + "Cringe": "Embarrassing.", + "Curry favor": "Trying to ingratiate oneself with someone.", + "Cut me some slack": "Be lenient / Give me a break.", + "Dark horse": "Unexpected winner.", + "Devil is in the details": "Small things can cause big problems.", + "Dodge a bullet": "Avoid disaster.", + "Dog-eat-dog": "Ruthlessly competitive.", + "Doomscrolling": "Endlessly scrolling through bad news on social media.", + "Down to earth": "Realistic / Humble.", + "Drinking the Kool-Aid": "Blindly following a dangerous ideology or corporate culture.", + "Drop in the bucket": "A very small, insignificant amount.", + "Early bird": "Person who arrives early.", + "Extra": "Dramatic.", + "Eye-opener": "Something that reveals a surprising truth.", + "Face the music": "Accept consequences.", + "Fair-weather friend": "A friend who is only there when things are good.", + "Fam": "Close friends.", + "Fifth wheel": "Unwanted extra person.", + "Flex": "To show off.", + "FOMO": "Fear Of Missing Out.", + "Full ride": "100% Scholarship.", + "Get wind of": "To hear a rumor about something.", + "Give the cold shoulder": "To ignore someone intentionally.", + "Glass ceiling": "Barrier to promotion for women.", + "Glow up": "Improvement.", + "GOAT": "Greatest of All Time.", + "Go with the flow": "Accept things as they happen.", + "Golden handcuffs": "High salary/benefits that keep an employee in a job they hate.", + "Guap": "Money.", + "Hangry": "Hungry + Angry.", + "Hard pass": "Refusal.", + "High-key": "Openly / Obviously.", + "Hit the nail on the head": "Describe something exactly right.", + "Hot take": "A controversial opinion.", + "Hump Day": "Wednesday.", + "Ick": "A sudden feeling of repulsion towards a dating partner.", + "In the red": "Debt.", + "In the black": "Making money.", + "Jump the shark": "Decline in quality.", + "Karen": "Entitled woman.", + "Keep your chin up": "Stay positive.", + "Kill it": "To do something extremely well.", + "Knock on wood": "Superstitious action to prevent bad luck.", + "Left on read": "Reading a message and ignoring it.", + "Let off steam": "Release anger/energy.", + "Level playing field": "Fair competition.", + "Lit": "Fun / Drunk.", + "Low-key": "Secretly / Modestly.", + "Monday blues": "Sadness about the work week starting.", + "Mood": "Relatable feeling.", + "Moving the goalposts": "Unfairly changing the rules during the process.", + "MVP": "Most Valuable Player.", + "No shade": "No offense intended.", + "Off the grid": "Disconnected from tech.", + "On point": "Perfect.", + "On the fence": "Undecided.", + "Out of left field": "Unexpected / Bizarre.", + "Paper trail": "Written evidence.", + "Par for the course": "Normal / Expected (usually negative).", + "Pay it forward": "Do a good deed to repay a good deed done to you.", + "Pink slip": "Firing notice.", + "Pipeline": "Future projects/sales.", + "Playing hard to get": "Feigning disinterest.", + "Pop the question": "Propose marriage.", + "Rain on my parade": "Spoil someone's enjoyment.", + "Red flag": "Warning sign (in dating/business).", + "Ride or die": "Extremely loyal partner/friend.", + "Runway": "How long a startup can survive before running out of money.", + "Salty": "Bitter.", + "Savage": "Ruthless.", + "Scope creep": "Uncontrolled growth of a project's requirements.", + "Shot in the dark": "Guess.", + "Sick": "Cool.", + "Silo": "Departments not sharing information.", + "Simp": "Someone who does too much for a person they like (derogatory).", + "Skeleton crew": "Minimum staff.", + "Skin in the game": "Personal financial risk in an enterprise.", + "Slaps": "It is very good (usually music/food).", + "Slay": "Do well.", + "Spill the beans": "Reveal secret.", + "Stan": "Fan.", + "Sus": "Suspicious.", + "Sweat equity": "Unpaid work in exchange for a share of the company.", + "Take a rain check": "Postpone an invitation.", + "The extra mile": "Effort beyond what is required.", + "Throw shade": "Subtle insult.", + "Under the weather": "Sick.", + "Vibes": "Feelings.", + "Woke": "Aware.", + "Yeet": "To throw something with force (Gen Z).", + "401(k)": "Employer-sponsored retirement savings plan.", + "86": "Banned / Removed.", + "All-nighter": "Staying awake all night to study or work.", + "Amber Alert": "Emergency broadcast for a child abduction.", + "Bail": "To leave abruptly OR money paid to leave jail pre-trial.", + "Ballot": "The paper/system used to cast a vote.", + "Band-Aid solution": "A temporary, superficial fix to a problem.", + "Blue state": "A US state that predominantly votes for the Democratic Party.", + "Bodega": "Corner store (NYC).", + "Booked": "Processed by police after an arrest.", + "Brown-nose": "To suck up to authority figures.", + "Bubbler": "Drinking fountain (Wisconsin/New England region).", + "Catbird seat": "An advantageous or prominent position.", + "Caucus": "A meeting of political party members to choose candidates.", + "Class action": "A lawsuit filed by a group of people.", + "Closing costs": "Fees paid at the end of a real estate transaction.", + "Copay": "Fixed amount paid by a patient for medical service (Insurance).", + "Curb appeal": "Attractiveness of a house from the street.", + "Dean's List": "List of students recognized for high academic achievement.", + "Deductible": "Amount paid out-of-pocket before insurance kicks in.", + "Dibs": "Claiming rights.", + "Double whammy": "Two bad things happening at once.", + "Down payment": "Initial upfront payment for a house/car.", + "DUI / DWI": "Driving Under the Influence / Driving While Intoxicated.", + "Earmark": "Designate funds for specific use.", + "Eminent domain": "Government power to take private property for public use.", + "Escrow": "Money held by a third party during a transaction.", + "Felony": "Serious crime (>1 year prison).", + "Filibuster": "Prolonging debate to delay a vote in Congress.", + "Fixer-upper": "House needing renovation.", + "Fixin' to": "Getting ready to do something (Southern US).", + "Flip": "To buy something (house) and sell it quickly for profit.", + "Freshman 15": "Weight gain in college.", + "Gerrymandering": "Manipulating voting district boundaries for political gain.", + "GOP": "Grand Old Party (The Republican Party).", + "Grassroots": "Political movement driven by ordinary people, not elites.", + "Greek Life": "Fraternities and Sororities system in colleges.", + "Gridlock": "Traffic jam OR political stalemate.", + "Grounded": "Punishment where a child is not allowed to go out.", + "Hazing": "Humiliating initiation rituals for a group.", + "Hella": "Very (NorCal).", + "HOA": "Homeowners Association (Neighborhood rules).", + "Homecoming": "School celebration.", + "Inside baseball": "Details only experts/insiders would know or care about.", + "Ivy League": "Elite colleges.", + "Jaywalking": "Crossing the street illegally.", + "John Doe / Jane Doe": "Placeholder name for an unidentified person.", + "Jumbo loan": "A mortgage that exceeds standard lending limits.", + "Junior Varsity (JV)": "Second-tier athletic team (below Varsity).", + "Lame duck": "An official in the final period of office after a successor is elected.", + "Lemon law": "Consumer protection for defective vehicles.", + "Lobbyist": "Person hired to influence politicians.", + "McMansion": "Large, mass-produced house with poor architectural style.", + "Miranda rights": "Right to silence and an attorney (Police warning).", + "Misdemeanor": "Minor crime.", + "Moonlighting": "Second job.", + "Mug shot": "Booking photo.", + "NDA": "Non-Disclosure Agreement.", + "NIMBY": "Not In My Back Yard (Opposing development nearby).", + "Out of network": "Medical provider not covered by your insurance.", + "Plead the Fifth": "Refusing to testify to avoid self-incrimination.", + "Pledge": "Fraternity recruit.", + "Pop / Soda / Coke": "Regional terms for carbonated soft drinks.", + "Pork barrel": "Government spending for localized projects to secure votes.", + "Post-game": "To party after a sporting event.", + "Pre-game": "Drink before event.", + "Probable cause": "Reason to arrest.", + "Prom": "Formal high school dance.", + "Public Defender": "Court-appointed lawyer for those who can't afford one.", + "Purple state": "A swing state (mix of Red/Republican and Blue/Democrat).", + "Red state": "A US state that predominantly votes Republican.", + "Red-handed": "Caught in the act.", + "Rent control": "Laws limiting how much landlords can increase rent.", + "Restraining order": "Court order ordering someone to stay away.", + "Road rage": "Driving anger.", + "Rush week": "Recruitment period for fraternities/sororities.", + "Safety school": "A college you are sure you will get into.", + "Security deposit": "Money held by landlord.", + "Snowbird": "Winter migrant.", + "Sophomore slump": "Decline in performance during the second year.", + "Spin doctor": "PR person.", + "Stoop": "Small staircase at the entrance of a building (NYC/Philly).", + "Sublet": "Renting your apartment to someone else temporarily.", + "Subpoena": "Court order.", + "Swing state": "State where the vote could go either way.", + "Tailgate": "Parking lot party.", + "Tenure": "Permanent job security for professors.", + "The Feds": "Federal agents (FBI, etc.).", + "Town hall": "Public meeting with a politician.", + "Under the table": "Illegal pay.", + "Valet": "Parking service.", + "Varsity": "Principal athletic team representing a school.", + "Walk the talk": "Do what you say you will do.", + "Wasp": "Elite white person.", + "Whistleblower": "Snitch.", + "Wicked": "Very (Boston).", + "Y'all": "You all (Plural 'you' - Southern/AAVE).", + "Yellow tape": "Crime scene tape.", + "401(k) Match": "Employer contribution to retirement savings.", + "Monday Morning Quarterback": "Critic.", + "A buck fifty": "One dollar and fifty cents (or sometimes used to mean 'a small amount').", + "Across the pond": "The United Kingdom (from the US perspective).", + "Air conditioning (A/C)": "Central cooling (Essential in US South/West).", + "All-American": "Wholesome, typical, or excellent (often referring to athletes).", + "Amber waves of grain": "Poetic reference to the US Midwest (from 'America the Beautiful').", + "Baby Boomer": "Generation born 1946-1964.", + "Back 40": "The remote part of a large property (Farm term).", + "Backburner": "Low priority.", + "Bailout": "Financial rescue of a company.", + "Ballpark": "Rough estimate.", + "Base": "Main office.", + "Basket": "Group of currencies or stocks.", + "Bible Belt": "The Southern US, known for conservative evangelical Christianity.", + "Big Apple": "New York City.", + "Big Easy": "New Orleans.", + "Bleachers": "Cheap bench seats at a sports stadium.", + "Blind date": "Date with a stranger arranged by a third party.", + "Blue collar": "Manual labor worker.", + "Boondocks / Boonies": "Remote, rural area.", + "Boot camp": "Military training or intense fitness program.", + "Breadwinner": "Primary income earner.", + "Buckle up": "Put on seatbelt.", + "Bull market": "Rising prices.", + "Bear market": "Stock market is going down.", + "Bumper to bumper": "Traffic so dense cars are touching.", + "Busboy": "Restaurant worker who clears tables.", + "Candy": "Sweets/Chocolate (Not 'Sweets').", + "Car pool": "Sharing a ride to work/school.", + "Cash cow": "Profitable item.", + "Catty-corner / Kitty-corner": "Diagonally across an intersection.", + "Checks and balances": "System preventing one branch of government from dominating.", + "Cinch": "Something very easy.", + "Click": "Kilometer (Military).", + "Coast": "East or West coast.", + "Cold snap": "Sudden short period of cold weather.", + "Commissary": "Store (Military/Prison).", + "Co-pay": "Insurance fee.", + "Cover letter": "Letter sent with a resume.", + "Crossing guard": "Person who helps children cross the street.", + "Cubicle": "Semi-enclosed office workspace.", + "Curfew": "Time by which one must be home.", + "Deadbeat": "Lazy person / Non-payer.", + "Deep six": "Destroy / Discard.", + "Designated Driver (DD)": "Sober person driving drunks home.", + "Dime": "10 cents.", + "Dip": "Chewing tobacco.", + "Dirt road": "Unpaved road.", + "Dish": "Attractive person.", + "Dixie": "The South.", + "Doggy bag": "Bag for restaurant leftovers.", + "Double-dip": "To get paid from two sources illegitimately OR dip a chip twice.", + "Drive-thru": "Service window for cars.", + "Drop-off": "Place to leave something/someone.", + "Dry county": "No alcohol allowed.", + "Dude ranch": "Ranch for tourists.", + "Dumb down": "Simplify for a less intelligent audience.", + "Dumpster fire": "A chaotic disaster.", + "Dutch treat": "Each person pays for themselves.", + "Easy street": "Financial independence.", + "Electoral College": "The complex system that actually elects the President.", + "Empty nester": "Parent whose kids have moved out.", + "Entr\u00e9e": "The main course (In US; 'Starter' is the first course).", + "Exemption": "Tax break.", + "Fanny pack": "Waist bag (Note: 'Fanny' means buttocks in US, not vagina).", + "Fifth": "Right to silence.", + "Fifth Amendment": "Right to remain silent.", + "Fender bender": "Small car accident.", + "Five-O": "Police.", + "Flop": "Failure.", + "Flyover country": "The US Midwest (between the coasts).", + "Fourth of July": "Independence Day.", + "Freshman": "1st year student (High School/College).", + "Sophomore": "2nd year student.", + "Junior": "3rd year student.", + "Senior": "4th year student.", + "Full-ride": "Scholarship covering all costs.", + "Fumble": "To drop the ball / Make a mistake.", + "G": "Thousand dollars OR Gangster.", + "Gas station": "Petrol station.", + "GED": "General Equivalency Diploma (High School alternative).", + "Gentrification": "Wealthy people moving into poor neighborhoods, raising rents.", + "Gig": "Job.", + "Go postal": "Violent rage.", + "Gold digger": "Person dating for money.", + "GPA": "Grade Point Average.", + "Grand Slam": "Total success.", + "Green card": "Permanent Resident card.", + "Ground zero": "Center of disaster.", + "Half-baked": "Poorly thought out.", + "Hand-me-down": "Used clothing passed from older sibling.", + "Happy Hour": "Discount drink time.", + "Hard hat": "Construction worker.", + "Head honcho": "Boss.", + "High school": "Secondary school.", + "Highway": "Main road.", + "Hillbilly": "Rural mountain person (stereotypically uneducated).", + "Hood": "Neighborhood.", + "Hoops": "Basketball.", + "Hot dog": "Sausage in a bun.", + "HOV lane": "High Occupancy Vehicle lane (Carpool lane).", + "Huddle": "Meeting.", + "Humvee": "Military vehicle.", + "I-95 / I-5": "Major Interstate highways.", + "Icebox": "Refrigerator (Old fashioned).", + "In the hole": "Solitary confinement OR Debt.", + "Inside the Beltway": "Washington DC politics.", + "Interstate": "National highway system.", + "IRS": "Internal Revenue Service (Tax agency).", + "Jackpot": "Big win.", + "Jaywalk": "Cross street illegally.", + "Jersey barrier": "Concrete traffic divider.", + "John Hancock": "Signature.", + "Jock": "Athlete.", + "Joe Six-pack": "Average American man.", + "Jonesing": "Craving.", + "Jumbo tron": "Giant screen at stadium.", + "Junior High / Middle School": "Grades 6-8.", + "Junk food": "Unhealthy snacks.", + "Kick the bucket": "Die.", + "Kool-Aid": "Blind faith.", + "Layoff": "Firing due to lack of work.", + "License plate": "Number plate.", + "Liquor store": "Shop selling alcohol.", + "Loitering": "Standing around doing nothing (often illegal).", + "Long shot": "Unlikely.", + "Loophole": "Technicality allowing one to avoid a rule.", + "Loose cannon": "Unpredictable person.", + "Lowball": "Offer a deceptively low price.", + "A-list": "Top tier celebrities.", + "B-list": "Second tier celebrities.", + "Backseat driver": "Passenger who gives unwanted driving advice.", + "Bender": "A multi-day drinking/drug spree.", + "Beta test": "Trying something out before it's ready.", + "Big cheese": "Important person.", + "Blockbuster": "Very successful movie.", + "Bomb": "Fail (US) vs Succeed (UK).", + "Boob tube": "Television (Old slang).", + "Box office": "Ticket sales revenue.", + "Brain freeze": "Headache from eating cold food too fast.", + "Brewski": "Beer.", + "Brown bag it": "Bring lunch from home.", + "Bug": "Software error.", + "Bun in the oven": "Pregnant.", + "Burn rubber": "Accelerate fast enough to spin tires.", + "Buzzkill": "Someone who ruins the fun.", + "Cafeteria Catholic": "Someone who picks and chooses which religious rules to follow.", + "Caked up": "Having a large buttocks (Slang).", + "Call shotgun": "Claim the front passenger seat.", + "Cameo": "Brief appearance by a famous person.", + "Can": "Toilet OR To fire someone.", + "Cash in": "Profit from an investment.", + "Catch some Zs": "Sleep.", + "Cheapskate": "Stingy person.", + "Chick flick": "Movie targeted at women (Rom-com).", + "Chop shop": "Place where stolen cars are dismantled.", + "Cliffhanger": "Suspenseful ending.", + "Cloud nine": "Extreme happiness.", + "Cold shoulder": "Ignore.", + "Comfort food": "High-calorie, nostalgic food (Mac & Cheese, Fried Chicken).", + "Commercial": "TV advertisement.", + "Cookie": "Sweet biscuit (Chocolate chip, etc.).", + "Biscuit": "Savory bread roll (US South).", + "Chips": "Crisps (Potato chips).", + "Fries": "Chips (French fries).", + "Cop a feel": "Touch someone sexually without consent (or sneakily).", + "Crash": "Sleep OR Computer failure.", + "Credits": "List of names at end of movie.", + "Crowdfund": "Raise money from many people online.", + "Crunchy": "Hippie / Environmentalist.", + "Cut the cord": "Cancel cable TV.", + "Cutting edge": "Most advanced technology.", + "Dad bod": "Soft physique on a middle-aged man.", + "Dead presidents": "Money.", + "Diner": "Casual, cheap restaurant (often retro).", + "Director's cut": "Extended version of a movie.", + "Disrupt": "Change an industry radically (Tech jargon).", + "Doppelganger": "Look-alike.", + "Double feature": "Two movies for price of one.", + "Drive-in": "Outdoor movie theater for cars.", + "Early adopter": "Person who buys new tech first.", + "Easter egg": "Hidden message/feature in media.", + "Eat crow": "Admit one was wrong.", + "Eat dust": "Lose a race/competition.", + "Ecosystem": "Interconnected tech products (Apple ecosystem).", + "Eggplant emoji": "Symbol for penis (Texting).", + "Faceplant": "Fall on one's face.", + "Fanboy / Fangirl": "Obsessive fan.", + "Feature creep": "Adding too many features to a product.", + "Five-finger discount": "Shoplifting.", + "Flasher": "Person who exposes genitals publicly.", + "Flat tire": "Punctured tire.", + "Flick": "Movie.", + "Flip the bird": "Show middle finger.", + "Food coma": "Sleepiness after eating.", + "Foodie": "Person who loves gourmet food.", + "Freebie": "Free item.", + "Friend zone": "Platonic rejection.", + "Fringe": "Extreme/Non-mainstream.", + "Full circle": "Returning to the start.", + "Gaslighting": "Manipulating reality.", + "Gearhead": "Car enthusiast.", + "Ghost town": "Abandoned/Empty place.", + "Glitch": "Minor malfunction.", + "Go viral": "Spread rapidly online.", + "Go-to": "Favorite / Reliable option.", + "Goat": "Greatest of All Time (G.O.A.T.).", + "Grease monkey": "Mechanic.", + "Green room": "Waiting area.", + "Grind": "Work hard.", + "Groundbreaking": "Innovative.", + "Hacker": "Computer expert (can be good or bad).", + "Hack": "Cough OR Bad writer.", + "Has-been": "Former celebrity.", + "Hater": "Critic.", + "Headliner": "Main act.", + "Heartthrob": "Attractive male celebrity.", + "High five": "Hand slap gesture.", + "Hit the books": "Study.", + "Hit the hay": "Sleep.", + "Hit the spot": "Satisfied a craving.", + "Hog": "Large motorcycle (Harley) OR Greedy person.", + "Hollywood ending": "Unrealistically happy ending.", + "Homebody": "Person who prefers staying home.", + "Hoopty": "Old, broken-down car.", + "Hot mic": "Microphone left on accidentally.", + "Hype": "Excitement.", + "Influencer": "Social media celebrity.", + "Internet troll": "Person who provokes online.", + "It girl": "Popular female celebrity of the moment.", + "Jack up": "Raise price OR ruin something.", + "Jalopy": "Old car.", + "Jam": "Song OR Problem.", + "Junk mail": "Spam physical mail.", + "Keyboard warrior": "Tough guy online.", + "Killer app": "Essential software.", + "Klutz": "Clumsy person.", + "Knockoff": "Fake brand product.", + "Lag": "Delay (Internet/Video).", + "Lame": "Uncool.", + "Laugh track": "Recorded laughter in sitcoms.", + "Lead foot": "Fast driver.", + "Life hack": "Tip to make life easier.", + "Like": "Filler word (e.g., 'It was, like, crazy').", + "Listicle": "Article in list format.", + "Live stream": "Real-time video.", + "Low key": "Subtle.", + "Mainstream": "Popular culture.", + "Meme": "Viral internet joke.", + "Method acting": "Staying in character off-camera.", + "Mic drop": "Dramatic conclusion.", + "Mooc": "Massive Open Online Course.", + "Mosh pit": "Dance area.", + "Movie buff": "Film expert.", + "Mulligan": "Do-over.", + "Multitask": "Do many things at once.", + "Nerd": "Smart person.", + "Network": "Meet people for business.", + "Newbie / Noob": "Beginner.", + "Nickel and dime": "Small costs.", + "Night owl": "Person awake at night.", + "No-brainer": "Obvious choice.", + "Nomad": "Remote worker who travels.", + "Nosebleed seats": "High up, cheap seats.", + "One-hit wonder": "Brief fame.", + "Open source": "Software code available to all.", + "Oscar bait": "Movie made specifically to win awards.", + "Out of the loop": "Uninformed.", + "Outtake": "Deleted scene.", + "Over the top": "Excessive.", + "Paid programming": "Infomercial.", + "Paparazzi": "Celebrity photographers.", + "Phishing": "Email scam.", + "Photobomb": "Ruining a photo by jumping in background.", + "Pig out": "Eat a lot.", + "Pilot": "First episode of a show.", + "Pitch": "Throw.", + "Pixelated": "Low resolution image.", + "Platform": "Operating system or social site.", + "Playlist": "List of songs.", + "Plug": "Promote something.", + "Podcast": "Audio show.", + "Pop up": "Temporary store/ad.", + "Poser": "Fake person.", + "Post-credits scene": "Scene after credits roll.", + "Potluck": "Party where everyone brings a dish.", + "Premiere": "First showing.", + "Prequel": "Movie set before the original.", + "Prime time": "Peak TV viewing hours (8-11pm).", + "Product placement": "Brands shown in movies.", + "Promo": "Advertisement.", + "Props": "Respect.", + "Public domain": "No copyright.", + "Punt": "Delay decision.", + "Push notification": "Phone alert.", + "Put on blast": "Publicly criticize.", + "Queue": "Line (Netflix queue, rarely used for people).", + "Quit cold turkey": "Stop immediately.", + "Rage quit": "Stop playing game in anger.", + "Rating": "Audience size OR Content age limit (PG-13, R).", + "Reboot": "Restarting a movie franchise.", + "Recap": "Summary.", + "Red carpet": "Celebrity walkway.", + "Release date": "Launch day.", + "Remake": "New version of old movie.", + "Remote": "TV controller (Clicker).", + "Rerun": "Repeat of a TV show.", + "Review bomb": "Flooding a product with negative reviews.", + "Riff": "Improvise.", + "Rip off": "Theft.", + "Road trip": "Long car journey.", + "Rock bottom": "Lowest point.", + "Role model": "Person to imitate.", + "Rom-com": "Romantic Comedy.", + "Root for": "Support a team.", + "Rubberneck": "Stare.", + "Screen time": "Time spent on devices.", + "Screenshot": "Image of screen.", + "Script": "Written dialogue.", + "Season finale": "Last episode of season.", + "Selfie": "Photo of oneself.", + "Sell out": "Compromise integrity for money.", + "Sequel": "Follow-up movie.", + "Server": "Computer host OR Waiter.", + "Shade": "Insult.", + "Shipping": "Wanting two characters to date.", + "Showrunner": "TV producer in charge.", + "Sidekick": "Helper.", + "Sign off": "Log out / Goodbye.", + "Silver screen": "Movies.", + "Sitcom": "Situation Comedy.", + "Sleeper hit": "Unexpected success.", + "Slacker": "Lazy person.", + "Slapstick": "Physical comedy.", + "Slasher": "Horror movie with killer.", + "Slow motion": "Reduced speed.", + "Smartphone": "iPhone/Android.", + "Smash hit": "Huge success.", + "Sneak peek": "Preview.", + "Soap opera": "Melodramatic daily drama.", + "Social butterfly": "Outgoing person.", + "Soft launch": "Quiet release.", + "Sound bite": "Short audio clip.", + "Soundtrack": "Movie music.", + "Spam": "Junk mail.", + "Special effects (FX)": "CGI/Visual tricks.", + "Spin-off": "Show derived from another.", + "Spoiler": "Revealing the ending.", + "Sponsored": "Paid for by brand.", + "Spotlight": "Attention.", + "Squad": "Team.", + "Stage fright": "Fear.", + "Stand-up": "Comedy performance.", + "Star-struck": "Awed by celebrity.", + "Startup": "New tech company.", + "Status symbol": "Item showing wealth.", + "Steal the show": "Outperform the lead.", + "Streaming": "Watching online (Netflix).", + "Stunt double": "Actor for dangerous scenes.", + "Subscribe": "Follow channel.", + "Subtitle": "Text at bottom.", + "Super bowl": "Championship football game (Ad event).", + "Surge pricing": "Higher price at peak time (Uber).", + "Swipe left/right": "Reject/Accept (Tinder).", + "Syndication": "Selling show to many channels.", + "Tabloid": "Gossip newspaper.", + "Tag": "Label.", + "Takeout": "Food.", + "Talk show": "Interview program.", + "Techie": "Technology expert.", + "Teaser": "Short trailer.", + "Teleprompter": "Script reader.", + "The cloud": "Online storage.", + "Throwback": "Nostalgic reference.", + "Thumbnail": "Small preview image.", + "Ticket scalper": "Reseller of tickets.", + "Title track": "Song with same name as album.", + "To-go box": "Container for leftovers.", + "Touchscreen": "Interactive screen.", + "Trailer": "Movie advertisement.", + "Trending": "Popular now.", + "Troll": "Annoy.", + "Turnpike": "Toll road.", + "Tweet": "Post.", + "Twist ending": "Surprise conclusion.", + "Typecast": "Actor stuck in one role type.", + "Unfriend": "Remove connection.", + "Unsubscribe": "Stop emails.", + "Update": "New version.", + "Upgrade": "Better version.", + "Upload": "Send file.", + "User interface (UI)": "Screen layout.", + "Username": "Login name.", + "Vaporware": "Software announced but never released.", + "Variety show": "Mixed performance.", + "Viral": "Popular online.", + "Virtual reality": "Simulated world.", + "Vlog": "Video blog.", + "Voiceover": "Off-screen narration.", + "Walk-on": "Minor role.", + "Wallet": "Digital payment holder.", + "Webinar": "Online seminar.", + "Wifi": "Wireless internet.", + "Widget": "Small app tool.", + "Wiki": "Collaborative site.", + "Window shopping": "Browsing without buying.", + "Wingman": "Friend helping with dating.", + "Wire": "Listening device.", + "Wireless": "Radio (Old) or Wifi (New).", + "Word of mouth": "Recommendation.", + "Wrap party": "Party when filming ends.", + "Writer's block": "Inability to write.", + "Yellow journalism": "Sensationalist news.", + "Youtuber": "Video creator.", + "Zero hour": "Start.", + "Zombie": "Mindless person.", + "Zoom": "Fast.", + "10-4": "Okay / Understood (Trucker).", + "9-to-5": "Standard workday.", + "A.W.O.L.": "Absent Without Leave (Missing).", + "Ace in the hole": "Secret advantage.", + "All in": "Committed fully.", + "Ambulance chaser": "Unethical lawyer seeking injury cases.", + "Amen corner": "Group of people who agree with everything said.", + "Ante up": "Pay your share.", + "As is": "Sold in current condition (no repairs/refunds).", + "Baby shower": "Party for a pregnant woman.", + "Bachelor party": "Party for groom before wedding.", + "Bachelorette party": "Party for bride before wedding.", + "Backyard": "Private garden behind house.", + "Ball drop": "New Year's Eve event in NYC.", + "Band-Aid": "Adhesive bandage (Brand name used as generic).", + "Barbecue (BBQ)": "Outdoor grilling party.", + "Bedside manner": "A doctor's ability to be empathetic.", + "Bet the farm": "Risk everything.", + "Bible thumper": "Aggressive religious evangelist.", + "Big box store": "Large retail chain (Walmart, Costco).", + "Black sheep": "Outcast family member.", + "Block party": "Neighborhood street party.", + "Blue laws": "Sunday alcohol bans.", + "Blue-light special": "Discount sale (K-Mart reference).", + "Bookie": "Person who takes illegal bets.", + "Boots on the ground": "Troops in the field.", + "Bottom feeder": "Opportunist who profits from others' misfortune.", + "Break even": "Make no profit but no loss.", + "Brownie points": "Credit for doing a good deed.", + "Bullseye": "Direct hit / Perfect.", + "Bundling": "Combining insurance/services for a discount.", + "Call someone's bluff": "Challenge someone to prove they aren't lying.", + "Card shark": "Skilled (or cheating) card player.", + "Cash out": "Take money and leave.", + "Chapstick": "Lip balm.", + "Clean bill of health": "Doctor says you are healthy.", + "Cleanup hitter": "Strongest person on the team.", + "Close to the vest": "Secretive.", + "Cold case": "Unsolved crime.", + "Collateral damage": "Unintended casualties.", + "Come to Jesus": "Serious realization.", + "Co-sign": "Guarantee a loan OR Agree with someone.", + "Coupon clipper": "Frugal person.", + "Cover charge": "Entry fee for a club.", + "Crapshoot": "Risky/Unpredictable situation.", + "Cut the mustard": "Meet the standard.", + "Dead on arrival (DOA)": "Already failed before starting.", + "Double or nothing": "Betting everything to win double or lose all.", + "Down to the wire": "Until the very last moment.", + "Drive-by": "Shooting from a car OR Brief visit.", + "Dry run": "Rehearsal.", + "Duct tape": "Silver adhesive tape (Fixes everything).", + "Early bird special": "Discount dinner for seniors.", + "Elbow grease": "Physical effort.", + "End zone": "Goal area (Football).", + "ER": "Emergency Room.", + "Estate sale": "Selling everything inside a house (usually after death).", + "Eye in the sky": "Traffic helicopter or Casino cameras.", + "Fall guy": "Person who takes the blame.", + "Fold": "Quit.", + "Full house": "Crowded.", + "Garage sale": "Selling old items from one's driveway.", + "Gate community": "Neighborhood with security guard.", + "Go cold turkey": "Quit abruptly.", + "Go Dutch": "Split the bill.", + "Gold star": "Reward for good behavior.", + "Good Samaritan": "Helper.", + "Graveyard shift": "Overnight work.", + "Grease someone's palm": "Bribe someone.", + "Groundhog Day": "Repeating situation.", + "Handyman": "Person who does small home repairs.", + "Happy camper": "Satisfied person.", + "Hard ball": "Aggressive negotiation.", + "Hat trick": "Three successes in a row.", + "Head-to-head": "Direct competition.", + "High roller": "Big spender.", + "Hold the fort": "Maintain order while leader is away.", + "Home court advantage": "Advantage of being in familiar territory.", + "House money": "Risk-free profit.", + "Hump day": "Wednesday.", + "Inside job": "Crime by employee.", + "Jury duty": "Mandatory service in court.", + "Kleenex": "Tissue paper.", + "Last ditch effort": "Final attempt.", + "Laymans terms": "Simple language.", + "Leftovers": "Uneaten food saved for later.", + "M.I.A.": "Missing In Action.", + "Mall cop": "Security guard.", + "Man cave": "Room in house for husband's hobbies.", + "Moon shot": "Ambitious project.", + "Nest egg": "Retirement savings.", + "Nightcap": "Final drink before bed.", + "No dice": "Refusal.", + "Nosebleed section": "Highest, cheapest seats.", + "Off the wagon": "Drinking alcohol after being sober.", + "On the house": "Free.", + "On the wagon": "Sober.", + "Open house": "Scheduled time to view a house for sale.", + "Out in left field": "Crazy / Wrong.", + "Pass the buck": "Blame others.", + "Paycheck to paycheck": "Having no savings.", + "Play hooky": "Skip school/work.", + "Play it safe": "Avoid risk.", + "Poker face": "Stoic expression.", + "Pro bono": "Free legal work.", + "Q-Tip": "Cotton swab.", + "Raise the bar": "Increase standards.", + "Riding the bench": "Not participating.", + "Ring a bell?": "Sound familiar?", + "Rough patch": "Difficult time.", + "Run the table": "Win every game.", + "Scotch tape": "Clear adhesive tape.", + "Second opinion": "Seeing a different doctor for confirmation.", + "Sharpie": "Permanent marker.", + "Shotgun wedding": "Forced marriage due to pregnancy.", + "Show and Tell": "School activity.", + "Sitting duck": "Easy target.", + "Skeleton in the closet": "Hidden secret.", + "Snake eyes": "Bad luck.", + "Snow day": "School cancelled due to snow.", + "Soccer mom": "Stereotypical suburban mother.", + "Spiel": "Rehearsed speech/Sales pitch.", + "Spring break": "Holiday.", + "Sticky note": "Post-it note.", + "Stocking stuffer": "Small Christmas gift.", + "Sunday driver": "Slow driver.", + "Sunday best": "Best clothes (for church).", + "Sweatshop": "Factory with bad conditions.", + "Swing shift": "Evening work.", + "Take a knee": "Pause / Rest.", + "Thanksgiving": "Major November holiday (Turkey).", + "The house always wins": "The system is rigged.", + "Throw in the towel": "Quit.", + "Touchdown": "Success.", + "Trick or Treat": "Halloween phrase.", + "Tupperware": "Plastic food container.", + "Turkey Day": "Thanksgiving.", + "Under the knife": "Having surgery.", + "Upsell": "Try to sell a more expensive item.", + "Urgent Care": "Walk-in clinic (Not ER).", + "Walk of shame": "Walking home in morning after one-night stand.", + "Wet blanket": "Person who ruins fun.", + "White elephant": "Gift exchange game.", + "White picket fence": "Symbol of suburban ideal.", + "Wild card": "Unknown.", + "Yard sale": "Garage sale.", + "Zero tolerance": "Strict rules.", + "A-Game": "Best effort.", + "Airhead": "Stupid person.", + "All ears": "Listening intently.", + "Antsy": "Restless / Anxious.", + "Baggage": "Past emotional trauma.", + "Beef": "Grudge / Conflict.", + "Beer belly": "Fat stomach from drinking.", + "Bite me": "Go away / Shut up.", + "Blabbermouth": "Person who talks too much.", + "Blast": "A very fun time.", + "Blow off steam": "Release anger/stress.", + "Blow smoke": "Exaggerate or lie to flatter someone.", + "Bombshell": "Shocking news.", + "Bone to pick": "Grievance to discuss.", + "Boundaries": "Personal limits (Therapy term).", + "Brainstorm": "Generate ideas.", + "Bummer": "Disappointing situation.", + "Busted": "Arrested / Caught.", + "Butterfingers": "Clumsy person who drops things.", + "Buzz": "Excitement / Slight intoxication.", + "Calling it quits": "Ending something (relationship/job).", + "Cardio": "Aerobic exercise.", + "Cheat day": "Day off from a diet.", + "Check it out": "Look at this.", + "Chill": "Relax / Cool.", + "Clueless": "Unaware.", + "Codependent": "Reliant on a partner (Therapy term).", + "Come clean": "Tell the truth.", + "Cop out": "Avoid responsibility.", + "Copycat": "Imitator.", + "Crush": "Romantic attraction.", + "Cut loose": "Relax / Have fun.", + "Debbie Downer": "Person who depresses others.", + "Ditch": "Leave / Abandon.", + "Drama queen": "Person who exaggerates problems.", + "Drop dead": "Go away.", + "Dweeb": "Nerd.", + "Easy-peasy": "Very easy.", + "Eat dirt": "Fall down.", + "Eat your heart out": "Be jealous.", + "Egg on your face": "Embarrassed.", + "Enabler": "Person who helps someone continue bad behavior.", + "Eye candy": "Attractive person.", + "Fair and square": "Honestly.", + "Far out": "Cool / Strange.", + "Fed up": "Annoyed / Done.", + "Flip out": "Get angry/crazy.", + "Fluke": "Lucky accident.", + "Freak out": "Panic.", + "Full of it": "Lying / Arrogant.", + "Gains": "Muscle growth.", + "Geek": "Obsessive enthusiast.", + "Get a grip": "Control yourself.", + "Get real": "Be realistic.", + "Ghost": "Leave without saying goodbye.", + "Give me a break": "Stop lying / Leave me alone.", + "Go bananas": "Go crazy.", + "Goof off": "Waste time.", + "Grab a bite": "Get food.", + "Gross": "Disgusting.", + "Gut feeling": "Intuition.", + "Guts": "Courage.", + "Hang in there": "Don't give up.", + "Hang out": "Spend time socially.", + "Hard time": "Difficulty OR Prison.", + "Head over heels": "Deeply in love.", + "Hit the sack": "Sleep.", + "Hold your horses": "Wait.", + "Hooked": "Addicted.", + "Icky": "Gross / Unpleasant.", + "In a jam": "In trouble.", + "In the doghouse": "In trouble (usually with spouse).", + "Inside scoop": "Secret information.", + "Jacked": "Very muscular.", + "Jitters": "Nervousness.", + "Junkie": "Addict.", + "Keeper": "Person worth keeping/marrying.", + "Keto": "Low carb diet.", + "Knock it off": "Stop it.", + "Knockout": "Beautiful.", + "Kosher": "Legitimate / Okay.", + "Laid back": "Relaxed.", + "Last straw": "Final annoyance.", + "Loaded": "Rich / Drunk / Gun with ammo.", + "Looker": "Attractive person.", + "Loser": "Unsuccessful person.", + "Low-life": "Criminal / Bad person.", + "Macros": "Macronutrients (Protein/Fat/Carbs).", + "Make waves": "Cause trouble.", + "Mellow": "Relaxed.", + "Mental health day": "Day off for stress.", + "Mess up": "Make a mistake.", + "Mind-blowing": "Amazing.", + "Mooch": "Beggar / Parasite.", + "Narcissist": "Self-obsessed person (Overused).", + "Nuke": "Microwave / Destroy.", + "Nuts": "Crazy.", + "Oddball": "Weird person.", + "Off the hook": "Escaped trouble OR Cool.", + "Old school": "Traditional.", + "Out of it": "Confused / Tired.", + "Pain in the neck": "Annoyance.", + "Party animal": "Person who loves parties.", + "Peanuts": "Small money.", + "Pissed": "Angry (Not drunk).", + "Pit stop": "Short break.", + "Plastic": "Credit card.", + "Pop quiz": "Surprise test.", + "Pro": "Professional.", + "Projecting": "Attributing own faults to others.", + "Psyched": "Excited.", + "Pumped": "Excited.", + "Pushy": "Aggressive.", + "Put out": "Agree to sex.", + "Rack": "Bed.", + "Rags to riches": "Poor to wealthy.", + "Rain or shine": "Whatever happens.", + "Reps": "Repetitions (Exercise).", + "Ripped": "Muscular.", + "Rip-off": "Bad deal / Scam.", + "Rookie": "Newbie.", + "Roughly": "Approximately.", + "Rule out": "Eliminate option.", + "Run out of gas": "Lose energy.", + "Rusty": "Out of practice.", + "Scaredy-cat": "Coward.", + "Scoop": "News.", + "Score": "Successful crime.", + "Self-care": "Taking care of oneself.", + "Sets": "Groups of reps (Exercise).", + "Shady": "Suspicious.", + "Sharp": "Smart OR On time.", + "Shredded": "Very muscular with low fat.", + "Sketchy": "Dangerous / Suspicious.", + "Skip": "Miss class/work.", + "Sleep on it": "Decide tomorrow.", + "Slob": "Messy person.", + "Smash": "Sex.", + "Snap": "Break.", + "Snooze": "Sleep / Boring.", + "So-so": "Okay / Average.", + "Spaced out": "Distracted.", + "Split": "Leave.", + "Spooky": "Scary.", + "Square": "Boring.", + "Stash": "Hide.", + "Steal": "Bargain.", + "Stoked": "Excited.", + "Stuffed": "Full of food.", + "Sucker": "Gullible person.", + "Sweet": "Cool.", + "Swole": "Muscular.", + "Tacky": "Cheap.", + "Tag along": "Follow.", + "Take off": "Leave.", + "Tight": "Cool.", + "Tip": "Money.", + "Toast": "Done.", + "Totaled": "Car destroyed.", + "Toxic": "Harmful person/environment.", + "Trash": "Garbage.", + "Treat": "Gift.", + "Triggered": "Emotionally provoked.", + "Twist": "Change.", + "Up tight": "Tense.", + "Validate": "Confirm feelings.", + "Wasted": "Drunk.", + "Weirdo": "Strange person.", + "Whiz": "Smart.", + "Wimp": "Weak person.", + "Wired": "Energetic / Caffeinated.", + "Wreck": "Crash.", + "2nd Amendment": "Right to own guns.", + "86ed": "Kicked out / Banned.", + "AWOL": "Absent Without Leave.", + "All hat, no cattle": "Talks big but has no substance (Texas).", + "Ammo": "Ammunition OR Arguments to use against someone.", + "Annie Oakley": "Good female shooter.", + "Bae": "Before Anyone Else (Partner).", + "Baller": "Successful / Wealthy person.", + "Benjamins": "$100 bills.", + "Big D": "Dallas, Texas.", + "Blitz": "Attack (Football/Business).", + "Boondoggle": "Wasteful government project.", + "Boot": "New recruit (Military).", + "Bounce": "Leave.", + "Brick": "Very cold (NYC slang).", + "Bubba": "Southern male (stereotype).", + "Bug out": "Leave quickly / Panic.", + "Bust a cap": "Shoot a gun.", + "Cake walk": "Easy task.", + "Cali": "California (insiders rarely say this, outsiders do).", + "Catty-corner": "Diagonal.", + "Cheddar": "Money.", + "Cheerleader": "Supporter.", + "Chow": "Food.", + "Civilian": "Non-police/military person.", + "Cockpit": "Driver's seat.", + "Come and Take It": "Gun rights slogan.", + "Creek": "Stream (Pronounced 'Crick' in some areas).", + "Crib": "Home.", + "Cut and run": "Retreat quickly.", + "DMV": "Department of Motor Vehicles (Hell on earth).", + "Defcon 1": "Maximum danger.", + "Deuce": "Two / Peace sign / Toilet.", + "Dime piece": "Perfect 10 (Attractive).", + "Dirt": "Gossip.", + "Dog tags": "Military ID.", + "Dope": "Cool OR Drugs.", + "Double-dipping": "Getting paid twice.", + "Dough": "Money.", + "Down range": "Deployed in combat zone.", + "Drill sergeant": "Strict teacher/boss.", + "Drop and give me 20": "Do 20 pushups.", + "Dutch": "Split the bill.", + "Ear hustle": "Eavesdrop.", + "Easy peasy": "Simple.", + "Eighty-six": "Cancel / Remove.", + "Empty clip": "Out of ammo/ideas.", + "FUBAR": "F***ed Up Beyond All Recognition.", + "Fall back": "Retreat / Relax.", + "Finna": "Going to (African American Vernacular).", + "Fire in the hole": "Warning of explosion.", + "Flak": "Criticism.", + "Flat": "Apartment (Rare in US, usually 'Apartment').", + "Flip-flops": "Thongs (shoes).", + "Flyover state": "Midwest (Derogatory).", + "For shizzle": "For sure (Snoop Dogg slang).", + "Forty": "40oz beer.", + "Friendly fire": "Accidentally hurting your own side.", + "Frat bro": "Stereotypical fraternity member.", + "G.I.": "Soldier (Government Issue).", + "G.O.A.T.": "Greatest of All Time.", + "Gat": "Gun.", + "Gear": "Equipment / Drugs.", + "Get lit": "Party hard.", + "Gonna": "Going to.", + "Gotcha": "I understand OR I tricked you.", + "Grass": "Marijuana.", + "Grunt": "Infantry soldier.", + "Gucci": "Good / Cool.", + "Gun nut": "Gun enthusiast.", + "Gym rat": "Fitness addict.", + "Heater": "Gun.", + "Holler": "Call out.", + "Homie": "Friend.", + "Hook 'em": "University of Texas slogan.", + "Hooah": "Army battle cry.", + "Hoorah": "Marine battle cry.", + "Hoosier": "Person from Indiana.", + "Hot mess": "Disaster person.", + "Hump": "Carry heavy load.", + "Hustle": "Scam OR Hard work.", + "Ice": "Diamonds.", + "In the paint": "Aggressive (Basketball).", + "Jaw": "Talk.", + "Jinx": "Bad luck.", + "Joe": "Coffee OR Average man.", + "John": "Toilet OR Prostitute's client.", + "Juice": "Respect / Steroids / Electricity.", + "Jungle": "Dangerous area.", + "Junk": "Genitals OR Trash.", + "K-12": "Primary and Secondary education system.", + "Keg": "Barrel of beer.", + "Kicks": "Shoes.", + "Killer": "Great.", + "Klick": "Kilometer.", + "Lock and load": "Get ready.", + "Loop": "Chicago downtown.", + "MIA": "Missing.", + "MacGyver": "Fix with random items.", + "Major league": "Big time.", + "Mall rat": "Teenager at mall.", + "Man": "Friend.", + "Mardi Gras": "New Orleans festival.", + "Midterm": "Exam.", + "Moonshine": "Illegal alcohol.", + "Mr. Mom": "Stay-at-home dad.", + "Mug": "Face.", + "Mule": "Drug smuggler.", + "O-Face": "Orgasm face.", + "One eighty (180)": "Total reversal.", + "Oscar Mike": "On the Move (Military).", + "Over and Out": "Radio sign off.", + "Packing": "Carrying a gun.", + "Pad": "Home.", + "Pal": "Friend (often sarcastic).", + "Piece": "Gun.", + "Pig": "Police (Derogatory).", + "Pigskin": "Football.", + "Player": "Promiscuous person.", + "Pop": "Soda (Midwest).", + "Postal": "Crazy.", + "Prep": "Preppy person.", + "Punk": "Troublemaker.", + "Quick buck": "Easy money.", + "Rad": "Cool.", + "Rat": "Informant.", + "Redneck": "Rural white person.", + "Ride": "Car.", + "Riding shotgun": "Front seat.", + "Rock": "Diamond / Crack.", + "Rocket science": "Difficult.", + "Roger that": "Understood.", + "Roomie": "Roommate.", + "Root": "Cheer for.", + "Round": "Bullet.", + "Rush": "Fraternity recruitment.", + "SNAFU": "Situation Normal: All F***ed Up.", + "Sandbag": "Perform poorly on purpose.", + "Scam": "Fraud.", + "School": "To teach someone a lesson.", + "Scratch": "Money.", + "Scrub": "Loser.", + "Shaft": "Unfair treatment.", + "Shook": "Scared.", + "Shoot": "Go ahead / Damn.", + "Shotgun": "Front seat.", + "Shrink": "Therapist.", + "Sleeper": "Unexpected success.", + "Slice": "Pizza portion.", + "Slugger": "Baseball player.", + "Sneakers": "Trainers.", + "SoCal": "Southern California.", + "Soda": "Soft drink.", + "Sound": "Stable.", + "Spill": "Tell.", + "Spin": "Lie.", + "Spirit": "Attitude.", + "Splash": "Impact.", + "Spoiled": "Bad.", + "Spook": "Spy.", + "Spot": "Lend money.", + "Squat": "Nothing.", + "Squeal": "Inform.", + "Stack": "Thousand dollars.", + "Stage": "Perform.", + "Star": "Famous.", + "Staycation": "Home holiday.", + "Step up": "Take charge.", + "Stick": "Manual transmission.", + "Stoned": "High.", + "Straight": "Okay / Heterosexual.", + "Street": "Urban.", + "Stretch": "Exaggeration.", + "Strike": "Failure / Labor stoppage.", + "String": "Deceive.", + "Stud": "Macho man.", + "Stuff": "Things.", + "Stump": "Confuse.", + "Suck": "Be bad.", + "Suit": "Executive.", + "Swing": "Try.", + "Swipe": "Steal.", + "Switch": "Change.", + "Syllabus week": "First week of college (Easy).", + "Tab": "Bill.", + "Tank": "Fail.", + "Tape": "Record.", + "Taps": "Funeral song.", + "Tax": "Burden.", + "Tea": "Gossip.", + "Team": "Group.", + "Tear": "Cry.", + "Tech": "Technology.", + "Teen": "Youth.", + "Tell": "Reveal.", + "Ten": "Perfect.", + "Tex-Mex": "Texas Mexican food.", + "Thanks": "Gratitude.", + "Thing": "Item.", + "Thirst": "Desire.", + "Thug": "Criminal.", + "Ticket": "Entry.", + "Time": "Clock.", + "Tool": "Jerk.", + "Top": "Best.", + "Total": "Destroy.", + "Touch": "Contact.", + "Tough": "Hard.", + "Tour": "Trip.", + "Town": "City.", + "Track": "Song.", + "Trade": "Swap.", + "Trap": "Bad place.", + "Tree": "Marijuana.", + "Trick": "Deceive.", + "Trip": "Crazy.", + "Troop": "Soldier.", + "Truck": "Vehicle.", + "Trust": "Believe.", + "Truth": "Fact.", + "Tube": "TV.", + "Tune": "Song.", + "Turf": "Territory.", + "Turkey": "Fool.", + "Turn": "Change.", + "Type": "Kind.", + "Ump": "Referee.", + "Uncle": "Surrender.", + "Unit": "Big person.", + "Up": "Awake.", + "Use": "Exploit.", + "Vamp": "Improvise.", + "Veg": "Relax.", + "Vibe": "Feeling.", + "Vic": "Victim.", + "View": "Look.", + "Vip": "Important.", + "Vote": "Choose.", + "Wack": "Bad.", + "Wad": "Money.", + "Wait": "Stop.", + "Wake": "Funeral.", + "Walk": "Go free.", + "Wall": "Barrier.", + "Want": "Desire.", + "War": "Fight.", + "Wash": "Equal.", + "Waste": "Kill.", + "Watch": "Look.", + "Wave": "Trend.", + "Wax": "Defeat.", + "Way": "Method.", + "Weak": "Funny / Lame.", + "Wear": "Tire.", + "Web": "Internet.", + "Weed": "Marijuana.", + "Week": "Seven days.", + "Weird": "Strange.", + "Well": "Good.", + "West": "Direction.", + "Wet": "Alcohol.", + "Whack": "Kill.", + "Whale": "Gambler.", + "Whip": "Car.", + "Whoa": "Stop.", + "Wick": "Fuse.", + "Wide": "Big.", + "Wife": "Spouse.", + "Wild": "Crazy.", + "Win": "Succeed.", + "Wind": "Air.", + "Wing": "Improvise.", + "Wink": "Signal.", + "Wise": "Smart.", + "Wish": "Hope.", + "With": "Together.", + "Wiz": "Smart.", + "Wolf": "Devour.", + "Wonk": "Expert.", + "Word": "Truth.", + "Work": "Job.", + "Wow": "Amaze.", + "Wrap": "Finish.", + "Write": "Note.", + "Wrong": "Incorrect.", + "Yard": "Prison outdoor area.", + "Yeah": "Yes.", + "Year": "Time.", + "Yell": "Shout.", + "Yellow": "Coward.", + "Yes": "Affirmative.", + "Yinz": "You all (Pittsburgh).", + "Yolo": "Live once.", + "Zone": "Area.", + "10-20": "Location (Police code).", + "A.P.B.": "All Points Bulletin (Missing person alert).", + "Above my pay grade": "I am not authorized/paid enough to decide this.", + "Ace": "Top pitcher OR High card.", + "ambulance chaser": "Lawyer who solicits accident victims.", + "Back to the grind": "Returning to work.", + "Badge heavy": "Cop who abuses authority.", + "Bailiff": "Courtroom security officer.", + "Bandwagon": "Joining a popular cause late.", + "Bean counter": "Accountant / Obsessive budgeter.", + "Beat": "Patrol area (Police) OR Tired.", + "Bench warrant": "Arrest order issued by a judge.", + "Big house": "Prison.", + "Big league": "Major / Important.", + "Black and white": "Police car.", + "Blue flue": "Police strike where officers call in sick.", + "Book 'em": "Process an arrest.", + "Bottom of the ninth": "Last chance.", + "Brass": "High-ranking officers/executives.", + "Break room": "Employee lounge.", + "Bullpen": "Office area with no walls OR Warm-up area.", + "C.O.": "Corrections Officer (Prison guard).", + "Canary": "Informant.", + "Case": "Investigate / Watch (Case the joint).", + "Chain of command": "Hierarchy.", + "Chasing ghosts": "Investigating leads that go nowhere.", + "Chief": "Boss (often sarcastic).", + "Circle the wagons": "Prepare for defense.", + "Clean as a whistle": "Innocent / Neat.", + "Clock watcher": "Lazy employee.", + "Collar": "To arrest.", + "Cook the books": "Falsify financial records.", + "Cop a plea": "Plead guilty for a lesser sentence.", + "Corner office": "Executive suite.", + "Cover your six": "Watch your back.", + "Cubicle farm": "Large open office.", + "Cut and dry": "Obvious / Simple.", + "DA": "District Attorney (Prosecutor).", + "Dead to rights": "Caught with undeniable proof.", + "Deep throat": "Anonymous source.", + "Desk jockey": "Office worker.", + "Detective": "Investigator.", + "Dirty": "Corrupt (Cop) OR Possessing drugs.", + "Do time": "Serve a prison sentence.", + "Double header": "Two events in one day.", + "Down for the count": "Defeated / Asleep.", + "Drop a dime": "Inform on someone.", + "Dugout": "Team bench area.", + "DUI": "Driving Under Influence.", + "Exigent circumstances": "Emergency allowing police entry without warrant.", + "Fed": "FBI agent.", + "Fink": "Informant.", + "First base": "Kissing (Dating metaphor).", + "Flatfoot": "Police officer (Old slang).", + "Foul play": "Crime suspected.", + "Foul ball": "Mistake.", + "Front line": "Workers dealing with customers.", + "Full court press": "All-out effort (Basketball).", + "G-Man": "FBI Agent.", + "Get out of jail free card": "Excuse to avoid trouble.", + "Go down swinging": "Fight until the end.", + "Golden parachute": "Big payout for fired executive.", + "Grand slam": "Total success.", + "Grease": "Bribe.", + "Greenhorn": "Inexperienced worker.", + "Gridiron": "Football field.", + "Grilling": "Interrogating.", + "Ground ball": "Easy task.", + "Gumshoe": "Detective.", + "Gun": "Accelerator (Gun it).", + "Heat": "Police OR Pressure.", + "Heavy hitter": "Influential person.", + "High noon": "Time for a showdown.", + "Hit and run": "Car accident where driver flees.", + "Hit the deck": "Drop to the ground.", + "Holding cell": "Temporary jail.", + "Home stretch": "Final phase.", + "Homicide": "Murder.", + "Honeymoon period": "Early happy phase of a job.", + "Horse trading": "Hard negotiation.", + "Hot pursuit": "Chasing a suspect.", + "Hung jury": "Jury cannot agree.", + "In the line of duty": "While working (Police).", + "Ivory tower": "Academia / Disconnected leadership.", + "John Doe": "Unidentified male.", + "K-9": "Police dog unit.", + "Keep your nose clean": "Stay out of trouble.", + "Kickback": "Bribe returned to payer.", + "Lawyer up": "Get an attorney.", + "Left field": "Unexpected place.", + "Legal eagle": "Smart lawyer.", + "Life": "Life sentence.", + "Lineup": "Suspect identification row.", + "Loan shark": "Illegal moneylender.", + "Lockdown": "Prison confinement.", + "Lone Ranger": "Person acting alone.", + "Long arm of the law": "Police reach.", + "Lookout": "Watcher for crime.", + "Make bail": "Pay to leave jail.", + "Manhunt": "Search for fugitive.", + "Miranda": "Rights read to suspect.", + "Narc": "Narcotics officer OR Snitch.", + "Nine to five": "Standard job.", + "No contest": "Plea (Nolo contendere).", + "Off the books": "Unreported cash work.", + "Off the reservation": "Acting independently/rogue.", + "On the lam": "Running from police.", + "On the take": "Accepting bribes.", + "Open and shut": "Simple case.", + "Overtime": "Extra work.", + "Paddy wagon": "Police van (Old term).", + "Parole": "Early release from prison.", + "Partner": "Cop's teammate.", + "Pat down": "Search body.", + "Pay grade": "Salary level.", + "Perk": "Benefit.", + "Perp": "Perpetrator.", + "Pinnch": "Arrest.", + "Plant": "Hidden evidence.", + "Plea bargain": "Deal for lower sentence.", + "Pound the pavement": "Look for work/leads.", + "Probation": "Supervised freedom.", + "Public defender": "Free lawyer.", + "Punch in": "Start work.", + "Quick draw": "Fast reactor.", + "Rainmaker": "Person who brings in business.", + "Rap sheet": "Criminal record.", + "Riding the pine": "Not participating.", + "Right field": "Strange / Wrong.", + "Ringers": "Professionals posing as amateurs.", + "Round up": "Gather.", + "Rubber check": "Bounced check.", + "Run the bases": "Progress sexually.", + "Safe": "Not out.", + "Scab": "Strike breaker.", + "Screw": "Prison guard.", + "Second base": "Touching (Dating).", + "Serve and protect": "Police motto.", + "Severance": "Firing pay.", + "Shakedown": "Extortion / Search.", + "Sham": "Fake.", + "Shark": "Ruthless person.", + "Sheriff": "County police chief.", + "Shift": "Work period.", + "Shoot straight": "Tell truth.", + "Shop steward": "Union rep.", + "Showdown": "Fight.", + "Shutout": "Prevent opponent from scoring.", + "Sidearm": "Pistol.", + "Sing": "Confess.", + "Siren": "Police alarm.", + "Skip bail": "Flee before court.", + "Slammer": "Jail.", + "Snake oil": "Fake medicine.", + "Snitch": "Informant.", + "Softball": "Easy question.", + "Solitary": "Isolation cell.", + "Southpaw": "Left-handed person.", + "Speed trap": "Police hiding spot.", + "Stakeout": "Surveillance.", + "Standoff": "Deadlock.", + "Statute of limitations": "Time limit on crime.", + "Sting": "Undercover operation.", + "Stool pigeon": "Informant.", + "Suspect": "Person thought to be guilty.", + "Sweat it out": "Wait nervously.", + "Tail": "Follow someone.", + "Take a dive": "Lose on purpose.", + "Take the fall": "Accept blame.", + "Talk shop": "Discuss work.", + "Team player": "Cooperative worker.", + "Third base": "Oral sex (Dating).", + "Third degree": "Intense interrogation.", + "Throw the book at": "Maximum punishment.", + "Time and a half": "Overtime pay.", + "Tip off": "Warn.", + "Turn state's evidence": "Testify against partners.", + "Undercover": "Disguised police.", + "Union": "Labor group.", + "Vice": "Drugs/Prostitution unit.", + "Walk the beat": "Patrol.", + "Warrant": "Arrest order.", + "White collar": "Office worker.", + "Wild West": "Lawless situation.", + "Wise guy": "Mobster OR Joker.", + "Witness": "Observer.", + "Workhorse": "Hard worker.", + "Write-up": "Disciplinary report.", + "Wrong side of the tracks": "Poor neighborhood.", + "Act of God": "Natural disaster (Insurance term).", + "Amen": "I agree.", + "Backslide": "Return to bad habits.", + "Backstage": "Private area.", + "Baptism by fire": "Learning something difficult quickly.", + "Bear cross": "Endure suffering.", + "Beast of burden": "Hard worker.", + "Bible belt": "Religious South.", + "Big rig": "Large truck.", + "Blind leading the blind": "Ignorant people advising others.", + "Born again": "Religious conversion.", + "Breaker 1-9": "Requesting to speak on CB radio.", + "Broken record": "Repeating oneself.", + "Brother's keeper": "Responsible for others.", + "Burn out": "Exhaustion.", + "Cast the first stone": "Criticize hypocritically.", + "Chart-topper": "Popular song.", + "Choir": "Group of singers OR People who already agree (Preach to the choir).", + "Convoy": "Group of vehicles.", + "Cooking with gas": "Doing well.", + "Cover": "Remake of a song OR Entry fee.", + "Cross to bear": "Burden.", + "Daily bread": "Earnings.", + "Damned if you do": "No good option.", + "Deadhead": "Empty return trip (Trucking).", + "Deal with the devil": "Risky compromise.", + "Devil's advocate": "Argue opposite side.", + "Dicey": "Risky.", + "Doubting Thomas": "Skeptic.", + "Down and out": "Destitute.", + "Drop the mic": "End impressively.", + "Eleven pro": "Top quality.", + "Eye for an eye": "Revenge.", + "Fall from grace": "Loss of status.", + "Fat lady sings": "The end.", + "Forbidden fruit": "Illicit pleasure.", + "Four-wheeler": "Car (Trucker slang).", + "Give up the ghost": "Die / Quit.", + "Go for broke": "Risk all.", + "God forbid": "Hopefully not.", + "Gospel truth": "Absolute truth.", + "Grail": "Ultimate goal.", + "Groupie": "Obsessive fan.", + "Hallelujah": "Celebration.", + "Heavy metal": "Music genre OR Big machines.", + "Hell-bent": "Determined.", + "Holier than thou": "Arrogant morality.", + "Holy cow": "Wow.", + "Holy grail": "Best thing.", + "Hymn": "Song.", + "Idol": "Celebrity.", + "Jezebel": "Immoral woman.", + "Jonah": "Bad luck person.", + "Judas": "Traitor.", + "Judge not": "Don't criticize.", + "Keep on trucking": "Persist.", + "King of the road": "Trucker.", + "Kiss of death": "Fatal event.", + "Land of milk and honey": "Rich place.", + "Last supper": "Final meal.", + "Lay cards on table": "Reveal truth.", + "Let there be light": "Start.", + "Lip sync": "Fake singing.", + "Long haul": "Long time.", + "Lost cause": "Hopeless.", + "Lottery": "Luck.", + "Luck of the draw": "Chance.", + "Manna": "Unexpected gift.", + "Mark of the beast": "Evil sign.", + "Mecca": "Center of activity.", + "Messiah": "Savior.", + "Methuselah": "Old person.", + "Miracle": "Amazing event.", + "Moment of truth": "Critical time.", + "Money changes everything": "Cynical motto.", + "Move mountains": "Do impossible.", + "My cross to bear": "My burden.", + "New lease on life": "Fresh start.", + "Noah's ark": "Safe place.", + "Odds": "Probability.", + "Off the charts": "Amazing.", + "Olive branch": "Peace offer.", + "On a prayer": "Barely surviving.", + "Over and out": "Goodbye.", + "Over the hill": "Old.", + "Paid my dues": "Earned right.", + "Pandora's box": "Source of trouble.", + "Pariah": "Outcast.", + "Patience of Job": "Very patient.", + "Pearls before swine": "Wasting quality on unappreciative people.", + "Philistine": "Uncultured person.", + "Pot luck": "Random chance OR Meal.", + "Preach": "Speak truth.", + "Prodigal son": "Returning sinner.", + "Promised land": "Goal.", + "Prophet": "Predictor.", + "Raise the stakes": "Increase risk.", + "Rapture": "Ecstasy OR End times.", + "Reborn": "Changed.", + "Red sea": "Obstacle.", + "Rig": "Truck.", + "Roadie": "Crew member.", + "Rock and roll": "Start.", + "Rolling stone": "Wanderer.", + "Sacred cow": "Untouchable topic.", + "Saint": "Good person.", + "Salt of the earth": "Good people.", + "Samaritan": "Helper.", + "Scapegoat": "Blamed person.", + "Sell your soul": "Compromise integrity.", + "Serpent": "Traitor.", + "Seven year itch": "Boredom.", + "Shibboleth": "Password.", + "Sign from God": "Omen.", + "Sin": "Bad act.", + "Sinner": "Bad person.", + "Skin of my teeth": "Barely.", + "Sodom and Gomorrah": "Wicked place.", + "Sold out": "No tickets left OR Betrayed.", + "Solo": "Alone.", + "Sound check": "Test.", + "Spare the rod": "Spoil child.", + "Stack the deck": "Cheat.", + "Stairway to heaven": "Path to good.", + "Stake": "Bet.", + "Straight and narrow": "Honest path.", + "Strike it rich": "Win money.", + "Sure thing": "Certainty.", + "Sweeten the pot": "Add value.", + "Take a gamble": "Risk.", + "Talent": "Skill.", + "Ten-four": "Okay.", + "The house": "Casino.", + "Thirty pieces of silver": "Bribe.", + "Thomas": "Doubter.", + "Titan": "Giant.", + "Top of the charts": "Best.", + "Tower of Babel": "Confusion.", + "Turn the other cheek": "Ignore insult.", + "Twelve disciple": "Follower.", + "Two cents": "Opinion.", + "Unsung hero": "Ignored helper.", + "Up the ante": "Increase risk.", + "Valley of death": "Hard time.", + "Vegas odds": "Probability.", + "Venue": "Location.", + "Voice in wilderness": "Ignored warning.", + "Walk on water": "Do miracle.", + "Wandering Jew": "Traveler.", + "Wash hands of": "Abandon.", + "Water into wine": "Miracle.", + "Way of all flesh": "Death.", + "Wheels": "Car.", + "Wise men": "Smart people.", + "Wolf in sheep's clothing": "Enemy disguised.", + "Worship": "Adore.", + "Writing on the wall": "Impending doom." + }, + "pragmatic_rules": [ + { + "trigger": "How are you?", + "speaker_role": "Any", + "interpretation": "Standard greeting. The only correct answer is 'Good' or 'Fine'. Do not give a life update.", + "tone": "Ritualistic" + }, + { + "trigger": "We should do lunch", + "speaker_role": "Acquaintance", + "interpretation": "Polite farewell. Means 'I like you enough to lie about seeing you again'.", + "tone": "Polite/False" + }, + { + "trigger": "I'll let you go", + "speaker_role": "Initiator", + "interpretation": "I am bored or busy and want to end this conversation immediately.", + "tone": "Exit Strategy" + }, + { + "trigger": "That's interesting", + "speaker_role": "Listener", + "interpretation": "That is weird, wrong, or I disagree. (Context dependent).", + "tone": "Non-committal" + }, + { + "trigger": "I hear what you're saying", + "speaker_role": "Debater", + "interpretation": "I understand the words, but I completely disagree.", + "tone": "Dismissive" + }, + { + "trigger": "Let's take this offline", + "speaker_role": "Manager", + "interpretation": "Shut up about this topic during the meeting.", + "tone": "Directive" + }, + { + "trigger": "With all due respect", + "speaker_role": "Debater", + "interpretation": "I am about to say something disrespectful or contradictory.", + "tone": "Warning" + }, + { + "trigger": "Tell me about yourself", + "speaker_role": "Interviewer", + "interpretation": "Give me your 60-second professional pitch, not your biography.", + "tone": "Professional" + }, + { + "trigger": "Let's touch base", + "speaker_role": "Colleague", + "interpretation": "I will annoy you about this later.", + "tone": "Persistent" + }, + { + "trigger": "I'm running a few minutes late", + "speaker_role": "Arriver", + "interpretation": "I will be 10-15 minutes late.", + "tone": "Apologetic" + }, + { + "trigger": "See you later", + "speaker_role": "Leaver", + "interpretation": "Goodbye. (Does not literally mean I will see you later).", + "tone": "Casual" + }, + { + "trigger": "Excuse me", + "speaker_role": "Stranger", + "interpretation": "Get out of my way OR I need your attention.", + "tone": "Functional" + }, + { + "trigger": "It's fine", + "speaker_role": "Partner", + "interpretation": "It is absolutely not fine.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Maybe", + "speaker_role": "Invitee", + "interpretation": "No, but I don't want to hurt your feelings.", + "tone": "Avoidant" + }, + { + "trigger": "I'll think about it", + "speaker_role": "Customer", + "interpretation": "I am not buying this.", + "tone": "Polite Refusal" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are an idiot / You are pathetic.", + "tone": "Condescending" + }, + { + "trigger": "Looks great", + "speaker_role": "Reviewer", + "interpretation": "It is acceptable. (Does not necessarily mean 'great').", + "tone": "Approval" + }, + { + "trigger": "To be honest", + "speaker_role": "Speaker", + "interpretation": "I am about to be blunt or critical.", + "tone": "Warning" + }, + { + "trigger": "Just a heads up", + "speaker_role": "Messenger", + "interpretation": "Prepare for bad news or a task.", + "tone": "Alerting" + }, + { + "trigger": "Do you have a sec?", + "speaker_role": "Requester", + "interpretation": "I need 5-10 minutes of your time.", + "tone": "Minimizing" + }, + { + "trigger": "I don't care", + "speaker_role": "Decider", + "interpretation": "I am easygoing/You choose. (If angry tone: I am indifferent).", + "tone": "Neutral" + }, + { + "trigger": "Whatever", + "speaker_role": "Arguer", + "interpretation": "Fuck you / I am done talking.", + "tone": "Dismissive" + }, + { + "trigger": "Good for you", + "speaker_role": "Listener", + "interpretation": "I don't care, or I am jealous.", + "tone": "Sarcastic" + }, + { + "trigger": "Shut up!", + "speaker_role": "Friend", + "interpretation": "I can't believe it! (Expression of shock, not a command).", + "tone": "Excited" + }, + { + "trigger": "Get out of here", + "speaker_role": "Friend", + "interpretation": "You are joking/lying.", + "tone": "Disbelief" + }, + { + "trigger": "My bad", + "speaker_role": "Offender", + "interpretation": "I apologize (minor offense).", + "tone": "Casual" + }, + { + "trigger": "No worries", + "speaker_role": "Helper", + "interpretation": "You're welcome.", + "tone": "Casual" + }, + { + "trigger": "I appreciate it", + "speaker_role": "Recipient", + "interpretation": "Thank you.", + "tone": "Sincere" + }, + { + "trigger": "Can I pick your brain?", + "speaker_role": "Requester", + "interpretation": "I want free advice or consulting.", + "tone": "Flattering" + }, + { + "trigger": "Let's play it by ear", + "speaker_role": "Planner", + "interpretation": "I don't want to commit to a plan yet.", + "tone": "Flexible" + }, + { + "trigger": "Sounds like a plan", + "speaker_role": "Agreed", + "interpretation": "I agree to the proposal.", + "tone": "Affirmative" + }, + { + "trigger": "It is what it is", + "speaker_role": "Stoic", + "interpretation": "I accept this bad situation because I can't change it.", + "tone": "Resigned" + }, + { + "trigger": "Per my last email", + "speaker_role": "Sender", + "interpretation": "You are stupid/lazy for not reading what I already wrote.", + "tone": "Aggressive" + }, + { + "trigger": "Moving forward", + "speaker_role": "Manager", + "interpretation": "Stop dwelling on the mistake; here are the new rules.", + "tone": "Directive" + }, + { + "trigger": "Not a problem", + "speaker_role": "Server", + "interpretation": "You're welcome.", + "tone": "Service" + }, + { + "trigger": "What's up?", + "speaker_role": "Greeter", + "interpretation": "Hello.", + "tone": "Casual" + }, + { + "trigger": "Sup", + "speaker_role": "Greeter", + "interpretation": "Hello.", + "tone": "Very Casual" + }, + { + "trigger": "I'm good", + "speaker_role": "Refuser", + "interpretation": "No, I don't want that.", + "tone": "Polite Refusal" + }, + { + "trigger": "You're fine", + "speaker_role": "Apologee", + "interpretation": "I forgive you / It wasn't a big deal.", + "tone": "Reassuring" + }, + { + "trigger": "Have a good one", + "speaker_role": "Leaver", + "interpretation": "Have a good day/night.", + "tone": "Friendly" + }, + { + "trigger": "Take care", + "speaker_role": "Leaver", + "interpretation": "Goodbye.", + "tone": "Friendly" + }, + { + "trigger": "Could you do me a favor?", + "speaker_role": "Requester", + "interpretation": "I am about to ask for something annoying.", + "tone": "Preparation" + }, + { + "trigger": "If that makes sense", + "speaker_role": "Explainer", + "interpretation": "Am I explaining this clearly? (Insecurity marker).", + "tone": "Checking" + }, + { + "trigger": "I'm weak", + "speaker_role": "Gen Z", + "interpretation": "That is hilarious.", + "tone": "Humorous" + }, + { + "trigger": "I'm dead", + "speaker_role": "Gen Z", + "interpretation": "That is hilarious.", + "tone": "Humorous" + }, + { + "trigger": "Bet", + "speaker_role": "Gen Z", + "interpretation": "Yes / Agreed / Okay.", + "tone": "Affirmative" + }, + { + "trigger": "Say less", + "speaker_role": "Gen Z", + "interpretation": "I understand completely and agree.", + "tone": "Affirmative" + }, + { + "trigger": "Period", + "speaker_role": "Gen Z", + "interpretation": "End of discussion / Emphatic agreement.", + "tone": "Final" + }, + { + "trigger": "It's giving...", + "speaker_role": "Gen Z", + "interpretation": "It reminds me of / It has the vibe of...", + "tone": "Comparative" + }, + { + "trigger": "Are you in line?", + "speaker_role": "Queuer", + "interpretation": "Go to the back of the line.", + "tone": "Territorial" + }, + { + "trigger": "How's the food?", + "speaker_role": "Server", + "interpretation": "I am checking on you because I want a good tip.", + "tone": "Service-Polite" + }, + { + "trigger": "Keep the change", + "speaker_role": "Customer", + "interpretation": "I am tipping you the remainder.", + "tone": "Generous/Efficient" + }, + { + "trigger": "Check please", + "speaker_role": "Customer", + "interpretation": "I am ready to pay and leave immediately.", + "tone": "Direct" + }, + { + "trigger": "Do you have this in the back?", + "speaker_role": "Shopper", + "interpretation": "I don't believe you that it's out of stock.", + "tone": "Hopeful/Skeptical" + }, + { + "trigger": "I'm just looking", + "speaker_role": "Shopper", + "interpretation": "Please leave me alone; I do not want sales help.", + "tone": "Dismissive" + }, + { + "trigger": "Can I speak to your manager?", + "speaker_role": "Customer", + "interpretation": "I am about to make a serious complaint.", + "tone": "Aggressive" + }, + { + "trigger": "It's not you, it's me", + "speaker_role": "Breaker-upper", + "interpretation": "It is definitely you, but I am being polite.", + "tone": "Clich\u00e9" + }, + { + "trigger": "We need to talk", + "speaker_role": "Partner", + "interpretation": "I am breaking up with you.", + "tone": "Ominous" + }, + { + "trigger": "I'm focusing on my career", + "speaker_role": "Date", + "interpretation": "I am not interested in a relationship with you.", + "tone": "Evasive" + }, + { + "trigger": "Netflix and chill?", + "speaker_role": "Suitor", + "interpretation": "Do you want to come over for sex?", + "tone": "Suggestive" + }, + { + "trigger": "Wyd?", + "speaker_role": "Texter", + "interpretation": "What are you doing? (Often a booty call if sent late at night).", + "tone": "Casual" + }, + { + "trigger": "K.", + "speaker_role": "Texter", + "interpretation": "I am angry or annoyed.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "I'm fine.", + "speaker_role": "Partner", + "interpretation": "I am furious. Ask me what is wrong.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Whatever you want", + "speaker_role": "Partner", + "interpretation": "I don't want to decide, but I will hate what you pick.", + "tone": "Trap" + }, + { + "trigger": "Shotgun!", + "speaker_role": "Passenger", + "interpretation": "I claim the front passenger seat.", + "tone": "Competitive" + }, + { + "trigger": "Are we there yet?", + "speaker_role": "Child/Passenger", + "interpretation": "I am bored.", + "tone": "Annoying" + }, + { + "trigger": "Let's agree to disagree", + "speaker_role": "Debater", + "interpretation": "I will never agree with you, so let's stop talking.", + "tone": "Final" + }, + { + "trigger": "I'm not gonna lie", + "speaker_role": "Speaker", + "interpretation": "I am about to say something controversial.", + "tone": "Confessional" + }, + { + "trigger": "No offense, but...", + "speaker_role": "Critic", + "interpretation": "I am about to say something extremely offensive.", + "tone": "Warning" + }, + { + "trigger": "Asking for a friend", + "speaker_role": "Asker", + "interpretation": "I am asking for myself but I am embarrassed.", + "tone": "Humorous/Transparent" + }, + { + "trigger": "I'm down", + "speaker_role": "Friend", + "interpretation": "I agree to the plan.", + "tone": "Enthusiastic" + }, + { + "trigger": "I'm up for whatever", + "speaker_role": "Friend", + "interpretation": "You decide.", + "tone": "Flexible" + }, + { + "trigger": "Let's bounce", + "speaker_role": "Friend", + "interpretation": "Let's leave.", + "tone": "Casual" + }, + { + "trigger": "Did I stutter?", + "speaker_role": "Aggressor", + "interpretation": "I meant exactly what I said.", + "tone": "Confrontational" + }, + { + "trigger": "You're breaking up", + "speaker_role": "Caller", + "interpretation": "I can't hear you (or I want to hang up).", + "tone": "Functional" + }, + { + "trigger": "My phone died", + "speaker_role": "Texter", + "interpretation": "I didn't want to talk to you.", + "tone": "Excuse" + }, + { + "trigger": "Let me call you right back", + "speaker_role": "Caller", + "interpretation": "I am hanging up now. (May or may not call back).", + "tone": "Dismissive" + }, + { + "trigger": "Thanks in advance", + "speaker_role": "Emailer", + "interpretation": "I expect you to do this; you have no choice.", + "tone": "Presumptuous" + }, + { + "trigger": "Gentle reminder", + "speaker_role": "Emailer", + "interpretation": "Do your job, you are late.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Reply All", + "speaker_role": "Emailer", + "interpretation": "I want everyone to see my response.", + "tone": "Public" + }, + { + "trigger": "BCC", + "speaker_role": "Emailer", + "interpretation": "I am secretly showing this email to someone else.", + "tone": "Sneaky" + }, + { + "trigger": "Does that make sense?", + "speaker_role": "Teacher/Explainer", + "interpretation": "Did you understand me?", + "tone": "Checking" + }, + { + "trigger": "Tell me about it", + "speaker_role": "Sympathizer", + "interpretation": "I agree completely / I have had the same experience.", + "tone": "Empathetic" + }, + { + "trigger": "You can say that again", + "speaker_role": "Agreed", + "interpretation": "That is very true.", + "tone": " emphatic" + }, + { + "trigger": "Get out of town!", + "speaker_role": "Listener", + "interpretation": "I don't believe it!", + "tone": "Surprised" + }, + { + "trigger": "Hold your horses", + "speaker_role": "Advisor", + "interpretation": "Wait / Slow down.", + "tone": "Cautionary" + }, + { + "trigger": "Take a hike", + "speaker_role": "Rejector", + "interpretation": "Go away.", + "tone": "Rude" + }, + { + "trigger": "Make yourself at home", + "speaker_role": "Host", + "interpretation": "Relax.", + "tone": "Welcoming" + }, + { + "trigger": "Help yourself", + "speaker_role": "Host", + "interpretation": "Take food/drink without asking.", + "tone": "Welcoming" + }, + { + "trigger": "Do you need a bag?", + "speaker_role": "Cashier", + "interpretation": "Bags cost money now/I am ready to finish this.", + "tone": "Transactional" + }, + { + "trigger": "Have you been helped?", + "speaker_role": "Salesperson", + "interpretation": "Are you buying something or wasting time?", + "tone": "Service" + }, + { + "trigger": "I need space", + "speaker_role": "Partner", + "interpretation": "I want to be alone (pre-breakup).", + "tone": "Distancing" + }, + { + "trigger": "We're taking a break", + "speaker_role": "Partner", + "interpretation": "We are separated but not divorced/broken up yet.", + "tone": "Complicated" + }, + { + "trigger": "Friends with benefits", + "speaker_role": "Partner", + "interpretation": "Sex without romantic commitment.", + "tone": "Casual" + }, + { + "trigger": "Sliding into DMs", + "speaker_role": "Suitor", + "interpretation": "Sending a private message for romantic purposes.", + "tone": "Flirtatious" + }, + { + "trigger": "Left on read", + "speaker_role": "Victim", + "interpretation": "They saw my message and ignored it.", + "tone": "Insulted" + }, + { + "trigger": "Swipe right", + "speaker_role": "Dater", + "interpretation": "I like them.", + "tone": "Approval" + }, + { + "trigger": "Swipe left", + "speaker_role": "Dater", + "interpretation": "I reject them.", + "tone": "Rejection" + }, + { + "trigger": "Pull over", + "speaker_role": "Police/Passenger", + "interpretation": "Stop the car on the side of the road.", + "tone": "Commanding" + }, + { + "trigger": "Cut off", + "speaker_role": "Driver", + "interpretation": "Someone drove in front of me dangerously.", + "tone": "Angry" + }, + { + "trigger": "Tailgating", + "speaker_role": "Driver", + "interpretation": "Driving too close to the car in front.", + "tone": "Dangerous" + }, + { + "trigger": "Road rage", + "speaker_role": "Driver", + "interpretation": "Violent anger while driving.", + "tone": "Aggressive" + }, + { + "trigger": "Fender bender", + "speaker_role": "Driver", + "interpretation": "Minor car accident.", + "tone": "Descriptive" + }, + { + "trigger": "Rubbernecking", + "speaker_role": "Driver", + "interpretation": "Slowing down to look at an accident.", + "tone": "Annoying" + }, + { + "trigger": "Buckle up", + "speaker_role": "Driver", + "interpretation": "Put on your seatbelt.", + "tone": "Safety" + }, + { + "trigger": "Designated driver", + "speaker_role": "Friend", + "interpretation": "The sober person driving everyone home.", + "tone": "Responsible" + }, + { + "trigger": "Riding shotgun", + "speaker_role": "Passenger", + "interpretation": "Sitting in the front seat.", + "tone": "Casual" + }, + { + "trigger": "Gas guzzler", + "speaker_role": "Critic", + "interpretation": "Car with poor fuel economy.", + "tone": "Critical" + }, + { + "trigger": "Lemon law", + "speaker_role": "Owner", + "interpretation": "Laws protecting buyers of defective cars.", + "tone": "Legal" + }, + { + "trigger": "Sticker shock", + "speaker_role": "Buyer", + "interpretation": "Surprise at a high price.", + "tone": "Shocked" + }, + { + "trigger": "Buyer's remorse", + "speaker_role": "Buyer", + "interpretation": "Regret after purchasing.", + "tone": "Regretful" + }, + { + "trigger": "Retail therapy", + "speaker_role": "Shopper", + "interpretation": "Shopping to feel better.", + "tone": "Humorous" + }, + { + "trigger": "Shop till you drop", + "speaker_role": "Shopper", + "interpretation": "Shopping for a long time.", + "tone": "Enthusiastic" + }, + { + "trigger": "Window shopping", + "speaker_role": "Shopper", + "interpretation": "Looking with no intent to buy.", + "tone": "Casual" + }, + { + "trigger": "Rain check", + "speaker_role": "Shopper", + "interpretation": "Coupon for a sale item that is out of stock.", + "tone": "Transactional" + }, + { + "trigger": "Clearance", + "speaker_role": "Store", + "interpretation": "Final sale items.", + "tone": "Promotional" + }, + { + "trigger": "BOGO", + "speaker_role": "Store", + "interpretation": "Buy One Get One (Free/Half off).", + "tone": "Promotional" + }, + { + "trigger": "Price match", + "speaker_role": "Buyer", + "interpretation": "Will you match a competitor's price?", + "tone": "Negotiating" + }, + { + "trigger": "Store credit", + "speaker_role": "Clerk", + "interpretation": "Refund given as money to spend in-store only.", + "tone": "Policy" + }, + { + "trigger": "Final sale", + "speaker_role": "Clerk", + "interpretation": "No returns allowed.", + "tone": "Warning" + }, + { + "trigger": "Receipt in the bag", + "speaker_role": "Clerk", + "interpretation": "Proof of purchase is included.", + "tone": "Standard" + }, + { + "trigger": "Have a nice day", + "speaker_role": "Employee", + "interpretation": "Goodbye (Scripted).", + "tone": "Robotic/Polite" + }, + { + "trigger": "It's on the house", + "speaker_role": "Server", + "interpretation": "It is free.", + "tone": "Generous" + }, + { + "trigger": "Split the bill", + "speaker_role": "Diner", + "interpretation": "Each person pays for themselves.", + "tone": "Fair" + }, + { + "trigger": "I've got this", + "speaker_role": "Payer", + "interpretation": "I will pay for everyone.", + "tone": "Generous" + }, + { + "trigger": "To go / Takeout", + "speaker_role": "Customer", + "interpretation": "Food packaged to eat elsewhere.", + "tone": "Functional" + }, + { + "trigger": "Doggy bag", + "speaker_role": "Diner", + "interpretation": " leftovers to take home.", + "tone": "Casual" + }, + { + "trigger": "Early bird special", + "speaker_role": "Restaurant", + "interpretation": "Discount for eating early (associated with elderly).", + "tone": "Informational" + }, + { + "trigger": "Happy hour", + "speaker_role": "Bar", + "interpretation": "Discounted drinks time.", + "tone": "Fun" + }, + { + "trigger": "Last call", + "speaker_role": "Bartender", + "interpretation": "Last chance to order alcohol before closing.", + "tone": "Urgent" + }, + { + "trigger": "Cut off", + "speaker_role": "Bartender", + "interpretation": "Refusing to serve more alcohol to a drunk person.", + "tone": "Authoritative" + }, + { + "trigger": "Tab", + "speaker_role": "Customer", + "interpretation": "Bill being tallied to pay later.", + "tone": "Casual" + }, + { + "trigger": "On tap", + "speaker_role": "Bartender", + "interpretation": "Draft beer available.", + "tone": "Informational" + }, + { + "trigger": "On the rocks", + "speaker_role": "Drinker", + "interpretation": "Served with ice.", + "tone": "Specific" + }, + { + "trigger": "Neat", + "speaker_role": "Drinker", + "interpretation": "Served without ice or mixer.", + "tone": "Specific" + }, + { + "trigger": "Virgin", + "speaker_role": "Drinker", + "interpretation": "Non-alcoholic version of a drink.", + "tone": "Specific" + }, + { + "trigger": "Chug", + "speaker_role": "Drinker", + "interpretation": "Drink rapidly.", + "tone": "Aggressive/Fun" + }, + { + "trigger": "Bottoms up", + "speaker_role": "Toaster", + "interpretation": "Cheers / Drink it all.", + "tone": "Celebratory" + }, + { + "trigger": "Designated hitter", + "speaker_role": "Manager", + "interpretation": "Specialist brought in for one task.", + "tone": "Strategic" + }, + { + "trigger": "Step up to the plate", + "speaker_role": "Manager", + "interpretation": "Take responsibility.", + "tone": "Motivational" + }, + { + "trigger": "Curveball", + "speaker_role": "Victim", + "interpretation": "Unexpected event.", + "tone": "Surprised" + }, + { + "trigger": "Out in left field", + "speaker_role": "Critic", + "interpretation": "Crazy / Wrong / Unexpected.", + "tone": "Dismissive" + }, + { + "trigger": "Strike three", + "speaker_role": "Authority", + "interpretation": "You are done/fired.", + "tone": "Final" + }, + { + "trigger": "Hail Mary", + "speaker_role": "Planner", + "interpretation": "Desperate last attempt.", + "tone": "Desperate" + }, + { + "trigger": "Touchdown", + "speaker_role": "Celebrant", + "interpretation": "Success.", + "tone": "Happy" + }, + { + "trigger": "Fumble", + "speaker_role": "Critic", + "interpretation": "Mistake.", + "tone": "Critical" + }, + { + "trigger": "Blitz", + "speaker_role": "Worker", + "interpretation": "All-out effort.", + "tone": "Intense" + }, + { + "trigger": "Huddle", + "speaker_role": "Manager", + "interpretation": "Short meeting.", + "tone": "Collaborative" + }, + { + "trigger": "How are you doing?", + "speaker_role": "Cashier/Stranger", + "interpretation": "Greetings. Answer 'Good' and move on. Do not stop walking.", + "tone": "Ritualistic" + }, + { + "trigger": "Do you have a warrant?", + "speaker_role": "Citizen", + "interpretation": "I refuse to let you enter/search unless compelled by law.", + "tone": "Defensive/Legal" + }, + { + "trigger": "Am I free to go?", + "speaker_role": "Detainee", + "interpretation": "If I am not under arrest, I am leaving immediately.", + "tone": "Challenging" + }, + { + "trigger": "I'd like to speak to my attorney", + "speaker_role": "Suspect", + "interpretation": "I will stop talking to the police now.", + "tone": "Final" + }, + { + "trigger": "Thank you for your service", + "speaker_role": "Civilian", + "interpretation": "Standard polite greeting to Military/Veterans.", + "tone": "Respectful" + }, + { + "trigger": "On a scale of 1 to 10", + "speaker_role": "Doctor", + "interpretation": "Quantify your pain (10 is worst).", + "tone": "Clinical" + }, + { + "trigger": "Is this in-network?", + "speaker_role": "Patient", + "interpretation": "Will my insurance pay for this, or will I go bankrupt?", + "tone": "Anxious" + }, + { + "trigger": "Gratuity included", + "speaker_role": "Bill", + "interpretation": "Do not tip extra; it's already added (common for large groups).", + "tone": "Informational" + }, + { + "trigger": "Keep the change", + "speaker_role": "Customer", + "interpretation": "I am tipping you the coins/small bills.", + "tone": "Casual" + }, + { + "trigger": "Open House", + "speaker_role": "Realtor", + "interpretation": "Walk-ins welcome to view this home for sale.", + "tone": "Welcoming" + }, + { + "trigger": "First and Last", + "speaker_role": "Landlord", + "interpretation": "Requirement to pay the first and last month's rent upfront.", + "tone": "Financial" + }, + { + "trigger": "Credit check", + "speaker_role": "Landlord/Lender", + "interpretation": "I am investigating your financial history.", + "tone": "Investigative" + }, + { + "trigger": "Cosigner", + "speaker_role": "Lender", + "interpretation": "You are too poor/young to trust; get a parent to sign.", + "tone": "Demanding" + }, + { + "trigger": "Office Hours", + "speaker_role": "Professor", + "interpretation": "The only time you are allowed to bother me.", + "tone": "Administrative" + }, + { + "trigger": "Is this on the test?", + "speaker_role": "Student", + "interpretation": "If not, I will stop listening immediately.", + "tone": "Pragmatic" + }, + { + "trigger": "Pull an all-nighter", + "speaker_role": "Student", + "interpretation": "Study until sunrise.", + "tone": "Desperate" + }, + { + "trigger": "Toga party", + "speaker_role": "Student", + "interpretation": "Stereotypical Greek life party wearing sheets.", + "tone": "Rowdy" + }, + { + "trigger": "Going pro", + "speaker_role": "Athlete", + "interpretation": "Leaving college early to join professional sports.", + "tone": "Ambitious" + }, + { + "trigger": "Redshirt", + "speaker_role": "Athlete", + "interpretation": "Sitting out a year to extend eligibility.", + "tone": "Strategic" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are an idiot (masked as pity).", + "tone": "Condescending" + }, + { + "trigger": "Ope!", + "speaker_role": "Midwesterner", + "interpretation": "Excuse me / I bumped into you / I made a mistake.", + "tone": "Apologetic" + }, + { + "trigger": "Yeah, no", + "speaker_role": "Any", + "interpretation": "No.", + "tone": "Negative" + }, + { + "trigger": "No, yeah", + "speaker_role": "Any", + "interpretation": "Yes.", + "tone": "Affirmative" + }, + { + "trigger": "Yeah, no, for sure", + "speaker_role": "Californian", + "interpretation": "Definitely yes.", + "tone": "Affirmative" + }, + { + "trigger": "The City", + "speaker_role": "Local", + "interpretation": "The nearest major metropolis (e.g., Manhattan for NY, SF for Bay Area).", + "tone": "Specific" + }, + { + "trigger": "Out of towners", + "speaker_role": "Local", + "interpretation": "Tourists.", + "tone": "Dismissive" + }, + { + "trigger": "Fender bender", + "speaker_role": "Driver", + "interpretation": "Minor car accident.", + "tone": "Descriptive" + }, + { + "trigger": "Gridlock", + "speaker_role": "Reporter", + "interpretation": "Nothing is moving (Traffic or Congress).", + "tone": "Frustrated" + }, + { + "trigger": "Mind the gap", + "speaker_role": "Train Announcer", + "interpretation": "Watch your step.", + "tone": "Warning" + }, + { + "trigger": "Walk", + "speaker_role": "Crosswalk", + "interpretation": "Cross the street now.", + "tone": "Directive" + }, + { + "trigger": "Don't Walk", + "speaker_role": "Crosswalk", + "interpretation": "Do not cross.", + "tone": "Prohibitive" + }, + { + "trigger": "Last Call", + "speaker_role": "Bartender", + "interpretation": "Kitchen/Bar closes in 15 minutes.", + "tone": "Urgent" + }, + { + "trigger": "You're cut off", + "speaker_role": "Bartender", + "interpretation": "I will not serve you any more alcohol.", + "tone": "Authoritative" + }, + { + "trigger": "Tab open?", + "speaker_role": "Bartender", + "interpretation": "Do you want to pay now or later?", + "tone": "Transactional" + }, + { + "trigger": "Table for two?", + "speaker_role": "Host", + "interpretation": "Are you dining alone or waiting for someone?", + "tone": "Inquisitive" + }, + { + "trigger": "Booth or table?", + "speaker_role": "Host", + "interpretation": "Preference for seating style.", + "tone": "Service" + }, + { + "trigger": "On the side", + "speaker_role": "Diner", + "interpretation": "Put the sauce/dressing in a separate cup.", + "tone": "Specific" + }, + { + "trigger": "Substitute", + "speaker_role": "Diner", + "interpretation": "Swap one food item for another.", + "tone": "Requesting" + }, + { + "trigger": "Compliments of the chef", + "speaker_role": "Server", + "interpretation": "Free item given to VIPs or to apologize.", + "tone": "Generous" + }, + { + "trigger": "Are you registered to vote?", + "speaker_role": "Canvasser", + "interpretation": "I want to talk to you about politics.", + "tone": "Political" + }, + { + "trigger": "Get out the vote", + "speaker_role": "Activist", + "interpretation": "Effort to increase voter turnout.", + "tone": "Motivational" + }, + { + "trigger": "Too close to call", + "speaker_role": "Reporter", + "interpretation": "The election results are not clear yet.", + "tone": "Suspenseful" + }, + { + "trigger": "Concede", + "speaker_role": "Candidate", + "interpretation": "Admit defeat.", + "tone": "Resigned" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get an attorney immediately; you are in trouble.", + "tone": "Serious" + }, + { + "trigger": "Press charges", + "speaker_role": "Victim", + "interpretation": "Formally accuse someone of a crime.", + "tone": "Legal" + }, + { + "trigger": "Drop the charges", + "speaker_role": "Prosecutor", + "interpretation": "Stop the legal case.", + "tone": "Merciful" + }, + { + "trigger": "Off the record", + "speaker_role": "Source", + "interpretation": "You cannot publish this quote with my name.", + "tone": "Secretive" + }, + { + "trigger": "No comment", + "speaker_role": "Respondent", + "interpretation": "I will not answer (implies guilt or strategy).", + "tone": "Evasive" + }, + { + "trigger": "Confirm or deny", + "speaker_role": "Reporter", + "interpretation": "Give me a straight answer.", + "tone": "Pressing" + }, + { + "trigger": "Thoughts and prayers", + "speaker_role": "Public Figure", + "interpretation": "I am acknowledging a tragedy but offering no solution.", + "tone": "Clich\u00e9" + }, + { + "trigger": "Thank you for holding", + "speaker_role": "Service", + "interpretation": "I am back on the line after ignoring you.", + "tone": "Polite" + }, + { + "trigger": "Your call is important to us", + "speaker_role": "Recording", + "interpretation": "We are understaffed.", + "tone": "False" + }, + { + "trigger": "Have a nice day", + "speaker_role": "Any", + "interpretation": "Goodbye.", + "tone": "Ritualistic" + }, + { + "trigger": "Excuse me", + "speaker_role": "Stranger", + "interpretation": "You are in my way.", + "tone": "Polite/Annoyed" + }, + { + "trigger": "Pardon me", + "speaker_role": "Stranger", + "interpretation": "I didn't hear you OR I bumped you.", + "tone": "Formal" + }, + { + "trigger": "Watch it!", + "speaker_role": "Pedestrian", + "interpretation": "You almost hit me.", + "tone": "Aggressive" + }, + { + "trigger": "Get a room", + "speaker_role": "Observer", + "interpretation": "Stop displaying public affection.", + "tone": "Disgusted" + }, + { + "trigger": "TMI", + "speaker_role": "Listener", + "interpretation": "Too Much Information (That is gross/private).", + "tone": "Repulsed" + }, + { + "trigger": "Spill the tea", + "speaker_role": "Friend", + "interpretation": "Tell me the gossip.", + "tone": "Eager" + }, + { + "trigger": "Throw shade", + "speaker_role": "Critic", + "interpretation": "Insult subtly.", + "tone": "Negative" + }, + { + "trigger": "Cancel culture", + "speaker_role": "Critic", + "interpretation": "Boycotting someone for offensive behavior.", + "tone": "Political" + }, + { + "trigger": "Fake news", + "speaker_role": "Skeptic", + "interpretation": "I disagree with that report.", + "tone": "Dismissive" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Gen Z", + "interpretation": "You are old and out of touch.", + "tone": "Dismissive" + }, + { + "trigger": "Snowflake", + "speaker_role": "Critic", + "interpretation": "You are too sensitive.", + "tone": "Insulting" + }, + { + "trigger": "Karen", + "speaker_role": "Observer", + "interpretation": "Entitled white woman demanding a manager.", + "tone": "Derogatory" + }, + { + "trigger": "Ghosting", + "speaker_role": "Dater", + "interpretation": "Disappearing without a goodbye.", + "tone": "Avoidant" + }, + { + "trigger": "Catfishing", + "speaker_role": "Victim", + "interpretation": "Pretending to be someone else online.", + "tone": "Deceptive" + }, + { + "trigger": "Friend zone", + "speaker_role": "Suitor", + "interpretation": "Rejection of romance in favor of friendship.", + "tone": "Disappointed" + }, + { + "trigger": "It's not rocket science", + "speaker_role": "Critic", + "interpretation": "It is simple.", + "tone": "Sarcastic" + }, + { + "trigger": "Go big or go home", + "speaker_role": "Motivator", + "interpretation": "Give maximum effort.", + "tone": " intense" + }, + { + "trigger": "YOLO", + "speaker_role": "Risk-taker", + "interpretation": "You Only Live Once (Do it).", + "tone": "Reckless" + }, + { + "trigger": "FOMO", + "speaker_role": "Anxious", + "interpretation": "Fear Of Missing Out.", + "tone": "Anxious" + }, + { + "trigger": "Jinx", + "speaker_role": "Speaker", + "interpretation": "We said the same thing at the same time.", + "tone": "Playful" + }, + { + "trigger": "Knock on wood", + "speaker_role": "Speaker", + "interpretation": "I hope I didn't just jinx myself.", + "tone": "Superstitious" + }, + { + "trigger": "Fingers crossed", + "speaker_role": "Well-wisher", + "interpretation": "Hope for good luck.", + "tone": "Hopeful" + }, + { + "trigger": "Pinky swear", + "speaker_role": "Friend", + "interpretation": "Absolute promise.", + "tone": "Childish/Serious" + }, + { + "trigger": "Cross my heart", + "speaker_role": "Promiser", + "interpretation": "I am telling the truth.", + "tone": "Sincere" + }, + { + "trigger": "Finders keepers", + "speaker_role": "Claimant", + "interpretation": "I found it, so it is mine.", + "tone": "Childish" + }, + { + "trigger": "Five second rule", + "speaker_role": "Eater", + "interpretation": "Food dropped for <5 seconds is safe to eat.", + "tone": "Humorous" + }, + { + "trigger": "Shotgun", + "speaker_role": "Passenger", + "interpretation": "I claim the front seat.", + "tone": "Competitive" + }, + { + "trigger": "Not in my backyard", + "speaker_role": "Resident", + "interpretation": "I support this in theory, but not near me.", + "tone": "Hypocritical" + }, + { + "trigger": "Keep up with the Joneses", + "speaker_role": "Critic", + "interpretation": "Competing socially via material wealth.", + "tone": "Critical" + }, + { + "trigger": "Keeping it real", + "speaker_role": "Speaker", + "interpretation": "Being authentic.", + "tone": "Proud" + }, + { + "trigger": "Selling out", + "speaker_role": "Critic", + "interpretation": "Compromising values for money.", + "tone": "Accusatory" + }, + { + "trigger": "Jump the shark", + "speaker_role": "Critic", + "interpretation": "The moment quality declined significantly.", + "tone": "Critical" + }, + { + "trigger": "Drop the mic", + "speaker_role": "Performer", + "interpretation": "I have won the argument/performance.", + "tone": "Triumphant" + }, + { + "trigger": "How much do you weigh?", + "speaker_role": "Any", + "interpretation": "Extremely rude question (unless doctor). Answer in Pounds (lbs).", + "tone": "Taboo" + }, + { + "trigger": "How tall are you?", + "speaker_role": "Any", + "interpretation": "Answer in Feet and Inches (e.g., 5'10\"). Not cm.", + "tone": "Standard" + }, + { + "trigger": "What's the temperature?", + "speaker_role": "Any", + "interpretation": "Answer in Fahrenheit. (70 is nice, 100 is hot, 30 is freezing).", + "tone": "Standard" + }, + { + "trigger": "How far is it?", + "speaker_role": "Any", + "interpretation": "Answer in TIME (e.g., '20 minutes away'), not distance.", + "tone": "Practical" + }, + { + "trigger": "Who are you voting for?", + "speaker_role": "Stranger/Coworker", + "interpretation": "Dangerous question. Avoid answering to prevent conflict.", + "tone": "Taboo" + }, + { + "trigger": "How much money do you make?", + "speaker_role": "Stranger", + "interpretation": "Very rude. Do not answer.", + "tone": "Taboo" + }, + { + "trigger": "Restroom / Bathroom", + "speaker_role": "Public", + "interpretation": "Polite word for Toilet. Do not say 'Toilet' or 'Loo'.", + "tone": "Polite" + }, + { + "trigger": "Check, please", + "speaker_role": "Diner", + "interpretation": "Bring the bill.", + "tone": "Standard" + }, + { + "trigger": "To go", + "speaker_role": "Customer", + "interpretation": "Takeaway.", + "tone": "Standard" + }, + { + "trigger": "For here", + "speaker_role": "Customer", + "interpretation": "Eat in the restaurant.", + "tone": "Standard" + }, + { + "trigger": "On the house", + "speaker_role": "Server", + "interpretation": "Free.", + "tone": "Generous" + }, + { + "trigger": "Carding / I need to see ID", + "speaker_role": "Server/Bouncer", + "interpretation": "Checking age (Must be 21+ for alcohol/clubs).", + "tone": "Legal" + }, + { + "trigger": "Designated Driver", + "speaker_role": "Friend", + "interpretation": "You cannot drink tonight; you are driving.", + "tone": "Responsible" + }, + { + "trigger": "Riding Shotgun", + "speaker_role": "Passenger", + "interpretation": "I claim the front passenger seat.", + "tone": "Competitive" + }, + { + "trigger": "Buckle up", + "speaker_role": "Driver", + "interpretation": "Put on seatbelt.", + "tone": "Safety" + }, + { + "trigger": "Step on it", + "speaker_role": "Passenger", + "interpretation": "Drive faster.", + "tone": "Urgent" + }, + { + "trigger": "Cut to the chase", + "speaker_role": "Listener", + "interpretation": "Stop wasting time, get to the point.", + "tone": "Direct" + }, + { + "trigger": "Plead the Fifth", + "speaker_role": "Speaker", + "interpretation": "I refuse to answer (implies guilt/secrecy).", + "tone": "Legal/Humorous" + }, + { + "trigger": "Take the Fifth", + "speaker_role": "Speaker", + "interpretation": "Same as Plead the Fifth.", + "tone": "Legal/Humorous" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get a lawyer immediately.", + "tone": "Serious" + }, + { + "trigger": "Sue me", + "speaker_role": "Defiant", + "interpretation": "I don't care; do your worst.", + "tone": "Aggressive" + }, + { + "trigger": "See you in court", + "speaker_role": "Adversary", + "interpretation": "We will not settle this amicably.", + "tone": "Hostile" + }, + { + "trigger": "Off the record", + "speaker_role": "Speaker", + "interpretation": "This is private; do not repeat it publicly.", + "tone": "Confidential" + }, + { + "trigger": "No comment", + "speaker_role": "Speaker", + "interpretation": "I will not answer.", + "tone": "Evasive" + }, + { + "trigger": "Press charges", + "speaker_role": "Victim", + "interpretation": "Request police to prosecute.", + "tone": "Legal" + }, + { + "trigger": "Drop the charges", + "speaker_role": "Victim", + "interpretation": "Stop the prosecution.", + "tone": "Forgiving" + }, + { + "trigger": "Bail out", + "speaker_role": "Friend", + "interpretation": "Pay money to get someone out of jail OR leave a situation.", + "tone": "Rescue" + }, + { + "trigger": "Pink slip", + "speaker_role": "Boss", + "interpretation": "You are fired.", + "tone": "Negative" + }, + { + "trigger": "Let you go", + "speaker_role": "Boss", + "interpretation": "You are fired (Euphemism).", + "tone": "Corporate" + }, + { + "trigger": "Downsizing", + "speaker_role": "Company", + "interpretation": "Mass firing.", + "tone": "Corporate" + }, + { + "trigger": "Severance package", + "speaker_role": "HR", + "interpretation": "Money paid upon firing.", + "tone": "Financial" + }, + { + "trigger": "Two weeks notice", + "speaker_role": "Employee", + "interpretation": "Standard warning before quitting.", + "tone": "Professional" + }, + { + "trigger": "Call in sick", + "speaker_role": "Employee", + "interpretation": "Inform boss you aren't coming today.", + "tone": "Standard" + }, + { + "trigger": "Play hooky", + "speaker_role": "Student/Employee", + "interpretation": "Skip school/work without permission.", + "tone": "Rebellious" + }, + { + "trigger": "Moonlighting", + "speaker_role": "Worker", + "interpretation": "Working a second job secretly.", + "tone": "Secretive" + }, + { + "trigger": "Under the table", + "speaker_role": "Payer", + "interpretation": "Illegal cash payment (no tax).", + "tone": "Illegal" + }, + { + "trigger": "Clock in / Clock out", + "speaker_role": "Worker", + "interpretation": "Record start/end time.", + "tone": "Standard" + }, + { + "trigger": "Overtime", + "speaker_role": "Worker", + "interpretation": "Work >40 hours (paid 1.5x).", + "tone": "Financial" + }, + { + "trigger": "Benefits", + "speaker_role": "HR", + "interpretation": "Health insurance/401k (Crucial part of job).", + "tone": "Important" + }, + { + "trigger": "Open enrollment", + "speaker_role": "HR", + "interpretation": "Time to pick insurance plan.", + "tone": "Administrative" + }, + { + "trigger": "Deductible", + "speaker_role": "Insurer", + "interpretation": "Amount you pay before insurance helps.", + "tone": "Financial" + }, + { + "trigger": "Out of pocket", + "speaker_role": "Payer", + "interpretation": "Paying own money.", + "tone": "Financial" + }, + { + "trigger": "Copay", + "speaker_role": "Patient", + "interpretation": "Fee for doctor visit.", + "tone": "Financial" + }, + { + "trigger": "In-network", + "speaker_role": "Patient", + "interpretation": "Covered by insurance.", + "tone": "Relieved" + }, + { + "trigger": "Out-of-network", + "speaker_role": "Patient", + "interpretation": "Not covered; very expensive.", + "tone": "Scary" + }, + { + "trigger": "Pre-existing condition", + "speaker_role": "Insurer", + "interpretation": "Health issue you had before insurance.", + "tone": "Medical" + }, + { + "trigger": "Generic", + "speaker_role": "Pharmacist", + "interpretation": "Non-brand name drug (Cheaper).", + "tone": "Practical" + }, + { + "trigger": "Over the counter (OTC)", + "speaker_role": "Pharmacist", + "interpretation": "Drug bought without prescription.", + "tone": "Standard" + }, + { + "trigger": "Prescription", + "speaker_role": "Doctor", + "interpretation": "Note allowing purchase of strong drugs.", + "tone": "Legal" + }, + { + "trigger": "911", + "speaker_role": "Caller", + "interpretation": "Emergency number.", + "tone": "Urgent" + }, + { + "trigger": "Amber Alert", + "speaker_role": "Phone", + "interpretation": "Child abduction warning.", + "tone": "Alarming" + }, + { + "trigger": "Silver Alert", + "speaker_role": "Phone", + "interpretation": "Missing elderly person.", + "tone": "Alarming" + }, + { + "trigger": "Active Shooter", + "speaker_role": "News/Police", + "interpretation": "Person shooting people currently.", + "tone": "Terrifying" + }, + { + "trigger": "Lockdown", + "speaker_role": "School/Police", + "interpretation": "Stay inside, lock doors.", + "tone": "Protective" + }, + { + "trigger": "Shelter in place", + "speaker_role": "Authority", + "interpretation": "Do not leave the building.", + "tone": "Protective" + }, + { + "trigger": "Evacuate", + "speaker_role": "Authority", + "interpretation": "Leave the area immediately.", + "tone": "Urgent" + }, + { + "trigger": "Curfew", + "speaker_role": "Police", + "interpretation": "Illegal to be outside after X time.", + "tone": "Legal" + }, + { + "trigger": "Jaywalking", + "speaker_role": "Police", + "interpretation": "Crossing street illegally.", + "tone": "Minor crime" + }, + { + "trigger": "Miranda Rights", + "speaker_role": "Police", + "interpretation": "You have the right to remain silent...", + "tone": "Legal" + }, + { + "trigger": "Resisting arrest", + "speaker_role": "Police", + "interpretation": "Fighting back against police.", + "tone": "Serious crime" + }, + { + "trigger": "Probable cause", + "speaker_role": "Police", + "interpretation": "Legal reason to search.", + "tone": "Legal" + }, + { + "trigger": "Warrant", + "speaker_role": "Citizen", + "interpretation": "Document allowing search.", + "tone": "Legal" + }, + { + "trigger": "Plea bargain", + "speaker_role": "Lawyer", + "interpretation": "Admit guilt for less punishment.", + "tone": "Legal" + }, + { + "trigger": "Hung jury", + "speaker_role": "Court", + "interpretation": "Jury cannot agree on verdict.", + "tone": "Legal" + }, + { + "trigger": "Double jeopardy", + "speaker_role": "Court", + "interpretation": "Cannot be tried twice for same crime.", + "tone": "Legal" + }, + { + "trigger": "Fifth Amendment", + "speaker_role": "Court", + "interpretation": "Right against self-incrimination.", + "tone": "Legal" + }, + { + "trigger": "First Amendment", + "speaker_role": "Citizen", + "interpretation": "Freedom of Speech.", + "tone": "Political" + }, + { + "trigger": "Second Amendment", + "speaker_role": "Citizen", + "interpretation": "Right to bear arms (Guns).", + "tone": "Political" + }, + { + "trigger": "Concealed carry", + "speaker_role": "Gun Owner", + "interpretation": "Hiding a gun on your person legally.", + "tone": "Political" + }, + { + "trigger": "Open carry", + "speaker_role": "Gun Owner", + "interpretation": "Showing a gun openly.", + "tone": "Political" + }, + { + "trigger": "Background check", + "speaker_role": "Seller", + "interpretation": "Checking criminal history.", + "tone": "Standard" + }, + { + "trigger": "Red state", + "speaker_role": "Pundit", + "interpretation": "Republican/Conservative state.", + "tone": "Political" + }, + { + "trigger": "Blue state", + "speaker_role": "Pundit", + "interpretation": "Democrat/Liberal state.", + "tone": "Political" + }, + { + "trigger": "Swing state", + "speaker_role": "Pundit", + "interpretation": "State that decides the election.", + "tone": "Political" + }, + { + "trigger": "Purple state", + "speaker_role": "Pundit", + "interpretation": "Mixed political state.", + "tone": "Political" + }, + { + "trigger": "Bible Belt", + "speaker_role": "Sociologist", + "interpretation": "Religious Southern US.", + "tone": "Cultural" + }, + { + "trigger": "Rust Belt", + "speaker_role": "Sociologist", + "interpretation": "Industrial Midwest (De-industrialized).", + "tone": "Cultural" + }, + { + "trigger": "Sun Belt", + "speaker_role": "Sociologist", + "interpretation": "Warm Southern/Western states.", + "tone": "Cultural" + }, + { + "trigger": "Midwest nice", + "speaker_role": "Sociologist", + "interpretation": "Polite but passive-aggressive behavior.", + "tone": "Cultural" + }, + { + "trigger": "Southern hospitality", + "speaker_role": "Southerner", + "interpretation": "Welcoming guests warmly.", + "tone": "Positive" + }, + { + "trigger": "New York Minute", + "speaker_role": "New Yorker", + "interpretation": "Very fast.", + "tone": "Fast" + }, + { + "trigger": "Vegas Rule", + "speaker_role": "Tourist", + "interpretation": "What happens here, stays here.", + "tone": "Secretive" + }, + { + "trigger": "Florida Man", + "speaker_role": "Internet", + "interpretation": "Crazy criminal news story.", + "tone": "Humorous" + }, + { + "trigger": "The Burbs", + "speaker_role": "Resident", + "interpretation": "Suburbs.", + "tone": "Boring/Safe" + }, + { + "trigger": "Downtown", + "speaker_role": "Resident", + "interpretation": "City Center.", + "tone": "Urban" + }, + { + "trigger": "Uptown", + "speaker_role": "Resident", + "interpretation": "Residential/Wealthier part of city.", + "tone": "Urban" + }, + { + "trigger": "Main Street", + "speaker_role": "Politician", + "interpretation": "Small businesses/Average people.", + "tone": "Political" + }, + { + "trigger": "Wall Street", + "speaker_role": "Politician", + "interpretation": "Big banks/Finance.", + "tone": "Political" + }, + { + "trigger": "Silicon Valley", + "speaker_role": "Techie", + "interpretation": "Tech Industry.", + "tone": "Tech" + }, + { + "trigger": "Hollywood", + "speaker_role": "Actor", + "interpretation": "Movie Industry.", + "tone": "Entertainment" + }, + { + "trigger": "The Hill", + "speaker_role": "Politician", + "interpretation": "Capitol Hill / Congress.", + "tone": "Political" + }, + { + "trigger": "The White House", + "speaker_role": "News", + "interpretation": "The President/Executive Branch.", + "tone": "Political" + }, + { + "trigger": "Uncle Sam", + "speaker_role": "Patriot", + "interpretation": "The US Government.", + "tone": "Personification" + }, + { + "trigger": "G.I. Joe", + "speaker_role": "Soldier", + "interpretation": "Standard soldier.", + "tone": "Military" + }, + { + "trigger": "Stars and Stripes", + "speaker_role": "Patriot", + "interpretation": "The Flag.", + "tone": "Patriotic" + }, + { + "trigger": "Old Glory", + "speaker_role": "Patriot", + "interpretation": "The Flag.", + "tone": "Patriotic" + }, + { + "trigger": "Pledge of Allegiance", + "speaker_role": "Student", + "interpretation": "Loyalty oath said in schools.", + "tone": "Ritualistic" + }, + { + "trigger": "National Anthem", + "speaker_role": "Singer", + "interpretation": "Star Spangled Banner.", + "tone": "Ritualistic" + }, + { + "trigger": "Take a knee", + "speaker_role": "Activist", + "interpretation": "Protest during anthem.", + "tone": "Political" + }, + { + "trigger": "Did you see the game?", + "speaker_role": "Greeter", + "interpretation": "Generic small talk. Usually refers to NFL (Football).", + "tone": "Casual" + }, + { + "trigger": "No spoilers!", + "speaker_role": "Listener", + "interpretation": "Do not tell me what happens in the movie/show.", + "tone": "Warning" + }, + { + "trigger": "I'm binging it", + "speaker_role": "Viewer", + "interpretation": "I am watching every episode rapidly.", + "tone": "Obsessive" + }, + { + "trigger": "It broke the internet", + "speaker_role": "Commentator", + "interpretation": "It was extremely popular/controversial.", + "tone": "Hyperbolic" + }, + { + "trigger": "Swipe left", + "speaker_role": "Judge", + "interpretation": "I reject this person/idea.", + "tone": "Dismissive" + }, + { + "trigger": "Swipe right", + "speaker_role": "Judge", + "interpretation": "I accept/like this.", + "tone": "Approval" + }, + { + "trigger": "DM me", + "speaker_role": "User", + "interpretation": "Send me a private Direct Message.", + "tone": "Direct" + }, + { + "trigger": "Link in bio", + "speaker_role": "Influencer", + "interpretation": "Go to my profile to click the link.", + "tone": "Promotional" + }, + { + "trigger": "Like and Subscribe", + "speaker_role": "Creator", + "interpretation": "Please support my channel.", + "tone": "Standard" + }, + { + "trigger": "Don't read the comments", + "speaker_role": "Advisor", + "interpretation": "The comment section is toxic/negative.", + "tone": "Warning" + }, + { + "trigger": "Pics or it didn't happen", + "speaker_role": "Skeptic", + "interpretation": "I need photographic proof.", + "tone": "Challenging" + }, + { + "trigger": "Too long; didn't read (TL;DR)", + "speaker_role": "Reader", + "interpretation": "Summary for lazy people.", + "tone": "Summary" + }, + { + "trigger": "Ask Me Anything (AMA)", + "speaker_role": "Expert", + "interpretation": "Q&A session.", + "tone": "Open" + }, + { + "trigger": "Throwback Thursday (TBT)", + "speaker_role": "Poster", + "interpretation": "Posting an old photo.", + "tone": "Nostalgic" + }, + { + "trigger": "Fear of Missing Out (FOMO)", + "speaker_role": "Anxious", + "interpretation": "I must go or I will regret it.", + "tone": "Anxious" + }, + { + "trigger": "YOLO", + "speaker_role": "Risk-taker", + "interpretation": "You Only Live Once (Just do it).", + "tone": "Reckless" + }, + { + "trigger": "Karen", + "speaker_role": "Observer", + "interpretation": "Entitled complainer.", + "tone": "Derogatory" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Youth", + "interpretation": "Old person opinion dismissed.", + "tone": "Dismissive" + }, + { + "trigger": "Ghosted", + "speaker_role": "Victim", + "interpretation": "They stopped replying.", + "tone": "Sad" + }, + { + "trigger": "Catfished", + "speaker_role": "Victim", + "interpretation": "Tricked by fake profile.", + "tone": "Embarrassed" + }, + { + "trigger": "Troll", + "speaker_role": "User", + "interpretation": "Don't feed the troll (Don't reply).", + "tone": "Warning" + }, + { + "trigger": "Ratio'd", + "speaker_role": "Twitter User", + "interpretation": "Replies > Likes (You had a bad take).", + "tone": "Mocking" + }, + { + "trigger": "Stan", + "speaker_role": "Fan", + "interpretation": "I am a super-fan.", + "tone": "Intense" + }, + { + "trigger": "Cringe", + "speaker_role": "Critic", + "interpretation": "Second-hand embarrassment.", + "tone": "Judgmental" + }, + { + "trigger": "Based", + "speaker_role": "Commenter", + "interpretation": "I agree / You are courageous.", + "tone": "Approval" + }, + { + "trigger": "Cap / No Cap", + "speaker_role": "Gen Z", + "interpretation": "Lie / Truth.", + "tone": "Verifying" + }, + { + "trigger": "Bet", + "speaker_role": "Gen Z", + "interpretation": "Yes / Okay.", + "tone": "Agreement" + }, + { + "trigger": "Slaps", + "speaker_role": "Listener", + "interpretation": "This song is good.", + "tone": "Approval" + }, + { + "trigger": "Sus", + "speaker_role": "Gamer", + "interpretation": "Suspicious.", + "tone": "Suspicious" + }, + { + "trigger": "Tea", + "speaker_role": "Gossip", + "interpretation": "Gossip/Truth.", + "tone": "Secretive" + }, + { + "trigger": "Receipts", + "speaker_role": "Arguer", + "interpretation": "Evidence (screenshots).", + "tone": "Proof" + }, + { + "trigger": "Woke", + "speaker_role": "Critic/Activist", + "interpretation": "Politically aware (or insult for overly PC).", + "tone": "Political" + }, + { + "trigger": "Cancel", + "speaker_role": "Activst", + "interpretation": "Boycott person.", + "tone": "Punitive" + }, + { + "trigger": "Clout", + "speaker_role": "Influencer", + "interpretation": "Fame/Influence.", + "tone": "Status" + }, + { + "trigger": "Flex", + "speaker_role": "Show-off", + "interpretation": "Show off wealth/strength.", + "tone": "Arrogant" + }, + { + "trigger": "Glow up", + "speaker_role": "Observer", + "interpretation": "Improvement in appearance.", + "tone": "Complimentary" + }, + { + "trigger": "Gucci", + "speaker_role": "Slang", + "interpretation": "Good / Cool.", + "tone": "Positive" + }, + { + "trigger": "Hangry", + "speaker_role": "Eater", + "interpretation": "I need food now or I will kill you.", + "tone": "Warning" + }, + { + "trigger": "Humble brag", + "speaker_role": "Critic", + "interpretation": "Bragging disguised as complaint.", + "tone": "Annoyed" + }, + { + "trigger": "Adulting", + "speaker_role": "Millennial", + "interpretation": "Doing responsible tasks.", + "tone": "Tired" + }, + { + "trigger": "First World Problem", + "speaker_role": "Self-aware", + "interpretation": "Trivial complaint.", + "tone": "Ironic" + }, + { + "trigger": "Sorry not sorry", + "speaker_role": "Defiant", + "interpretation": "I am not actually sorry.", + "tone": "Sassy" + }, + { + "trigger": "Does it have an app?", + "speaker_role": "User", + "interpretation": "Can I do this on my phone?", + "tone": "Lazy" + }, + { + "trigger": "Have you tried turning it off and on?", + "speaker_role": "Tech Support", + "interpretation": "Restart the device.", + "tone": "Standard" + }, + { + "trigger": "404 Error", + "speaker_role": "Joker", + "interpretation": "Idea not found / Brain empty.", + "tone": "Humorous" + }, + { + "trigger": "Blue Screen of Death", + "speaker_role": "User", + "interpretation": "Computer crashed completely.", + "tone": "Fatal" + }, + { + "trigger": "Ping me", + "speaker_role": "Worker", + "interpretation": "Message me.", + "tone": "Corporate" + }, + { + "trigger": "Take this offline", + "speaker_role": "Manager", + "interpretation": "Discuss later.", + "tone": "Corporate" + }, + { + "trigger": "Circle back", + "speaker_role": "Manager", + "interpretation": "Return to topic later.", + "tone": "Corporate" + }, + { + "trigger": "Bandwidth", + "speaker_role": "Worker", + "interpretation": "Mental capacity.", + "tone": "Corporate" + }, + { + "trigger": "Deep dive", + "speaker_role": "Analyst", + "interpretation": "Detailed look.", + "tone": "Corporate" + }, + { + "trigger": "Hard stop", + "speaker_role": "Attendee", + "interpretation": "Must leave at specific time.", + "tone": "Firm" + }, + { + "trigger": "Bio-break", + "speaker_role": "Attendee", + "interpretation": "Toilet break.", + "tone": "Euphemism" + }, + { + "trigger": "Touch base", + "speaker_role": "Colleague", + "interpretation": "Talk briefly.", + "tone": "Corporate" + }, + { + "trigger": "Out of pocket", + "speaker_role": "Worker", + "interpretation": "Unavailable.", + "tone": "Corporate" + }, + { + "trigger": "Low hanging fruit", + "speaker_role": "Manager", + "interpretation": "Easy targets.", + "tone": "Corporate" + }, + { + "trigger": "Move the needle", + "speaker_role": "Manager", + "interpretation": "Make significant progress.", + "tone": "Corporate" + }, + { + "trigger": "Think outside the box", + "speaker_role": "Manager", + "interpretation": "Be creative.", + "tone": "Clich\u00e9" + }, + { + "trigger": "Win-win", + "speaker_role": "Negotiator", + "interpretation": "Good for everyone.", + "tone": "Positive" + }, + { + "trigger": "Synergy", + "speaker_role": "Manager", + "interpretation": "Cooperation (Buzzword).", + "tone": " meaningless" + }, + { + "trigger": "Disrupt", + "speaker_role": "Founder", + "interpretation": "Change industry.", + "tone": "Ambitious" + }, + { + "trigger": "Pivot", + "speaker_role": "Founder", + "interpretation": "Change strategy failing.", + "tone": "Euphemism" + }, + { + "trigger": "Unicorn", + "speaker_role": "Investor", + "interpretation": "Billion dollar startup.", + "tone": "Rare" + }, + { + "trigger": "Bootstrapping", + "speaker_role": "Founder", + "interpretation": "Self-funding.", + "tone": "Proud" + }, + { + "trigger": "Burn rate", + "speaker_role": "Investor", + "interpretation": "Spending speed.", + "tone": "Financial" + }, + { + "trigger": "Runway", + "speaker_role": "Founder", + "interpretation": "Time until money runs out.", + "tone": "Anxious" + }, + { + "trigger": "Exit strategy", + "speaker_role": "Founder", + "interpretation": "Plan to sell company.", + "tone": "Strategic" + }, + { + "trigger": "Early adopter", + "speaker_role": "User", + "interpretation": "First to use.", + "tone": "Cool" + }, + { + "trigger": "Beta", + "speaker_role": "Dev", + "interpretation": "Unfinished version.", + "tone": "Warning" + }, + { + "trigger": "Bug", + "speaker_role": "Dev", + "interpretation": "Error.", + "tone": "Technical" + }, + { + "trigger": "Feature not a bug", + "speaker_role": "Dev", + "interpretation": "It's supposed to do that (Joking).", + "tone": "Defensive" + }, + { + "trigger": "Spaghetti code", + "speaker_role": "Dev", + "interpretation": "Messy programming.", + "tone": "Critical" + }, + { + "trigger": "The Cloud", + "speaker_role": "User", + "interpretation": "Internet storage.", + "tone": "Vague" + }, + { + "trigger": "Algorithm", + "speaker_role": "User", + "interpretation": "The computer logic deciding what I see.", + "tone": "Mysterious" + }, + { + "trigger": "Clickbait", + "speaker_role": "Reader", + "interpretation": "Misleading headline.", + "tone": "Annoyed" + }, + { + "trigger": "Paywall", + "speaker_role": "Reader", + "interpretation": "Must pay to read.", + "tone": "Frustrated" + }, + { + "trigger": "Dark mode", + "speaker_role": "User", + "interpretation": "Black background setting.", + "tone": "Preference" + }, + { + "trigger": "Incognito mode", + "speaker_role": "User", + "interpretation": "Private browsing.", + "tone": "Secretive" + }, + { + "trigger": "Cookies", + "speaker_role": "Browser", + "interpretation": "Tracking data.", + "tone": "Technical" + }, + { + "trigger": "Cache", + "speaker_role": "Tech", + "interpretation": "Saved data.", + "tone": "Technical" + }, + { + "trigger": "Firewall", + "speaker_role": "Tech", + "interpretation": "Security barrier.", + "tone": "Protective" + }, + { + "trigger": "Malware", + "speaker_role": "Tech", + "interpretation": "Virus.", + "tone": "Bad" + }, + { + "trigger": "Trojan horse", + "speaker_role": "Tech", + "interpretation": "Hidden virus.", + "tone": "Sneaky" + }, + { + "trigger": "Phishing", + "speaker_role": "Security", + "interpretation": "Fake email scam.", + "tone": "Warning" + }, + { + "trigger": "Two-factor", + "speaker_role": "Security", + "interpretation": "Phone verification.", + "tone": "Secure" + }, + { + "trigger": "Password", + "speaker_role": "User", + "interpretation": "123456 (Usually weak).", + "tone": "Secret" + }, + { + "trigger": "Unplug", + "speaker_role": "Advisor", + "interpretation": "Stop using tech for a while.", + "tone": "Healthy" + }, + { + "trigger": "Digital detox", + "speaker_role": "Hipster", + "interpretation": "Time without phone.", + "tone": "Trendy" + }, + { + "trigger": "Screen time", + "speaker_role": "Parent", + "interpretation": "Limit phone use.", + "tone": "Strict" + }, + { + "trigger": "Doomscrolling", + "speaker_role": "User", + "interpretation": "Reading bad news obsessively.", + "tone": "Depressed" + }, + { + "trigger": "Rabbit hole", + "speaker_role": "User", + "interpretation": "Getting lost in a topic online.", + "tone": "Distracted" + }, + { + "trigger": "Wiki hole", + "speaker_role": "User", + "interpretation": "Reading Wikipedia for hours.", + "tone": "Curious" + }, + { + "trigger": "Trick or Treat!", + "speaker_role": "Child", + "interpretation": "Give me candy.", + "tone": "Expectant" + }, + { + "trigger": "Happy Holidays", + "speaker_role": "Any", + "interpretation": "Inclusive greeting for Dec/Jan.", + "tone": "Polite" + }, + { + "trigger": "Merry Christmas", + "speaker_role": "Any", + "interpretation": "Specific greeting (Can be political statement).", + "tone": "Traditional" + }, + { + "trigger": "Thank you for your service", + "speaker_role": "Civilian", + "interpretation": "Mandatory phrase when meeting a veteran.", + "tone": "Respectful" + }, + { + "trigger": "Bless you", + "speaker_role": "Any", + "interpretation": "Said immediately after someone sneezes.", + "tone": "Reflexive" + }, + { + "trigger": "Gesundheit", + "speaker_role": "Any", + "interpretation": "Said after sneezing (Alternative).", + "tone": "Polite" + }, + { + "trigger": "I'm sorry for your loss", + "speaker_role": "Sympathizer", + "interpretation": "Standard condolence for death.", + "tone": "Solemn" + }, + { + "trigger": "Paper or plastic?", + "speaker_role": "Cashier", + "interpretation": "How do you want your groceries bagged?", + "tone": "Routine" + }, + { + "trigger": "Debit or Credit?", + "speaker_role": "Cashier", + "interpretation": "How are you paying?", + "tone": "Routine" + }, + { + "trigger": "Do you have a rewards card?", + "speaker_role": "Cashier", + "interpretation": "Data tracking request.", + "tone": "Routine" + }, + { + "trigger": "Can I get a refill?", + "speaker_role": "Diner", + "interpretation": "More drink (Usually free).", + "tone": "Request" + }, + { + "trigger": "Is Pepsi okay?", + "speaker_role": "Server", + "interpretation": "We don't have Coke.", + "tone": "Apologetic" + }, + { + "trigger": "Super size it", + "speaker_role": "Server", + "interpretation": "Make the meal larger for money.", + "tone": "Sales" + }, + { + "trigger": "Hold the onions", + "speaker_role": "Diner", + "interpretation": "Do not put onions on it.", + "tone": "Specific" + }, + { + "trigger": "On the side", + "speaker_role": "Diner", + "interpretation": "Put sauce in a separate cup.", + "tone": "Specific" + }, + { + "trigger": "How would you like that cooked?", + "speaker_role": "Server", + "interpretation": "Rare, Medium, or Well Done?", + "tone": "Inquiry" + }, + { + "trigger": "Do you take insurance?", + "speaker_role": "Patient", + "interpretation": "I cannot afford this otherwise.", + "tone": "Anxious" + }, + { + "trigger": "Fill this out", + "speaker_role": "Receptionist", + "interpretation": "Complete the paperwork.", + "tone": "Directive" + }, + { + "trigger": "The doctor will see you now", + "speaker_role": "Nurse", + "interpretation": "Go to the exam room.", + "tone": "Formal" + }, + { + "trigger": "This might sting a little", + "speaker_role": "Doctor", + "interpretation": "This will hurt.", + "tone": "Warning" + }, + { + "trigger": "Turn your head and cough", + "speaker_role": "Doctor", + "interpretation": "Hernia check.", + "tone": "Clinical" + }, + { + "trigger": "Take two and call me in the morning", + "speaker_role": "Doctor", + "interpretation": "It's not serious.", + "tone": "Dismissive" + }, + { + "trigger": "Get off my lawn", + "speaker_role": "Old Man", + "interpretation": "Go away.", + "tone": "Stereotypical" + }, + { + "trigger": "Not in my backyard (NIMBY)", + "speaker_role": "Resident", + "interpretation": "I don't want construction near me.", + "tone": "Defensive" + }, + { + "trigger": "Keep it down!", + "speaker_role": "Neighbor", + "interpretation": "You are too loud.", + "tone": "Angry" + }, + { + "trigger": "Good fences make good neighbors", + "speaker_role": " homeowner", + "interpretation": "Privacy prevents conflict.", + "tone": "Proverbial" + }, + { + "trigger": "Can I borrow a cup of sugar?", + "speaker_role": "Neighbor", + "interpretation": "I need a small favor.", + "tone": "Friendly" + }, + { + "trigger": "Keeping up with the Joneses", + "speaker_role": "Critic", + "interpretation": "Buying things just to compete with neighbors.", + "tone": "Critical" + }, + { + "trigger": "There goes the neighborhood", + "speaker_role": "Resident", + "interpretation": "Bad people are moving in / Property value is dropping.", + "tone": "Bigoted/Snobbish" + }, + { + "trigger": "Trick or treat smell my feet", + "speaker_role": "Child", + "interpretation": "Joke rhyme.", + "tone": "Playful" + }, + { + "trigger": "Happy Turkey Day", + "speaker_role": "Greeter", + "interpretation": "Happy Thanksgiving.", + "tone": "Casual" + }, + { + "trigger": "I'm stuffed", + "speaker_role": "Eater", + "interpretation": "I ate too much.", + "tone": "Satisfied" + }, + { + "trigger": "Food coma", + "speaker_role": "Eater", + "interpretation": "Sleepy after eating.", + "tone": "Tired" + }, + { + "trigger": "New Year, New Me", + "speaker_role": "Poster", + "interpretation": "I will change my habits (usually fails).", + "tone": "Optimistic" + }, + { + "trigger": "Ball drop", + "speaker_role": "Viewer", + "interpretation": "Countdown to midnight.", + "tone": "Excited" + }, + { + "trigger": "Kiss me", + "speaker_role": "Partner", + "interpretation": "Midnight tradition.", + "tone": "Romantic" + }, + { + "trigger": "Will you be my Valentine?", + "speaker_role": "Suitor", + "interpretation": "Date request for Feb 14.", + "tone": "Romantic" + }, + { + "trigger": "April Fools!", + "speaker_role": "Joker", + "interpretation": "I just tricked you.", + "tone": "Playful" + }, + { + "trigger": "Beware of Dog", + "speaker_role": "Sign", + "interpretation": "Do not enter.", + "tone": "Warning" + }, + { + "trigger": "Solicitors", + "speaker_role": "Sign", + "interpretation": "Salespeople.", + "tone": "Formal" + }, + { + "trigger": "No Soliciting", + "speaker_role": "Sign", + "interpretation": "Don't knock on my door to sell things.", + "tone": "Prohibitive" + }, + { + "trigger": "Neighborhood Watch", + "speaker_role": "Sign", + "interpretation": "We call the police on strangers.", + "tone": "Warning" + }, + { + "trigger": "Slow Children Playing", + "speaker_role": "Sign", + "interpretation": "Drive slowly.", + "tone": "Warning" + }, + { + "trigger": "Garage Sale", + "speaker_role": "Sign", + "interpretation": "I am selling junk in my driveway.", + "tone": "Informal" + }, + { + "trigger": "Lost Dog", + "speaker_role": "Poster", + "interpretation": "Please help find pet.", + "tone": "Sad" + }, + { + "trigger": "Vote for...", + "speaker_role": "Sign", + "interpretation": "Political endorsement.", + "tone": "Political" + }, + { + "trigger": "Support our Troops", + "speaker_role": "Sticker", + "interpretation": "Patriotic sentiment.", + "tone": "Patriotic" + }, + { + "trigger": "Baby on Board", + "speaker_role": "Sticker", + "interpretation": "Drive carefully near me.", + "tone": "Cautionary" + }, + { + "trigger": "Coexist", + "speaker_role": "Sticker", + "interpretation": "Religious tolerance.", + "tone": "Liberal" + }, + { + "trigger": "Come and Take It", + "speaker_role": "Sticker", + "interpretation": "Gun rights.", + "tone": "Conservative" + }, + { + "trigger": "Thin Blue Line", + "speaker_role": "Sticker", + "interpretation": "Police support.", + "tone": "Political" + }, + { + "trigger": "My child is an Honor Student", + "speaker_role": "Sticker", + "interpretation": "Parental bragging.", + "tone": "Proud" + }, + { + "trigger": "Wash me", + "speaker_role": "Graffiti", + "interpretation": "This car is dirty.", + "tone": "Humorous" + }, + { + "trigger": "How's my driving?", + "speaker_role": "Sticker", + "interpretation": "Call number to complain.", + "tone": "Corporate" + }, + { + "trigger": "Wide Load", + "speaker_role": "Truck", + "interpretation": "Large cargo.", + "tone": "Warning" + }, + { + "trigger": "Oversize Load", + "speaker_role": "Truck", + "interpretation": "Large cargo.", + "tone": "Warning" + }, + { + "trigger": "Do not pass", + "speaker_role": "Sign", + "interpretation": "Stay in lane.", + "tone": "Command" + }, + { + "trigger": "Yield", + "speaker_role": "Sign", + "interpretation": "Let other cars go first.", + "tone": "Command" + }, + { + "trigger": "Merge", + "speaker_role": "Sign", + "interpretation": "Join traffic.", + "tone": "Command" + }, + { + "trigger": "Dead End", + "speaker_role": "Sign", + "interpretation": "Road stops.", + "tone": "Warning" + }, + { + "trigger": "No Outlet", + "speaker_role": "Sign", + "interpretation": "Dead end.", + "tone": "Warning" + }, + { + "trigger": "Speed Trap", + "speaker_role": "Driver", + "interpretation": "Police hiding to catch speeders.", + "tone": "Warning" + }, + { + "trigger": "Bumper to bumper", + "speaker_role": "Reporter", + "interpretation": "Heavy traffic.", + "tone": "Frustrated" + }, + { + "trigger": "Rubbernecking", + "speaker_role": "Reporter", + "interpretation": "Slowing to look at crash.", + "tone": "Annoyed" + }, + { + "trigger": "Road hog", + "speaker_role": "Driver", + "interpretation": "Takes up too much space.", + "tone": "Angry" + }, + { + "trigger": "Sunday driver", + "speaker_role": "Driver", + "interpretation": "Too slow.", + "tone": "Angry" + }, + { + "trigger": "Backseat driver", + "speaker_role": "Driver", + "interpretation": "Passenger giving advice.", + "tone": "Annoyed" + }, + { + "trigger": "Are we there yet?", + "speaker_role": "Passenger", + "interpretation": "I am bored.", + "tone": "Whining" + }, + { + "trigger": "Pull over", + "speaker_role": "Any", + "interpretation": "Stop the car.", + "tone": "Urgent" + }, + { + "trigger": "Step out of the car", + "speaker_role": "Police", + "interpretation": "You are in trouble.", + "tone": "Command" + }, + { + "trigger": "License and registration", + "speaker_role": "Police", + "interpretation": "Show documents.", + "tone": "Command" + }, + { + "trigger": "Do you know how fast you were going?", + "speaker_role": "Police", + "interpretation": "Admit guilt.", + "tone": "Trick question" + }, + { + "trigger": "I'll let you off with a warning", + "speaker_role": "Police", + "interpretation": "No ticket today.", + "tone": "Merciful" + }, + { + "trigger": "Click it or ticket", + "speaker_role": "Slogan", + "interpretation": "Wear seatbelt.", + "tone": "Catchy" + }, + { + "trigger": "Don't drink and drive", + "speaker_role": "Slogan", + "interpretation": "Safety warning.", + "tone": "Serious" + }, + { + "trigger": "Friends don't let friends drive drunk", + "speaker_role": "Slogan", + "interpretation": "Take their keys.", + "tone": "Serious" + }, + { + "trigger": "Buckle up", + "speaker_role": "Driver", + "interpretation": "Put seatbelt on.", + "tone": "Command" + }, + { + "trigger": "Shotgun!", + "speaker_role": "Passenger", + "interpretation": "I get front seat.", + "tone": "Competitive" + }, + { + "trigger": "Punch buggy no punch backs", + "speaker_role": "Child", + "interpretation": "I see a VW Beetle.", + "tone": "Playful" + }, + { + "trigger": "Jinx buy me a coke", + "speaker_role": "Speaker", + "interpretation": "We spoke simultaneously.", + "tone": "Playful" + }, + { + "trigger": "Cross my heart and hope to die", + "speaker_role": "Child", + "interpretation": "I promise.", + "tone": "Serious" + }, + { + "trigger": "Liar liar pants on fire", + "speaker_role": "Child", + "interpretation": "You are lying.", + "tone": "Mocking" + }, + { + "trigger": "I know you are but what am I?", + "speaker_role": "Child", + "interpretation": "Reflecting insult.", + "tone": "Defensive" + }, + { + "trigger": "Talk to the hand", + "speaker_role": "Dismissive", + "interpretation": "I'm not listening.", + "tone": "Rude" + }, + { + "trigger": "Whatever", + "speaker_role": "Dismissive", + "interpretation": "I don't care.", + "tone": "Rude" + }, + { + "trigger": "My house, my rules", + "speaker_role": "Parent", + "interpretation": "Obey me.", + "tone": "Authoritative" + }, + { + "trigger": "Because I said so", + "speaker_role": "Parent", + "interpretation": "End of argument.", + "tone": "Authoritative" + }, + { + "trigger": "Go to your room", + "speaker_role": "Parent", + "interpretation": "You are punished.", + "tone": "Command" + }, + { + "trigger": "You're grounded", + "speaker_role": "Parent", + "interpretation": "You cannot go out.", + "tone": "Punitive" + }, + { + "trigger": "Wait till your father gets home", + "speaker_role": "Mother", + "interpretation": "Delayed punishment.", + "tone": "Threatening" + }, + { + "trigger": "Eat your vegetables", + "speaker_role": "Parent", + "interpretation": "Be healthy.", + "tone": "Command" + }, + { + "trigger": "Don't talk with your mouth full", + "speaker_role": "Parent", + "interpretation": "Have manners.", + "tone": "Correction" + }, + { + "trigger": "Elbows off the table", + "speaker_role": "Parent", + "interpretation": "Have manners.", + "tone": "Correction" + }, + { + "trigger": "How's it going?", + "speaker_role": "Greeter", + "interpretation": "Phatic greeting. Do not answer honestly.", + "tone": "Ritual" + }, + { + "trigger": "See ya", + "speaker_role": "Leaver", + "interpretation": "Goodbye.", + "tone": "Casual" + }, + { + "trigger": "Let's do lunch", + "speaker_role": "Acquaintance", + "interpretation": "We will likely never eat lunch together.", + "tone": "Insincere" + }, + { + "trigger": "Shut up!", + "speaker_role": "Listener", + "interpretation": "I don't believe you! (Surprise).", + "tone": "Excited" + }, + { + "trigger": "Get out!", + "speaker_role": "Listener", + "interpretation": "That is impossible! (Surprise).", + "tone": "Excited" + }, + { + "trigger": "Netflix and chill", + "speaker_role": "Suitor", + "interpretation": "Come over for sex.", + "tone": "Euphemistic" + }, + { + "trigger": "Hook up", + "speaker_role": "Dater", + "interpretation": "Have casual sex.", + "tone": "Casual" + }, + { + "trigger": "We're talking", + "speaker_role": "Dater", + "interpretation": "Pre-dating phase, not exclusive.", + "tone": "Ambiguous" + }, + { + "trigger": "Seeing someone", + "speaker_role": "Dater", + "interpretation": "Dating, potentially exclusive.", + "tone": "Serious" + }, + { + "trigger": "Exclusive", + "speaker_role": "Dater", + "interpretation": "Boyfriend/Girlfriend status.", + "tone": "Committed" + }, + { + "trigger": "We need to talk", + "speaker_role": "Partner", + "interpretation": "I am breaking up with you or have bad news.", + "tone": "Ominous" + }, + { + "trigger": "It's fine", + "speaker_role": "Partner", + "interpretation": "It is definitely not fine.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Whatever", + "speaker_role": "Arguer", + "interpretation": "I am ending this conversation now.", + "tone": "Dismissive" + }, + { + "trigger": "I'm done", + "speaker_role": "Arguer", + "interpretation": "I am leaving the room/relationship.", + "tone": "Final" + }, + { + "trigger": "Just looking", + "speaker_role": "Shopper", + "interpretation": "Leave me alone.", + "tone": "Polite" + }, + { + "trigger": "Do you have this in the back?", + "speaker_role": "Shopper", + "interpretation": "Please check stock.", + "tone": "Hopeful" + }, + { + "trigger": "Cut me off", + "speaker_role": "Driver", + "interpretation": "Drove in front of me dangerously.", + "tone": "Angry" + }, + { + "trigger": "Tailgating", + "speaker_role": "Driver", + "interpretation": "Driving too close behind.", + "tone": "Dangerous" + }, + { + "trigger": "Flipping the bird", + "speaker_role": "Driver", + "interpretation": "Showing middle finger.", + "tone": "Insulting" + }, + { + "trigger": "I'll be there in 5", + "speaker_role": "Arriver", + "interpretation": "I will be there in 10-15 minutes.", + "tone": "Lying" + }, + { + "trigger": "Fashionably late", + "speaker_role": "Guest", + "interpretation": "Arriving late to look cool.", + "tone": "Social" + }, + { + "trigger": "I feel like...", + "speaker_role": "Speaker", + "interpretation": "My opinion is... (Softened).", + "tone": "Diffident" + }, + { + "trigger": "My truth", + "speaker_role": "Speaker", + "interpretation": "My subjective experience.", + "tone": "Personal" + }, + { + "trigger": "Holding space", + "speaker_role": "Listener", + "interpretation": "Listening without judging.", + "tone": "Therapeutic" + }, + { + "trigger": "Check please", + "speaker_role": "Diner", + "interpretation": "I want to pay.", + "tone": "Functional" + }, + { + "trigger": "Box it up", + "speaker_role": "Diner", + "interpretation": "Pack leftovers.", + "tone": "Functional" + }, + { + "trigger": "Y'all", + "speaker_role": "Southerner", + "interpretation": "You all (Plural).", + "tone": "Regional" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are stupid/pathetic.", + "tone": "Condescending" + }, + { + "trigger": "Fixin' to", + "speaker_role": "Southerner", + "interpretation": "Preparing to.", + "tone": "Regional" + }, + { + "trigger": "Ope", + "speaker_role": "Midwesterner", + "interpretation": "Excuse me.", + "tone": "Polite" + }, + { + "trigger": "Yeah no", + "speaker_role": "Midwesterner", + "interpretation": "No.", + "tone": "Negative" + }, + { + "trigger": "No yeah", + "speaker_role": "Midwesterner", + "interpretation": "Yes.", + "tone": "Affirmative" + }, + { + "trigger": "Shoot me an email", + "speaker_role": "Worker", + "interpretation": "Send an email.", + "tone": "Casual" + }, + { + "trigger": "Circle back", + "speaker_role": "Manager", + "interpretation": "Discuss later.", + "tone": "Corporate" + }, + { + "trigger": "Hard stop", + "speaker_role": "Attendee", + "interpretation": "Must leave.", + "tone": "Firm" + }, + { + "trigger": "Ping me", + "speaker_role": "Worker", + "interpretation": "Message me.", + "tone": "Casual" + }, + { + "trigger": "Bandwidth", + "speaker_role": "Worker", + "interpretation": "Time/Energy.", + "tone": "Corporate" + }, + { + "trigger": "Take it offline", + "speaker_role": "Manager", + "interpretation": "Stop talking now.", + "tone": "Directive" + }, + { + "trigger": "Synergy", + "speaker_role": "Manager", + "interpretation": "Cooperation (Buzzword).", + "tone": "Empty" + }, + { + "trigger": "Touch base", + "speaker_role": "Colleague", + "interpretation": "Contact briefly.", + "tone": "Corporate" + }, + { + "trigger": "Deep dive", + "speaker_role": "Analyst", + "interpretation": "Detailed analysis.", + "tone": "Corporate" + }, + { + "trigger": "Low hanging fruit", + "speaker_role": "Manager", + "interpretation": "Easy tasks.", + "tone": "Corporate" + }, + { + "trigger": "Play devil's advocate", + "speaker_role": "Debater", + "interpretation": "Argue opposite side for fun.", + "tone": "Argumentative" + }, + { + "trigger": "To be honest", + "speaker_role": "Speaker", + "interpretation": "I'm about to say something rude.", + "tone": "Warning" + }, + { + "trigger": "With all due respect", + "speaker_role": "Speaker", + "interpretation": "I have no respect for your idea.", + "tone": "Warning" + }, + { + "trigger": "No offense", + "speaker_role": "Speaker", + "interpretation": "This will be offensive.", + "tone": "Warning" + }, + { + "trigger": "I'm just saying", + "speaker_role": "Critic", + "interpretation": "Don't get mad at my criticism.", + "tone": "Defensive" + }, + { + "trigger": "Asking for a friend", + "speaker_role": "Asker", + "interpretation": "Asking for myself (embarrassing).", + "tone": "Humorous" + }, + { + "trigger": "Tell me about it", + "speaker_role": "Sympathizer", + "interpretation": "I agree completely.", + "tone": "Agreement" + }, + { + "trigger": "You can say that again", + "speaker_role": "Sympathizer", + "interpretation": "That is very true.", + "tone": "Agreement" + }, + { + "trigger": "It is what it is", + "speaker_role": "Stoic", + "interpretation": "Accepting bad situation.", + "tone": "Resigned" + }, + { + "trigger": "Living the dream", + "speaker_role": "Worker", + "interpretation": "I am suffering (Sarcastic).", + "tone": "Sarcastic" + }, + { + "trigger": "Working hard or hardly working?", + "speaker_role": "Joker", + "interpretation": "Bad dad joke greeting.", + "tone": "Annoying" + }, + { + "trigger": "Another day in paradise", + "speaker_role": "Worker", + "interpretation": "I hate my job.", + "tone": "Sarcastic" + }, + { + "trigger": "Sounds like a plan", + "speaker_role": "Agreed", + "interpretation": "Agreed.", + "tone": "Affirmative" + }, + { + "trigger": "I'm down", + "speaker_role": "Agreed", + "interpretation": "I want to go.", + "tone": "Enthusiastic" + }, + { + "trigger": "I'm game", + "speaker_role": "Agreed", + "interpretation": "I am willing.", + "tone": "Willing" + }, + { + "trigger": "Count me in", + "speaker_role": "Agreed", + "interpretation": "I will participate.", + "tone": "Committed" + }, + { + "trigger": "Pass", + "speaker_role": "Refuser", + "interpretation": "No thanks.", + "tone": "Casual" + }, + { + "trigger": "Hard pass", + "speaker_role": "Refuser", + "interpretation": "Definitely not.", + "tone": "Strong" + }, + { + "trigger": "Rain check", + "speaker_role": "Refuser", + "interpretation": "Reschedule.", + "tone": "Polite" + }, + { + "trigger": "Maybe", + "speaker_role": "Refuser", + "interpretation": "No.", + "tone": "Soft" + }, + { + "trigger": "We'll see", + "speaker_role": "Parent", + "interpretation": "No.", + "tone": "Dismissive" + }, + { + "trigger": "Let's play it by ear", + "speaker_role": "Planner", + "interpretation": "Decide later.", + "tone": "Flexible" + }, + { + "trigger": "Wing it", + "speaker_role": "Improviser", + "interpretation": "Do it without preparation.", + "tone": "Casual" + }, + { + "trigger": "Shotgun", + "speaker_role": "Passenger", + "interpretation": "I claim front seat.", + "tone": "Competitive" + }, + { + "trigger": "Jinx", + "speaker_role": "Speaker", + "interpretation": "Same words spoken.", + "tone": "Playful" + }, + { + "trigger": "Knock on wood", + "speaker_role": "Speaker", + "interpretation": "Prevent bad luck.", + "tone": "Superstitious" + }, + { + "trigger": "Fingers crossed", + "speaker_role": "Hoper", + "interpretation": "Hope it happens.", + "tone": "Hopeful" + }, + { + "trigger": "My bad", + "speaker_role": "Apologizer", + "interpretation": "My mistake.", + "tone": "Casual" + }, + { + "trigger": "No worries", + "speaker_role": "Forgiver", + "interpretation": "You're welcome.", + "tone": "Casual" + }, + { + "trigger": "You're good", + "speaker_role": "Forgiver", + "interpretation": "No problem.", + "tone": "Casual" + }, + { + "trigger": "All good", + "speaker_role": "Forgiver", + "interpretation": "Everything is fine.", + "tone": "Casual" + }, + { + "trigger": "For sure", + "speaker_role": "Agreed", + "interpretation": "Definitely.", + "tone": "Affirmative" + }, + { + "trigger": "Totally", + "speaker_role": "Agreed", + "interpretation": "I agree.", + "tone": "Affirmative" + }, + { + "trigger": "No doubt", + "speaker_role": "Agreed", + "interpretation": "Certainly.", + "tone": "Affirmative" + }, + { + "trigger": "Word", + "speaker_role": "Hipster", + "interpretation": "Agreed.", + "tone": "Slang" + }, + { + "trigger": "Bet", + "speaker_role": "Gen Z", + "interpretation": "Okay/Yes.", + "tone": "Slang" + }, + { + "trigger": "Cap", + "speaker_role": "Gen Z", + "interpretation": "Lie.", + "tone": "Slang" + }, + { + "trigger": "No cap", + "speaker_role": "Gen Z", + "interpretation": "Truth.", + "tone": "Slang" + }, + { + "trigger": "Simp", + "speaker_role": "Gen Z", + "interpretation": "Submissive man.", + "tone": "Derogatory" + }, + { + "trigger": "Karen", + "speaker_role": "Gen Z", + "interpretation": "Entitled woman.", + "tone": "Derogatory" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Gen Z", + "interpretation": "Old person dismissal.", + "tone": "Dismissive" + }, + { + "trigger": "Boomer", + "speaker_role": "Gen Z", + "interpretation": "Old person.", + "tone": "Descriptive" + }, + { + "trigger": "Zoomer", + "speaker_role": "Older", + "interpretation": "Gen Z person.", + "tone": "Descriptive" + }, + { + "trigger": "Millennial", + "speaker_role": "Older", + "interpretation": "Young person (often wrong age).", + "tone": "Descriptive" + }, + { + "trigger": "Snowflake", + "speaker_role": "Conservative", + "interpretation": "Sensitive person.", + "tone": "Insulting" + }, + { + "trigger": "Woke", + "speaker_role": "Conservative", + "interpretation": "Performative progressive.", + "tone": "Insulting" + }, + { + "trigger": "Libtard", + "speaker_role": "Conservative", + "interpretation": "Liberal.", + "tone": "Derogatory" + }, + { + "trigger": "MAGA", + "speaker_role": "Trump Supporter", + "interpretation": "Make America Great Again.", + "tone": "Political" + }, + { + "trigger": "RINO", + "speaker_role": "Conservative", + "interpretation": "Republican In Name Only.", + "tone": "Political" + }, + { + "trigger": "Fake News", + "speaker_role": "Skeptic", + "interpretation": "Lies.", + "tone": "Dismissive" + }, + { + "trigger": "Mainstream Media", + "speaker_role": "Skeptic", + "interpretation": "Biased news.", + "tone": "Critical" + }, + { + "trigger": "Thank you for your service", + "speaker_role": "Civilian", + "interpretation": "Mandatory phrase when meeting a veteran.", + "tone": "Respectful" + }, + { + "trigger": "Semper Fi", + "speaker_role": "Marine", + "interpretation": "Always Faithful (Marine greeting).", + "tone": "Brotherhood" + }, + { + "trigger": "Hooah", + "speaker_role": "Army", + "interpretation": "Yes / Understood / Let's go.", + "tone": "Motivated" + }, + { + "trigger": "Roger", + "speaker_role": "Any", + "interpretation": "Message received.", + "tone": "Functional" + }, + { + "trigger": "Copy", + "speaker_role": "Any", + "interpretation": "I hear you.", + "tone": "Functional" + }, + { + "trigger": "Over", + "speaker_role": "Radio", + "interpretation": "I am done talking, your turn.", + "tone": "Functional" + }, + { + "trigger": "Out", + "speaker_role": "Radio", + "interpretation": "Conversation ended.", + "tone": "Functional" + }, + { + "trigger": "Watch your six", + "speaker_role": "Advisor", + "interpretation": "Watch your back (6 o'clock).", + "tone": "Warning" + }, + { + "trigger": "On your left", + "speaker_role": "Runner/Cyclist", + "interpretation": "I am passing you.", + "tone": "Warning" + }, + { + "trigger": "Stay in your lane", + "speaker_role": "Critic", + "interpretation": "Mind your own business.", + "tone": "Directive" + }, + { + "trigger": "Stand your ground", + "speaker_role": "Defender", + "interpretation": "Do not retreat; use force if needed.", + "tone": "Defiant" + }, + { + "trigger": "I plead the Fifth", + "speaker_role": "Speaker", + "interpretation": "I will not answer.", + "tone": "Legal/Humorous" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get an attorney now.", + "tone": "Serious" + }, + { + "trigger": "Am I being detained?", + "speaker_role": "Suspect", + "interpretation": "If not, I am leaving.", + "tone": "Confrontational" + }, + { + "trigger": "I do not consent to a search", + "speaker_role": "Suspect", + "interpretation": "Legal refusal.", + "tone": "Legal" + }, + { + "trigger": "Come and take it", + "speaker_role": "Gun Owner", + "interpretation": "I will fight you for my rights.", + "tone": "Defiant" + }, + { + "trigger": "Don't mess with Texas", + "speaker_role": "Texan", + "interpretation": "Warning.", + "tone": "Pride" + }, + { + "trigger": "Roll Tide", + "speaker_role": "Alabamian", + "interpretation": "Hello / Goodbye / Go Alabama.", + "tone": "Tribal" + }, + { + "trigger": "Hook 'em", + "speaker_role": "Texan", + "interpretation": "Go Longhorns.", + "tone": "Tribal" + }, + { + "trigger": "Go Blue", + "speaker_role": "Michigander", + "interpretation": "Go Michigan.", + "tone": "Tribal" + }, + { + "trigger": "Wicked smaht", + "speaker_role": "Bostonian", + "interpretation": "Very smart.", + "tone": "Regional" + }, + { + "trigger": "Fuggedaboutit", + "speaker_role": "New Yorker", + "interpretation": "Forget it / It's the best / No problem.", + "tone": "Regional" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You're an idiot.", + "tone": "Condescending" + }, + { + "trigger": "Ope", + "speaker_role": "Midwesterner", + "interpretation": "Excuse me.", + "tone": "Polite" + }, + { + "trigger": "Y'all", + "speaker_role": "Southerner", + "interpretation": "You guys.", + "tone": "Inclusive" + }, + { + "trigger": "All y'all", + "speaker_role": "Southerner", + "interpretation": "Every single one of you.", + "tone": "Inclusive" + }, + { + "trigger": "Fixin' to", + "speaker_role": "Southerner", + "interpretation": "Preparing to.", + "tone": "Planning" + }, + { + "trigger": "Hella", + "speaker_role": "Californian", + "interpretation": "Very.", + "tone": "Slang" + }, + { + "trigger": "The 5", + "speaker_role": "Californian", + "interpretation": "Interstate 5 (highway).", + "tone": "Specific" + }, + { + "trigger": "Pop", + "speaker_role": "Midwesterner", + "interpretation": "Soda.", + "tone": "Regional" + }, + { + "trigger": "Coke", + "speaker_role": "Southerner", + "interpretation": "Any soda (What kind of coke do you want?).", + "tone": "Regional" + }, + { + "trigger": "Gym, Tan, Laundry", + "speaker_role": "Jersey", + "interpretation": "Priorities.", + "tone": "Stereotype" + }, + { + "trigger": "Live Free or Die", + "speaker_role": "New Hampshirite", + "interpretation": "State motto.", + "tone": "Defiant" + }, + { + "trigger": "Aloha", + "speaker_role": "Hawaiian", + "interpretation": "Hello / Goodbye / Love.", + "tone": "Warm" + }, + { + "trigger": "Mahalo", + "speaker_role": "Hawaiian", + "interpretation": "Thank you.", + "tone": "Polite" + }, + { + "trigger": "Poked the bear", + "speaker_role": "Provoker", + "interpretation": "Agitated a dangerous person.", + "tone": "Warning" + }, + { + "trigger": "Play stupid games, win stupid prizes", + "speaker_role": "Critic", + "interpretation": "You deserve your bad outcome.", + "tone": "Sarcastic" + }, + { + "trigger": "Hold my beer", + "speaker_role": "Risk-taker", + "interpretation": "Watch this (I am about to do something stupid).", + "tone": "Humorous" + }, + { + "trigger": "Send it", + "speaker_role": "Risk-taker", + "interpretation": "Just do it.", + "tone": "Encouraging" + }, + { + "trigger": "Full send", + "speaker_role": "Risk-taker", + "interpretation": "100% effort/risk.", + "tone": "Encouraging" + }, + { + "trigger": "Do it for the Vine", + "speaker_role": "Millennial", + "interpretation": "Do it for the camera.", + "tone": "Nostalgic" + }, + { + "trigger": "Worldstar!", + "speaker_role": "Observer", + "interpretation": "A fight is happening.", + "tone": "Excited" + }, + { + "trigger": "Bye Felicia", + "speaker_role": "Dismissive", + "interpretation": "Go away, nobody cares.", + "tone": "Rude" + }, + { + "trigger": "Cash me outside", + "speaker_role": "Aggressor", + "interpretation": "Let's fight outside.", + "tone": "Aggressive" + }, + { + "trigger": "I'm weak", + "speaker_role": "Laugher", + "interpretation": "That is hilarious.", + "tone": "Hyperbolic" + }, + { + "trigger": "I'm dead", + "speaker_role": "Laugher", + "interpretation": "That is hilarious.", + "tone": "Hyperbolic" + }, + { + "trigger": "Facts", + "speaker_role": "Agreed", + "interpretation": "True.", + "tone": "Affirmative" + }, + { + "trigger": "Big facts", + "speaker_role": "Agreed", + "interpretation": "Very true.", + "tone": "Affirmative" + }, + { + "trigger": "Period", + "speaker_role": "Agreed", + "interpretation": "End of discussion.", + "tone": "Final" + }, + { + "trigger": "Periodt", + "speaker_role": "Agreed", + "interpretation": "End of discussion (Emphatic).", + "tone": "Final" + }, + { + "trigger": "Slay", + "speaker_role": "Supporter", + "interpretation": "You look great / You did well.", + "tone": "Positive" + }, + { + "trigger": "Queen", + "speaker_role": "Supporter", + "interpretation": "High praise for a woman.", + "tone": "Positive" + }, + { + "trigger": "King", + "speaker_role": "Supporter", + "interpretation": "High praise for a man.", + "tone": "Positive" + }, + { + "trigger": "Simp", + "speaker_role": "Critic", + "interpretation": "Man trying too hard for a woman.", + "tone": "Insulting" + }, + { + "trigger": "Incel", + "speaker_role": "Critic", + "interpretation": "Involuntary Celibate (Misogynist).", + "tone": "Insulting" + }, + { + "trigger": "Chad", + "speaker_role": "Observer", + "interpretation": "Alpha male.", + "tone": "Descriptive" + }, + { + "trigger": "Stacy", + "speaker_role": "Observer", + "interpretation": "Stereotypical attractive female.", + "tone": "Descriptive" + }, + { + "trigger": "Based", + "speaker_role": "Supporter", + "interpretation": "Courageous opinion.", + "tone": "Approval" + }, + { + "trigger": "Cringe", + "speaker_role": "Critic", + "interpretation": "Embarrassing.", + "tone": "Negative" + }, + { + "trigger": "Blue pill", + "speaker_role": "Critic", + "interpretation": "Living in blissful ignorance.", + "tone": "Political" + }, + { + "trigger": "Red pill", + "speaker_role": "Critic", + "interpretation": "Seeing the 'truth' (often right-wing).", + "tone": "Political" + }, + { + "trigger": "Black pill", + "speaker_role": "Critic", + "interpretation": "Nihilism / Hopelessness.", + "tone": "Negative" + }, + { + "trigger": "Gaslight", + "speaker_role": "Victim", + "interpretation": "Manipulate reality.", + "tone": "Serious" + }, + { + "trigger": "Gatekeep", + "speaker_role": "Critic", + "interpretation": "Control access.", + "tone": "Negative" + }, + { + "trigger": "Girlboss", + "speaker_role": "Supporter", + "interpretation": "Successful woman (sometimes ironic).", + "tone": "Ambiguous" + }, + { + "trigger": "Mansplain", + "speaker_role": "Critic", + "interpretation": "Man explaining condescendingly.", + "tone": "Negative" + }, + { + "trigger": "Manspread", + "speaker_role": "Critic", + "interpretation": "Man taking up too much seat space.", + "tone": "Negative" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Youth", + "interpretation": "Old and out of touch.", + "tone": "Dismissive" + }, + { + "trigger": "Karen", + "speaker_role": "Observer", + "interpretation": "Entitled complainer.", + "tone": "Insulting" + }, + { + "trigger": "Let's Go Brandon", + "speaker_role": "Critic", + "interpretation": "F*** Joe Biden.", + "tone": "Political" + }, + { + "trigger": "Thanks Obama", + "speaker_role": "Satirist", + "interpretation": "Blaming Obama for everything (Joke).", + "tone": "Ironic" + }, + { + "trigger": "Not my president", + "speaker_role": "Protester", + "interpretation": "I reject the election result.", + "tone": "Defiant" + }, + { + "trigger": "Drain the swamp", + "speaker_role": "Supporter", + "interpretation": "Remove corrupt politicians.", + "tone": "Political" + }, + { + "trigger": "Fake News", + "speaker_role": "Critic", + "interpretation": "Lies.", + "tone": "Political" + }, + { + "trigger": "Alternative facts", + "speaker_role": "Critic", + "interpretation": "Lies.", + "tone": "Political" + }, + { + "trigger": "Covfefe", + "speaker_role": "Joker", + "interpretation": "Nonsense typo.", + "tone": "Humorous" + }, + { + "trigger": "Bigly", + "speaker_role": "Joker", + "interpretation": "Big league / Very much.", + "tone": "Humorous" + }, + { + "trigger": "Nasty woman", + "speaker_role": "Critic", + "interpretation": "Insult for assertive woman.", + "tone": "Political" + }, + { + "trigger": "Basket of deplorables", + "speaker_role": "Critic", + "interpretation": "Trump supporters.", + "tone": "Political" + }, + { + "trigger": "Lock her up", + "speaker_role": "Chanter", + "interpretation": "Jail Hillary Clinton.", + "tone": "Political" + }, + { + "trigger": "Build the wall", + "speaker_role": "Chanter", + "interpretation": "Stop immigration.", + "tone": "Political" + }, + { + "trigger": "Feel the Bern", + "speaker_role": "Supporter", + "interpretation": "Support Bernie Sanders.", + "tone": "Political" + }, + { + "trigger": "I'm with her", + "speaker_role": "Supporter", + "interpretation": "Support Hillary Clinton.", + "tone": "Political" + }, + { + "trigger": "Make America Great Again", + "speaker_role": "Supporter", + "interpretation": "Return to the past.", + "tone": "Political" + }, + { + "trigger": "No Justice No Peace", + "speaker_role": "Protester", + "interpretation": "We will not stop until justice is served.", + "tone": "Political" + }, + { + "trigger": "Black Lives Matter", + "speaker_role": "Activist", + "interpretation": "Racial justice slogan.", + "tone": "Political" + }, + { + "trigger": "Blue Lives Matter", + "speaker_role": "Activist", + "interpretation": "Police support slogan.", + "tone": "Political" + }, + { + "trigger": "All Lives Matter", + "speaker_role": "Counter-Activist", + "interpretation": "Rebuttal to BLM.", + "tone": "Political" + }, + { + "trigger": "Thoughts and prayers", + "speaker_role": "Politician", + "interpretation": "I am doing nothing.", + "tone": "Empty" + }, + { + "trigger": "Never forget", + "speaker_role": "Patriot", + "interpretation": "Remember 9/11.", + "tone": "Solemn" + }, + { + "trigger": "United We Stand", + "speaker_role": "Patriot", + "interpretation": "Unity slogan.", + "tone": "Patriotic" + }, + { + "trigger": "Freedom isn't free", + "speaker_role": "Patriot", + "interpretation": "Soldiers died for you.", + "tone": "Solemn" + }, + { + "trigger": "Support our troops", + "speaker_role": "Patriot", + "interpretation": "Honor the military.", + "tone": "Patriotic" + }, + { + "trigger": "Am I free to go?", + "speaker_role": "Suspect", + "interpretation": "I am challenging your authority to hold me.", + "tone": "Legal" + }, + { + "trigger": "I want a lawyer", + "speaker_role": "Suspect", + "interpretation": "I am stopping this interrogation.", + "tone": "Defensive" + }, + { + "trigger": "Do you know why I pulled you over?", + "speaker_role": "Police", + "interpretation": "Admit your crime so I don't have to prove it.", + "tone": "Trap" + }, + { + "trigger": "License and registration", + "speaker_role": "Police", + "interpretation": "Hand over documents immediately.", + "tone": "Command" + }, + { + "trigger": "Step out of the vehicle", + "speaker_role": "Police", + "interpretation": "You are likely being arrested or searched.", + "tone": "Command" + }, + { + "trigger": "Stop resisting", + "speaker_role": "Police", + "interpretation": "I am about to use force.", + "tone": "Warning" + }, + { + "trigger": "You have the right to remain silent", + "speaker_role": "Police", + "interpretation": "You are under arrest (Miranda Warning).", + "tone": "Legal" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get an attorney immediately.", + "tone": "Urgent" + }, + { + "trigger": "Take the plea", + "speaker_role": "Lawyer", + "interpretation": "Admit guilt for less jail time.", + "tone": "Pragmatic" + }, + { + "trigger": "Throw the book at him", + "speaker_role": "Judge/DA", + "interpretation": "Give maximum punishment.", + "tone": "Severe" + }, + { + "trigger": "Get out of jail free", + "speaker_role": "Player", + "interpretation": "Avoid consequences easily.", + "tone": "Metaphorical" + }, + { + "trigger": "Three strikes", + "speaker_role": "Judge", + "interpretation": "Life sentence for third felony.", + "tone": "Legal" + }, + { + "trigger": "See you in court", + "speaker_role": "Litigant", + "interpretation": "I will sue you.", + "tone": "Threatening" + }, + { + "trigger": "My hands are tied", + "speaker_role": "Bureaucrat", + "interpretation": "Rules prevent me from helping you.", + "tone": "Dismissive" + }, + { + "trigger": "Off the record", + "speaker_role": "Source", + "interpretation": "Don't quote me.", + "tone": "Secretive" + }, + { + "trigger": "No comment", + "speaker_role": "Suspect", + "interpretation": "I refuse to answer.", + "tone": "Evasive" + }, + { + "trigger": "I can't recall", + "speaker_role": "Witness", + "interpretation": "I know but I won't say (Perjury avoidance).", + "tone": "Evasive" + }, + { + "trigger": "Objection", + "speaker_role": "Lawyer", + "interpretation": "Stop talking.", + "tone": "Legal" + }, + { + "trigger": "Sustained", + "speaker_role": "Judge", + "interpretation": "Objection valid.", + "tone": "Legal" + }, + { + "trigger": "Overruled", + "speaker_role": "Judge", + "interpretation": "Objection invalid.", + "tone": "Legal" + }, + { + "trigger": "May I approach the bench?", + "speaker_role": "Lawyer", + "interpretation": "I need to whisper to the judge.", + "tone": "Formal" + }, + { + "trigger": "All rise", + "speaker_role": "Bailiff", + "interpretation": "Stand up for the judge.", + "tone": "Command" + }, + { + "trigger": "Not guilty", + "speaker_role": "Defendant", + "interpretation": "I deny the charges.", + "tone": "Legal" + }, + { + "trigger": "Guilty", + "speaker_role": "Defendant", + "interpretation": "I admit the charges.", + "tone": "Legal" + }, + { + "trigger": "Hung jury", + "speaker_role": "Reporter", + "interpretation": "No verdict reached.", + "tone": "Neutral" + }, + { + "trigger": "Mistrial", + "speaker_role": "Judge", + "interpretation": "Trial cancelled, start over.", + "tone": "Legal" + }, + { + "trigger": "Contempt of court", + "speaker_role": "Judge", + "interpretation": "You are disrespecting me; go to jail.", + "tone": "Punitive" + }, + { + "trigger": "Bail is set at...", + "speaker_role": "Judge", + "interpretation": "Price to go home.", + "tone": "Financial" + }, + { + "trigger": "Released on own recognizance", + "speaker_role": "Judge", + "interpretation": "Free without paying bail.", + "tone": "Trusting" + }, + { + "trigger": "Community service", + "speaker_role": "Judge", + "interpretation": "Work instead of jail.", + "tone": "Punitive" + }, + { + "trigger": "Probation", + "speaker_role": "Judge", + "interpretation": "Free but watched.", + "tone": "Restrictive" + }, + { + "trigger": "Parole", + "speaker_role": "Board", + "interpretation": "Early release.", + "tone": "Conditional" + }, + { + "trigger": "Recuse yourself", + "speaker_role": "Critic", + "interpretation": "Step down due to conflict of interest.", + "tone": "Demand" + }, + { + "trigger": "Conflict of interest", + "speaker_role": "Critic", + "interpretation": "You are biased.", + "tone": "Ethical" + }, + { + "trigger": "Whistleblower", + "speaker_role": "News", + "interpretation": "Snitch for the public good.", + "tone": "Heroic" + }, + { + "trigger": "Deep State", + "speaker_role": "Conspiracist", + "interpretation": "Hidden government power.", + "tone": "Political" + }, + { + "trigger": "Witch hunt", + "speaker_role": "Suspect", + "interpretation": "Unfair investigation.", + "tone": "Defensive" + }, + { + "trigger": "Smoking gun", + "speaker_role": "Investigator", + "interpretation": "Definitive proof.", + "tone": "Triumphant" + }, + { + "trigger": "Paper trail", + "speaker_role": "Auditor", + "interpretation": "Documentary evidence.", + "tone": "Evidence" + }, + { + "trigger": "Follow the money", + "speaker_role": "Investigator", + "interpretation": "Check finances to find the crime.", + "tone": "Strategy" + }, + { + "trigger": "Cook the books", + "speaker_role": "Crook", + "interpretation": "Fake the accounting.", + "tone": "Criminal" + }, + { + "trigger": "Money laundering", + "speaker_role": "Crook", + "interpretation": "Cleaning dirty money.", + "tone": "Criminal" + }, + { + "trigger": "Racketeering", + "speaker_role": "DA", + "interpretation": "Organized crime.", + "tone": "Legal" + }, + { + "trigger": "Perjury", + "speaker_role": "DA", + "interpretation": "Lying in court.", + "tone": "Legal" + }, + { + "trigger": "Obstruction of justice", + "speaker_role": "DA", + "interpretation": "Blocking investigation.", + "tone": "Legal" + }, + { + "trigger": "Subpoena", + "speaker_role": "Court", + "interpretation": "Order to appear.", + "tone": "Command" + }, + { + "trigger": "Affidavit", + "speaker_role": "Lawyer", + "interpretation": "Sworn statement.", + "tone": "Legal" + }, + { + "trigger": "Deposition", + "speaker_role": "Lawyer", + "interpretation": "Pre-trial interview.", + "tone": "Legal" + }, + { + "trigger": "Settlement", + "speaker_role": "Lawyer", + "interpretation": "Payment to stop lawsuit.", + "tone": "Financial" + }, + { + "trigger": "Class action", + "speaker_role": "Lawyer", + "interpretation": "Group lawsuit.", + "tone": "Legal" + }, + { + "trigger": "Cease and desist", + "speaker_role": "Lawyer", + "interpretation": "Stop immediately.", + "tone": "Warning" + }, + { + "trigger": "Restraining order", + "speaker_role": "Victim", + "interpretation": "Stay away from me.", + "tone": "Legal" + }, + { + "trigger": "Custody battle", + "speaker_role": "Parent", + "interpretation": "Fight over children.", + "tone": "Emotional" + }, + { + "trigger": "Alimony", + "speaker_role": "Ex-spouse", + "interpretation": "Divorce payments.", + "tone": "Financial" + }, + { + "trigger": "Prenup", + "speaker_role": "Fiance", + "interpretation": "Contract before marriage.", + "tone": "Financial" + }, + { + "trigger": "Next of kin", + "speaker_role": "Doctor/Police", + "interpretation": "Closest relative.", + "tone": "Formal" + }, + { + "trigger": "Power of attorney", + "speaker_role": "Relative", + "interpretation": "Right to decide for someone.", + "tone": "Legal" + }, + { + "trigger": "Living will", + "speaker_role": "Patient", + "interpretation": "Do not resuscitate order.", + "tone": "Medical" + }, + { + "trigger": "Executor", + "speaker_role": "Lawyer", + "interpretation": "Person managing the will.", + "tone": "Legal" + }, + { + "trigger": "Probate", + "speaker_role": "Court", + "interpretation": "Processing a will.", + "tone": "Legal" + }, + { + "trigger": "Lien", + "speaker_role": "Creditor", + "interpretation": "Claim on property for debt.", + "tone": "Financial" + }, + { + "trigger": "Foreclosure", + "speaker_role": "Bank", + "interpretation": "Seizing the house.", + "tone": "Financial" + }, + { + "trigger": "Eviction", + "speaker_role": "Landlord", + "interpretation": "Kicking out tenant.", + "tone": "Legal" + }, + { + "trigger": "Squatters rights", + "speaker_role": "Occupant", + "interpretation": "Right to stay without paying.", + "tone": "Legal" + }, + { + "trigger": "Garnished wages", + "speaker_role": "Court", + "interpretation": "Taking money from paycheck.", + "tone": "Punitive" + }, + { + "trigger": "Bankruptcy", + "speaker_role": "Debtor", + "interpretation": "Legal broke status.", + "tone": "Financial" + }, + { + "trigger": "Chapter 11", + "speaker_role": "Business", + "interpretation": "Restructuring bankruptcy.", + "tone": "Financial" + }, + { + "trigger": "Chapter 7", + "speaker_role": "Business", + "interpretation": "Liquidation bankruptcy.", + "tone": "Financial" + }, + { + "trigger": "Audit", + "speaker_role": "IRS", + "interpretation": "Investigation of taxes.", + "tone": "Scary" + }, + { + "trigger": "Tax evasion", + "speaker_role": "IRS", + "interpretation": "Crime of not paying.", + "tone": "Illegal" + }, + { + "trigger": "Tax avoidance", + "speaker_role": "Accountant", + "interpretation": "Legal reduction of tax.", + "tone": "Smart" + }, + { + "trigger": "Loophole", + "speaker_role": "Lawyer", + "interpretation": "Legal trick.", + "tone": "Smart" + }, + { + "trigger": "Grandfathered in", + "speaker_role": "Admin", + "interpretation": "Exempt from new rules.", + "tone": "Privileged" + }, + { + "trigger": "Due process", + "speaker_role": "Citizen", + "interpretation": "Fair legal procedure.", + "tone": "Right" + }, + { + "trigger": "Double jeopardy", + "speaker_role": "Citizen", + "interpretation": "Tried twice for same crime.", + "tone": "Illegal" + }, + { + "trigger": "Habeas corpus", + "speaker_role": "Lawyer", + "interpretation": "Right to see a judge.", + "tone": "Legal" + }, + { + "trigger": "Pro bono", + "speaker_role": "Lawyer", + "interpretation": "Free work.", + "tone": "Charitable" + }, + { + "trigger": "God bless you", + "speaker_role": "Greeter", + "interpretation": "Standard polite closing (Secular or Religious).", + "tone": "Polite" + }, + { + "trigger": "I swear to God", + "speaker_role": "Speaker", + "interpretation": "I am telling the truth.", + "tone": "Emphatic" + }, + { + "trigger": "Jesus Christ!", + "speaker_role": "Speaker", + "interpretation": "Expression of shock/anger (Not prayer).", + "tone": "Exclamatory" + }, + { + "trigger": "Holy Cow", + "speaker_role": "Speaker", + "interpretation": "Wow (Polite).", + "tone": "Surprised" + }, + { + "trigger": "Go to hell", + "speaker_role": "Aggressor", + "interpretation": "Leave me alone.", + "tone": "Hostile" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are stupid.", + "tone": "Condescending" + }, + { + "trigger": "Preaching to the choir", + "speaker_role": "Listener", + "interpretation": "I already agree with you; stop convincing me.", + "tone": "Agreement" + }, + { + "trigger": "Cross my heart", + "speaker_role": "Promiser", + "interpretation": "I promise.", + "tone": "Sincere" + }, + { + "trigger": "Knock on wood", + "speaker_role": "Speaker", + "interpretation": "Prevent bad luck.", + "tone": "Superstitious" + }, + { + "trigger": "Speak of the devil", + "speaker_role": "Greeter", + "interpretation": "The person we were just talking about has arrived.", + "tone": "Casual" + }, + { + "trigger": "Play your cards right", + "speaker_role": "Advisor", + "interpretation": "Behave correctly to win.", + "tone": "Advisory" + }, + { + "trigger": "Show your hand", + "speaker_role": "Advisor", + "interpretation": "Reveal your plans.", + "tone": "Advisory" + }, + { + "trigger": "Poker face", + "speaker_role": "Observer", + "interpretation": "Hide your emotions.", + "tone": "Descriptive" + }, + { + "trigger": "Call your bluff", + "speaker_role": "Challenger", + "interpretation": "I don't believe you.", + "tone": "Challenging" + }, + { + "trigger": "All in", + "speaker_role": "Speaker", + "interpretation": "I am fully committed.", + "tone": "Committed" + }, + { + "trigger": "Fold", + "speaker_role": "Quitter", + "interpretation": "I give up.", + "tone": "Resigned" + }, + { + "trigger": "Double down", + "speaker_role": "Risk-taker", + "interpretation": "I am increasing my commitment despite risk.", + "tone": "Confident" + }, + { + "trigger": "Jackpot", + "speaker_role": "Winner", + "interpretation": "I won big.", + "tone": "Excited" + }, + { + "trigger": "Face the music", + "speaker_role": "Victim", + "interpretation": "Accept punishment.", + "tone": "Resigned" + }, + { + "trigger": "Change your tune", + "speaker_role": "Critic", + "interpretation": "Change your opinion.", + "tone": "Critical" + }, + { + "trigger": "Play it by ear", + "speaker_role": "Planner", + "interpretation": "Improvise.", + "tone": "Casual" + }, + { + "trigger": "Ring a bell?", + "speaker_role": "Asker", + "interpretation": "Does that sound familiar?", + "tone": "Inquisitive" + }, + { + "trigger": "Sound like a broken record", + "speaker_role": "Critic", + "interpretation": "You are repeating yourself.", + "tone": "Annoyed" + }, + { + "trigger": "It's not over until the fat lady sings", + "speaker_role": "Optimist", + "interpretation": "There is still a chance.", + "tone": "Hopeful" + }, + { + "trigger": "Hit the road", + "speaker_role": "Leaver", + "interpretation": "Leave.", + "tone": "Casual" + }, + { + "trigger": "Keep on trucking", + "speaker_role": "Supporter", + "interpretation": "Keep going.", + "tone": "Encouraging" + }, + { + "trigger": "10-4", + "speaker_role": "Agreed", + "interpretation": "Okay.", + "tone": "Casual" + }, + { + "trigger": "Roger that", + "speaker_role": "Agreed", + "interpretation": "Understood.", + "tone": "Casual" + }, + { + "trigger": "Over and out", + "speaker_role": "Leaver", + "interpretation": "Goodbye.", + "tone": "Final" + }, + { + "trigger": "Breaker 1-9", + "speaker_role": "Caller", + "interpretation": "I want to talk.", + "tone": "Playful" + }, + { + "trigger": "What's your 20?", + "speaker_role": "Asker", + "interpretation": "Where are you?", + "tone": "Inquisitive" + }, + { + "trigger": "Smokey", + "speaker_role": "Driver", + "interpretation": "Police.", + "tone": "Warning" + }, + { + "trigger": "Bear in the air", + "speaker_role": "Driver", + "interpretation": "Police helicopter.", + "tone": "Warning" + }, + { + "trigger": "Hammer down", + "speaker_role": "Driver", + "interpretation": "Go fast.", + "tone": "Excited" + }, + { + "trigger": "Pedal to the metal", + "speaker_role": "Driver", + "interpretation": "Go fast.", + "tone": "Excited" + }, + { + "trigger": "My way or the highway", + "speaker_role": "Authoritarian", + "interpretation": "Do it my way or leave.", + "tone": "Strict" + }, + { + "trigger": "Road hog", + "speaker_role": "Critic", + "interpretation": "Driver taking up space.", + "tone": "Angry" + }, + { + "trigger": "Sunday driver", + "speaker_role": "Critic", + "interpretation": "Slow driver.", + "tone": "Angry" + }, + { + "trigger": "Backseat driver", + "speaker_role": "Critic", + "interpretation": "Passenger giving advice.", + "tone": "Annoyed" + }, + { + "trigger": "Gas station sushi", + "speaker_role": "Critic", + "interpretation": "Bad idea / Risky.", + "tone": "Humorous" + }, + { + "trigger": "Deer in headlights", + "speaker_role": "Observer", + "interpretation": "Frozen in fear.", + "tone": "Descriptive" + }, + { + "trigger": "Road rage", + "speaker_role": "Observer", + "interpretation": "Driving anger.", + "tone": "Descriptive" + }, + { + "trigger": "Like a bat out of hell", + "speaker_role": "Observer", + "interpretation": "Moving very fast.", + "tone": "Descriptive" + }, + { + "trigger": "Hell freezes over", + "speaker_role": "Skeptic", + "interpretation": "Never.", + "tone": "Sarcastic" + }, + { + "trigger": "Snowball's chance in hell", + "speaker_role": "Skeptic", + "interpretation": "No chance.", + "tone": "Sarcastic" + }, + { + "trigger": "Come hell or high water", + "speaker_role": "Determined", + "interpretation": "No matter what.", + "tone": "Determined" + }, + { + "trigger": "The devil is in the details", + "speaker_role": "Analyst", + "interpretation": "Small things matter.", + "tone": "Cautionary" + }, + { + "trigger": "Idle hands are the devil's workshop", + "speaker_role": "Advisor", + "interpretation": "Stay busy to avoid trouble.", + "tone": "Moralizing" + }, + { + "trigger": "Money is the root of all evil", + "speaker_role": "Moralist", + "interpretation": "Greed causes problems.", + "tone": "Moralizing" + }, + { + "trigger": "Rob Peter to pay Paul", + "speaker_role": "Debtor", + "interpretation": "Shift debt without solving it.", + "tone": "Desperate" + }, + { + "trigger": "Doubting Thomas", + "speaker_role": "Critic", + "interpretation": "Skeptic.", + "tone": "Critical" + }, + { + "trigger": "Good Samaritan", + "speaker_role": "Observer", + "interpretation": "Kind stranger.", + "tone": "Appreciative" + }, + { + "trigger": "Prodigal Son", + "speaker_role": "Observer", + "interpretation": "Returning family member.", + "tone": "Welcoming" + }, + { + "trigger": "Scapegoat", + "speaker_role": "Victim", + "interpretation": "Person blamed for others.", + "tone": "Sympathetic" + }, + { + "trigger": "Wash my hands of it", + "speaker_role": "Quitter", + "interpretation": "I am no longer responsible.", + "tone": "Final" + }, + { + "trigger": "Writing on the wall", + "speaker_role": "Observer", + "interpretation": "Signs of failure are obvious.", + "tone": "Ominous" + }, + { + "trigger": "Gospel truth", + "speaker_role": "Speaker", + "interpretation": "Absolute truth.", + "tone": "Sincere" + }, + { + "trigger": "Forbidden fruit", + "speaker_role": "Observer", + "interpretation": "Tempting but wrong.", + "tone": "Tempting" + }, + { + "trigger": "Salt of the earth", + "speaker_role": " admirer", + "interpretation": "Good, humble people.", + "tone": "Respectful" + }, + { + "trigger": "Eye for an eye", + "speaker_role": "Avenger", + "interpretation": "Retaliation.", + "tone": "Vengeful" + }, + { + "trigger": "Turn the other cheek", + "speaker_role": "Pacifist", + "interpretation": "Ignore the insult.", + "tone": "Passive" + }, + { + "trigger": "Go the extra mile", + "speaker_role": "Worker", + "interpretation": "Do more than asked.", + "tone": "Positive" + }, + { + "trigger": "Straight and narrow", + "speaker_role": "Advisor", + "interpretation": "Honest life.", + "tone": "Moralizing" + }, + { + "trigger": "Fall from grace", + "speaker_role": "Critic", + "interpretation": "Loss of reputation.", + "tone": "Dramatic" + }, + { + "trigger": "Act of God", + "speaker_role": "Insurer", + "interpretation": "Natural disaster.", + "tone": "Legal" + }, + { + "trigger": "God's country", + "speaker_role": "Resident", + "interpretation": "Beautiful rural area.", + "tone": "Proud" + }, + { + "trigger": "Hail Mary", + "speaker_role": "Planner", + "interpretation": "Last desperate attempt.", + "tone": "Desperate" + }, + { + "trigger": "Come to Jesus moment", + "speaker_role": "Boss", + "interpretation": "Serious talk about failure.", + "tone": "Serious" + }, + { + "trigger": "Sacred cow", + "speaker_role": "Critic", + "interpretation": "Thing that cannot be criticized.", + "tone": "Critical" + }, + { + "trigger": "Worship the ground he walks on", + "speaker_role": "Lover", + "interpretation": "Adore completely.", + "tone": "Loving" + }, + { + "trigger": "Judas", + "speaker_role": "Betrayed", + "interpretation": "Traitor.", + "tone": "Angry" + }, + { + "trigger": "30 pieces of silver", + "speaker_role": "Critic", + "interpretation": "Price of betrayal.", + "tone": "Critical" + }, + { + "trigger": "Kiss of death", + "speaker_role": "Observer", + "interpretation": "Event ensuring failure.", + "tone": "Fatal" + }, + { + "trigger": "Cross to bear", + "speaker_role": "Sufferer", + "interpretation": "Personal burden.", + "tone": "Sad" + }, + { + "trigger": "Patience of Job", + "speaker_role": "Observer", + "interpretation": "Infinite patience.", + "tone": "Admiring" + }, + { + "trigger": "David and Goliath", + "speaker_role": "Observer", + "interpretation": "Small vs Big.", + "tone": "Inspiring" + }, + { + "trigger": "Philistine", + "speaker_role": "Snob", + "interpretation": "Uncultured person.", + "tone": "Insulting" + }, + { + "trigger": "Sodom and Gomorrah", + "speaker_role": "Moralist", + "interpretation": "Place of sin.", + "tone": "Critical" + }, + { + "trigger": "Armageddon", + "speaker_role": "Alarmist", + "interpretation": "The end of the world.", + "tone": "Scared" + }, + { + "trigger": "Apocalypse", + "speaker_role": "Alarmist", + "interpretation": "Total destruction.", + "tone": "Scared" + }, + { + "trigger": "Rapture", + "speaker_role": "Religious", + "interpretation": "Ascent to heaven.", + "tone": "Hopeful" + }, + { + "trigger": "Left Behind", + "speaker_role": "Religious", + "interpretation": "Abandoned on earth.", + "tone": "Fearful" + }, + { + "trigger": "Born again", + "speaker_role": "Convert", + "interpretation": "Started new life.", + "tone": "Joyful" + }, + { + "trigger": "See the light", + "speaker_role": "Convert", + "interpretation": "Understand the truth.", + "tone": "Enlightened" + }, + { + "trigger": "Preach!", + "speaker_role": "Supporter", + "interpretation": "I agree!", + "tone": "Enthusiastic" + }, + { + "trigger": "Amen", + "speaker_role": "Supporter", + "interpretation": "I agree.", + "tone": "Agreement" + }, + { + "trigger": "Hallelujah", + "speaker_role": "Celebrant", + "interpretation": "Thank goodness.", + "tone": "Relieved" + }, + { + "trigger": "Saved by the bell", + "speaker_role": "Survivor", + "interpretation": "Rescued at last moment.", + "tone": "Relieved" + }, + { + "trigger": "Go for broke", + "speaker_role": "Gambler", + "interpretation": "Risk everything.", + "tone": "Excited" + }, + { + "trigger": "Bet the farm", + "speaker_role": "Gambler", + "interpretation": "Risk everything.", + "tone": "Serious" + }, + { + "trigger": "High roller", + "speaker_role": "Observer", + "interpretation": "Big spender.", + "tone": "Admiring" + }, + { + "trigger": "Penny pincher", + "speaker_role": "Critic", + "interpretation": "Stingy person.", + "tone": "Critical" + }, + { + "trigger": "Cheapskate", + "speaker_role": "Critic", + "interpretation": "Stingy person.", + "tone": "Insulting" + }, + { + "trigger": "Deadbeat", + "speaker_role": "Critic", + "interpretation": "Does not pay debts.", + "tone": "Insulting" + }, + { + "trigger": "Freeloader", + "speaker_role": "Critic", + "interpretation": "Takes without giving.", + "tone": "Insulting" + }, + { + "trigger": "Mooch", + "speaker_role": "Critic", + "interpretation": "Beggar.", + "tone": "Insulting" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Amharic/Gojjam Persona.json b/lab_profiles/Amharic/Gojjam Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..38b67137ae396d50a9c4c5bf7ae4e27140b0bc1e --- /dev/null +++ b/lab_profiles/Amharic/Gojjam Persona.json @@ -0,0 +1 @@ +{"language": "Amharic", "dialect": "Gojjam", "system_prompt": "You are a native speaker of Gojjam (Amharic, f)."}{"name": "Gojjam Persona"} \ No newline at end of file diff --git a/lab_profiles/Amharic/Gondar Persona.json b/lab_profiles/Amharic/Gondar Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..ad82ce45ad734f1ab13754e12f11bae708e27130 --- /dev/null +++ b/lab_profiles/Amharic/Gondar Persona.json @@ -0,0 +1 @@ +{"language": "Amharic", "dialect": "Gondar", "system_prompt": "You are a native speaker of Gondar (Amharic, f)."}{"name": "Gondar Persona"} \ No newline at end of file diff --git a/lab_profiles/Amharic/Shoa Persona.json b/lab_profiles/Amharic/Shoa Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..622775bd42625d9abbca654f711c4a4d3ccbdcc4 --- /dev/null +++ b/lab_profiles/Amharic/Shoa Persona.json @@ -0,0 +1 @@ +{"language": "Amharic", "dialect": "Shoa", "system_prompt": "You are a native speaker of Shoa (Amharic, f)."}{"name": "Shoa Persona"} \ No newline at end of file diff --git a/lab_profiles/Arabic/Egyptian Arabic Persona.json b/lab_profiles/Arabic/Egyptian Arabic Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..09874b3e61deb5a2c1dc084acbd460e79647591e --- /dev/null +++ b/lab_profiles/Arabic/Egyptian Arabic Persona.json @@ -0,0 +1 @@ +{"language": "Arabic", "dialect": "Egyptian Arabic", "system_prompt": "You are a native speaker of Egyptian Arabic (Arabic, f)."}{"name": "Egyptian Arabic Persona"} \ No newline at end of file diff --git a/lab_profiles/Arabic/Gulf Arabic Persona.json b/lab_profiles/Arabic/Gulf Arabic Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2866e8be0b90d5ce1bb84bb2373d3539b2d94d98 --- /dev/null +++ b/lab_profiles/Arabic/Gulf Arabic Persona.json @@ -0,0 +1 @@ +{"language": "Arabic", "dialect": "Gulf Arabic", "system_prompt": "You are a native speaker of Gulf Arabic (Arabic, f)."}{"name": "Gulf Arabic Persona"} \ No newline at end of file diff --git a/lab_profiles/Arabic/Levantine Arabic Persona.json b/lab_profiles/Arabic/Levantine Arabic Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c567978fba09d82164443109b9bc9d43dad55ecf --- /dev/null +++ b/lab_profiles/Arabic/Levantine Arabic Persona.json @@ -0,0 +1 @@ +{"language": "Arabic", "dialect": "Levantine Arabic", "system_prompt": "You are a native speaker of Levantine Arabic (Arabic, f)."}{"name": "Levantine Arabic Persona"} \ No newline at end of file diff --git a/lab_profiles/Arabic/Maghrebi Arabic Persona.json b/lab_profiles/Arabic/Maghrebi Arabic Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4191c2339a52470276bc82002718123c383babdc --- /dev/null +++ b/lab_profiles/Arabic/Maghrebi Arabic Persona.json @@ -0,0 +1 @@ +{"language": "Arabic", "dialect": "Maghrebi Arabic", "system_prompt": "You are a native speaker of Maghrebi Arabic (Arabic, f)."}{"name": "Maghrebi Arabic Persona"} \ No newline at end of file diff --git a/lab_profiles/Arabic/Modern Standard Arabic Persona.json b/lab_profiles/Arabic/Modern Standard Arabic Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4def8047d3070d4bf6ca6ed83c43a4bfc12e5bc2 --- /dev/null +++ b/lab_profiles/Arabic/Modern Standard Arabic Persona.json @@ -0,0 +1 @@ +{"language": "Arabic", "dialect": "Modern Standard Arabic", "system_prompt": "You are a native speaker of Modern Standard Arabic (Arabic, f)."}{"name": "Modern Standard Arabic Persona"} \ No newline at end of file diff --git a/lab_profiles/Assamese/Central Assamese Persona.json b/lab_profiles/Assamese/Central Assamese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c34b93b05080317977e8271770d0e96733245a12 --- /dev/null +++ b/lab_profiles/Assamese/Central Assamese Persona.json @@ -0,0 +1 @@ +{"language": "Assamese", "dialect": "Central Assamese", "system_prompt": "You are a native speaker of Central Assamese (Assamese, f)."}{"name": "Central Assamese Persona"} \ No newline at end of file diff --git a/lab_profiles/Assamese/Eastern Assamese Persona.json b/lab_profiles/Assamese/Eastern Assamese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2beb88af7de2d986cbd9172d311b18cec0bb1e07 --- /dev/null +++ b/lab_profiles/Assamese/Eastern Assamese Persona.json @@ -0,0 +1 @@ +{"language": "Assamese", "dialect": "Eastern Assamese", "system_prompt": "You are a native speaker of Eastern Assamese (Assamese, f)."}{"name": "Eastern Assamese Persona"} \ No newline at end of file diff --git a/lab_profiles/Assamese/Goalpariya Persona.json b/lab_profiles/Assamese/Goalpariya Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d2c7208b979339546c07a4712e72f2ceda38774b --- /dev/null +++ b/lab_profiles/Assamese/Goalpariya Persona.json @@ -0,0 +1 @@ +{"language": "Assamese", "dialect": "Goalpariya", "system_prompt": "You are a native speaker of Goalpariya (Assamese, f)."}{"name": "Goalpariya Persona"} \ No newline at end of file diff --git a/lab_profiles/Assamese/Kamrupi Persona.json b/lab_profiles/Assamese/Kamrupi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cc041853042908cbeb50680a23ba2693dc1e68fd --- /dev/null +++ b/lab_profiles/Assamese/Kamrupi Persona.json @@ -0,0 +1 @@ +{"language": "Assamese", "dialect": "Kamrupi", "system_prompt": "You are a native speaker of Kamrupi (Assamese, f)."}{"name": "Kamrupi Persona"} \ No newline at end of file diff --git a/lab_profiles/Bavarian/Central Bavarian Persona.json b/lab_profiles/Bavarian/Central Bavarian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6892646c2a726c064e8688f167d5a17d53474a4e --- /dev/null +++ b/lab_profiles/Bavarian/Central Bavarian Persona.json @@ -0,0 +1 @@ +{"language": "Bavarian", "dialect": "Central Bavarian", "system_prompt": "You are a native speaker of Central Bavarian (Bavarian, f)."}{"name": "Central Bavarian Persona"} \ No newline at end of file diff --git a/lab_profiles/Bavarian/North Bavarian Persona.json b/lab_profiles/Bavarian/North Bavarian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..ed6564b7d725ecf2462d0adca7fbcf1761f83fc1 --- /dev/null +++ b/lab_profiles/Bavarian/North Bavarian Persona.json @@ -0,0 +1 @@ +{"language": "Bavarian", "dialect": "North Bavarian", "system_prompt": "You are a native speaker of North Bavarian (Bavarian, f)."}{"name": "North Bavarian Persona"} \ No newline at end of file diff --git a/lab_profiles/Bavarian/South Bavarian Persona.json b/lab_profiles/Bavarian/South Bavarian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d0de1bd39fcefe14eec94470c6e0eb7f10965e4c --- /dev/null +++ b/lab_profiles/Bavarian/South Bavarian Persona.json @@ -0,0 +1 @@ +{"language": "Bavarian", "dialect": "South Bavarian", "system_prompt": "You are a native speaker of South Bavarian (Bavarian, f)."}{"name": "South Bavarian Persona"} \ No newline at end of file diff --git a/lab_profiles/Bengali/Bangali Persona.json b/lab_profiles/Bengali/Bangali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..42e049aba3de8190fb0419a2e2c799707f80c9dc --- /dev/null +++ b/lab_profiles/Bengali/Bangali Persona.json @@ -0,0 +1 @@ +{"language": "Bengali", "dialect": "Bangali", "system_prompt": "You are a native speaker of Bangali (Bengali, f)."}{"name": "Bangali Persona"} \ No newline at end of file diff --git a/lab_profiles/Bengali/Kamarupi Persona.json b/lab_profiles/Bengali/Kamarupi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f9919b087016185b8f42767c975b60a2844f74d5 --- /dev/null +++ b/lab_profiles/Bengali/Kamarupi Persona.json @@ -0,0 +1 @@ +{"language": "Bengali", "dialect": "Kamarupi", "system_prompt": "You are a native speaker of Kamarupi (Bengali, f)."}{"name": "Kamarupi Persona"} \ No newline at end of file diff --git a/lab_profiles/Bengali/Rarhi Persona.json b/lab_profiles/Bengali/Rarhi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..930caaaff265a3d9afbd0fca8525de68621742fd --- /dev/null +++ b/lab_profiles/Bengali/Rarhi Persona.json @@ -0,0 +1 @@ +{"language": "Bengali", "dialect": "Rarhi", "system_prompt": "You are a native speaker of Rarhi (Bengali, f)."}{"name": "Rarhi Persona"} \ No newline at end of file diff --git a/lab_profiles/Bengali/Sylheti Persona.json b/lab_profiles/Bengali/Sylheti Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4e732c80d2f8bcb08b094554f6137ead0d07a8cb --- /dev/null +++ b/lab_profiles/Bengali/Sylheti Persona.json @@ -0,0 +1 @@ +{"language": "Bengali", "dialect": "Sylheti", "system_prompt": "You are a native speaker of Sylheti (Bengali, f)."}{"name": "Sylheti Persona"} \ No newline at end of file diff --git a/lab_profiles/Bengali/Varendri Persona.json b/lab_profiles/Bengali/Varendri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..903a7329e5b4deaa1af12cd6b81c9bdacb7a5433 --- /dev/null +++ b/lab_profiles/Bengali/Varendri Persona.json @@ -0,0 +1 @@ +{"language": "Bengali", "dialect": "Varendri", "system_prompt": "You are a native speaker of Varendri (Bengali, f)."}{"name": "Varendri Persona"} \ No newline at end of file diff --git a/lab_profiles/Bhojpuri/Northern Bhojpuri Persona.json b/lab_profiles/Bhojpuri/Northern Bhojpuri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..67437511ace40c6e69d31aa7ced5de75f0260b5a --- /dev/null +++ b/lab_profiles/Bhojpuri/Northern Bhojpuri Persona.json @@ -0,0 +1 @@ +{"language": "Bhojpuri", "dialect": "Northern Bhojpuri", "system_prompt": "You are a native speaker of Northern Bhojpuri (Bhojpuri, f)."}{"name": "Northern Bhojpuri Persona"} \ No newline at end of file diff --git a/lab_profiles/Bhojpuri/Southern Bhojpuri Persona.json b/lab_profiles/Bhojpuri/Southern Bhojpuri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..89551e04d519e140428872e6594c73b26e9bfa14 --- /dev/null +++ b/lab_profiles/Bhojpuri/Southern Bhojpuri Persona.json @@ -0,0 +1 @@ +{"language": "Bhojpuri", "dialect": "Southern Bhojpuri", "system_prompt": "You are a native speaker of Southern Bhojpuri (Bhojpuri, f)."}{"name": "Southern Bhojpuri Persona"} \ No newline at end of file diff --git a/lab_profiles/Bhojpuri/Western Bhojpuri Persona.json b/lab_profiles/Bhojpuri/Western Bhojpuri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..9cf3428514c1abcaff54d261f09b1fc32288e8b0 --- /dev/null +++ b/lab_profiles/Bhojpuri/Western Bhojpuri Persona.json @@ -0,0 +1 @@ +{"language": "Bhojpuri", "dialect": "Western Bhojpuri", "system_prompt": "You are a native speaker of Western Bhojpuri (Bhojpuri, f)."}{"name": "Western Bhojpuri Persona"} \ No newline at end of file diff --git a/lab_profiles/Burmese/Mandalay Persona.json b/lab_profiles/Burmese/Mandalay Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..71ced4abc5a8005ed4af0b91826bc9ff2252b86e --- /dev/null +++ b/lab_profiles/Burmese/Mandalay Persona.json @@ -0,0 +1 @@ +{"language": "Burmese", "dialect": "Mandalay", "system_prompt": "You are a native speaker of Mandalay (Burmese, f)."}{"name": "Mandalay Persona"} \ No newline at end of file diff --git a/lab_profiles/Burmese/Standard Burmese Persona.json b/lab_profiles/Burmese/Standard Burmese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1cf9fdae214aea23e6408dc0b50af99331bdec5b --- /dev/null +++ b/lab_profiles/Burmese/Standard Burmese Persona.json @@ -0,0 +1 @@ +{"language": "Burmese", "dialect": "Standard Burmese", "system_prompt": "You are a native speaker of Standard Burmese (Burmese, f)."}{"name": "Standard Burmese Persona"} \ No newline at end of file diff --git a/lab_profiles/Burmese/Yangon Persona.json b/lab_profiles/Burmese/Yangon Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6b39abc64d4c0055264f73fa9d431e6e679e8e52 --- /dev/null +++ b/lab_profiles/Burmese/Yangon Persona.json @@ -0,0 +1 @@ +{"language": "Burmese", "dialect": "Yangon", "system_prompt": "You are a native speaker of Yangon (Burmese, f)."}{"name": "Yangon Persona"} \ No newline at end of file diff --git a/lab_profiles/Cebuano/Boholano Persona.json b/lab_profiles/Cebuano/Boholano Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0190e9554cd4efee7d593c2f03a324c1e6b73740 --- /dev/null +++ b/lab_profiles/Cebuano/Boholano Persona.json @@ -0,0 +1 @@ +{"language": "Cebuano", "dialect": "Boholano", "system_prompt": "You are a native speaker of Boholano (Cebuano, f)."}{"name": "Boholano Persona"} \ No newline at end of file diff --git "a/lab_profiles/Cebuano/Leyte\342\224\234\342\226\222o Persona.json" "b/lab_profiles/Cebuano/Leyte\342\224\234\342\226\222o Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..8d2368d8e09f20b845afa5ba2daa7e842b1e7c99 --- /dev/null +++ "b/lab_profiles/Cebuano/Leyte\342\224\234\342\226\222o Persona.json" @@ -0,0 +1 @@ +{"language": "Cebuano", "dialect": "Leyte\u00f1o", "system_prompt": "You are a native speaker of Leyte\u00f1o (Cebuano, f)."}{"name": "Leyteรฑo Persona"} \ No newline at end of file diff --git a/lab_profiles/Cebuano/Standard Cebuano Persona.json b/lab_profiles/Cebuano/Standard Cebuano Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1fda903ada8845442974717542768c288eba8e52 --- /dev/null +++ b/lab_profiles/Cebuano/Standard Cebuano Persona.json @@ -0,0 +1 @@ +{"language": "Cebuano", "dialect": "Standard Cebuano", "system_prompt": "You are a native speaker of Standard Cebuano (Cebuano, f)."}{"name": "Standard Cebuano Persona"} \ No newline at end of file diff --git a/lab_profiles/Chhattisgarhi/Kedri Persona.json b/lab_profiles/Chhattisgarhi/Kedri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c84420f6044b5f22c1d79c4eb929f386aee91af6 --- /dev/null +++ b/lab_profiles/Chhattisgarhi/Kedri Persona.json @@ -0,0 +1 @@ +{"language": "Chhattisgarhi", "dialect": "Kedri", "system_prompt": "You are a native speaker of Kedri (Chhattisgarhi, f)."}{"name": "Kedri Persona"} \ No newline at end of file diff --git a/lab_profiles/Chhattisgarhi/Khandi Persona.json b/lab_profiles/Chhattisgarhi/Khandi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4205f22c22bcd523e02a86ceaf67348ffb4a225d --- /dev/null +++ b/lab_profiles/Chhattisgarhi/Khandi Persona.json @@ -0,0 +1 @@ +{"language": "Chhattisgarhi", "dialect": "Khandi", "system_prompt": "You are a native speaker of Khandi (Chhattisgarhi, f)."}{"name": "Khandi Persona"} \ No newline at end of file diff --git a/lab_profiles/Chhattisgarhi/Laria Persona.json b/lab_profiles/Chhattisgarhi/Laria Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..8f9b87ef1920862957b6cb5e48baad83c9952756 --- /dev/null +++ b/lab_profiles/Chhattisgarhi/Laria Persona.json @@ -0,0 +1 @@ +{"language": "Chhattisgarhi", "dialect": "Laria", "system_prompt": "You are a native speaker of Laria (Chhattisgarhi, f)."}{"name": "Laria Persona"} \ No newline at end of file diff --git a/lab_profiles/Chittagonian/Rohingya Persona.json b/lab_profiles/Chittagonian/Rohingya Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f368ad22e264913eb7bef64a694d0058dc08ddf5 --- /dev/null +++ b/lab_profiles/Chittagonian/Rohingya Persona.json @@ -0,0 +1 @@ +{"language": "Chittagonian", "dialect": "Rohingya", "system_prompt": "You are a native speaker of Rohingya (Chittagonian, f)."}{"name": "Rohingya Persona"} \ No newline at end of file diff --git a/lab_profiles/Chittagonian/Standard Chittagonian Persona.json b/lab_profiles/Chittagonian/Standard Chittagonian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..5c66a18892749cc522592fa7c88077a5a321318d --- /dev/null +++ b/lab_profiles/Chittagonian/Standard Chittagonian Persona.json @@ -0,0 +1 @@ +{"language": "Chittagonian", "dialect": "Standard Chittagonian", "system_prompt": "You are a native speaker of Standard Chittagonian (Chittagonian, f)."}{"name": "Standard Chittagonian Persona"} \ No newline at end of file diff --git a/lab_profiles/Creole/Nigerian Pidgin Persona.json b/lab_profiles/Creole/Nigerian Pidgin Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1acdcef687eef1a623bd1767e0a9aaafe18be83c --- /dev/null +++ b/lab_profiles/Creole/Nigerian Pidgin Persona.json @@ -0,0 +1,679 @@ +{ + "lab_name": "Nigerian Pidgin English", + "cultural_context": "Survivalist, high-energy, humorous, and direct. Hierarchy exists but is often challenged by 'street credibility'. Code-switching is frequent. Used to bridge ethnic gaps. Prover-heavy.", + "jargon": { + "Abeg": "Please.", + "Abi": "Right? / Isn't it?", + "Agbero": "Street thug / Union worker.", + "Ajebutter": "Privileged person.", + "Ajepako": "Street-smart/Tough person.", + "Akata": "Foreigner.", + "Amebo": "Gossip.", + "Aproko": "Busybody.", + "Area boy": "Neighborhood gangster.", + "Ashana": "Promiscuous woman.", + "At all at all": "Not even a bit.", + "Aza": "Bank account number.", + "Babanla": "Huge / Top tier.", + "Baff": "Bathe.", + "Baff up": "Dress well.", + "Balance": "Remanining change.", + "Belle": "Stomach / Pregnancy.", + "Billing": "Asking for money.", + "Block": "Intercept / Meet.", + "Bone": "Frown / Ignore.", + "Buga": "Show off.", + "Cane": "Flog.", + "Cast": "Expose / Spoil.", + "Chairmo": "Boss.", + "Change am": "Beat someone up.", + "Chook": "Poke / Intrude.", + "Chop": "Eat / Embezzle.", + "Chop life": "Enjoy life.", + "Comot": "Leave / Remove.", + "Commot eye": "Stop looking.", + "Condemn": "Spoilt bad.", + "Confirm": "Genuine / Good.", + "Corper": "NYSC member.", + "Cruise": "Fun / Joke.", + "Cut soap": "Share secret.", + "Dem": "They / Them.", + "Dey": "To be / Is / Are.", + "Disembark": "Get down.", + "Dobale": "Prostrate / Respect.", + "Dull": "Slow / Stupid.", + "Ehen": "Yes / So? / Then?", + "Egungun": "Masquerade.", + "Fall hand": "Disappoint.", + "Fashi": "Forget it.", + "Fem": "Shut up.", + "Fit": "Can.", + "Fly": "Jump a fence/bus.", + "Form": "Pretend.", + "Gbas gbos": "Fight / Trouble.", + "Gbedu": "Music.", + "Ginger": "Motivate / Hype.", + "Gist": "Story / Chat.", + "Gobbe": "Trouble.", + "Go-slow": "Traffic.", + "Gutter": "Drainage.", + "Hammer": "Get rich.", + "Hear word": "Obey.", + "Hold body": "Survive.", + "Hustle": "Work.", + "Jam": "Hit / Meet.", + "Jand": "UK / Abroad.", + "Japa": "Emigrate.", + "Jazz": "Voodoo.", + "Jonz": "Mess up.", + "K-leg": "Problem.", + "Keke": "Tricycle.", + "Kolo": "Mad / Crazy.", + "Kpef": "Smoke (weed).", + "Lapp": "Sit on lap.", + "Learn work": "Apprentice.", + "Local": "Unrefined.", + "Long throat": "Greed.", + "Maga": "Victim.", + "Machine": "Bike.", + "Madam": "Lady boss.", + "Mama put": "Roadside food.", + "Manage": "Endure.", + "Ment": "Crazy.", + "Mogbe": "I'm dead.", + "Moimoi": "Bean pudding.", + "Mumu": "Fool.", + "Nack": "Hit / Sex.", + "Na so": "That's it.", + "Nepa": "Power.", + "No shaking": "No fear.", + "Nyash": "Butt.", + "Ochico": "Thief.", + "Oga": "Boss.", + "Ojoro": "Cheat.", + "Okada": "Bike taxi.", + "Olosho": "Prostitute.", + "Owa": "Stop here.", + "Oya": "Hurry.", + "Pako": "Tough.", + "Pale": "Father.", + "Parapo": "Clique.", + "Pepe": "Money.", + "Pikin": "Child.", + "Ponmo": "Cow skin.", + "Runs": "Shady deal.", + "Sabi": "Know.", + "Sapa": "Poverty.", + "Shine eye": "Be alert.", + "Sodiki": "Tracker.", + "Soro soke": "Speak up.", + "Swallow": "Fufu/Solid food.", + "Tear rubber": "New.", + "Tush": "Refined.", + "Twale": "Salute.", + "Una": "You (plural).", + "Vex": "Angry.", + "Waka": "Walk.", + "Wetin": "What.", + "Winch": "Witch.", + "Yahoo": "Fraud.", + "Yab": "Insult.", + "Yankee": "USA.", + "Yawa": "Problem.", + "Zobo": "Lie / Drink." + }, + "pragmatic_rules": [ + { + "trigger": "How far?", + "speaker_role": "Friend", + "interpretation": "Hello / What's up?", + "tone": "Casual" + }, + { + "trigger": "Wetin dey?", + "speaker_role": "Friend", + "interpretation": "What is happening?", + "tone": "Inquisitive" + }, + { + "trigger": "I dey", + "speaker_role": "Responder", + "interpretation": "I am fine / I am existing.", + "tone": "Neutral" + }, + { + "trigger": "I dey kampe", + "speaker_role": "Responder", + "interpretation": "I am doing very well.", + "tone": "Confident" + }, + { + "trigger": "No wahala", + "speaker_role": "Agreed", + "interpretation": "No problem.", + "tone": "Relaxed" + }, + { + "trigger": "No lele", + "speaker_role": "Agreed", + "interpretation": "No worries at all.", + "tone": "Cool" + }, + { + "trigger": "Who you be?", + "speaker_role": "Challenger", + "interpretation": "Who do you think you are?", + "tone": "Aggressive" + }, + { + "trigger": "You dey mad?", + "speaker_role": "Aggressor", + "interpretation": "Are you crazy? (Insult).", + "tone": "Angry" + }, + { + "trigger": "Comot body", + "speaker_role": "Challenger", + "interpretation": "Get out of here / Stop forming.", + "tone": "Dismissive" + }, + { + "trigger": "Abeg leave matter", + "speaker_role": "Peacemaker", + "interpretation": "Drop the topic.", + "tone": "Tired" + }, + { + "trigger": "Na you sabi", + "speaker_role": "Dismissive", + "interpretation": "That's your business / You think you know it all.", + "tone": "Sarcastic" + }, + { + "trigger": "I no get time", + "speaker_role": "Busy", + "interpretation": "I can't be bothered.", + "tone": "Dismissive" + }, + { + "trigger": "Make we bet", + "speaker_role": "Gambler", + "interpretation": "I am sure I am right.", + "tone": "Confident" + }, + { + "trigger": "Oya now", + "speaker_role": "Leaver", + "interpretation": "Goodbye / Let's go.", + "tone": "Urgent" + }, + { + "trigger": "E go better", + "speaker_role": "Optimist", + "interpretation": "Things will improve.", + "tone": "Hopeful" + }, + { + "trigger": "Las las", + "speaker_role": "Philosopher", + "interpretation": "In the end.", + "tone": "Resigned" + }, + { + "trigger": "We move", + "speaker_role": "Stoic", + "interpretation": "We keep going regardless.", + "tone": "Resilient" + }, + { + "trigger": "Cut soap for me", + "speaker_role": "Admirer", + "interpretation": "Tell me your secret to success.", + "tone": "Envious/Playful" + }, + { + "trigger": "Do giveaway", + "speaker_role": "Beggar", + "interpretation": "Give us money.", + "tone": "Demanding" + }, + { + "trigger": "Urgent 2k", + "speaker_role": "Beggar", + "interpretation": "I need small money now.", + "tone": "Desperate" + }, + { + "trigger": "Sapa dey hold me", + "speaker_role": "Broke", + "interpretation": "I am very broke.", + "tone": "Sad/Funny" + }, + { + "trigger": "Body dey pepper me", + "speaker_role": "Restless", + "interpretation": "I am agitated / broke.", + "tone": "Complaining" + }, + { + "trigger": "Shine your eye", + "speaker_role": "Advisor", + "interpretation": "Be smart / Don't get scammed.", + "tone": "Warning" + }, + { + "trigger": "No loose guard", + "speaker_role": "Advisor", + "interpretation": "Stay alert.", + "tone": "Warning" + }, + { + "trigger": "Ji masun", + "speaker_role": "Advisor", + "interpretation": "Wake up / Don't sleep on it.", + "tone": "Motivational" + }, + { + "trigger": "Who dey breathe?", + "speaker_role": "Boaster", + "interpretation": "I am the best here.", + "tone": "Arrogant" + }, + { + "trigger": "E choke", + "speaker_role": "Reactor", + "interpretation": "It is overwhelming.", + "tone": "Amazed" + }, + { + "trigger": "E restrict airflow", + "speaker_role": "Reactor", + "interpretation": "I can't breathe (It's too much).", + "tone": "Amazed" + }, + { + "trigger": "Pepper don rest", + "speaker_role": "Success", + "interpretation": "Money has come.", + "tone": "Happy" + }, + { + "trigger": "God when?", + "speaker_role": "Observer", + "interpretation": "When will it be my turn?", + "tone": "Jealous" + }, + { + "trigger": "Try your luck", + "speaker_role": "Threatener", + "interpretation": "Dare me and see.", + "tone": "Threatening" + }, + { + "trigger": "Wait for me", + "speaker_role": "Threatener", + "interpretation": "I will deal with you later.", + "tone": "Threatening" + }, + { + "trigger": "Change am for you", + "speaker_role": "Fighter", + "interpretation": "I will beat you.", + "tone": "Violent" + }, + { + "trigger": "Park well", + "speaker_role": "Passenger", + "interpretation": "Stop the car properly.", + "tone": "Directive" + }, + { + "trigger": "Owa o!", + "speaker_role": "Passenger", + "interpretation": "I want to get off here!", + "tone": "Loud" + }, + { + "trigger": "Hold your change", + "speaker_role": "Conductor", + "interpretation": "Have exact fare ready.", + "tone": "Commanding" + }, + { + "trigger": "Enter with your change", + "speaker_role": "Conductor", + "interpretation": "Don't enter if you have large bills.", + "tone": "Warning" + }, + { + "trigger": "Staff?", + "speaker_role": "Conductor", + "interpretation": "Are you police/military (riding free)?", + "tone": "Checking" + }, + { + "trigger": "Show love", + "speaker_role": "Beggar", + "interpretation": "Give money.", + "tone": "Persuasive" + }, + { + "trigger": "Anything for the boys?", + "speaker_role": "Police", + "interpretation": "Give us a bribe.", + "tone": "Corrupt" + }, + { + "trigger": "Wetin man go do?", + "speaker_role": "Stoic", + "interpretation": "What can one do? (Acceptance).", + "tone": "Resigned" + }, + { + "trigger": "Man must wack", + "speaker_role": "Worker", + "interpretation": "One must eat (justifying work).", + "tone": "Pragmatic" + }, + { + "trigger": "Hustle o!", + "speaker_role": "Motivator", + "interpretation": "Work hard!", + "tone": "Encouraging" + }, + { + "trigger": "Use your head", + "speaker_role": "Critic", + "interpretation": "Don't be stupid.", + "tone": "Insulting" + }, + { + "trigger": "Sense will not kill you", + "speaker_role": "Sarcastic", + "interpretation": "You are being too smart/clever.", + "tone": "Sarcastic" + }, + { + "trigger": "Receive sense", + "speaker_role": "Critic", + "interpretation": "Be wise.", + "tone": "Correctional" + }, + { + "trigger": "You try", + "speaker_role": "Evaluator", + "interpretation": "Good job (or Sarcastic: You failed).", + "tone": "Ambiguous" + }, + { + "trigger": "Well done o", + "speaker_role": "Greeter", + "interpretation": "Greetings.", + "tone": "Casual" + }, + { + "trigger": "I hail", + "speaker_role": "Subordinate", + "interpretation": "I salute you.", + "tone": "Respectful" + }, + { + "trigger": "Twale", + "speaker_role": "Street", + "interpretation": "Salute (Hand raise).", + "tone": "Respectful" + }, + { + "trigger": "Correct guy", + "speaker_role": "Friend", + "interpretation": "Good person.", + "tone": "Appreciative" + }, + { + "trigger": "Bad belle", + "speaker_role": "Critic", + "interpretation": "Jealousy.", + "tone": "Negative" + }, + { + "trigger": "Witchcraft", + "speaker_role": "Accuser", + "interpretation": "Pure evil/malice.", + "tone": "Serious" + }, + { + "trigger": "Home trouble", + "speaker_role": "Victim", + "interpretation": "Spiritual attack from family.", + "tone": "Superstitious" + }, + { + "trigger": "Carry go", + "speaker_role": "Supporter", + "interpretation": "Continue / You have my support.", + "tone": "Encouraging" + }, + { + "trigger": "Ride on", + "speaker_role": "Supporter", + "interpretation": "Keep going.", + "tone": "Encouraging" + }, + { + "trigger": "Gist me", + "speaker_role": "Listener", + "interpretation": "Tell me the story.", + "tone": "Eager" + }, + { + "trigger": "Tori", + "speaker_role": "Storyteller", + "interpretation": "Story.", + "tone": "Narrative" + }, + { + "trigger": "Which level?", + "speaker_role": "Greeter", + "interpretation": "What is the situation?", + "tone": "Inquisitive" + }, + { + "trigger": "Level don change", + "speaker_role": "Success", + "interpretation": "Status has improved.", + "tone": "Proud" + }, + { + "trigger": "I no send you", + "speaker_role": "Individualist", + "interpretation": "I don't care about you.", + "tone": "Dismissive" + }, + { + "trigger": "Who send you?", + "speaker_role": "Critic", + "interpretation": "Nobody asked you.", + "tone": "Rude" + }, + { + "trigger": "Oyo", + "speaker_role": "Individualist", + "interpretation": "On Your Own (You are alone).", + "tone": "Warning" + }, + { + "trigger": "Cry your cry", + "speaker_role": "Dismissive", + "interpretation": "Bear your burden alone.", + "tone": "Callous" + }, + { + "trigger": "Drink water drop cup", + "speaker_role": "Peacemaker", + "interpretation": "Relax.", + "tone": "Calming" + }, + { + "trigger": "Breakfast", + "speaker_role": "Victim", + "interpretation": "Heartbreak.", + "tone": "Sad" + }, + { + "trigger": "She don serve me breakfast", + "speaker_role": "Victim", + "interpretation": "She broke up with me.", + "tone": "Sad" + }, + { + "trigger": "Fear who no fear you", + "speaker_role": "Advisor", + "interpretation": "Be careful of fearless people.", + "tone": "Warning" + }, + { + "trigger": "Japa", + "speaker_role": "Dreamer", + "interpretation": "Leave the country.", + "tone": "Aspiring" + }, + { + "trigger": "Condition make crayfish bend", + "speaker_role": "Philosopher", + "interpretation": "Hardship changes people.", + "tone": "Proverbial" + }, + { + "trigger": "Khaki no be leather", + "speaker_role": "Comparer", + "interpretation": "Fakes are not the original.", + "tone": "Proverbial" + }, + { + "trigger": "Body no be firewood", + "speaker_role": "Tired", + "interpretation": "I need rest.", + "tone": "Exhausted" + }, + { + "trigger": "Soup wey sweet", + "speaker_role": "Proverb", + "interpretation": "Good things cost money.", + "tone": "Transactional" + }, + { + "trigger": "Monkey dey work baboon dey chop", + "speaker_role": "Worker", + "interpretation": "I work, the boss eats.", + "tone": "Complaining" + }, + { + "trigger": "Soldier come soldier go", + "speaker_role": "Observer", + "interpretation": "People come and go.", + "tone": "Philosophical" + }, + { + "trigger": "Water pass garri", + "speaker_role": "Victim", + "interpretation": "The situation is critical.", + "tone": "Serious" + }, + { + "trigger": "Na you biko", + "speaker_role": "Sarcastic", + "interpretation": "You are the boss (mocking).", + "tone": "Sarcastic" + }, + { + "trigger": "Oga at the top", + "speaker_role": "Reference", + "interpretation": "Highest authority.", + "tone": "Respectful/Mocking" + }, + { + "trigger": "Audio money", + "speaker_role": "Skeptic", + "interpretation": "Fake wealth.", + "tone": "Dismissive" + }, + { + "trigger": "Medicine after death", + "speaker_role": "Critic", + "interpretation": "Too little too late.", + "tone": "Regretful" + }, + { + "trigger": "Shoot bird", + "speaker_role": "Drunk", + "interpretation": "To vomit.", + "tone": "Disgusting" + }, + { + "trigger": "Shine teeth", + "speaker_role": "Smiler", + "interpretation": "To smile/laugh.", + "tone": "Happy" + }, + { + "trigger": "Enter trousers", + "speaker_role": "Threatener", + "interpretation": "We will fight.", + "tone": "Aggressive" + }, + { + "trigger": "Find trouble", + "speaker_role": "Provoker", + "interpretation": "Look for a fight.", + "tone": "Provocative" + }, + { + "trigger": "Rest", + "speaker_role": "Critic", + "interpretation": "Stop talking.", + "tone": "Dismissive" + }, + { + "trigger": "Getat", + "speaker_role": "Dismissive", + "interpretation": "Get out of here.", + "tone": "Rude" + }, + { + "trigger": "Ma fo", + "speaker_role": "Supporter", + "interpretation": "Don't break / Don't worry.", + "tone": "Reassuring" + }, + { + "trigger": "Bone face", + "speaker_role": "Actor", + "interpretation": "Keep a straight face.", + "tone": "Serious" + }, + { + "trigger": "See finish", + "speaker_role": "Victim", + "interpretation": "Disrespect due to familiarity.", + "tone": "Regretful" + }, + { + "trigger": "Over-sabi", + "speaker_role": "Critic", + "interpretation": "Trying too hard.", + "tone": "Annoyed" + }, + { + "trigger": "Do normal", + "speaker_role": "Advisor", + "interpretation": "Behave yourself.", + "tone": "Warning" + }, + { + "trigger": "Act film", + "speaker_role": "Observer", + "interpretation": "Creating a scene/drama.", + "tone": "Amused" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Czech/Common Czech Persona.json b/lab_profiles/Czech/Common Czech Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..ba67de3fc7b1da2088721fb0c081212304e4d518 --- /dev/null +++ b/lab_profiles/Czech/Common Czech Persona.json @@ -0,0 +1 @@ +{"language": "Czech", "dialect": "Common Czech", "system_prompt": "You are a native speaker of Common Czech (Czech, f)."}{"name": "Common Czech Persona"} \ No newline at end of file diff --git a/lab_profiles/Czech/Moravian Persona.json b/lab_profiles/Czech/Moravian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b8d8ec8f1ee9dd98e9d2efe9ee86049cdd442dfa --- /dev/null +++ b/lab_profiles/Czech/Moravian Persona.json @@ -0,0 +1 @@ +{"language": "Czech", "dialect": "Moravian", "system_prompt": "You are a native speaker of Moravian (Czech, f)."}{"name": "Moravian Persona"} \ No newline at end of file diff --git a/lab_profiles/Czech/Silesian Persona.json b/lab_profiles/Czech/Silesian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..df0b8adef39961770ca765ab49282fef6707758b --- /dev/null +++ b/lab_profiles/Czech/Silesian Persona.json @@ -0,0 +1 @@ +{"language": "Czech", "dialect": "Silesian", "system_prompt": "You are a native speaker of Silesian (Czech, f)."}{"name": "Silesian Persona"} \ No newline at end of file diff --git a/lab_profiles/Deccan/Standard Deccani Persona.json b/lab_profiles/Deccan/Standard Deccani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a17278be7490ea5da964325aa47d73bc873f6008 --- /dev/null +++ b/lab_profiles/Deccan/Standard Deccani Persona.json @@ -0,0 +1 @@ +{"language": "Deccan", "dialect": "Standard Deccani", "system_prompt": "You are a native speaker of Standard Deccani (Deccan, f)."}{"name": "Standard Deccani Persona"} \ No newline at end of file diff --git a/lab_profiles/Dutch/Brabantian Persona.json b/lab_profiles/Dutch/Brabantian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..51d9a4594a4d268f2e46b5435b1a9d4eec8c999f --- /dev/null +++ b/lab_profiles/Dutch/Brabantian Persona.json @@ -0,0 +1 @@ +{"language": "Dutch", "dialect": "Brabantian", "system_prompt": "You are a native speaker of Brabantian (Dutch, f)."}{"name": "Brabantian Persona"} \ No newline at end of file diff --git a/lab_profiles/Dutch/Hollandic Persona.json b/lab_profiles/Dutch/Hollandic Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b68d1bd1288263e803e20d15e0e81737f49f0331 --- /dev/null +++ b/lab_profiles/Dutch/Hollandic Persona.json @@ -0,0 +1 @@ +{"language": "Dutch", "dialect": "Hollandic", "system_prompt": "You are a native speaker of Hollandic (Dutch, f)."}{"name": "Hollandic Persona"} \ No newline at end of file diff --git a/lab_profiles/Dutch/Limburgish Persona.json b/lab_profiles/Dutch/Limburgish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b808493cf1ca52c5cc88605105dee45a3f484239 --- /dev/null +++ b/lab_profiles/Dutch/Limburgish Persona.json @@ -0,0 +1 @@ +{"language": "Dutch", "dialect": "Limburgish", "system_prompt": "You are a native speaker of Limburgish (Dutch, f)."}{"name": "Limburgish Persona"} \ No newline at end of file diff --git a/lab_profiles/Egyptian Arabic/Alexandrian Persona.json b/lab_profiles/Egyptian Arabic/Alexandrian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..5fc7310526c1ab8aaeafa98a01050dd865fed20c --- /dev/null +++ b/lab_profiles/Egyptian Arabic/Alexandrian Persona.json @@ -0,0 +1 @@ +{"language": "Egyptian Arabic", "dialect": "Alexandrian", "system_prompt": "You are a native speaker of Alexandrian (Egyptian Arabic, f)."}{"name": "Alexandrian Persona"} \ No newline at end of file diff --git a/lab_profiles/Egyptian Arabic/Cairene Persona.json b/lab_profiles/Egyptian Arabic/Cairene Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..01119be03549ae9abdacdcb19d7c02b3fdfb56c0 --- /dev/null +++ b/lab_profiles/Egyptian Arabic/Cairene Persona.json @@ -0,0 +1 @@ +{"language": "Egyptian Arabic", "dialect": "Cairene", "system_prompt": "You are a native speaker of Cairene (Egyptian Arabic, f)."}{"name": "Cairene Persona"} \ No newline at end of file diff --git a/lab_profiles/Egyptian Arabic/Saidi Persona.json b/lab_profiles/Egyptian Arabic/Saidi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..04e5faf338240141f904fdaa516d3ca0acf2f4fa --- /dev/null +++ b/lab_profiles/Egyptian Arabic/Saidi Persona.json @@ -0,0 +1 @@ +{"language": "Egyptian Arabic", "dialect": "Saidi", "system_prompt": "You are a native speaker of Saidi (Egyptian Arabic, f)."}{"name": "Saidi Persona"} \ No newline at end of file diff --git a/lab_profiles/English/African American Vernacular Persona.json b/lab_profiles/English/African American Vernacular Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..509dba9b3a7ce89ab40a127aa32737525e511968 --- /dev/null +++ b/lab_profiles/English/African American Vernacular Persona.json @@ -0,0 +1,188 @@ +{ + "lab_name": "African American Vernacular English", + "cultural_context": "High context, collectivist, and deeply rooted in oral tradition and rhythmic expression. Communication is often performative, utilizing 'call and response' dynamics. Values 'realness' (authenticity) and 'sharpness' (wit/style). Speech patterns are characterized by grammatical markers like the aspectual 'be' (habitual action) and double negatives for emphasis. Heavily influenced by the Black church (cadence, metaphors), Hip-Hop culture, and the historical necessity of 'signifying' (double-talk/coded language). Social structure prioritizes 'fictive kinship' (treating friends as family). There is a high premium on 'reading' or 'roasting' as a form of social bonding and conflict resolution. Pragmatically, it often employs 'indirectness' as a survival strategy or politeness marker, while being intensely direct in communal 'truth-telling' settings.", + "jargon": { + "Ain't": "Am not / Is not / Are not (Universal negator).", + "All that": "Very impressive or attractive (often used in the negative: 'He think he all that').", + "Asf": "As fuck (Extreme emphasis, used as a suffix).", + "Bae": "Before Anyone Else (Significant other).", + "Bag": "A large sum of money or a goal ('Get the bag').", + "Bet": "Affirmative response / I agree / It\u2019s a challenge ('Watch me').", + "Blessing": "A fortunate event, often used to express gratitude ('It's a blessing').", + "Body": "To completely outperform or defeat someone ('He bodied that verse').", + "Brick": "A long period of time ('I haven't seen her in a brick') OR Very cold (NYC specific).", + "Bussin'": "Delicious (Usually refers to food).", + "Cap / No Cap": "A lie / I am telling the truth.", + "Cappin'": "Lying or exaggerating.", + "Certified": "Proven to be authentic or high quality.", + "Chile": "Child (Used as an exclamation of disbelief or to start a story).", + "Clap back": "A quick, sharp, or witty response to an insult.", + "Clean": "Looking very good, stylish, or well-dressed.", + "Clout": "Social influence or fame.", + "Come correct": "Approach a situation with the proper respect or preparation.", + "Deadass": "Completely serious / I am not joking.", + "Dig": "To understand or appreciate ('You dig?').", + "Dip": "To leave quickly.", + "Done": "To be fed up or finished with a situation ('I'm done').", + "Drip": "High-end fashion, style, or jewelry.", + "Everyday": "Ordinary or mediocre ('That's just everyday').", + "Facts": "I agree with what you just said / That is the truth.", + "Fam": "Close friends or family.", + "Feel you": "I understand and empathize with your perspective.", + "Fictive Kin": "Using family terms (Auntie, Unc, Brother) for non-relatives.", + "Finna": "Fixing to / About to (Contraction of 'finally' + 'to' or 'fixing' + 'to').", + "Finesse": "To get what you want through cleverness or manipulation.", + "Flex": "To show off wealth, status, or skill.", + "For real / For real, for real": "Are you serious? / I am being intensely serious.", + "Frontin'": "Faking a persona or pretending to be more than one is.", + "G": "Friend / Gangster / One thousand dollars.", + "Gas": "To hype someone up (sometimes falsely) OR High-quality marijuana.", + "Ghost": "To disappear or stop responding.", + "Glow up": "A significant transformation for the better.", + "GOAT": "Greatest of All Time.", + "Guap": "Large amounts of money.", + "Hands": "Fighting ability ('He got hands').", + "High-key": "Openly / Obviously.", + "Humble": "To bring someone back to reality ('I had to humble him').", + "Hungry": "Ambitious / Desperate for success.", + "Hustle": "To work hard, often in informal economies.", + "I'm weak": "That is hilarious (I am laughing so hard I am physically weak).", + "In my feelings": "Feeling emotional or oversensitive.", + "Istamp": "I agree completely / I vouch for that.", + "It's giving": "It has the vibe of... ('It's giving 90s').", + "Jawn": "A person, place, or thing (Philly origin, widely understood).", + "Keep it 100": "Be completely honest.", + "Kicks": "Shoes / Sneakers.", + "L": "A loss ('Take an L').", + "Low-key": "Secretly / Modestly / Slightly.", + "Mainline": "The most important or central thing.", + "Mad": "Very / Extremely ('I'm mad hungry').", + "Minute": "A long time ('I haven't been there in a minute').", + "No holds barred": "Without limits or rules.", + "No shade": "No offense intended (usually followed by something offensive).", + "On fleek": "Perfectly executed (usually eyebrows or style).", + "On god": "I swear on everything I hold sacred.", + "On my mama": "I swear on my mother's life.", + "On point": "Perfect / Accurate.", + "Opp": "Opposition / Enemy.", + "Out of pocket": "Acting wildly inappropriate or out of line.", + "Period / Periodt": "End of discussion.", + "Pull up": "To arrive at a location (usually by car).", + "Put you on": "To introduce someone to something new or beneficial.", + "Reach": "An exaggeration or an unlikely assumption.", + "Real talk": "I am about to say something serious and honest.", + "Receipts": "Evidence of a claim (usually screenshots).", + "Rent free": "Obsessing over something ('Living in your head rent free').", + "Rizz": "Charisma, specifically in romantic pursuit.", + "Salty": "Bitter or upset about a loss/slight.", + "Savage": "Ruthless or impressively cold-blooded.", + "Say less": "I understand completely; no further explanation needed.", + "Sell out": "To betray one's culture or values for personal gain.", + "Shook": "Shocked, scared, or deeply affected.", + "Sidebar": "A quick tangential comment.", + "Signifyin'": "Coded language, wordplay, or insults.", + "Slaps": "It is of high quality (usually music or food).", + "Slay": "To do something exceptionally well.", + "Smalls": "Insignificant or minor things.", + "Snack": "An attractive person.", + "Snatched": "Looking very good or sharp (specifically hair/outfit).", + "Solid": "Reliable / Trustworthy ('He\u2019s solid').", + "Stan": "An obsessive fan.", + "Stay woke": "Be aware of social/political injustices.", + "Straight": "Okay / I\u2019m fine ('I'm straight').", + "Sus": "Suspicious.", + "Tea": "Gossip ('Spill the tea').", + "The itch": "A craving or habitual need.", + "Thirst / Thirsty": "Desperate for attention or validation.", + "Throw shade": "To insult someone subtly or indirectly.", + "Tight": "Cool / Good OR Angry (Context dependent).", + "Tore up": "In very bad condition / Looking a mess.", + "Triflin'": "Lazy, dishonest, or low-quality (behavior).", + "Trip / Trippin'": "Acting irrationally or overreacting.", + "Tryna": "Trying to.", + "Vibe": "The atmosphere or feeling of a person/place.", + "W": "A win.", + "Wack": "Bad / Corny / Low quality.", + "What's the move?": "What is the plan?", + "Whip": "A car.", + "Whole meal": "Someone who is the 'full package' (attractive/successful).", + "Wildin'": "Acting out of control or crazy.", + "Word / Word up": "I agree / I hear you / Is that true?", + "Y'all": "You all (Second person plural).", + "You good?": "Are you okay? / Is there a problem? / You don't need anything else (Context dependent)." + }, + "pragmatic_rules": [ + { + "trigger": "What's good?", + "speaker_role": "Greeter", + "interpretation": "How are you? / What's happening? Not a literal question about what is 'good'.", + "tone": "Casual" + }, + { + "trigger": "I'm finna be there", + "speaker_role": "Arriver", + "interpretation": "I am preparing to leave. I will be there eventually (likely 20-30 minutes).", + "tone": "Vague" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Elder/Auntie", + "interpretation": "You are making a mistake, or I pity your ignorance.", + "tone": "Paternalistic" + }, + { + "trigger": "I'm not gonna lie", + "speaker_role": "Speaker", + "interpretation": "I am about to be very blunt or share a controversial opinion.", + "tone": "Confessional" + }, + { + "trigger": "Don't get it twisted", + "speaker_role": "Speaker", + "interpretation": "Clarification: Do not misunderstand my kindness for weakness or my meaning for something else.", + "tone": "Warning" + }, + { + "trigger": "You know what I'm saying?", + "speaker_role": "Speaker", + "interpretation": "Phatic expression used to maintain rhythm and engagement. Usually doesn't require an answer.", + "tone": "Rhythmic" + }, + { + "trigger": "Aht aht!", + "speaker_role": "Authority/Parent", + "interpretation": "Stop what you are doing immediately.", + "tone": "Corrective" + }, + { + "trigger": "I see you!", + "speaker_role": "Observer", + "interpretation": "I acknowledge and celebrate your success, style, or effort.", + "tone": "Encouraging" + }, + { + "trigger": "It's the ___ for me", + "speaker_role": "Critic/Jester", + "interpretation": "This specific detail is what I find funny, annoying, or noteworthy.", + "tone": "Observational" + }, + { + "trigger": "You reachin'", + "speaker_role": "Listener", + "interpretation": "Your logic is flawed or you are making a huge assumption.", + "tone": "Dismissive" + }, + { + "trigger": "That's crazy", + "speaker_role": "Listener", + "interpretation": "I am no longer listening, or I have nothing to add to this story.", + "tone": "Exit Strategy" + }, + { + "trigger": "Who all gonna be there?", + "speaker_role": "Invitee", + "interpretation": "I need to know the vibe/safety of the event before I commit.", + "tone": "Precautionary" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/English/American Persona.json b/lab_profiles/English/American Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..73e3b78d43aa3597ebe4b57a5b78a3db15e78fbb --- /dev/null +++ b/lab_profiles/English/American Persona.json @@ -0,0 +1,7014 @@ +{ + "lab_name": "American English", + "cultural_context": "Low context, hyper-individualistic, and achievement-oriented ('The American Dream'). Directness is valued, though criticism is often softened via the 'sandwich method' or modern 'therapy speak'. Social interaction is characterized by superficial friendliness, mandatory small talk, and a transactional service culture (tipping). The lexicon is heavily militarized and sportified, treating business and life as competitive games. High reliance on legal/procedural slang due to a litigious society. Secular speech is deeply saturated with King James Biblical idioms, Hollywood tropes, and 'Wild West' individualism. Strong cultural emphasis on car dependency, homeownership as status, and the 'hustle' of self-made success.", + "jargon": { + "24/7": "Twenty-four seven (All the time).", + "800-pound gorilla": "The most powerful or dominant entity in a room/market.", + "A-game": "One's best performance.", + "Across the board": "Applying to everyone/everything.", + "Action item": "A specific task that needs to be done.", + "All set": "Ready, finished, or 'I don't need anything else'.", + "ASAP": "As Soon As Possible (often implies urgency/stress).", + "At the end of the day": "Ultimately / The most important fact is.", + "Awesome": "Generic positive response. Does not mean 'inspiring awe'.", + "Back to the drawing board": "Start over because the previous attempt failed.", + "Back-to-back": "Consecutive meetings with no break.", + "Ballpark figure": "Rough estimate.", + "Bandwidth": "Energy, time, or mental capacity to do a task.", + "Bang for your buck": "Value for money.", + "Basket case": "Crazy / Stressed person.", + "Behind the eight ball": "In a disadvantageous position.", + "Beltway": "Relating to Washington D.C. politics (Inside the Beltway).", + "Big deal": "Important thing (or sarcastic: 'No big deal').", + "Bio-break": "Restroom break (Corporate/Gamer slang).", + "Bite the bullet": "Endure a painful experience or make a tough decision.", + "Bleeding edge": "Newer and riskier than 'cutting edge'.", + "Blind spot": "Area you cannot see (driving or metaphorical).", + "Blue-sky thinking": "Creative brainstorming with no limits.", + "Bottom line": "The main point / Profit.", + "Brain fart": "Temporary mental lapse or forgetfulness.", + "Break a leg": "Good luck.", + "Buck": "Dollar.", + "Burnout": "Physical/mental collapse caused by overwork.", + "Buy-in": "Agreement or support from stakeholders.", + "Call it a day": "Stop working for the day.", + "Can of worms": "A complex, troublesome situation.", + "Cap / No Cap": "Lie / No lie (Gen Z slang).", + "Catch-22": "No-win situation.", + "Change of heart": "Changing one's opinion or feelings.", + "Check": "The bill at a restaurant.", + "Circle back": "Revisit a topic later.", + "Cold feet": "Loss of nerve/confidence before an event.", + "Cold turkey": "Stopping abruptly.", + "Come to Jesus moment": "A moment of intense realization or a harsh truth-telling meeting.", + "Copy that": "I understand.", + "Couch potato": "Lazy person.", + "Crunch time": "The period just before a deadline.", + "Curveball": "Surprise.", + "Cut corners": "Do something cheaply/poorly.", + "Cut to the chase": "Skip the details and get to the point.", + "Dead in the water": "A plan with no hope of success.", + "Deep dive": "Thorough analysis.", + "Deliverables": "The tangible results/products of a project.", + "Dime a dozen": "Very common and of low value.", + "Double down": "Increase risk.", + "Drill down": "Look at data in more detail.", + "Drive it home": "Make a point clearly understood.", + "Drop the ball": "Fail.", + "Dude": "Person (Gender neutral in CA).", + "Ducks in a row": "Getting organized.", + "Elephant in the room": "An obvious problem no one wants to discuss.", + "Elevator pitch": "A very short summary of an idea (30-60 seconds).", + "EOD / COB": "End of Day / Close of Business (Deadline: 5:00 PM).", + "Face time": "Being seen by the boss.", + "Figure it out": "Solve the problem yourself.", + "Fire drill": "A sudden, urgent, often chaotic task.", + "Flake": "Unreliable person.", + "Flip-flop": "Change opinion (Politics) OR Sandal.", + "For real?": "Are you serious?", + "Full plate": "Very busy.", + "Game changer": "Something that significantly shifts the situation.", + "Game plan": "Strategy.", + "Gaslight": "Manipulating someone to question their reality.", + "Gatekeeper": "Person controlling access.", + "Get the ball rolling": "Start a process.", + "Ghosting": "Ending a relationship by cutting off all communication.", + "Go south": "To deteriorate or fail.", + "Go-getter": "An ambitious person.", + "Grain of salt": "Skepticism.", + "Grand": "Thousand dollars.", + "Green light": "Permission to proceed.", + "Gut check": "Relying on instinct.", + "Hail Mary": "Desperate try.", + "Hardball": "Aggressive tactics.", + "Heads up": "Warning.", + "Hit the ground running": "Start a new job/project effectively immediately.", + "Hit the road": "Leave.", + "Home run": "Success.", + "In the loop": "Informed.", + "In the weeds": "Lost in too many details or overwhelmed.", + "Jump the gun": "Start too early.", + "Keep me posted": "Keep me updated.", + "Kick the can down the road": "Delay a decision/problem.", + "Kill two birds with one stone": "Solve two problems with one action.", + "Lemon": "Defective car.", + "Leverage": "Use something to maximum advantage.", + "Lighten up": "Relax.", + "Loop in": "Add someone to the communication.", + "Low-hanging fruit": "Easy tasks or targets.", + "Monday morning quarterback": "Critic.", + "Move the needle": "Make a measurable difference.", + "No brainer": "An obvious decision.", + "Off the clock": "Not working.", + "Off the cuff": "Spontaneous/Unscripted.", + "Offline": "Discussing something privately/later.", + "On my radar": "I am aware of it.", + "On the same page": "In agreement.", + "Out of pocket": "Unavailable (or paying with own money).", + "Pain point": "A specific problem a customer has.", + "Parking lot": "To set an idea aside for later discussion.", + "Piece of cake": "Easy.", + "Piggyback": "To build on someone else's idea.", + "Ping": "Contact someone.", + "Pitch in": "Help out.", + "Pivot": "Change strategy.", + "Play devil's advocate": "Argue the opposing side to test an idea.", + "Play it by ear": "Improvise.", + "Plead the fifth": "Refuse to answer (incriminating).", + "Pull the plug": "Stop a project.", + "Push the envelope": "Go beyond established limits.", + "Pushback": "Resistance.", + "Put a pin in it": "Pause a discussion for later.", + "Put out fires": "Dealing with emergencies.", + "Quarterback": "Lead.", + "Rain check": "Reschedule.", + "Reach out": "Contact someone.", + "Red tape": "Bureaucracy.", + "Ride shotgun": "Front passenger.", + "Rizz": "Charisma (Gen Z).", + "Rock the boat": "Cause trouble or disrupt status quo.", + "Rule of thumb": "General guideline.", + "Run it up the flagpole": "Test an idea to see reaction.", + "Scalability": "Ability to grow.", + "Screw up": "Mistake.", + "Shoot an email": "Send an email.", + "Side hustle": "Second job.", + "Silver lining": "Positive side of bad situation.", + "Slam dunk": "Success.", + "Sill the tea": "Share gossip.", + "Spin your wheels": "Exert effort with no result.", + "Step up to the plate": "Take responsibility.", + "Stretch goal": "An ambitious target.", + "Strike out": "Fail completely.", + "Sweet spot": "The optimal point.", + "Synergy": "Cooperation interaction (Corporate clich\u00e9).", + "Table it": "Postpone discussion.", + "Take five": "Break.", + "Takeaway": "Key point to remember.", + "The whole nine yards": "Everything / All of it.", + "Think outside the box": "Think creatively.", + "Throw under the bus": "Betray someone for own gain.", + "Touch base": "Contact.", + "Traction": "Momentum.", + "Up in the air": "Undecided.", + "Vibe check": "Assess mood.", + "Wheelhouse": "Area of expertise.", + "Win-win": "Good for all.", + "Wing it": "Improvise.", + "Wrap up": "Finish.", + "Zone out": "Lose focus.", + "Armchair expert": "Someone who asserts knowledge on a subject they know nothing about.", + "Ball is in your court": "It is your turn to make a move/decision.", + "Basic": "Mainstream / Boring (usually female).", + "Batting a thousand": "Doing everything perfectly.", + "Beat around the bush": "Avoiding the main topic.", + "Benchwarmer": "Someone not participating or second-choice.", + "Big picture": "The overall perspective or objective.", + "Binge-watch": "Watch an entire season of a show at once.", + "Black Friday": "The day after Thanksgiving (shopping chaos).", + "Blindside": "Surprise attack (Physical or metaphorical).", + "Bootstrapping": "Building a business with no outside investment.", + "Boujee": "High class / Expensive taste (from Bourgeois).", + "Brainstorming": "Group creativity technique.", + "Breadcrumbing": "Sending sporadic messages to keep a romantic interest hooked without commitment.", + "Break the ice": "Relieve tension in a social setting.", + "Burn bridges": "To destroy relationships so you can never return.", + "Bury the hatchet": "Make peace.", + "Call the shots": "Make decisions.", + "Catfish": "Deceive someone online with a fake persona.", + "Caught red-handed": "Caught in the act of doing something wrong.", + "Cherry-pick": "Select only the best data.", + "Clap back": "A quick, sharp response to criticism.", + "Clean slate": "Fresh start.", + "Close call": "Narrow escape from danger.", + "Cringe": "Embarrassing.", + "Curry favor": "Trying to ingratiate oneself with someone.", + "Cut me some slack": "Be lenient / Give me a break.", + "Dark horse": "Unexpected winner.", + "Devil is in the details": "Small things can cause big problems.", + "Dodge a bullet": "Avoid disaster.", + "Dog-eat-dog": "Ruthlessly competitive.", + "Doomscrolling": "Endlessly scrolling through bad news on social media.", + "Down to earth": "Realistic / Humble.", + "Drinking the Kool-Aid": "Blindly following a dangerous ideology or corporate culture.", + "Drop in the bucket": "A very small, insignificant amount.", + "Early bird": "Person who arrives early.", + "Extra": "Dramatic.", + "Eye-opener": "Something that reveals a surprising truth.", + "Face the music": "Accept consequences.", + "Fair-weather friend": "A friend who is only there when things are good.", + "Fam": "Close friends.", + "Fifth wheel": "Unwanted extra person.", + "Flex": "To show off.", + "FOMO": "Fear Of Missing Out.", + "Full ride": "100% Scholarship.", + "Get wind of": "To hear a rumor about something.", + "Give the cold shoulder": "To ignore someone intentionally.", + "Glass ceiling": "Barrier to promotion for women.", + "Glow up": "Improvement.", + "GOAT": "Greatest of All Time.", + "Go with the flow": "Accept things as they happen.", + "Golden handcuffs": "High salary/benefits that keep an employee in a job they hate.", + "Guap": "Money.", + "Hangry": "Hungry + Angry.", + "Hard pass": "Refusal.", + "High-key": "Openly / Obviously.", + "Hit the nail on the head": "Describe something exactly right.", + "Hot take": "A controversial opinion.", + "Hump Day": "Wednesday.", + "Ick": "A sudden feeling of repulsion towards a dating partner.", + "In the red": "Debt.", + "In the black": "Making money.", + "Jump the shark": "Decline in quality.", + "Karen": "Entitled woman.", + "Keep your chin up": "Stay positive.", + "Kill it": "To do something extremely well.", + "Knock on wood": "Superstitious action to prevent bad luck.", + "Left on read": "Reading a message and ignoring it.", + "Let off steam": "Release anger/energy.", + "Level playing field": "Fair competition.", + "Lit": "Fun / Drunk.", + "Low-key": "Secretly / Modestly.", + "Monday blues": "Sadness about the work week starting.", + "Mood": "Relatable feeling.", + "Moving the goalposts": "Unfairly changing the rules during the process.", + "MVP": "Most Valuable Player.", + "No shade": "No offense intended.", + "Off the grid": "Disconnected from tech.", + "On point": "Perfect.", + "On the fence": "Undecided.", + "Out of left field": "Unexpected / Bizarre.", + "Paper trail": "Written evidence.", + "Par for the course": "Normal / Expected (usually negative).", + "Pay it forward": "Do a good deed to repay a good deed done to you.", + "Pink slip": "Firing notice.", + "Pipeline": "Future projects/sales.", + "Playing hard to get": "Feigning disinterest.", + "Pop the question": "Propose marriage.", + "Rain on my parade": "Spoil someone's enjoyment.", + "Red flag": "Warning sign (in dating/business).", + "Ride or die": "Extremely loyal partner/friend.", + "Runway": "How long a startup can survive before running out of money.", + "Salty": "Bitter.", + "Savage": "Ruthless.", + "Scope creep": "Uncontrolled growth of a project's requirements.", + "Shot in the dark": "Guess.", + "Sick": "Cool.", + "Silo": "Departments not sharing information.", + "Simp": "Someone who does too much for a person they like (derogatory).", + "Skeleton crew": "Minimum staff.", + "Skin in the game": "Personal financial risk in an enterprise.", + "Slaps": "It is very good (usually music/food).", + "Slay": "Do well.", + "Spill the beans": "Reveal secret.", + "Stan": "Fan.", + "Sus": "Suspicious.", + "Sweat equity": "Unpaid work in exchange for a share of the company.", + "Take a rain check": "Postpone an invitation.", + "The extra mile": "Effort beyond what is required.", + "Throw shade": "Subtle insult.", + "Under the weather": "Sick.", + "Vibes": "Feelings.", + "Woke": "Aware.", + "Yeet": "To throw something with force (Gen Z).", + "401(k)": "Employer-sponsored retirement savings plan.", + "86": "Banned / Removed.", + "All-nighter": "Staying awake all night to study or work.", + "Amber Alert": "Emergency broadcast for a child abduction.", + "Bail": "To leave abruptly OR money paid to leave jail pre-trial.", + "Ballot": "The paper/system used to cast a vote.", + "Band-Aid solution": "A temporary, superficial fix to a problem.", + "Blue state": "A US state that predominantly votes for the Democratic Party.", + "Bodega": "Corner store (NYC).", + "Booked": "Processed by police after an arrest.", + "Brown-nose": "To suck up to authority figures.", + "Bubbler": "Drinking fountain (Wisconsin/New England region).", + "Catbird seat": "An advantageous or prominent position.", + "Caucus": "A meeting of political party members to choose candidates.", + "Class action": "A lawsuit filed by a group of people.", + "Closing costs": "Fees paid at the end of a real estate transaction.", + "Copay": "Fixed amount paid by a patient for medical service (Insurance).", + "Curb appeal": "Attractiveness of a house from the street.", + "Dean's List": "List of students recognized for high academic achievement.", + "Deductible": "Amount paid out-of-pocket before insurance kicks in.", + "Dibs": "Claiming rights.", + "Double whammy": "Two bad things happening at once.", + "Down payment": "Initial upfront payment for a house/car.", + "DUI / DWI": "Driving Under the Influence / Driving While Intoxicated.", + "Earmark": "Designate funds for specific use.", + "Eminent domain": "Government power to take private property for public use.", + "Escrow": "Money held by a third party during a transaction.", + "Felony": "Serious crime (>1 year prison).", + "Filibuster": "Prolonging debate to delay a vote in Congress.", + "Fixer-upper": "House needing renovation.", + "Fixin' to": "Getting ready to do something (Southern US).", + "Flip": "To buy something (house) and sell it quickly for profit.", + "Freshman 15": "Weight gain in college.", + "Gerrymandering": "Manipulating voting district boundaries for political gain.", + "GOP": "Grand Old Party (The Republican Party).", + "Grassroots": "Political movement driven by ordinary people, not elites.", + "Greek Life": "Fraternities and Sororities system in colleges.", + "Gridlock": "Traffic jam OR political stalemate.", + "Grounded": "Punishment where a child is not allowed to go out.", + "Hazing": "Humiliating initiation rituals for a group.", + "Hella": "Very (NorCal).", + "HOA": "Homeowners Association (Neighborhood rules).", + "Homecoming": "School celebration.", + "Inside baseball": "Details only experts/insiders would know or care about.", + "Ivy League": "Elite colleges.", + "Jaywalking": "Crossing the street illegally.", + "John Doe / Jane Doe": "Placeholder name for an unidentified person.", + "Jumbo loan": "A mortgage that exceeds standard lending limits.", + "Junior Varsity (JV)": "Second-tier athletic team (below Varsity).", + "Lame duck": "An official in the final period of office after a successor is elected.", + "Lemon law": "Consumer protection for defective vehicles.", + "Lobbyist": "Person hired to influence politicians.", + "McMansion": "Large, mass-produced house with poor architectural style.", + "Miranda rights": "Right to silence and an attorney (Police warning).", + "Misdemeanor": "Minor crime.", + "Moonlighting": "Second job.", + "Mug shot": "Booking photo.", + "NDA": "Non-Disclosure Agreement.", + "NIMBY": "Not In My Back Yard (Opposing development nearby).", + "Out of network": "Medical provider not covered by your insurance.", + "Plead the Fifth": "Refusing to testify to avoid self-incrimination.", + "Pledge": "Fraternity recruit.", + "Pop / Soda / Coke": "Regional terms for carbonated soft drinks.", + "Pork barrel": "Government spending for localized projects to secure votes.", + "Post-game": "To party after a sporting event.", + "Pre-game": "Drink before event.", + "Probable cause": "Reason to arrest.", + "Prom": "Formal high school dance.", + "Public Defender": "Court-appointed lawyer for those who can't afford one.", + "Purple state": "A swing state (mix of Red/Republican and Blue/Democrat).", + "Red state": "A US state that predominantly votes Republican.", + "Red-handed": "Caught in the act.", + "Rent control": "Laws limiting how much landlords can increase rent.", + "Restraining order": "Court order ordering someone to stay away.", + "Road rage": "Driving anger.", + "Rush week": "Recruitment period for fraternities/sororities.", + "Safety school": "A college you are sure you will get into.", + "Security deposit": "Money held by landlord.", + "Snowbird": "Winter migrant.", + "Sophomore slump": "Decline in performance during the second year.", + "Spin doctor": "PR person.", + "Stoop": "Small staircase at the entrance of a building (NYC/Philly).", + "Sublet": "Renting your apartment to someone else temporarily.", + "Subpoena": "Court order.", + "Swing state": "State where the vote could go either way.", + "Tailgate": "Parking lot party.", + "Tenure": "Permanent job security for professors.", + "The Feds": "Federal agents (FBI, etc.).", + "Town hall": "Public meeting with a politician.", + "Under the table": "Illegal pay.", + "Valet": "Parking service.", + "Varsity": "Principal athletic team representing a school.", + "Walk the talk": "Do what you say you will do.", + "Wasp": "Elite white person.", + "Whistleblower": "Snitch.", + "Wicked": "Very (Boston).", + "Y'all": "You all (Plural 'you' - Southern/AAVE).", + "Yellow tape": "Crime scene tape.", + "401(k) Match": "Employer contribution to retirement savings.", + "Monday Morning Quarterback": "Critic.", + "A buck fifty": "One dollar and fifty cents (or sometimes used to mean 'a small amount').", + "Across the pond": "The United Kingdom (from the US perspective).", + "Air conditioning (A/C)": "Central cooling (Essential in US South/West).", + "All-American": "Wholesome, typical, or excellent (often referring to athletes).", + "Amber waves of grain": "Poetic reference to the US Midwest (from 'America the Beautiful').", + "Baby Boomer": "Generation born 1946-1964.", + "Back 40": "The remote part of a large property (Farm term).", + "Backburner": "Low priority.", + "Bailout": "Financial rescue of a company.", + "Ballpark": "Rough estimate.", + "Base": "Main office.", + "Basket": "Group of currencies or stocks.", + "Bible Belt": "The Southern US, known for conservative evangelical Christianity.", + "Big Apple": "New York City.", + "Big Easy": "New Orleans.", + "Bleachers": "Cheap bench seats at a sports stadium.", + "Blind date": "Date with a stranger arranged by a third party.", + "Blue collar": "Manual labor worker.", + "Boondocks / Boonies": "Remote, rural area.", + "Boot camp": "Military training or intense fitness program.", + "Breadwinner": "Primary income earner.", + "Buckle up": "Put on seatbelt.", + "Bull market": "Rising prices.", + "Bear market": "Stock market is going down.", + "Bumper to bumper": "Traffic so dense cars are touching.", + "Busboy": "Restaurant worker who clears tables.", + "Candy": "Sweets/Chocolate (Not 'Sweets').", + "Car pool": "Sharing a ride to work/school.", + "Cash cow": "Profitable item.", + "Catty-corner / Kitty-corner": "Diagonally across an intersection.", + "Checks and balances": "System preventing one branch of government from dominating.", + "Cinch": "Something very easy.", + "Click": "Kilometer (Military).", + "Coast": "East or West coast.", + "Cold snap": "Sudden short period of cold weather.", + "Commissary": "Store (Military/Prison).", + "Co-pay": "Insurance fee.", + "Cover letter": "Letter sent with a resume.", + "Crossing guard": "Person who helps children cross the street.", + "Cubicle": "Semi-enclosed office workspace.", + "Curfew": "Time by which one must be home.", + "Deadbeat": "Lazy person / Non-payer.", + "Deep six": "Destroy / Discard.", + "Designated Driver (DD)": "Sober person driving drunks home.", + "Dime": "10 cents.", + "Dip": "Chewing tobacco.", + "Dirt road": "Unpaved road.", + "Dish": "Attractive person.", + "Dixie": "The South.", + "Doggy bag": "Bag for restaurant leftovers.", + "Double-dip": "To get paid from two sources illegitimately OR dip a chip twice.", + "Drive-thru": "Service window for cars.", + "Drop-off": "Place to leave something/someone.", + "Dry county": "No alcohol allowed.", + "Dude ranch": "Ranch for tourists.", + "Dumb down": "Simplify for a less intelligent audience.", + "Dumpster fire": "A chaotic disaster.", + "Dutch treat": "Each person pays for themselves.", + "Easy street": "Financial independence.", + "Electoral College": "The complex system that actually elects the President.", + "Empty nester": "Parent whose kids have moved out.", + "Entr\u00e9e": "The main course (In US; 'Starter' is the first course).", + "Exemption": "Tax break.", + "Fanny pack": "Waist bag (Note: 'Fanny' means buttocks in US, not vagina).", + "Fifth": "Right to silence.", + "Fifth Amendment": "Right to remain silent.", + "Fender bender": "Small car accident.", + "Five-O": "Police.", + "Flop": "Failure.", + "Flyover country": "The US Midwest (between the coasts).", + "Fourth of July": "Independence Day.", + "Freshman": "1st year student (High School/College).", + "Sophomore": "2nd year student.", + "Junior": "3rd year student.", + "Senior": "4th year student.", + "Full-ride": "Scholarship covering all costs.", + "Fumble": "To drop the ball / Make a mistake.", + "G": "Thousand dollars OR Gangster.", + "Gas station": "Petrol station.", + "GED": "General Equivalency Diploma (High School alternative).", + "Gentrification": "Wealthy people moving into poor neighborhoods, raising rents.", + "Gig": "Job.", + "Go postal": "Violent rage.", + "Gold digger": "Person dating for money.", + "GPA": "Grade Point Average.", + "Grand Slam": "Total success.", + "Green card": "Permanent Resident card.", + "Ground zero": "Center of disaster.", + "Half-baked": "Poorly thought out.", + "Hand-me-down": "Used clothing passed from older sibling.", + "Happy Hour": "Discount drink time.", + "Hard hat": "Construction worker.", + "Head honcho": "Boss.", + "High school": "Secondary school.", + "Highway": "Main road.", + "Hillbilly": "Rural mountain person (stereotypically uneducated).", + "Hood": "Neighborhood.", + "Hoops": "Basketball.", + "Hot dog": "Sausage in a bun.", + "HOV lane": "High Occupancy Vehicle lane (Carpool lane).", + "Huddle": "Meeting.", + "Humvee": "Military vehicle.", + "I-95 / I-5": "Major Interstate highways.", + "Icebox": "Refrigerator (Old fashioned).", + "In the hole": "Solitary confinement OR Debt.", + "Inside the Beltway": "Washington DC politics.", + "Interstate": "National highway system.", + "IRS": "Internal Revenue Service (Tax agency).", + "Jackpot": "Big win.", + "Jaywalk": "Cross street illegally.", + "Jersey barrier": "Concrete traffic divider.", + "John Hancock": "Signature.", + "Jock": "Athlete.", + "Joe Six-pack": "Average American man.", + "Jonesing": "Craving.", + "Jumbo tron": "Giant screen at stadium.", + "Junior High / Middle School": "Grades 6-8.", + "Junk food": "Unhealthy snacks.", + "Kick the bucket": "Die.", + "Kool-Aid": "Blind faith.", + "Layoff": "Firing due to lack of work.", + "License plate": "Number plate.", + "Liquor store": "Shop selling alcohol.", + "Loitering": "Standing around doing nothing (often illegal).", + "Long shot": "Unlikely.", + "Loophole": "Technicality allowing one to avoid a rule.", + "Loose cannon": "Unpredictable person.", + "Lowball": "Offer a deceptively low price.", + "A-list": "Top tier celebrities.", + "B-list": "Second tier celebrities.", + "Backseat driver": "Passenger who gives unwanted driving advice.", + "Bender": "A multi-day drinking/drug spree.", + "Beta test": "Trying something out before it's ready.", + "Big cheese": "Important person.", + "Blockbuster": "Very successful movie.", + "Bomb": "Fail (US) vs Succeed (UK).", + "Boob tube": "Television (Old slang).", + "Box office": "Ticket sales revenue.", + "Brain freeze": "Headache from eating cold food too fast.", + "Brewski": "Beer.", + "Brown bag it": "Bring lunch from home.", + "Bug": "Software error.", + "Bun in the oven": "Pregnant.", + "Burn rubber": "Accelerate fast enough to spin tires.", + "Buzzkill": "Someone who ruins the fun.", + "Cafeteria Catholic": "Someone who picks and chooses which religious rules to follow.", + "Caked up": "Having a large buttocks (Slang).", + "Call shotgun": "Claim the front passenger seat.", + "Cameo": "Brief appearance by a famous person.", + "Can": "Toilet OR To fire someone.", + "Cash in": "Profit from an investment.", + "Catch some Zs": "Sleep.", + "Cheapskate": "Stingy person.", + "Chick flick": "Movie targeted at women (Rom-com).", + "Chop shop": "Place where stolen cars are dismantled.", + "Cliffhanger": "Suspenseful ending.", + "Cloud nine": "Extreme happiness.", + "Cold shoulder": "Ignore.", + "Comfort food": "High-calorie, nostalgic food (Mac & Cheese, Fried Chicken).", + "Commercial": "TV advertisement.", + "Cookie": "Sweet biscuit (Chocolate chip, etc.).", + "Biscuit": "Savory bread roll (US South).", + "Chips": "Crisps (Potato chips).", + "Fries": "Chips (French fries).", + "Cop a feel": "Touch someone sexually without consent (or sneakily).", + "Crash": "Sleep OR Computer failure.", + "Credits": "List of names at end of movie.", + "Crowdfund": "Raise money from many people online.", + "Crunchy": "Hippie / Environmentalist.", + "Cut the cord": "Cancel cable TV.", + "Cutting edge": "Most advanced technology.", + "Dad bod": "Soft physique on a middle-aged man.", + "Dead presidents": "Money.", + "Diner": "Casual, cheap restaurant (often retro).", + "Director's cut": "Extended version of a movie.", + "Disrupt": "Change an industry radically (Tech jargon).", + "Doppelganger": "Look-alike.", + "Double feature": "Two movies for price of one.", + "Drive-in": "Outdoor movie theater for cars.", + "Early adopter": "Person who buys new tech first.", + "Easter egg": "Hidden message/feature in media.", + "Eat crow": "Admit one was wrong.", + "Eat dust": "Lose a race/competition.", + "Ecosystem": "Interconnected tech products (Apple ecosystem).", + "Eggplant emoji": "Symbol for penis (Texting).", + "Faceplant": "Fall on one's face.", + "Fanboy / Fangirl": "Obsessive fan.", + "Feature creep": "Adding too many features to a product.", + "Five-finger discount": "Shoplifting.", + "Flasher": "Person who exposes genitals publicly.", + "Flat tire": "Punctured tire.", + "Flick": "Movie.", + "Flip the bird": "Show middle finger.", + "Food coma": "Sleepiness after eating.", + "Foodie": "Person who loves gourmet food.", + "Freebie": "Free item.", + "Friend zone": "Platonic rejection.", + "Fringe": "Extreme/Non-mainstream.", + "Full circle": "Returning to the start.", + "Gaslighting": "Manipulating reality.", + "Gearhead": "Car enthusiast.", + "Ghost town": "Abandoned/Empty place.", + "Glitch": "Minor malfunction.", + "Go viral": "Spread rapidly online.", + "Go-to": "Favorite / Reliable option.", + "Goat": "Greatest of All Time (G.O.A.T.).", + "Grease monkey": "Mechanic.", + "Green room": "Waiting area.", + "Grind": "Work hard.", + "Groundbreaking": "Innovative.", + "Hacker": "Computer expert (can be good or bad).", + "Hack": "Cough OR Bad writer.", + "Has-been": "Former celebrity.", + "Hater": "Critic.", + "Headliner": "Main act.", + "Heartthrob": "Attractive male celebrity.", + "High five": "Hand slap gesture.", + "Hit the books": "Study.", + "Hit the hay": "Sleep.", + "Hit the spot": "Satisfied a craving.", + "Hog": "Large motorcycle (Harley) OR Greedy person.", + "Hollywood ending": "Unrealistically happy ending.", + "Homebody": "Person who prefers staying home.", + "Hoopty": "Old, broken-down car.", + "Hot mic": "Microphone left on accidentally.", + "Hype": "Excitement.", + "Influencer": "Social media celebrity.", + "Internet troll": "Person who provokes online.", + "It girl": "Popular female celebrity of the moment.", + "Jack up": "Raise price OR ruin something.", + "Jalopy": "Old car.", + "Jam": "Song OR Problem.", + "Junk mail": "Spam physical mail.", + "Keyboard warrior": "Tough guy online.", + "Killer app": "Essential software.", + "Klutz": "Clumsy person.", + "Knockoff": "Fake brand product.", + "Lag": "Delay (Internet/Video).", + "Lame": "Uncool.", + "Laugh track": "Recorded laughter in sitcoms.", + "Lead foot": "Fast driver.", + "Life hack": "Tip to make life easier.", + "Like": "Filler word (e.g., 'It was, like, crazy').", + "Listicle": "Article in list format.", + "Live stream": "Real-time video.", + "Low key": "Subtle.", + "Mainstream": "Popular culture.", + "Meme": "Viral internet joke.", + "Method acting": "Staying in character off-camera.", + "Mic drop": "Dramatic conclusion.", + "Mooc": "Massive Open Online Course.", + "Mosh pit": "Dance area.", + "Movie buff": "Film expert.", + "Mulligan": "Do-over.", + "Multitask": "Do many things at once.", + "Nerd": "Smart person.", + "Network": "Meet people for business.", + "Newbie / Noob": "Beginner.", + "Nickel and dime": "Small costs.", + "Night owl": "Person awake at night.", + "No-brainer": "Obvious choice.", + "Nomad": "Remote worker who travels.", + "Nosebleed seats": "High up, cheap seats.", + "One-hit wonder": "Brief fame.", + "Open source": "Software code available to all.", + "Oscar bait": "Movie made specifically to win awards.", + "Out of the loop": "Uninformed.", + "Outtake": "Deleted scene.", + "Over the top": "Excessive.", + "Paid programming": "Infomercial.", + "Paparazzi": "Celebrity photographers.", + "Phishing": "Email scam.", + "Photobomb": "Ruining a photo by jumping in background.", + "Pig out": "Eat a lot.", + "Pilot": "First episode of a show.", + "Pitch": "Throw.", + "Pixelated": "Low resolution image.", + "Platform": "Operating system or social site.", + "Playlist": "List of songs.", + "Plug": "Promote something.", + "Podcast": "Audio show.", + "Pop up": "Temporary store/ad.", + "Poser": "Fake person.", + "Post-credits scene": "Scene after credits roll.", + "Potluck": "Party where everyone brings a dish.", + "Premiere": "First showing.", + "Prequel": "Movie set before the original.", + "Prime time": "Peak TV viewing hours (8-11pm).", + "Product placement": "Brands shown in movies.", + "Promo": "Advertisement.", + "Props": "Respect.", + "Public domain": "No copyright.", + "Punt": "Delay decision.", + "Push notification": "Phone alert.", + "Put on blast": "Publicly criticize.", + "Queue": "Line (Netflix queue, rarely used for people).", + "Quit cold turkey": "Stop immediately.", + "Rage quit": "Stop playing game in anger.", + "Rating": "Audience size OR Content age limit (PG-13, R).", + "Reboot": "Restarting a movie franchise.", + "Recap": "Summary.", + "Red carpet": "Celebrity walkway.", + "Release date": "Launch day.", + "Remake": "New version of old movie.", + "Remote": "TV controller (Clicker).", + "Rerun": "Repeat of a TV show.", + "Review bomb": "Flooding a product with negative reviews.", + "Riff": "Improvise.", + "Rip off": "Theft.", + "Road trip": "Long car journey.", + "Rock bottom": "Lowest point.", + "Role model": "Person to imitate.", + "Rom-com": "Romantic Comedy.", + "Root for": "Support a team.", + "Rubberneck": "Stare.", + "Screen time": "Time spent on devices.", + "Screenshot": "Image of screen.", + "Script": "Written dialogue.", + "Season finale": "Last episode of season.", + "Selfie": "Photo of oneself.", + "Sell out": "Compromise integrity for money.", + "Sequel": "Follow-up movie.", + "Server": "Computer host OR Waiter.", + "Shade": "Insult.", + "Shipping": "Wanting two characters to date.", + "Showrunner": "TV producer in charge.", + "Sidekick": "Helper.", + "Sign off": "Log out / Goodbye.", + "Silver screen": "Movies.", + "Sitcom": "Situation Comedy.", + "Sleeper hit": "Unexpected success.", + "Slacker": "Lazy person.", + "Slapstick": "Physical comedy.", + "Slasher": "Horror movie with killer.", + "Slow motion": "Reduced speed.", + "Smartphone": "iPhone/Android.", + "Smash hit": "Huge success.", + "Sneak peek": "Preview.", + "Soap opera": "Melodramatic daily drama.", + "Social butterfly": "Outgoing person.", + "Soft launch": "Quiet release.", + "Sound bite": "Short audio clip.", + "Soundtrack": "Movie music.", + "Spam": "Junk mail.", + "Special effects (FX)": "CGI/Visual tricks.", + "Spin-off": "Show derived from another.", + "Spoiler": "Revealing the ending.", + "Sponsored": "Paid for by brand.", + "Spotlight": "Attention.", + "Squad": "Team.", + "Stage fright": "Fear.", + "Stand-up": "Comedy performance.", + "Star-struck": "Awed by celebrity.", + "Startup": "New tech company.", + "Status symbol": "Item showing wealth.", + "Steal the show": "Outperform the lead.", + "Streaming": "Watching online (Netflix).", + "Stunt double": "Actor for dangerous scenes.", + "Subscribe": "Follow channel.", + "Subtitle": "Text at bottom.", + "Super bowl": "Championship football game (Ad event).", + "Surge pricing": "Higher price at peak time (Uber).", + "Swipe left/right": "Reject/Accept (Tinder).", + "Syndication": "Selling show to many channels.", + "Tabloid": "Gossip newspaper.", + "Tag": "Label.", + "Takeout": "Food.", + "Talk show": "Interview program.", + "Techie": "Technology expert.", + "Teaser": "Short trailer.", + "Teleprompter": "Script reader.", + "The cloud": "Online storage.", + "Throwback": "Nostalgic reference.", + "Thumbnail": "Small preview image.", + "Ticket scalper": "Reseller of tickets.", + "Title track": "Song with same name as album.", + "To-go box": "Container for leftovers.", + "Touchscreen": "Interactive screen.", + "Trailer": "Movie advertisement.", + "Trending": "Popular now.", + "Troll": "Annoy.", + "Turnpike": "Toll road.", + "Tweet": "Post.", + "Twist ending": "Surprise conclusion.", + "Typecast": "Actor stuck in one role type.", + "Unfriend": "Remove connection.", + "Unsubscribe": "Stop emails.", + "Update": "New version.", + "Upgrade": "Better version.", + "Upload": "Send file.", + "User interface (UI)": "Screen layout.", + "Username": "Login name.", + "Vaporware": "Software announced but never released.", + "Variety show": "Mixed performance.", + "Viral": "Popular online.", + "Virtual reality": "Simulated world.", + "Vlog": "Video blog.", + "Voiceover": "Off-screen narration.", + "Walk-on": "Minor role.", + "Wallet": "Digital payment holder.", + "Webinar": "Online seminar.", + "Wifi": "Wireless internet.", + "Widget": "Small app tool.", + "Wiki": "Collaborative site.", + "Window shopping": "Browsing without buying.", + "Wingman": "Friend helping with dating.", + "Wire": "Listening device.", + "Wireless": "Radio (Old) or Wifi (New).", + "Word of mouth": "Recommendation.", + "Wrap party": "Party when filming ends.", + "Writer's block": "Inability to write.", + "Yellow journalism": "Sensationalist news.", + "Youtuber": "Video creator.", + "Zero hour": "Start.", + "Zombie": "Mindless person.", + "Zoom": "Fast.", + "10-4": "Okay / Understood (Trucker).", + "9-to-5": "Standard workday.", + "A.W.O.L.": "Absent Without Leave (Missing).", + "Ace in the hole": "Secret advantage.", + "All in": "Committed fully.", + "Ambulance chaser": "Unethical lawyer seeking injury cases.", + "Amen corner": "Group of people who agree with everything said.", + "Ante up": "Pay your share.", + "As is": "Sold in current condition (no repairs/refunds).", + "Baby shower": "Party for a pregnant woman.", + "Bachelor party": "Party for groom before wedding.", + "Bachelorette party": "Party for bride before wedding.", + "Backyard": "Private garden behind house.", + "Ball drop": "New Year's Eve event in NYC.", + "Band-Aid": "Adhesive bandage (Brand name used as generic).", + "Barbecue (BBQ)": "Outdoor grilling party.", + "Bedside manner": "A doctor's ability to be empathetic.", + "Bet the farm": "Risk everything.", + "Bible thumper": "Aggressive religious evangelist.", + "Big box store": "Large retail chain (Walmart, Costco).", + "Black sheep": "Outcast family member.", + "Block party": "Neighborhood street party.", + "Blue laws": "Sunday alcohol bans.", + "Blue-light special": "Discount sale (K-Mart reference).", + "Bookie": "Person who takes illegal bets.", + "Boots on the ground": "Troops in the field.", + "Bottom feeder": "Opportunist who profits from others' misfortune.", + "Break even": "Make no profit but no loss.", + "Brownie points": "Credit for doing a good deed.", + "Bullseye": "Direct hit / Perfect.", + "Bundling": "Combining insurance/services for a discount.", + "Call someone's bluff": "Challenge someone to prove they aren't lying.", + "Card shark": "Skilled (or cheating) card player.", + "Cash out": "Take money and leave.", + "Chapstick": "Lip balm.", + "Clean bill of health": "Doctor says you are healthy.", + "Cleanup hitter": "Strongest person on the team.", + "Close to the vest": "Secretive.", + "Cold case": "Unsolved crime.", + "Collateral damage": "Unintended casualties.", + "Come to Jesus": "Serious realization.", + "Co-sign": "Guarantee a loan OR Agree with someone.", + "Coupon clipper": "Frugal person.", + "Cover charge": "Entry fee for a club.", + "Crapshoot": "Risky/Unpredictable situation.", + "Cut the mustard": "Meet the standard.", + "Dead on arrival (DOA)": "Already failed before starting.", + "Double or nothing": "Betting everything to win double or lose all.", + "Down to the wire": "Until the very last moment.", + "Drive-by": "Shooting from a car OR Brief visit.", + "Dry run": "Rehearsal.", + "Duct tape": "Silver adhesive tape (Fixes everything).", + "Early bird special": "Discount dinner for seniors.", + "Elbow grease": "Physical effort.", + "End zone": "Goal area (Football).", + "ER": "Emergency Room.", + "Estate sale": "Selling everything inside a house (usually after death).", + "Eye in the sky": "Traffic helicopter or Casino cameras.", + "Fall guy": "Person who takes the blame.", + "Fold": "Quit.", + "Full house": "Crowded.", + "Garage sale": "Selling old items from one's driveway.", + "Gate community": "Neighborhood with security guard.", + "Go cold turkey": "Quit abruptly.", + "Go Dutch": "Split the bill.", + "Gold star": "Reward for good behavior.", + "Good Samaritan": "Helper.", + "Graveyard shift": "Overnight work.", + "Grease someone's palm": "Bribe someone.", + "Groundhog Day": "Repeating situation.", + "Handyman": "Person who does small home repairs.", + "Happy camper": "Satisfied person.", + "Hard ball": "Aggressive negotiation.", + "Hat trick": "Three successes in a row.", + "Head-to-head": "Direct competition.", + "High roller": "Big spender.", + "Hold the fort": "Maintain order while leader is away.", + "Home court advantage": "Advantage of being in familiar territory.", + "House money": "Risk-free profit.", + "Hump day": "Wednesday.", + "Inside job": "Crime by employee.", + "Jury duty": "Mandatory service in court.", + "Kleenex": "Tissue paper.", + "Last ditch effort": "Final attempt.", + "Laymans terms": "Simple language.", + "Leftovers": "Uneaten food saved for later.", + "M.I.A.": "Missing In Action.", + "Mall cop": "Security guard.", + "Man cave": "Room in house for husband's hobbies.", + "Moon shot": "Ambitious project.", + "Nest egg": "Retirement savings.", + "Nightcap": "Final drink before bed.", + "No dice": "Refusal.", + "Nosebleed section": "Highest, cheapest seats.", + "Off the wagon": "Drinking alcohol after being sober.", + "On the house": "Free.", + "On the wagon": "Sober.", + "Open house": "Scheduled time to view a house for sale.", + "Out in left field": "Crazy / Wrong.", + "Pass the buck": "Blame others.", + "Paycheck to paycheck": "Having no savings.", + "Play hooky": "Skip school/work.", + "Play it safe": "Avoid risk.", + "Poker face": "Stoic expression.", + "Pro bono": "Free legal work.", + "Q-Tip": "Cotton swab.", + "Raise the bar": "Increase standards.", + "Riding the bench": "Not participating.", + "Ring a bell?": "Sound familiar?", + "Rough patch": "Difficult time.", + "Run the table": "Win every game.", + "Scotch tape": "Clear adhesive tape.", + "Second opinion": "Seeing a different doctor for confirmation.", + "Sharpie": "Permanent marker.", + "Shotgun wedding": "Forced marriage due to pregnancy.", + "Show and Tell": "School activity.", + "Sitting duck": "Easy target.", + "Skeleton in the closet": "Hidden secret.", + "Snake eyes": "Bad luck.", + "Snow day": "School cancelled due to snow.", + "Soccer mom": "Stereotypical suburban mother.", + "Spiel": "Rehearsed speech/Sales pitch.", + "Spring break": "Holiday.", + "Sticky note": "Post-it note.", + "Stocking stuffer": "Small Christmas gift.", + "Sunday driver": "Slow driver.", + "Sunday best": "Best clothes (for church).", + "Sweatshop": "Factory with bad conditions.", + "Swing shift": "Evening work.", + "Take a knee": "Pause / Rest.", + "Thanksgiving": "Major November holiday (Turkey).", + "The house always wins": "The system is rigged.", + "Throw in the towel": "Quit.", + "Touchdown": "Success.", + "Trick or Treat": "Halloween phrase.", + "Tupperware": "Plastic food container.", + "Turkey Day": "Thanksgiving.", + "Under the knife": "Having surgery.", + "Upsell": "Try to sell a more expensive item.", + "Urgent Care": "Walk-in clinic (Not ER).", + "Walk of shame": "Walking home in morning after one-night stand.", + "Wet blanket": "Person who ruins fun.", + "White elephant": "Gift exchange game.", + "White picket fence": "Symbol of suburban ideal.", + "Wild card": "Unknown.", + "Yard sale": "Garage sale.", + "Zero tolerance": "Strict rules.", + "A-Game": "Best effort.", + "Airhead": "Stupid person.", + "All ears": "Listening intently.", + "Antsy": "Restless / Anxious.", + "Baggage": "Past emotional trauma.", + "Beef": "Grudge / Conflict.", + "Beer belly": "Fat stomach from drinking.", + "Bite me": "Go away / Shut up.", + "Blabbermouth": "Person who talks too much.", + "Blast": "A very fun time.", + "Blow off steam": "Release anger/stress.", + "Blow smoke": "Exaggerate or lie to flatter someone.", + "Bombshell": "Shocking news.", + "Bone to pick": "Grievance to discuss.", + "Boundaries": "Personal limits (Therapy term).", + "Brainstorm": "Generate ideas.", + "Bummer": "Disappointing situation.", + "Busted": "Arrested / Caught.", + "Butterfingers": "Clumsy person who drops things.", + "Buzz": "Excitement / Slight intoxication.", + "Calling it quits": "Ending something (relationship/job).", + "Cardio": "Aerobic exercise.", + "Cheat day": "Day off from a diet.", + "Check it out": "Look at this.", + "Chill": "Relax / Cool.", + "Clueless": "Unaware.", + "Codependent": "Reliant on a partner (Therapy term).", + "Come clean": "Tell the truth.", + "Cop out": "Avoid responsibility.", + "Copycat": "Imitator.", + "Crush": "Romantic attraction.", + "Cut loose": "Relax / Have fun.", + "Debbie Downer": "Person who depresses others.", + "Ditch": "Leave / Abandon.", + "Drama queen": "Person who exaggerates problems.", + "Drop dead": "Go away.", + "Dweeb": "Nerd.", + "Easy-peasy": "Very easy.", + "Eat dirt": "Fall down.", + "Eat your heart out": "Be jealous.", + "Egg on your face": "Embarrassed.", + "Enabler": "Person who helps someone continue bad behavior.", + "Eye candy": "Attractive person.", + "Fair and square": "Honestly.", + "Far out": "Cool / Strange.", + "Fed up": "Annoyed / Done.", + "Flip out": "Get angry/crazy.", + "Fluke": "Lucky accident.", + "Freak out": "Panic.", + "Full of it": "Lying / Arrogant.", + "Gains": "Muscle growth.", + "Geek": "Obsessive enthusiast.", + "Get a grip": "Control yourself.", + "Get real": "Be realistic.", + "Ghost": "Leave without saying goodbye.", + "Give me a break": "Stop lying / Leave me alone.", + "Go bananas": "Go crazy.", + "Goof off": "Waste time.", + "Grab a bite": "Get food.", + "Gross": "Disgusting.", + "Gut feeling": "Intuition.", + "Guts": "Courage.", + "Hang in there": "Don't give up.", + "Hang out": "Spend time socially.", + "Hard time": "Difficulty OR Prison.", + "Head over heels": "Deeply in love.", + "Hit the sack": "Sleep.", + "Hold your horses": "Wait.", + "Hooked": "Addicted.", + "Icky": "Gross / Unpleasant.", + "In a jam": "In trouble.", + "In the doghouse": "In trouble (usually with spouse).", + "Inside scoop": "Secret information.", + "Jacked": "Very muscular.", + "Jitters": "Nervousness.", + "Junkie": "Addict.", + "Keeper": "Person worth keeping/marrying.", + "Keto": "Low carb diet.", + "Knock it off": "Stop it.", + "Knockout": "Beautiful.", + "Kosher": "Legitimate / Okay.", + "Laid back": "Relaxed.", + "Last straw": "Final annoyance.", + "Loaded": "Rich / Drunk / Gun with ammo.", + "Looker": "Attractive person.", + "Loser": "Unsuccessful person.", + "Low-life": "Criminal / Bad person.", + "Macros": "Macronutrients (Protein/Fat/Carbs).", + "Make waves": "Cause trouble.", + "Mellow": "Relaxed.", + "Mental health day": "Day off for stress.", + "Mess up": "Make a mistake.", + "Mind-blowing": "Amazing.", + "Mooch": "Beggar / Parasite.", + "Narcissist": "Self-obsessed person (Overused).", + "Nuke": "Microwave / Destroy.", + "Nuts": "Crazy.", + "Oddball": "Weird person.", + "Off the hook": "Escaped trouble OR Cool.", + "Old school": "Traditional.", + "Out of it": "Confused / Tired.", + "Pain in the neck": "Annoyance.", + "Party animal": "Person who loves parties.", + "Peanuts": "Small money.", + "Pissed": "Angry (Not drunk).", + "Pit stop": "Short break.", + "Plastic": "Credit card.", + "Pop quiz": "Surprise test.", + "Pro": "Professional.", + "Projecting": "Attributing own faults to others.", + "Psyched": "Excited.", + "Pumped": "Excited.", + "Pushy": "Aggressive.", + "Put out": "Agree to sex.", + "Rack": "Bed.", + "Rags to riches": "Poor to wealthy.", + "Rain or shine": "Whatever happens.", + "Reps": "Repetitions (Exercise).", + "Ripped": "Muscular.", + "Rip-off": "Bad deal / Scam.", + "Rookie": "Newbie.", + "Roughly": "Approximately.", + "Rule out": "Eliminate option.", + "Run out of gas": "Lose energy.", + "Rusty": "Out of practice.", + "Scaredy-cat": "Coward.", + "Scoop": "News.", + "Score": "Successful crime.", + "Self-care": "Taking care of oneself.", + "Sets": "Groups of reps (Exercise).", + "Shady": "Suspicious.", + "Sharp": "Smart OR On time.", + "Shredded": "Very muscular with low fat.", + "Sketchy": "Dangerous / Suspicious.", + "Skip": "Miss class/work.", + "Sleep on it": "Decide tomorrow.", + "Slob": "Messy person.", + "Smash": "Sex.", + "Snap": "Break.", + "Snooze": "Sleep / Boring.", + "So-so": "Okay / Average.", + "Spaced out": "Distracted.", + "Split": "Leave.", + "Spooky": "Scary.", + "Square": "Boring.", + "Stash": "Hide.", + "Steal": "Bargain.", + "Stoked": "Excited.", + "Stuffed": "Full of food.", + "Sucker": "Gullible person.", + "Sweet": "Cool.", + "Swole": "Muscular.", + "Tacky": "Cheap.", + "Tag along": "Follow.", + "Take off": "Leave.", + "Tight": "Cool.", + "Tip": "Money.", + "Toast": "Done.", + "Totaled": "Car destroyed.", + "Toxic": "Harmful person/environment.", + "Trash": "Garbage.", + "Treat": "Gift.", + "Triggered": "Emotionally provoked.", + "Twist": "Change.", + "Up tight": "Tense.", + "Validate": "Confirm feelings.", + "Wasted": "Drunk.", + "Weirdo": "Strange person.", + "Whiz": "Smart.", + "Wimp": "Weak person.", + "Wired": "Energetic / Caffeinated.", + "Wreck": "Crash.", + "2nd Amendment": "Right to own guns.", + "86ed": "Kicked out / Banned.", + "AWOL": "Absent Without Leave.", + "All hat, no cattle": "Talks big but has no substance (Texas).", + "Ammo": "Ammunition OR Arguments to use against someone.", + "Annie Oakley": "Good female shooter.", + "Bae": "Before Anyone Else (Partner).", + "Baller": "Successful / Wealthy person.", + "Benjamins": "$100 bills.", + "Big D": "Dallas, Texas.", + "Blitz": "Attack (Football/Business).", + "Boondoggle": "Wasteful government project.", + "Boot": "New recruit (Military).", + "Bounce": "Leave.", + "Brick": "Very cold (NYC slang).", + "Bubba": "Southern male (stereotype).", + "Bug out": "Leave quickly / Panic.", + "Bust a cap": "Shoot a gun.", + "Cake walk": "Easy task.", + "Cali": "California (insiders rarely say this, outsiders do).", + "Catty-corner": "Diagonal.", + "Cheddar": "Money.", + "Cheerleader": "Supporter.", + "Chow": "Food.", + "Civilian": "Non-police/military person.", + "Cockpit": "Driver's seat.", + "Come and Take It": "Gun rights slogan.", + "Creek": "Stream (Pronounced 'Crick' in some areas).", + "Crib": "Home.", + "Cut and run": "Retreat quickly.", + "DMV": "Department of Motor Vehicles (Hell on earth).", + "Defcon 1": "Maximum danger.", + "Deuce": "Two / Peace sign / Toilet.", + "Dime piece": "Perfect 10 (Attractive).", + "Dirt": "Gossip.", + "Dog tags": "Military ID.", + "Dope": "Cool OR Drugs.", + "Double-dipping": "Getting paid twice.", + "Dough": "Money.", + "Down range": "Deployed in combat zone.", + "Drill sergeant": "Strict teacher/boss.", + "Drop and give me 20": "Do 20 pushups.", + "Dutch": "Split the bill.", + "Ear hustle": "Eavesdrop.", + "Easy peasy": "Simple.", + "Eighty-six": "Cancel / Remove.", + "Empty clip": "Out of ammo/ideas.", + "FUBAR": "F***ed Up Beyond All Recognition.", + "Fall back": "Retreat / Relax.", + "Finna": "Going to (African American Vernacular).", + "Fire in the hole": "Warning of explosion.", + "Flak": "Criticism.", + "Flat": "Apartment (Rare in US, usually 'Apartment').", + "Flip-flops": "Thongs (shoes).", + "Flyover state": "Midwest (Derogatory).", + "For shizzle": "For sure (Snoop Dogg slang).", + "Forty": "40oz beer.", + "Friendly fire": "Accidentally hurting your own side.", + "Frat bro": "Stereotypical fraternity member.", + "G.I.": "Soldier (Government Issue).", + "G.O.A.T.": "Greatest of All Time.", + "Gat": "Gun.", + "Gear": "Equipment / Drugs.", + "Get lit": "Party hard.", + "Gonna": "Going to.", + "Gotcha": "I understand OR I tricked you.", + "Grass": "Marijuana.", + "Grunt": "Infantry soldier.", + "Gucci": "Good / Cool.", + "Gun nut": "Gun enthusiast.", + "Gym rat": "Fitness addict.", + "Heater": "Gun.", + "Holler": "Call out.", + "Homie": "Friend.", + "Hook 'em": "University of Texas slogan.", + "Hooah": "Army battle cry.", + "Hoorah": "Marine battle cry.", + "Hoosier": "Person from Indiana.", + "Hot mess": "Disaster person.", + "Hump": "Carry heavy load.", + "Hustle": "Scam OR Hard work.", + "Ice": "Diamonds.", + "In the paint": "Aggressive (Basketball).", + "Jaw": "Talk.", + "Jinx": "Bad luck.", + "Joe": "Coffee OR Average man.", + "John": "Toilet OR Prostitute's client.", + "Juice": "Respect / Steroids / Electricity.", + "Jungle": "Dangerous area.", + "Junk": "Genitals OR Trash.", + "K-12": "Primary and Secondary education system.", + "Keg": "Barrel of beer.", + "Kicks": "Shoes.", + "Killer": "Great.", + "Klick": "Kilometer.", + "Lock and load": "Get ready.", + "Loop": "Chicago downtown.", + "MIA": "Missing.", + "MacGyver": "Fix with random items.", + "Major league": "Big time.", + "Mall rat": "Teenager at mall.", + "Man": "Friend.", + "Mardi Gras": "New Orleans festival.", + "Midterm": "Exam.", + "Moonshine": "Illegal alcohol.", + "Mr. Mom": "Stay-at-home dad.", + "Mug": "Face.", + "Mule": "Drug smuggler.", + "O-Face": "Orgasm face.", + "One eighty (180)": "Total reversal.", + "Oscar Mike": "On the Move (Military).", + "Over and Out": "Radio sign off.", + "Packing": "Carrying a gun.", + "Pad": "Home.", + "Pal": "Friend (often sarcastic).", + "Piece": "Gun.", + "Pig": "Police (Derogatory).", + "Pigskin": "Football.", + "Player": "Promiscuous person.", + "Pop": "Soda (Midwest).", + "Postal": "Crazy.", + "Prep": "Preppy person.", + "Punk": "Troublemaker.", + "Quick buck": "Easy money.", + "Rad": "Cool.", + "Rat": "Informant.", + "Redneck": "Rural white person.", + "Ride": "Car.", + "Riding shotgun": "Front seat.", + "Rock": "Diamond / Crack.", + "Rocket science": "Difficult.", + "Roger that": "Understood.", + "Roomie": "Roommate.", + "Root": "Cheer for.", + "Round": "Bullet.", + "Rush": "Fraternity recruitment.", + "SNAFU": "Situation Normal: All F***ed Up.", + "Sandbag": "Perform poorly on purpose.", + "Scam": "Fraud.", + "School": "To teach someone a lesson.", + "Scratch": "Money.", + "Scrub": "Loser.", + "Shaft": "Unfair treatment.", + "Shook": "Scared.", + "Shoot": "Go ahead / Damn.", + "Shotgun": "Front seat.", + "Shrink": "Therapist.", + "Sleeper": "Unexpected success.", + "Slice": "Pizza portion.", + "Slugger": "Baseball player.", + "Sneakers": "Trainers.", + "SoCal": "Southern California.", + "Soda": "Soft drink.", + "Sound": "Stable.", + "Spill": "Tell.", + "Spin": "Lie.", + "Spirit": "Attitude.", + "Splash": "Impact.", + "Spoiled": "Bad.", + "Spook": "Spy.", + "Spot": "Lend money.", + "Squat": "Nothing.", + "Squeal": "Inform.", + "Stack": "Thousand dollars.", + "Stage": "Perform.", + "Star": "Famous.", + "Staycation": "Home holiday.", + "Step up": "Take charge.", + "Stick": "Manual transmission.", + "Stoned": "High.", + "Straight": "Okay / Heterosexual.", + "Street": "Urban.", + "Stretch": "Exaggeration.", + "Strike": "Failure / Labor stoppage.", + "String": "Deceive.", + "Stud": "Macho man.", + "Stuff": "Things.", + "Stump": "Confuse.", + "Suck": "Be bad.", + "Suit": "Executive.", + "Swing": "Try.", + "Swipe": "Steal.", + "Switch": "Change.", + "Syllabus week": "First week of college (Easy).", + "Tab": "Bill.", + "Tank": "Fail.", + "Tape": "Record.", + "Taps": "Funeral song.", + "Tax": "Burden.", + "Tea": "Gossip.", + "Team": "Group.", + "Tear": "Cry.", + "Tech": "Technology.", + "Teen": "Youth.", + "Tell": "Reveal.", + "Ten": "Perfect.", + "Tex-Mex": "Texas Mexican food.", + "Thanks": "Gratitude.", + "Thing": "Item.", + "Thirst": "Desire.", + "Thug": "Criminal.", + "Ticket": "Entry.", + "Time": "Clock.", + "Tool": "Jerk.", + "Top": "Best.", + "Total": "Destroy.", + "Touch": "Contact.", + "Tough": "Hard.", + "Tour": "Trip.", + "Town": "City.", + "Track": "Song.", + "Trade": "Swap.", + "Trap": "Bad place.", + "Tree": "Marijuana.", + "Trick": "Deceive.", + "Trip": "Crazy.", + "Troop": "Soldier.", + "Truck": "Vehicle.", + "Trust": "Believe.", + "Truth": "Fact.", + "Tube": "TV.", + "Tune": "Song.", + "Turf": "Territory.", + "Turkey": "Fool.", + "Turn": "Change.", + "Type": "Kind.", + "Ump": "Referee.", + "Uncle": "Surrender.", + "Unit": "Big person.", + "Up": "Awake.", + "Use": "Exploit.", + "Vamp": "Improvise.", + "Veg": "Relax.", + "Vibe": "Feeling.", + "Vic": "Victim.", + "View": "Look.", + "Vip": "Important.", + "Vote": "Choose.", + "Wack": "Bad.", + "Wad": "Money.", + "Wait": "Stop.", + "Wake": "Funeral.", + "Walk": "Go free.", + "Wall": "Barrier.", + "Want": "Desire.", + "War": "Fight.", + "Wash": "Equal.", + "Waste": "Kill.", + "Watch": "Look.", + "Wave": "Trend.", + "Wax": "Defeat.", + "Way": "Method.", + "Weak": "Funny / Lame.", + "Wear": "Tire.", + "Web": "Internet.", + "Weed": "Marijuana.", + "Week": "Seven days.", + "Weird": "Strange.", + "Well": "Good.", + "West": "Direction.", + "Wet": "Alcohol.", + "Whack": "Kill.", + "Whale": "Gambler.", + "Whip": "Car.", + "Whoa": "Stop.", + "Wick": "Fuse.", + "Wide": "Big.", + "Wife": "Spouse.", + "Wild": "Crazy.", + "Win": "Succeed.", + "Wind": "Air.", + "Wing": "Improvise.", + "Wink": "Signal.", + "Wise": "Smart.", + "Wish": "Hope.", + "With": "Together.", + "Wiz": "Smart.", + "Wolf": "Devour.", + "Wonk": "Expert.", + "Word": "Truth.", + "Work": "Job.", + "Wow": "Amaze.", + "Wrap": "Finish.", + "Write": "Note.", + "Wrong": "Incorrect.", + "Yard": "Prison outdoor area.", + "Yeah": "Yes.", + "Year": "Time.", + "Yell": "Shout.", + "Yellow": "Coward.", + "Yes": "Affirmative.", + "Yinz": "You all (Pittsburgh).", + "Yolo": "Live once.", + "Zone": "Area.", + "10-20": "Location (Police code).", + "A.P.B.": "All Points Bulletin (Missing person alert).", + "Above my pay grade": "I am not authorized/paid enough to decide this.", + "Ace": "Top pitcher OR High card.", + "ambulance chaser": "Lawyer who solicits accident victims.", + "Back to the grind": "Returning to work.", + "Badge heavy": "Cop who abuses authority.", + "Bailiff": "Courtroom security officer.", + "Bandwagon": "Joining a popular cause late.", + "Bean counter": "Accountant / Obsessive budgeter.", + "Beat": "Patrol area (Police) OR Tired.", + "Bench warrant": "Arrest order issued by a judge.", + "Big house": "Prison.", + "Big league": "Major / Important.", + "Black and white": "Police car.", + "Blue flue": "Police strike where officers call in sick.", + "Book 'em": "Process an arrest.", + "Bottom of the ninth": "Last chance.", + "Brass": "High-ranking officers/executives.", + "Break room": "Employee lounge.", + "Bullpen": "Office area with no walls OR Warm-up area.", + "C.O.": "Corrections Officer (Prison guard).", + "Canary": "Informant.", + "Case": "Investigate / Watch (Case the joint).", + "Chain of command": "Hierarchy.", + "Chasing ghosts": "Investigating leads that go nowhere.", + "Chief": "Boss (often sarcastic).", + "Circle the wagons": "Prepare for defense.", + "Clean as a whistle": "Innocent / Neat.", + "Clock watcher": "Lazy employee.", + "Collar": "To arrest.", + "Cook the books": "Falsify financial records.", + "Cop a plea": "Plead guilty for a lesser sentence.", + "Corner office": "Executive suite.", + "Cover your six": "Watch your back.", + "Cubicle farm": "Large open office.", + "Cut and dry": "Obvious / Simple.", + "DA": "District Attorney (Prosecutor).", + "Dead to rights": "Caught with undeniable proof.", + "Deep throat": "Anonymous source.", + "Desk jockey": "Office worker.", + "Detective": "Investigator.", + "Dirty": "Corrupt (Cop) OR Possessing drugs.", + "Do time": "Serve a prison sentence.", + "Double header": "Two events in one day.", + "Down for the count": "Defeated / Asleep.", + "Drop a dime": "Inform on someone.", + "Dugout": "Team bench area.", + "DUI": "Driving Under Influence.", + "Exigent circumstances": "Emergency allowing police entry without warrant.", + "Fed": "FBI agent.", + "Fink": "Informant.", + "First base": "Kissing (Dating metaphor).", + "Flatfoot": "Police officer (Old slang).", + "Foul play": "Crime suspected.", + "Foul ball": "Mistake.", + "Front line": "Workers dealing with customers.", + "Full court press": "All-out effort (Basketball).", + "G-Man": "FBI Agent.", + "Get out of jail free card": "Excuse to avoid trouble.", + "Go down swinging": "Fight until the end.", + "Golden parachute": "Big payout for fired executive.", + "Grand slam": "Total success.", + "Grease": "Bribe.", + "Greenhorn": "Inexperienced worker.", + "Gridiron": "Football field.", + "Grilling": "Interrogating.", + "Ground ball": "Easy task.", + "Gumshoe": "Detective.", + "Gun": "Accelerator (Gun it).", + "Heat": "Police OR Pressure.", + "Heavy hitter": "Influential person.", + "High noon": "Time for a showdown.", + "Hit and run": "Car accident where driver flees.", + "Hit the deck": "Drop to the ground.", + "Holding cell": "Temporary jail.", + "Home stretch": "Final phase.", + "Homicide": "Murder.", + "Honeymoon period": "Early happy phase of a job.", + "Horse trading": "Hard negotiation.", + "Hot pursuit": "Chasing a suspect.", + "Hung jury": "Jury cannot agree.", + "In the line of duty": "While working (Police).", + "Ivory tower": "Academia / Disconnected leadership.", + "John Doe": "Unidentified male.", + "K-9": "Police dog unit.", + "Keep your nose clean": "Stay out of trouble.", + "Kickback": "Bribe returned to payer.", + "Lawyer up": "Get an attorney.", + "Left field": "Unexpected place.", + "Legal eagle": "Smart lawyer.", + "Life": "Life sentence.", + "Lineup": "Suspect identification row.", + "Loan shark": "Illegal moneylender.", + "Lockdown": "Prison confinement.", + "Lone Ranger": "Person acting alone.", + "Long arm of the law": "Police reach.", + "Lookout": "Watcher for crime.", + "Make bail": "Pay to leave jail.", + "Manhunt": "Search for fugitive.", + "Miranda": "Rights read to suspect.", + "Narc": "Narcotics officer OR Snitch.", + "Nine to five": "Standard job.", + "No contest": "Plea (Nolo contendere).", + "Off the books": "Unreported cash work.", + "Off the reservation": "Acting independently/rogue.", + "On the lam": "Running from police.", + "On the take": "Accepting bribes.", + "Open and shut": "Simple case.", + "Overtime": "Extra work.", + "Paddy wagon": "Police van (Old term).", + "Parole": "Early release from prison.", + "Partner": "Cop's teammate.", + "Pat down": "Search body.", + "Pay grade": "Salary level.", + "Perk": "Benefit.", + "Perp": "Perpetrator.", + "Pinnch": "Arrest.", + "Plant": "Hidden evidence.", + "Plea bargain": "Deal for lower sentence.", + "Pound the pavement": "Look for work/leads.", + "Probation": "Supervised freedom.", + "Public defender": "Free lawyer.", + "Punch in": "Start work.", + "Quick draw": "Fast reactor.", + "Rainmaker": "Person who brings in business.", + "Rap sheet": "Criminal record.", + "Riding the pine": "Not participating.", + "Right field": "Strange / Wrong.", + "Ringers": "Professionals posing as amateurs.", + "Round up": "Gather.", + "Rubber check": "Bounced check.", + "Run the bases": "Progress sexually.", + "Safe": "Not out.", + "Scab": "Strike breaker.", + "Screw": "Prison guard.", + "Second base": "Touching (Dating).", + "Serve and protect": "Police motto.", + "Severance": "Firing pay.", + "Shakedown": "Extortion / Search.", + "Sham": "Fake.", + "Shark": "Ruthless person.", + "Sheriff": "County police chief.", + "Shift": "Work period.", + "Shoot straight": "Tell truth.", + "Shop steward": "Union rep.", + "Showdown": "Fight.", + "Shutout": "Prevent opponent from scoring.", + "Sidearm": "Pistol.", + "Sing": "Confess.", + "Siren": "Police alarm.", + "Skip bail": "Flee before court.", + "Slammer": "Jail.", + "Snake oil": "Fake medicine.", + "Snitch": "Informant.", + "Softball": "Easy question.", + "Solitary": "Isolation cell.", + "Southpaw": "Left-handed person.", + "Speed trap": "Police hiding spot.", + "Stakeout": "Surveillance.", + "Standoff": "Deadlock.", + "Statute of limitations": "Time limit on crime.", + "Sting": "Undercover operation.", + "Stool pigeon": "Informant.", + "Suspect": "Person thought to be guilty.", + "Sweat it out": "Wait nervously.", + "Tail": "Follow someone.", + "Take a dive": "Lose on purpose.", + "Take the fall": "Accept blame.", + "Talk shop": "Discuss work.", + "Team player": "Cooperative worker.", + "Third base": "Oral sex (Dating).", + "Third degree": "Intense interrogation.", + "Throw the book at": "Maximum punishment.", + "Time and a half": "Overtime pay.", + "Tip off": "Warn.", + "Turn state's evidence": "Testify against partners.", + "Undercover": "Disguised police.", + "Union": "Labor group.", + "Vice": "Drugs/Prostitution unit.", + "Walk the beat": "Patrol.", + "Warrant": "Arrest order.", + "White collar": "Office worker.", + "Wild West": "Lawless situation.", + "Wise guy": "Mobster OR Joker.", + "Witness": "Observer.", + "Workhorse": "Hard worker.", + "Write-up": "Disciplinary report.", + "Wrong side of the tracks": "Poor neighborhood.", + "Act of God": "Natural disaster (Insurance term).", + "Amen": "I agree.", + "Backslide": "Return to bad habits.", + "Backstage": "Private area.", + "Baptism by fire": "Learning something difficult quickly.", + "Bear cross": "Endure suffering.", + "Beast of burden": "Hard worker.", + "Bible belt": "Religious South.", + "Big rig": "Large truck.", + "Blind leading the blind": "Ignorant people advising others.", + "Born again": "Religious conversion.", + "Breaker 1-9": "Requesting to speak on CB radio.", + "Broken record": "Repeating oneself.", + "Brother's keeper": "Responsible for others.", + "Burn out": "Exhaustion.", + "Cast the first stone": "Criticize hypocritically.", + "Chart-topper": "Popular song.", + "Choir": "Group of singers OR People who already agree (Preach to the choir).", + "Convoy": "Group of vehicles.", + "Cooking with gas": "Doing well.", + "Cover": "Remake of a song OR Entry fee.", + "Cross to bear": "Burden.", + "Daily bread": "Earnings.", + "Damned if you do": "No good option.", + "Deadhead": "Empty return trip (Trucking).", + "Deal with the devil": "Risky compromise.", + "Devil's advocate": "Argue opposite side.", + "Dicey": "Risky.", + "Doubting Thomas": "Skeptic.", + "Down and out": "Destitute.", + "Drop the mic": "End impressively.", + "Eleven pro": "Top quality.", + "Eye for an eye": "Revenge.", + "Fall from grace": "Loss of status.", + "Fat lady sings": "The end.", + "Forbidden fruit": "Illicit pleasure.", + "Four-wheeler": "Car (Trucker slang).", + "Give up the ghost": "Die / Quit.", + "Go for broke": "Risk all.", + "God forbid": "Hopefully not.", + "Gospel truth": "Absolute truth.", + "Grail": "Ultimate goal.", + "Groupie": "Obsessive fan.", + "Hallelujah": "Celebration.", + "Heavy metal": "Music genre OR Big machines.", + "Hell-bent": "Determined.", + "Holier than thou": "Arrogant morality.", + "Holy cow": "Wow.", + "Holy grail": "Best thing.", + "Hymn": "Song.", + "Idol": "Celebrity.", + "Jezebel": "Immoral woman.", + "Jonah": "Bad luck person.", + "Judas": "Traitor.", + "Judge not": "Don't criticize.", + "Keep on trucking": "Persist.", + "King of the road": "Trucker.", + "Kiss of death": "Fatal event.", + "Land of milk and honey": "Rich place.", + "Last supper": "Final meal.", + "Lay cards on table": "Reveal truth.", + "Let there be light": "Start.", + "Lip sync": "Fake singing.", + "Long haul": "Long time.", + "Lost cause": "Hopeless.", + "Lottery": "Luck.", + "Luck of the draw": "Chance.", + "Manna": "Unexpected gift.", + "Mark of the beast": "Evil sign.", + "Mecca": "Center of activity.", + "Messiah": "Savior.", + "Methuselah": "Old person.", + "Miracle": "Amazing event.", + "Moment of truth": "Critical time.", + "Money changes everything": "Cynical motto.", + "Move mountains": "Do impossible.", + "My cross to bear": "My burden.", + "New lease on life": "Fresh start.", + "Noah's ark": "Safe place.", + "Odds": "Probability.", + "Off the charts": "Amazing.", + "Olive branch": "Peace offer.", + "On a prayer": "Barely surviving.", + "Over and out": "Goodbye.", + "Over the hill": "Old.", + "Paid my dues": "Earned right.", + "Pandora's box": "Source of trouble.", + "Pariah": "Outcast.", + "Patience of Job": "Very patient.", + "Pearls before swine": "Wasting quality on unappreciative people.", + "Philistine": "Uncultured person.", + "Pot luck": "Random chance OR Meal.", + "Preach": "Speak truth.", + "Prodigal son": "Returning sinner.", + "Promised land": "Goal.", + "Prophet": "Predictor.", + "Raise the stakes": "Increase risk.", + "Rapture": "Ecstasy OR End times.", + "Reborn": "Changed.", + "Red sea": "Obstacle.", + "Rig": "Truck.", + "Roadie": "Crew member.", + "Rock and roll": "Start.", + "Rolling stone": "Wanderer.", + "Sacred cow": "Untouchable topic.", + "Saint": "Good person.", + "Salt of the earth": "Good people.", + "Samaritan": "Helper.", + "Scapegoat": "Blamed person.", + "Sell your soul": "Compromise integrity.", + "Serpent": "Traitor.", + "Seven year itch": "Boredom.", + "Shibboleth": "Password.", + "Sign from God": "Omen.", + "Sin": "Bad act.", + "Sinner": "Bad person.", + "Skin of my teeth": "Barely.", + "Sodom and Gomorrah": "Wicked place.", + "Sold out": "No tickets left OR Betrayed.", + "Solo": "Alone.", + "Sound check": "Test.", + "Spare the rod": "Spoil child.", + "Stack the deck": "Cheat.", + "Stairway to heaven": "Path to good.", + "Stake": "Bet.", + "Straight and narrow": "Honest path.", + "Strike it rich": "Win money.", + "Sure thing": "Certainty.", + "Sweeten the pot": "Add value.", + "Take a gamble": "Risk.", + "Talent": "Skill.", + "Ten-four": "Okay.", + "The house": "Casino.", + "Thirty pieces of silver": "Bribe.", + "Thomas": "Doubter.", + "Titan": "Giant.", + "Top of the charts": "Best.", + "Tower of Babel": "Confusion.", + "Turn the other cheek": "Ignore insult.", + "Twelve disciple": "Follower.", + "Two cents": "Opinion.", + "Unsung hero": "Ignored helper.", + "Up the ante": "Increase risk.", + "Valley of death": "Hard time.", + "Vegas odds": "Probability.", + "Venue": "Location.", + "Voice in wilderness": "Ignored warning.", + "Walk on water": "Do miracle.", + "Wandering Jew": "Traveler.", + "Wash hands of": "Abandon.", + "Water into wine": "Miracle.", + "Way of all flesh": "Death.", + "Wheels": "Car.", + "Wise men": "Smart people.", + "Wolf in sheep's clothing": "Enemy disguised.", + "Worship": "Adore.", + "Writing on the wall": "Impending doom." + }, + "pragmatic_rules": [ + { + "trigger": "How are you?", + "speaker_role": "Any", + "interpretation": "Standard greeting. The only correct answer is 'Good' or 'Fine'. Do not give a life update.", + "tone": "Ritualistic" + }, + { + "trigger": "We should do lunch", + "speaker_role": "Acquaintance", + "interpretation": "Polite farewell. Means 'I like you enough to lie about seeing you again'.", + "tone": "Polite/False" + }, + { + "trigger": "I'll let you go", + "speaker_role": "Initiator", + "interpretation": "I am bored or busy and want to end this conversation immediately.", + "tone": "Exit Strategy" + }, + { + "trigger": "That's interesting", + "speaker_role": "Listener", + "interpretation": "That is weird, wrong, or I disagree. (Context dependent).", + "tone": "Non-committal" + }, + { + "trigger": "I hear what you're saying", + "speaker_role": "Debater", + "interpretation": "I understand the words, but I completely disagree.", + "tone": "Dismissive" + }, + { + "trigger": "Let's take this offline", + "speaker_role": "Manager", + "interpretation": "Shut up about this topic during the meeting.", + "tone": "Directive" + }, + { + "trigger": "With all due respect", + "speaker_role": "Debater", + "interpretation": "I am about to say something disrespectful or contradictory.", + "tone": "Warning" + }, + { + "trigger": "Tell me about yourself", + "speaker_role": "Interviewer", + "interpretation": "Give me your 60-second professional pitch, not your biography.", + "tone": "Professional" + }, + { + "trigger": "Let's touch base", + "speaker_role": "Colleague", + "interpretation": "I will annoy you about this later.", + "tone": "Persistent" + }, + { + "trigger": "I'm running a few minutes late", + "speaker_role": "Arriver", + "interpretation": "I will be 10-15 minutes late.", + "tone": "Apologetic" + }, + { + "trigger": "See you later", + "speaker_role": "Leaver", + "interpretation": "Goodbye. (Does not literally mean I will see you later).", + "tone": "Casual" + }, + { + "trigger": "Excuse me", + "speaker_role": "Stranger", + "interpretation": "Get out of my way OR I need your attention.", + "tone": "Functional" + }, + { + "trigger": "It's fine", + "speaker_role": "Partner", + "interpretation": "It is absolutely not fine.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Maybe", + "speaker_role": "Invitee", + "interpretation": "No, but I don't want to hurt your feelings.", + "tone": "Avoidant" + }, + { + "trigger": "I'll think about it", + "speaker_role": "Customer", + "interpretation": "I am not buying this.", + "tone": "Polite Refusal" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are an idiot / You are pathetic.", + "tone": "Condescending" + }, + { + "trigger": "Looks great", + "speaker_role": "Reviewer", + "interpretation": "It is acceptable. (Does not necessarily mean 'great').", + "tone": "Approval" + }, + { + "trigger": "To be honest", + "speaker_role": "Speaker", + "interpretation": "I am about to be blunt or critical.", + "tone": "Warning" + }, + { + "trigger": "Just a heads up", + "speaker_role": "Messenger", + "interpretation": "Prepare for bad news or a task.", + "tone": "Alerting" + }, + { + "trigger": "Do you have a sec?", + "speaker_role": "Requester", + "interpretation": "I need 5-10 minutes of your time.", + "tone": "Minimizing" + }, + { + "trigger": "I don't care", + "speaker_role": "Decider", + "interpretation": "I am easygoing/You choose. (If angry tone: I am indifferent).", + "tone": "Neutral" + }, + { + "trigger": "Whatever", + "speaker_role": "Arguer", + "interpretation": "Fuck you / I am done talking.", + "tone": "Dismissive" + }, + { + "trigger": "Good for you", + "speaker_role": "Listener", + "interpretation": "I don't care, or I am jealous.", + "tone": "Sarcastic" + }, + { + "trigger": "Shut up!", + "speaker_role": "Friend", + "interpretation": "I can't believe it! (Expression of shock, not a command).", + "tone": "Excited" + }, + { + "trigger": "Get out of here", + "speaker_role": "Friend", + "interpretation": "You are joking/lying.", + "tone": "Disbelief" + }, + { + "trigger": "My bad", + "speaker_role": "Offender", + "interpretation": "I apologize (minor offense).", + "tone": "Casual" + }, + { + "trigger": "No worries", + "speaker_role": "Helper", + "interpretation": "You're welcome.", + "tone": "Casual" + }, + { + "trigger": "I appreciate it", + "speaker_role": "Recipient", + "interpretation": "Thank you.", + "tone": "Sincere" + }, + { + "trigger": "Can I pick your brain?", + "speaker_role": "Requester", + "interpretation": "I want free advice or consulting.", + "tone": "Flattering" + }, + { + "trigger": "Let's play it by ear", + "speaker_role": "Planner", + "interpretation": "I don't want to commit to a plan yet.", + "tone": "Flexible" + }, + { + "trigger": "Sounds like a plan", + "speaker_role": "Agreed", + "interpretation": "I agree to the proposal.", + "tone": "Affirmative" + }, + { + "trigger": "It is what it is", + "speaker_role": "Stoic", + "interpretation": "I accept this bad situation because I can't change it.", + "tone": "Resigned" + }, + { + "trigger": "Per my last email", + "speaker_role": "Sender", + "interpretation": "You are stupid/lazy for not reading what I already wrote.", + "tone": "Aggressive" + }, + { + "trigger": "Moving forward", + "speaker_role": "Manager", + "interpretation": "Stop dwelling on the mistake; here are the new rules.", + "tone": "Directive" + }, + { + "trigger": "Not a problem", + "speaker_role": "Server", + "interpretation": "You're welcome.", + "tone": "Service" + }, + { + "trigger": "What's up?", + "speaker_role": "Greeter", + "interpretation": "Hello.", + "tone": "Casual" + }, + { + "trigger": "Sup", + "speaker_role": "Greeter", + "interpretation": "Hello.", + "tone": "Very Casual" + }, + { + "trigger": "I'm good", + "speaker_role": "Refuser", + "interpretation": "No, I don't want that.", + "tone": "Polite Refusal" + }, + { + "trigger": "You're fine", + "speaker_role": "Apologee", + "interpretation": "I forgive you / It wasn't a big deal.", + "tone": "Reassuring" + }, + { + "trigger": "Have a good one", + "speaker_role": "Leaver", + "interpretation": "Have a good day/night.", + "tone": "Friendly" + }, + { + "trigger": "Take care", + "speaker_role": "Leaver", + "interpretation": "Goodbye.", + "tone": "Friendly" + }, + { + "trigger": "Could you do me a favor?", + "speaker_role": "Requester", + "interpretation": "I am about to ask for something annoying.", + "tone": "Preparation" + }, + { + "trigger": "If that makes sense", + "speaker_role": "Explainer", + "interpretation": "Am I explaining this clearly? (Insecurity marker).", + "tone": "Checking" + }, + { + "trigger": "I'm weak", + "speaker_role": "Gen Z", + "interpretation": "That is hilarious.", + "tone": "Humorous" + }, + { + "trigger": "I'm dead", + "speaker_role": "Gen Z", + "interpretation": "That is hilarious.", + "tone": "Humorous" + }, + { + "trigger": "Bet", + "speaker_role": "Gen Z", + "interpretation": "Yes / Agreed / Okay.", + "tone": "Affirmative" + }, + { + "trigger": "Say less", + "speaker_role": "Gen Z", + "interpretation": "I understand completely and agree.", + "tone": "Affirmative" + }, + { + "trigger": "Period", + "speaker_role": "Gen Z", + "interpretation": "End of discussion / Emphatic agreement.", + "tone": "Final" + }, + { + "trigger": "It's giving...", + "speaker_role": "Gen Z", + "interpretation": "It reminds me of / It has the vibe of...", + "tone": "Comparative" + }, + { + "trigger": "Are you in line?", + "speaker_role": "Queuer", + "interpretation": "Go to the back of the line.", + "tone": "Territorial" + }, + { + "trigger": "How's the food?", + "speaker_role": "Server", + "interpretation": "I am checking on you because I want a good tip.", + "tone": "Service-Polite" + }, + { + "trigger": "Keep the change", + "speaker_role": "Customer", + "interpretation": "I am tipping you the remainder.", + "tone": "Generous/Efficient" + }, + { + "trigger": "Check please", + "speaker_role": "Customer", + "interpretation": "I am ready to pay and leave immediately.", + "tone": "Direct" + }, + { + "trigger": "Do you have this in the back?", + "speaker_role": "Shopper", + "interpretation": "I don't believe you that it's out of stock.", + "tone": "Hopeful/Skeptical" + }, + { + "trigger": "I'm just looking", + "speaker_role": "Shopper", + "interpretation": "Please leave me alone; I do not want sales help.", + "tone": "Dismissive" + }, + { + "trigger": "Can I speak to your manager?", + "speaker_role": "Customer", + "interpretation": "I am about to make a serious complaint.", + "tone": "Aggressive" + }, + { + "trigger": "It's not you, it's me", + "speaker_role": "Breaker-upper", + "interpretation": "It is definitely you, but I am being polite.", + "tone": "Clich\u00e9" + }, + { + "trigger": "We need to talk", + "speaker_role": "Partner", + "interpretation": "I am breaking up with you.", + "tone": "Ominous" + }, + { + "trigger": "I'm focusing on my career", + "speaker_role": "Date", + "interpretation": "I am not interested in a relationship with you.", + "tone": "Evasive" + }, + { + "trigger": "Netflix and chill?", + "speaker_role": "Suitor", + "interpretation": "Do you want to come over for sex?", + "tone": "Suggestive" + }, + { + "trigger": "Wyd?", + "speaker_role": "Texter", + "interpretation": "What are you doing? (Often a booty call if sent late at night).", + "tone": "Casual" + }, + { + "trigger": "K.", + "speaker_role": "Texter", + "interpretation": "I am angry or annoyed.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "I'm fine.", + "speaker_role": "Partner", + "interpretation": "I am furious. Ask me what is wrong.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Whatever you want", + "speaker_role": "Partner", + "interpretation": "I don't want to decide, but I will hate what you pick.", + "tone": "Trap" + }, + { + "trigger": "Shotgun!", + "speaker_role": "Passenger", + "interpretation": "I claim the front passenger seat.", + "tone": "Competitive" + }, + { + "trigger": "Are we there yet?", + "speaker_role": "Child/Passenger", + "interpretation": "I am bored.", + "tone": "Annoying" + }, + { + "trigger": "Let's agree to disagree", + "speaker_role": "Debater", + "interpretation": "I will never agree with you, so let's stop talking.", + "tone": "Final" + }, + { + "trigger": "I'm not gonna lie", + "speaker_role": "Speaker", + "interpretation": "I am about to say something controversial.", + "tone": "Confessional" + }, + { + "trigger": "No offense, but...", + "speaker_role": "Critic", + "interpretation": "I am about to say something extremely offensive.", + "tone": "Warning" + }, + { + "trigger": "Asking for a friend", + "speaker_role": "Asker", + "interpretation": "I am asking for myself but I am embarrassed.", + "tone": "Humorous/Transparent" + }, + { + "trigger": "I'm down", + "speaker_role": "Friend", + "interpretation": "I agree to the plan.", + "tone": "Enthusiastic" + }, + { + "trigger": "I'm up for whatever", + "speaker_role": "Friend", + "interpretation": "You decide.", + "tone": "Flexible" + }, + { + "trigger": "Let's bounce", + "speaker_role": "Friend", + "interpretation": "Let's leave.", + "tone": "Casual" + }, + { + "trigger": "Did I stutter?", + "speaker_role": "Aggressor", + "interpretation": "I meant exactly what I said.", + "tone": "Confrontational" + }, + { + "trigger": "You're breaking up", + "speaker_role": "Caller", + "interpretation": "I can't hear you (or I want to hang up).", + "tone": "Functional" + }, + { + "trigger": "My phone died", + "speaker_role": "Texter", + "interpretation": "I didn't want to talk to you.", + "tone": "Excuse" + }, + { + "trigger": "Let me call you right back", + "speaker_role": "Caller", + "interpretation": "I am hanging up now. (May or may not call back).", + "tone": "Dismissive" + }, + { + "trigger": "Thanks in advance", + "speaker_role": "Emailer", + "interpretation": "I expect you to do this; you have no choice.", + "tone": "Presumptuous" + }, + { + "trigger": "Gentle reminder", + "speaker_role": "Emailer", + "interpretation": "Do your job, you are late.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Reply All", + "speaker_role": "Emailer", + "interpretation": "I want everyone to see my response.", + "tone": "Public" + }, + { + "trigger": "BCC", + "speaker_role": "Emailer", + "interpretation": "I am secretly showing this email to someone else.", + "tone": "Sneaky" + }, + { + "trigger": "Does that make sense?", + "speaker_role": "Teacher/Explainer", + "interpretation": "Did you understand me?", + "tone": "Checking" + }, + { + "trigger": "Tell me about it", + "speaker_role": "Sympathizer", + "interpretation": "I agree completely / I have had the same experience.", + "tone": "Empathetic" + }, + { + "trigger": "You can say that again", + "speaker_role": "Agreed", + "interpretation": "That is very true.", + "tone": " emphatic" + }, + { + "trigger": "Get out of town!", + "speaker_role": "Listener", + "interpretation": "I don't believe it!", + "tone": "Surprised" + }, + { + "trigger": "Hold your horses", + "speaker_role": "Advisor", + "interpretation": "Wait / Slow down.", + "tone": "Cautionary" + }, + { + "trigger": "Take a hike", + "speaker_role": "Rejector", + "interpretation": "Go away.", + "tone": "Rude" + }, + { + "trigger": "Make yourself at home", + "speaker_role": "Host", + "interpretation": "Relax.", + "tone": "Welcoming" + }, + { + "trigger": "Help yourself", + "speaker_role": "Host", + "interpretation": "Take food/drink without asking.", + "tone": "Welcoming" + }, + { + "trigger": "Do you need a bag?", + "speaker_role": "Cashier", + "interpretation": "Bags cost money now/I am ready to finish this.", + "tone": "Transactional" + }, + { + "trigger": "Have you been helped?", + "speaker_role": "Salesperson", + "interpretation": "Are you buying something or wasting time?", + "tone": "Service" + }, + { + "trigger": "I need space", + "speaker_role": "Partner", + "interpretation": "I want to be alone (pre-breakup).", + "tone": "Distancing" + }, + { + "trigger": "We're taking a break", + "speaker_role": "Partner", + "interpretation": "We are separated but not divorced/broken up yet.", + "tone": "Complicated" + }, + { + "trigger": "Friends with benefits", + "speaker_role": "Partner", + "interpretation": "Sex without romantic commitment.", + "tone": "Casual" + }, + { + "trigger": "Sliding into DMs", + "speaker_role": "Suitor", + "interpretation": "Sending a private message for romantic purposes.", + "tone": "Flirtatious" + }, + { + "trigger": "Left on read", + "speaker_role": "Victim", + "interpretation": "They saw my message and ignored it.", + "tone": "Insulted" + }, + { + "trigger": "Swipe right", + "speaker_role": "Dater", + "interpretation": "I like them.", + "tone": "Approval" + }, + { + "trigger": "Swipe left", + "speaker_role": "Dater", + "interpretation": "I reject them.", + "tone": "Rejection" + }, + { + "trigger": "Pull over", + "speaker_role": "Police/Passenger", + "interpretation": "Stop the car on the side of the road.", + "tone": "Commanding" + }, + { + "trigger": "Cut off", + "speaker_role": "Driver", + "interpretation": "Someone drove in front of me dangerously.", + "tone": "Angry" + }, + { + "trigger": "Tailgating", + "speaker_role": "Driver", + "interpretation": "Driving too close to the car in front.", + "tone": "Dangerous" + }, + { + "trigger": "Road rage", + "speaker_role": "Driver", + "interpretation": "Violent anger while driving.", + "tone": "Aggressive" + }, + { + "trigger": "Fender bender", + "speaker_role": "Driver", + "interpretation": "Minor car accident.", + "tone": "Descriptive" + }, + { + "trigger": "Rubbernecking", + "speaker_role": "Driver", + "interpretation": "Slowing down to look at an accident.", + "tone": "Annoying" + }, + { + "trigger": "Buckle up", + "speaker_role": "Driver", + "interpretation": "Put on your seatbelt.", + "tone": "Safety" + }, + { + "trigger": "Designated driver", + "speaker_role": "Friend", + "interpretation": "The sober person driving everyone home.", + "tone": "Responsible" + }, + { + "trigger": "Riding shotgun", + "speaker_role": "Passenger", + "interpretation": "Sitting in the front seat.", + "tone": "Casual" + }, + { + "trigger": "Gas guzzler", + "speaker_role": "Critic", + "interpretation": "Car with poor fuel economy.", + "tone": "Critical" + }, + { + "trigger": "Lemon law", + "speaker_role": "Owner", + "interpretation": "Laws protecting buyers of defective cars.", + "tone": "Legal" + }, + { + "trigger": "Sticker shock", + "speaker_role": "Buyer", + "interpretation": "Surprise at a high price.", + "tone": "Shocked" + }, + { + "trigger": "Buyer's remorse", + "speaker_role": "Buyer", + "interpretation": "Regret after purchasing.", + "tone": "Regretful" + }, + { + "trigger": "Retail therapy", + "speaker_role": "Shopper", + "interpretation": "Shopping to feel better.", + "tone": "Humorous" + }, + { + "trigger": "Shop till you drop", + "speaker_role": "Shopper", + "interpretation": "Shopping for a long time.", + "tone": "Enthusiastic" + }, + { + "trigger": "Window shopping", + "speaker_role": "Shopper", + "interpretation": "Looking with no intent to buy.", + "tone": "Casual" + }, + { + "trigger": "Rain check", + "speaker_role": "Shopper", + "interpretation": "Coupon for a sale item that is out of stock.", + "tone": "Transactional" + }, + { + "trigger": "Clearance", + "speaker_role": "Store", + "interpretation": "Final sale items.", + "tone": "Promotional" + }, + { + "trigger": "BOGO", + "speaker_role": "Store", + "interpretation": "Buy One Get One (Free/Half off).", + "tone": "Promotional" + }, + { + "trigger": "Price match", + "speaker_role": "Buyer", + "interpretation": "Will you match a competitor's price?", + "tone": "Negotiating" + }, + { + "trigger": "Store credit", + "speaker_role": "Clerk", + "interpretation": "Refund given as money to spend in-store only.", + "tone": "Policy" + }, + { + "trigger": "Final sale", + "speaker_role": "Clerk", + "interpretation": "No returns allowed.", + "tone": "Warning" + }, + { + "trigger": "Receipt in the bag", + "speaker_role": "Clerk", + "interpretation": "Proof of purchase is included.", + "tone": "Standard" + }, + { + "trigger": "Have a nice day", + "speaker_role": "Employee", + "interpretation": "Goodbye (Scripted).", + "tone": "Robotic/Polite" + }, + { + "trigger": "It's on the house", + "speaker_role": "Server", + "interpretation": "It is free.", + "tone": "Generous" + }, + { + "trigger": "Split the bill", + "speaker_role": "Diner", + "interpretation": "Each person pays for themselves.", + "tone": "Fair" + }, + { + "trigger": "I've got this", + "speaker_role": "Payer", + "interpretation": "I will pay for everyone.", + "tone": "Generous" + }, + { + "trigger": "To go / Takeout", + "speaker_role": "Customer", + "interpretation": "Food packaged to eat elsewhere.", + "tone": "Functional" + }, + { + "trigger": "Doggy bag", + "speaker_role": "Diner", + "interpretation": " leftovers to take home.", + "tone": "Casual" + }, + { + "trigger": "Early bird special", + "speaker_role": "Restaurant", + "interpretation": "Discount for eating early (associated with elderly).", + "tone": "Informational" + }, + { + "trigger": "Happy hour", + "speaker_role": "Bar", + "interpretation": "Discounted drinks time.", + "tone": "Fun" + }, + { + "trigger": "Last call", + "speaker_role": "Bartender", + "interpretation": "Last chance to order alcohol before closing.", + "tone": "Urgent" + }, + { + "trigger": "Cut off", + "speaker_role": "Bartender", + "interpretation": "Refusing to serve more alcohol to a drunk person.", + "tone": "Authoritative" + }, + { + "trigger": "Tab", + "speaker_role": "Customer", + "interpretation": "Bill being tallied to pay later.", + "tone": "Casual" + }, + { + "trigger": "On tap", + "speaker_role": "Bartender", + "interpretation": "Draft beer available.", + "tone": "Informational" + }, + { + "trigger": "On the rocks", + "speaker_role": "Drinker", + "interpretation": "Served with ice.", + "tone": "Specific" + }, + { + "trigger": "Neat", + "speaker_role": "Drinker", + "interpretation": "Served without ice or mixer.", + "tone": "Specific" + }, + { + "trigger": "Virgin", + "speaker_role": "Drinker", + "interpretation": "Non-alcoholic version of a drink.", + "tone": "Specific" + }, + { + "trigger": "Chug", + "speaker_role": "Drinker", + "interpretation": "Drink rapidly.", + "tone": "Aggressive/Fun" + }, + { + "trigger": "Bottoms up", + "speaker_role": "Toaster", + "interpretation": "Cheers / Drink it all.", + "tone": "Celebratory" + }, + { + "trigger": "Designated hitter", + "speaker_role": "Manager", + "interpretation": "Specialist brought in for one task.", + "tone": "Strategic" + }, + { + "trigger": "Step up to the plate", + "speaker_role": "Manager", + "interpretation": "Take responsibility.", + "tone": "Motivational" + }, + { + "trigger": "Curveball", + "speaker_role": "Victim", + "interpretation": "Unexpected event.", + "tone": "Surprised" + }, + { + "trigger": "Out in left field", + "speaker_role": "Critic", + "interpretation": "Crazy / Wrong / Unexpected.", + "tone": "Dismissive" + }, + { + "trigger": "Strike three", + "speaker_role": "Authority", + "interpretation": "You are done/fired.", + "tone": "Final" + }, + { + "trigger": "Hail Mary", + "speaker_role": "Planner", + "interpretation": "Desperate last attempt.", + "tone": "Desperate" + }, + { + "trigger": "Touchdown", + "speaker_role": "Celebrant", + "interpretation": "Success.", + "tone": "Happy" + }, + { + "trigger": "Fumble", + "speaker_role": "Critic", + "interpretation": "Mistake.", + "tone": "Critical" + }, + { + "trigger": "Blitz", + "speaker_role": "Worker", + "interpretation": "All-out effort.", + "tone": "Intense" + }, + { + "trigger": "Huddle", + "speaker_role": "Manager", + "interpretation": "Short meeting.", + "tone": "Collaborative" + }, + { + "trigger": "How are you doing?", + "speaker_role": "Cashier/Stranger", + "interpretation": "Greetings. Answer 'Good' and move on. Do not stop walking.", + "tone": "Ritualistic" + }, + { + "trigger": "Do you have a warrant?", + "speaker_role": "Citizen", + "interpretation": "I refuse to let you enter/search unless compelled by law.", + "tone": "Defensive/Legal" + }, + { + "trigger": "Am I free to go?", + "speaker_role": "Detainee", + "interpretation": "If I am not under arrest, I am leaving immediately.", + "tone": "Challenging" + }, + { + "trigger": "I'd like to speak to my attorney", + "speaker_role": "Suspect", + "interpretation": "I will stop talking to the police now.", + "tone": "Final" + }, + { + "trigger": "Thank you for your service", + "speaker_role": "Civilian", + "interpretation": "Standard polite greeting to Military/Veterans.", + "tone": "Respectful" + }, + { + "trigger": "On a scale of 1 to 10", + "speaker_role": "Doctor", + "interpretation": "Quantify your pain (10 is worst).", + "tone": "Clinical" + }, + { + "trigger": "Is this in-network?", + "speaker_role": "Patient", + "interpretation": "Will my insurance pay for this, or will I go bankrupt?", + "tone": "Anxious" + }, + { + "trigger": "Gratuity included", + "speaker_role": "Bill", + "interpretation": "Do not tip extra; it's already added (common for large groups).", + "tone": "Informational" + }, + { + "trigger": "Keep the change", + "speaker_role": "Customer", + "interpretation": "I am tipping you the coins/small bills.", + "tone": "Casual" + }, + { + "trigger": "Open House", + "speaker_role": "Realtor", + "interpretation": "Walk-ins welcome to view this home for sale.", + "tone": "Welcoming" + }, + { + "trigger": "First and Last", + "speaker_role": "Landlord", + "interpretation": "Requirement to pay the first and last month's rent upfront.", + "tone": "Financial" + }, + { + "trigger": "Credit check", + "speaker_role": "Landlord/Lender", + "interpretation": "I am investigating your financial history.", + "tone": "Investigative" + }, + { + "trigger": "Cosigner", + "speaker_role": "Lender", + "interpretation": "You are too poor/young to trust; get a parent to sign.", + "tone": "Demanding" + }, + { + "trigger": "Office Hours", + "speaker_role": "Professor", + "interpretation": "The only time you are allowed to bother me.", + "tone": "Administrative" + }, + { + "trigger": "Is this on the test?", + "speaker_role": "Student", + "interpretation": "If not, I will stop listening immediately.", + "tone": "Pragmatic" + }, + { + "trigger": "Pull an all-nighter", + "speaker_role": "Student", + "interpretation": "Study until sunrise.", + "tone": "Desperate" + }, + { + "trigger": "Toga party", + "speaker_role": "Student", + "interpretation": "Stereotypical Greek life party wearing sheets.", + "tone": "Rowdy" + }, + { + "trigger": "Going pro", + "speaker_role": "Athlete", + "interpretation": "Leaving college early to join professional sports.", + "tone": "Ambitious" + }, + { + "trigger": "Redshirt", + "speaker_role": "Athlete", + "interpretation": "Sitting out a year to extend eligibility.", + "tone": "Strategic" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are an idiot (masked as pity).", + "tone": "Condescending" + }, + { + "trigger": "Ope!", + "speaker_role": "Midwesterner", + "interpretation": "Excuse me / I bumped into you / I made a mistake.", + "tone": "Apologetic" + }, + { + "trigger": "Yeah, no", + "speaker_role": "Any", + "interpretation": "No.", + "tone": "Negative" + }, + { + "trigger": "No, yeah", + "speaker_role": "Any", + "interpretation": "Yes.", + "tone": "Affirmative" + }, + { + "trigger": "Yeah, no, for sure", + "speaker_role": "Californian", + "interpretation": "Definitely yes.", + "tone": "Affirmative" + }, + { + "trigger": "The City", + "speaker_role": "Local", + "interpretation": "The nearest major metropolis (e.g., Manhattan for NY, SF for Bay Area).", + "tone": "Specific" + }, + { + "trigger": "Out of towners", + "speaker_role": "Local", + "interpretation": "Tourists.", + "tone": "Dismissive" + }, + { + "trigger": "Fender bender", + "speaker_role": "Driver", + "interpretation": "Minor car accident.", + "tone": "Descriptive" + }, + { + "trigger": "Gridlock", + "speaker_role": "Reporter", + "interpretation": "Nothing is moving (Traffic or Congress).", + "tone": "Frustrated" + }, + { + "trigger": "Mind the gap", + "speaker_role": "Train Announcer", + "interpretation": "Watch your step.", + "tone": "Warning" + }, + { + "trigger": "Walk", + "speaker_role": "Crosswalk", + "interpretation": "Cross the street now.", + "tone": "Directive" + }, + { + "trigger": "Don't Walk", + "speaker_role": "Crosswalk", + "interpretation": "Do not cross.", + "tone": "Prohibitive" + }, + { + "trigger": "Last Call", + "speaker_role": "Bartender", + "interpretation": "Kitchen/Bar closes in 15 minutes.", + "tone": "Urgent" + }, + { + "trigger": "You're cut off", + "speaker_role": "Bartender", + "interpretation": "I will not serve you any more alcohol.", + "tone": "Authoritative" + }, + { + "trigger": "Tab open?", + "speaker_role": "Bartender", + "interpretation": "Do you want to pay now or later?", + "tone": "Transactional" + }, + { + "trigger": "Table for two?", + "speaker_role": "Host", + "interpretation": "Are you dining alone or waiting for someone?", + "tone": "Inquisitive" + }, + { + "trigger": "Booth or table?", + "speaker_role": "Host", + "interpretation": "Preference for seating style.", + "tone": "Service" + }, + { + "trigger": "On the side", + "speaker_role": "Diner", + "interpretation": "Put the sauce/dressing in a separate cup.", + "tone": "Specific" + }, + { + "trigger": "Substitute", + "speaker_role": "Diner", + "interpretation": "Swap one food item for another.", + "tone": "Requesting" + }, + { + "trigger": "Compliments of the chef", + "speaker_role": "Server", + "interpretation": "Free item given to VIPs or to apologize.", + "tone": "Generous" + }, + { + "trigger": "Are you registered to vote?", + "speaker_role": "Canvasser", + "interpretation": "I want to talk to you about politics.", + "tone": "Political" + }, + { + "trigger": "Get out the vote", + "speaker_role": "Activist", + "interpretation": "Effort to increase voter turnout.", + "tone": "Motivational" + }, + { + "trigger": "Too close to call", + "speaker_role": "Reporter", + "interpretation": "The election results are not clear yet.", + "tone": "Suspenseful" + }, + { + "trigger": "Concede", + "speaker_role": "Candidate", + "interpretation": "Admit defeat.", + "tone": "Resigned" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get an attorney immediately; you are in trouble.", + "tone": "Serious" + }, + { + "trigger": "Press charges", + "speaker_role": "Victim", + "interpretation": "Formally accuse someone of a crime.", + "tone": "Legal" + }, + { + "trigger": "Drop the charges", + "speaker_role": "Prosecutor", + "interpretation": "Stop the legal case.", + "tone": "Merciful" + }, + { + "trigger": "Off the record", + "speaker_role": "Source", + "interpretation": "You cannot publish this quote with my name.", + "tone": "Secretive" + }, + { + "trigger": "No comment", + "speaker_role": "Respondent", + "interpretation": "I will not answer (implies guilt or strategy).", + "tone": "Evasive" + }, + { + "trigger": "Confirm or deny", + "speaker_role": "Reporter", + "interpretation": "Give me a straight answer.", + "tone": "Pressing" + }, + { + "trigger": "Thoughts and prayers", + "speaker_role": "Public Figure", + "interpretation": "I am acknowledging a tragedy but offering no solution.", + "tone": "Clich\u00e9" + }, + { + "trigger": "Thank you for holding", + "speaker_role": "Service", + "interpretation": "I am back on the line after ignoring you.", + "tone": "Polite" + }, + { + "trigger": "Your call is important to us", + "speaker_role": "Recording", + "interpretation": "We are understaffed.", + "tone": "False" + }, + { + "trigger": "Have a nice day", + "speaker_role": "Any", + "interpretation": "Goodbye.", + "tone": "Ritualistic" + }, + { + "trigger": "Excuse me", + "speaker_role": "Stranger", + "interpretation": "You are in my way.", + "tone": "Polite/Annoyed" + }, + { + "trigger": "Pardon me", + "speaker_role": "Stranger", + "interpretation": "I didn't hear you OR I bumped you.", + "tone": "Formal" + }, + { + "trigger": "Watch it!", + "speaker_role": "Pedestrian", + "interpretation": "You almost hit me.", + "tone": "Aggressive" + }, + { + "trigger": "Get a room", + "speaker_role": "Observer", + "interpretation": "Stop displaying public affection.", + "tone": "Disgusted" + }, + { + "trigger": "TMI", + "speaker_role": "Listener", + "interpretation": "Too Much Information (That is gross/private).", + "tone": "Repulsed" + }, + { + "trigger": "Spill the tea", + "speaker_role": "Friend", + "interpretation": "Tell me the gossip.", + "tone": "Eager" + }, + { + "trigger": "Throw shade", + "speaker_role": "Critic", + "interpretation": "Insult subtly.", + "tone": "Negative" + }, + { + "trigger": "Cancel culture", + "speaker_role": "Critic", + "interpretation": "Boycotting someone for offensive behavior.", + "tone": "Political" + }, + { + "trigger": "Fake news", + "speaker_role": "Skeptic", + "interpretation": "I disagree with that report.", + "tone": "Dismissive" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Gen Z", + "interpretation": "You are old and out of touch.", + "tone": "Dismissive" + }, + { + "trigger": "Snowflake", + "speaker_role": "Critic", + "interpretation": "You are too sensitive.", + "tone": "Insulting" + }, + { + "trigger": "Karen", + "speaker_role": "Observer", + "interpretation": "Entitled white woman demanding a manager.", + "tone": "Derogatory" + }, + { + "trigger": "Ghosting", + "speaker_role": "Dater", + "interpretation": "Disappearing without a goodbye.", + "tone": "Avoidant" + }, + { + "trigger": "Catfishing", + "speaker_role": "Victim", + "interpretation": "Pretending to be someone else online.", + "tone": "Deceptive" + }, + { + "trigger": "Friend zone", + "speaker_role": "Suitor", + "interpretation": "Rejection of romance in favor of friendship.", + "tone": "Disappointed" + }, + { + "trigger": "It's not rocket science", + "speaker_role": "Critic", + "interpretation": "It is simple.", + "tone": "Sarcastic" + }, + { + "trigger": "Go big or go home", + "speaker_role": "Motivator", + "interpretation": "Give maximum effort.", + "tone": " intense" + }, + { + "trigger": "YOLO", + "speaker_role": "Risk-taker", + "interpretation": "You Only Live Once (Do it).", + "tone": "Reckless" + }, + { + "trigger": "FOMO", + "speaker_role": "Anxious", + "interpretation": "Fear Of Missing Out.", + "tone": "Anxious" + }, + { + "trigger": "Jinx", + "speaker_role": "Speaker", + "interpretation": "We said the same thing at the same time.", + "tone": "Playful" + }, + { + "trigger": "Knock on wood", + "speaker_role": "Speaker", + "interpretation": "I hope I didn't just jinx myself.", + "tone": "Superstitious" + }, + { + "trigger": "Fingers crossed", + "speaker_role": "Well-wisher", + "interpretation": "Hope for good luck.", + "tone": "Hopeful" + }, + { + "trigger": "Pinky swear", + "speaker_role": "Friend", + "interpretation": "Absolute promise.", + "tone": "Childish/Serious" + }, + { + "trigger": "Cross my heart", + "speaker_role": "Promiser", + "interpretation": "I am telling the truth.", + "tone": "Sincere" + }, + { + "trigger": "Finders keepers", + "speaker_role": "Claimant", + "interpretation": "I found it, so it is mine.", + "tone": "Childish" + }, + { + "trigger": "Five second rule", + "speaker_role": "Eater", + "interpretation": "Food dropped for <5 seconds is safe to eat.", + "tone": "Humorous" + }, + { + "trigger": "Shotgun", + "speaker_role": "Passenger", + "interpretation": "I claim the front seat.", + "tone": "Competitive" + }, + { + "trigger": "Not in my backyard", + "speaker_role": "Resident", + "interpretation": "I support this in theory, but not near me.", + "tone": "Hypocritical" + }, + { + "trigger": "Keep up with the Joneses", + "speaker_role": "Critic", + "interpretation": "Competing socially via material wealth.", + "tone": "Critical" + }, + { + "trigger": "Keeping it real", + "speaker_role": "Speaker", + "interpretation": "Being authentic.", + "tone": "Proud" + }, + { + "trigger": "Selling out", + "speaker_role": "Critic", + "interpretation": "Compromising values for money.", + "tone": "Accusatory" + }, + { + "trigger": "Jump the shark", + "speaker_role": "Critic", + "interpretation": "The moment quality declined significantly.", + "tone": "Critical" + }, + { + "trigger": "Drop the mic", + "speaker_role": "Performer", + "interpretation": "I have won the argument/performance.", + "tone": "Triumphant" + }, + { + "trigger": "How much do you weigh?", + "speaker_role": "Any", + "interpretation": "Extremely rude question (unless doctor). Answer in Pounds (lbs).", + "tone": "Taboo" + }, + { + "trigger": "How tall are you?", + "speaker_role": "Any", + "interpretation": "Answer in Feet and Inches (e.g., 5'10\"). Not cm.", + "tone": "Standard" + }, + { + "trigger": "What's the temperature?", + "speaker_role": "Any", + "interpretation": "Answer in Fahrenheit. (70 is nice, 100 is hot, 30 is freezing).", + "tone": "Standard" + }, + { + "trigger": "How far is it?", + "speaker_role": "Any", + "interpretation": "Answer in TIME (e.g., '20 minutes away'), not distance.", + "tone": "Practical" + }, + { + "trigger": "Who are you voting for?", + "speaker_role": "Stranger/Coworker", + "interpretation": "Dangerous question. Avoid answering to prevent conflict.", + "tone": "Taboo" + }, + { + "trigger": "How much money do you make?", + "speaker_role": "Stranger", + "interpretation": "Very rude. Do not answer.", + "tone": "Taboo" + }, + { + "trigger": "Restroom / Bathroom", + "speaker_role": "Public", + "interpretation": "Polite word for Toilet. Do not say 'Toilet' or 'Loo'.", + "tone": "Polite" + }, + { + "trigger": "Check, please", + "speaker_role": "Diner", + "interpretation": "Bring the bill.", + "tone": "Standard" + }, + { + "trigger": "To go", + "speaker_role": "Customer", + "interpretation": "Takeaway.", + "tone": "Standard" + }, + { + "trigger": "For here", + "speaker_role": "Customer", + "interpretation": "Eat in the restaurant.", + "tone": "Standard" + }, + { + "trigger": "On the house", + "speaker_role": "Server", + "interpretation": "Free.", + "tone": "Generous" + }, + { + "trigger": "Carding / I need to see ID", + "speaker_role": "Server/Bouncer", + "interpretation": "Checking age (Must be 21+ for alcohol/clubs).", + "tone": "Legal" + }, + { + "trigger": "Designated Driver", + "speaker_role": "Friend", + "interpretation": "You cannot drink tonight; you are driving.", + "tone": "Responsible" + }, + { + "trigger": "Riding Shotgun", + "speaker_role": "Passenger", + "interpretation": "I claim the front passenger seat.", + "tone": "Competitive" + }, + { + "trigger": "Buckle up", + "speaker_role": "Driver", + "interpretation": "Put on seatbelt.", + "tone": "Safety" + }, + { + "trigger": "Step on it", + "speaker_role": "Passenger", + "interpretation": "Drive faster.", + "tone": "Urgent" + }, + { + "trigger": "Cut to the chase", + "speaker_role": "Listener", + "interpretation": "Stop wasting time, get to the point.", + "tone": "Direct" + }, + { + "trigger": "Plead the Fifth", + "speaker_role": "Speaker", + "interpretation": "I refuse to answer (implies guilt/secrecy).", + "tone": "Legal/Humorous" + }, + { + "trigger": "Take the Fifth", + "speaker_role": "Speaker", + "interpretation": "Same as Plead the Fifth.", + "tone": "Legal/Humorous" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get a lawyer immediately.", + "tone": "Serious" + }, + { + "trigger": "Sue me", + "speaker_role": "Defiant", + "interpretation": "I don't care; do your worst.", + "tone": "Aggressive" + }, + { + "trigger": "See you in court", + "speaker_role": "Adversary", + "interpretation": "We will not settle this amicably.", + "tone": "Hostile" + }, + { + "trigger": "Off the record", + "speaker_role": "Speaker", + "interpretation": "This is private; do not repeat it publicly.", + "tone": "Confidential" + }, + { + "trigger": "No comment", + "speaker_role": "Speaker", + "interpretation": "I will not answer.", + "tone": "Evasive" + }, + { + "trigger": "Press charges", + "speaker_role": "Victim", + "interpretation": "Request police to prosecute.", + "tone": "Legal" + }, + { + "trigger": "Drop the charges", + "speaker_role": "Victim", + "interpretation": "Stop the prosecution.", + "tone": "Forgiving" + }, + { + "trigger": "Bail out", + "speaker_role": "Friend", + "interpretation": "Pay money to get someone out of jail OR leave a situation.", + "tone": "Rescue" + }, + { + "trigger": "Pink slip", + "speaker_role": "Boss", + "interpretation": "You are fired.", + "tone": "Negative" + }, + { + "trigger": "Let you go", + "speaker_role": "Boss", + "interpretation": "You are fired (Euphemism).", + "tone": "Corporate" + }, + { + "trigger": "Downsizing", + "speaker_role": "Company", + "interpretation": "Mass firing.", + "tone": "Corporate" + }, + { + "trigger": "Severance package", + "speaker_role": "HR", + "interpretation": "Money paid upon firing.", + "tone": "Financial" + }, + { + "trigger": "Two weeks notice", + "speaker_role": "Employee", + "interpretation": "Standard warning before quitting.", + "tone": "Professional" + }, + { + "trigger": "Call in sick", + "speaker_role": "Employee", + "interpretation": "Inform boss you aren't coming today.", + "tone": "Standard" + }, + { + "trigger": "Play hooky", + "speaker_role": "Student/Employee", + "interpretation": "Skip school/work without permission.", + "tone": "Rebellious" + }, + { + "trigger": "Moonlighting", + "speaker_role": "Worker", + "interpretation": "Working a second job secretly.", + "tone": "Secretive" + }, + { + "trigger": "Under the table", + "speaker_role": "Payer", + "interpretation": "Illegal cash payment (no tax).", + "tone": "Illegal" + }, + { + "trigger": "Clock in / Clock out", + "speaker_role": "Worker", + "interpretation": "Record start/end time.", + "tone": "Standard" + }, + { + "trigger": "Overtime", + "speaker_role": "Worker", + "interpretation": "Work >40 hours (paid 1.5x).", + "tone": "Financial" + }, + { + "trigger": "Benefits", + "speaker_role": "HR", + "interpretation": "Health insurance/401k (Crucial part of job).", + "tone": "Important" + }, + { + "trigger": "Open enrollment", + "speaker_role": "HR", + "interpretation": "Time to pick insurance plan.", + "tone": "Administrative" + }, + { + "trigger": "Deductible", + "speaker_role": "Insurer", + "interpretation": "Amount you pay before insurance helps.", + "tone": "Financial" + }, + { + "trigger": "Out of pocket", + "speaker_role": "Payer", + "interpretation": "Paying own money.", + "tone": "Financial" + }, + { + "trigger": "Copay", + "speaker_role": "Patient", + "interpretation": "Fee for doctor visit.", + "tone": "Financial" + }, + { + "trigger": "In-network", + "speaker_role": "Patient", + "interpretation": "Covered by insurance.", + "tone": "Relieved" + }, + { + "trigger": "Out-of-network", + "speaker_role": "Patient", + "interpretation": "Not covered; very expensive.", + "tone": "Scary" + }, + { + "trigger": "Pre-existing condition", + "speaker_role": "Insurer", + "interpretation": "Health issue you had before insurance.", + "tone": "Medical" + }, + { + "trigger": "Generic", + "speaker_role": "Pharmacist", + "interpretation": "Non-brand name drug (Cheaper).", + "tone": "Practical" + }, + { + "trigger": "Over the counter (OTC)", + "speaker_role": "Pharmacist", + "interpretation": "Drug bought without prescription.", + "tone": "Standard" + }, + { + "trigger": "Prescription", + "speaker_role": "Doctor", + "interpretation": "Note allowing purchase of strong drugs.", + "tone": "Legal" + }, + { + "trigger": "911", + "speaker_role": "Caller", + "interpretation": "Emergency number.", + "tone": "Urgent" + }, + { + "trigger": "Amber Alert", + "speaker_role": "Phone", + "interpretation": "Child abduction warning.", + "tone": "Alarming" + }, + { + "trigger": "Silver Alert", + "speaker_role": "Phone", + "interpretation": "Missing elderly person.", + "tone": "Alarming" + }, + { + "trigger": "Active Shooter", + "speaker_role": "News/Police", + "interpretation": "Person shooting people currently.", + "tone": "Terrifying" + }, + { + "trigger": "Lockdown", + "speaker_role": "School/Police", + "interpretation": "Stay inside, lock doors.", + "tone": "Protective" + }, + { + "trigger": "Shelter in place", + "speaker_role": "Authority", + "interpretation": "Do not leave the building.", + "tone": "Protective" + }, + { + "trigger": "Evacuate", + "speaker_role": "Authority", + "interpretation": "Leave the area immediately.", + "tone": "Urgent" + }, + { + "trigger": "Curfew", + "speaker_role": "Police", + "interpretation": "Illegal to be outside after X time.", + "tone": "Legal" + }, + { + "trigger": "Jaywalking", + "speaker_role": "Police", + "interpretation": "Crossing street illegally.", + "tone": "Minor crime" + }, + { + "trigger": "Miranda Rights", + "speaker_role": "Police", + "interpretation": "You have the right to remain silent...", + "tone": "Legal" + }, + { + "trigger": "Resisting arrest", + "speaker_role": "Police", + "interpretation": "Fighting back against police.", + "tone": "Serious crime" + }, + { + "trigger": "Probable cause", + "speaker_role": "Police", + "interpretation": "Legal reason to search.", + "tone": "Legal" + }, + { + "trigger": "Warrant", + "speaker_role": "Citizen", + "interpretation": "Document allowing search.", + "tone": "Legal" + }, + { + "trigger": "Plea bargain", + "speaker_role": "Lawyer", + "interpretation": "Admit guilt for less punishment.", + "tone": "Legal" + }, + { + "trigger": "Hung jury", + "speaker_role": "Court", + "interpretation": "Jury cannot agree on verdict.", + "tone": "Legal" + }, + { + "trigger": "Double jeopardy", + "speaker_role": "Court", + "interpretation": "Cannot be tried twice for same crime.", + "tone": "Legal" + }, + { + "trigger": "Fifth Amendment", + "speaker_role": "Court", + "interpretation": "Right against self-incrimination.", + "tone": "Legal" + }, + { + "trigger": "First Amendment", + "speaker_role": "Citizen", + "interpretation": "Freedom of Speech.", + "tone": "Political" + }, + { + "trigger": "Second Amendment", + "speaker_role": "Citizen", + "interpretation": "Right to bear arms (Guns).", + "tone": "Political" + }, + { + "trigger": "Concealed carry", + "speaker_role": "Gun Owner", + "interpretation": "Hiding a gun on your person legally.", + "tone": "Political" + }, + { + "trigger": "Open carry", + "speaker_role": "Gun Owner", + "interpretation": "Showing a gun openly.", + "tone": "Political" + }, + { + "trigger": "Background check", + "speaker_role": "Seller", + "interpretation": "Checking criminal history.", + "tone": "Standard" + }, + { + "trigger": "Red state", + "speaker_role": "Pundit", + "interpretation": "Republican/Conservative state.", + "tone": "Political" + }, + { + "trigger": "Blue state", + "speaker_role": "Pundit", + "interpretation": "Democrat/Liberal state.", + "tone": "Political" + }, + { + "trigger": "Swing state", + "speaker_role": "Pundit", + "interpretation": "State that decides the election.", + "tone": "Political" + }, + { + "trigger": "Purple state", + "speaker_role": "Pundit", + "interpretation": "Mixed political state.", + "tone": "Political" + }, + { + "trigger": "Bible Belt", + "speaker_role": "Sociologist", + "interpretation": "Religious Southern US.", + "tone": "Cultural" + }, + { + "trigger": "Rust Belt", + "speaker_role": "Sociologist", + "interpretation": "Industrial Midwest (De-industrialized).", + "tone": "Cultural" + }, + { + "trigger": "Sun Belt", + "speaker_role": "Sociologist", + "interpretation": "Warm Southern/Western states.", + "tone": "Cultural" + }, + { + "trigger": "Midwest nice", + "speaker_role": "Sociologist", + "interpretation": "Polite but passive-aggressive behavior.", + "tone": "Cultural" + }, + { + "trigger": "Southern hospitality", + "speaker_role": "Southerner", + "interpretation": "Welcoming guests warmly.", + "tone": "Positive" + }, + { + "trigger": "New York Minute", + "speaker_role": "New Yorker", + "interpretation": "Very fast.", + "tone": "Fast" + }, + { + "trigger": "Vegas Rule", + "speaker_role": "Tourist", + "interpretation": "What happens here, stays here.", + "tone": "Secretive" + }, + { + "trigger": "Florida Man", + "speaker_role": "Internet", + "interpretation": "Crazy criminal news story.", + "tone": "Humorous" + }, + { + "trigger": "The Burbs", + "speaker_role": "Resident", + "interpretation": "Suburbs.", + "tone": "Boring/Safe" + }, + { + "trigger": "Downtown", + "speaker_role": "Resident", + "interpretation": "City Center.", + "tone": "Urban" + }, + { + "trigger": "Uptown", + "speaker_role": "Resident", + "interpretation": "Residential/Wealthier part of city.", + "tone": "Urban" + }, + { + "trigger": "Main Street", + "speaker_role": "Politician", + "interpretation": "Small businesses/Average people.", + "tone": "Political" + }, + { + "trigger": "Wall Street", + "speaker_role": "Politician", + "interpretation": "Big banks/Finance.", + "tone": "Political" + }, + { + "trigger": "Silicon Valley", + "speaker_role": "Techie", + "interpretation": "Tech Industry.", + "tone": "Tech" + }, + { + "trigger": "Hollywood", + "speaker_role": "Actor", + "interpretation": "Movie Industry.", + "tone": "Entertainment" + }, + { + "trigger": "The Hill", + "speaker_role": "Politician", + "interpretation": "Capitol Hill / Congress.", + "tone": "Political" + }, + { + "trigger": "The White House", + "speaker_role": "News", + "interpretation": "The President/Executive Branch.", + "tone": "Political" + }, + { + "trigger": "Uncle Sam", + "speaker_role": "Patriot", + "interpretation": "The US Government.", + "tone": "Personification" + }, + { + "trigger": "G.I. Joe", + "speaker_role": "Soldier", + "interpretation": "Standard soldier.", + "tone": "Military" + }, + { + "trigger": "Stars and Stripes", + "speaker_role": "Patriot", + "interpretation": "The Flag.", + "tone": "Patriotic" + }, + { + "trigger": "Old Glory", + "speaker_role": "Patriot", + "interpretation": "The Flag.", + "tone": "Patriotic" + }, + { + "trigger": "Pledge of Allegiance", + "speaker_role": "Student", + "interpretation": "Loyalty oath said in schools.", + "tone": "Ritualistic" + }, + { + "trigger": "National Anthem", + "speaker_role": "Singer", + "interpretation": "Star Spangled Banner.", + "tone": "Ritualistic" + }, + { + "trigger": "Take a knee", + "speaker_role": "Activist", + "interpretation": "Protest during anthem.", + "tone": "Political" + }, + { + "trigger": "Did you see the game?", + "speaker_role": "Greeter", + "interpretation": "Generic small talk. Usually refers to NFL (Football).", + "tone": "Casual" + }, + { + "trigger": "No spoilers!", + "speaker_role": "Listener", + "interpretation": "Do not tell me what happens in the movie/show.", + "tone": "Warning" + }, + { + "trigger": "I'm binging it", + "speaker_role": "Viewer", + "interpretation": "I am watching every episode rapidly.", + "tone": "Obsessive" + }, + { + "trigger": "It broke the internet", + "speaker_role": "Commentator", + "interpretation": "It was extremely popular/controversial.", + "tone": "Hyperbolic" + }, + { + "trigger": "Swipe left", + "speaker_role": "Judge", + "interpretation": "I reject this person/idea.", + "tone": "Dismissive" + }, + { + "trigger": "Swipe right", + "speaker_role": "Judge", + "interpretation": "I accept/like this.", + "tone": "Approval" + }, + { + "trigger": "DM me", + "speaker_role": "User", + "interpretation": "Send me a private Direct Message.", + "tone": "Direct" + }, + { + "trigger": "Link in bio", + "speaker_role": "Influencer", + "interpretation": "Go to my profile to click the link.", + "tone": "Promotional" + }, + { + "trigger": "Like and Subscribe", + "speaker_role": "Creator", + "interpretation": "Please support my channel.", + "tone": "Standard" + }, + { + "trigger": "Don't read the comments", + "speaker_role": "Advisor", + "interpretation": "The comment section is toxic/negative.", + "tone": "Warning" + }, + { + "trigger": "Pics or it didn't happen", + "speaker_role": "Skeptic", + "interpretation": "I need photographic proof.", + "tone": "Challenging" + }, + { + "trigger": "Too long; didn't read (TL;DR)", + "speaker_role": "Reader", + "interpretation": "Summary for lazy people.", + "tone": "Summary" + }, + { + "trigger": "Ask Me Anything (AMA)", + "speaker_role": "Expert", + "interpretation": "Q&A session.", + "tone": "Open" + }, + { + "trigger": "Throwback Thursday (TBT)", + "speaker_role": "Poster", + "interpretation": "Posting an old photo.", + "tone": "Nostalgic" + }, + { + "trigger": "Fear of Missing Out (FOMO)", + "speaker_role": "Anxious", + "interpretation": "I must go or I will regret it.", + "tone": "Anxious" + }, + { + "trigger": "YOLO", + "speaker_role": "Risk-taker", + "interpretation": "You Only Live Once (Just do it).", + "tone": "Reckless" + }, + { + "trigger": "Karen", + "speaker_role": "Observer", + "interpretation": "Entitled complainer.", + "tone": "Derogatory" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Youth", + "interpretation": "Old person opinion dismissed.", + "tone": "Dismissive" + }, + { + "trigger": "Ghosted", + "speaker_role": "Victim", + "interpretation": "They stopped replying.", + "tone": "Sad" + }, + { + "trigger": "Catfished", + "speaker_role": "Victim", + "interpretation": "Tricked by fake profile.", + "tone": "Embarrassed" + }, + { + "trigger": "Troll", + "speaker_role": "User", + "interpretation": "Don't feed the troll (Don't reply).", + "tone": "Warning" + }, + { + "trigger": "Ratio'd", + "speaker_role": "Twitter User", + "interpretation": "Replies > Likes (You had a bad take).", + "tone": "Mocking" + }, + { + "trigger": "Stan", + "speaker_role": "Fan", + "interpretation": "I am a super-fan.", + "tone": "Intense" + }, + { + "trigger": "Cringe", + "speaker_role": "Critic", + "interpretation": "Second-hand embarrassment.", + "tone": "Judgmental" + }, + { + "trigger": "Based", + "speaker_role": "Commenter", + "interpretation": "I agree / You are courageous.", + "tone": "Approval" + }, + { + "trigger": "Cap / No Cap", + "speaker_role": "Gen Z", + "interpretation": "Lie / Truth.", + "tone": "Verifying" + }, + { + "trigger": "Bet", + "speaker_role": "Gen Z", + "interpretation": "Yes / Okay.", + "tone": "Agreement" + }, + { + "trigger": "Slaps", + "speaker_role": "Listener", + "interpretation": "This song is good.", + "tone": "Approval" + }, + { + "trigger": "Sus", + "speaker_role": "Gamer", + "interpretation": "Suspicious.", + "tone": "Suspicious" + }, + { + "trigger": "Tea", + "speaker_role": "Gossip", + "interpretation": "Gossip/Truth.", + "tone": "Secretive" + }, + { + "trigger": "Receipts", + "speaker_role": "Arguer", + "interpretation": "Evidence (screenshots).", + "tone": "Proof" + }, + { + "trigger": "Woke", + "speaker_role": "Critic/Activist", + "interpretation": "Politically aware (or insult for overly PC).", + "tone": "Political" + }, + { + "trigger": "Cancel", + "speaker_role": "Activst", + "interpretation": "Boycott person.", + "tone": "Punitive" + }, + { + "trigger": "Clout", + "speaker_role": "Influencer", + "interpretation": "Fame/Influence.", + "tone": "Status" + }, + { + "trigger": "Flex", + "speaker_role": "Show-off", + "interpretation": "Show off wealth/strength.", + "tone": "Arrogant" + }, + { + "trigger": "Glow up", + "speaker_role": "Observer", + "interpretation": "Improvement in appearance.", + "tone": "Complimentary" + }, + { + "trigger": "Gucci", + "speaker_role": "Slang", + "interpretation": "Good / Cool.", + "tone": "Positive" + }, + { + "trigger": "Hangry", + "speaker_role": "Eater", + "interpretation": "I need food now or I will kill you.", + "tone": "Warning" + }, + { + "trigger": "Humble brag", + "speaker_role": "Critic", + "interpretation": "Bragging disguised as complaint.", + "tone": "Annoyed" + }, + { + "trigger": "Adulting", + "speaker_role": "Millennial", + "interpretation": "Doing responsible tasks.", + "tone": "Tired" + }, + { + "trigger": "First World Problem", + "speaker_role": "Self-aware", + "interpretation": "Trivial complaint.", + "tone": "Ironic" + }, + { + "trigger": "Sorry not sorry", + "speaker_role": "Defiant", + "interpretation": "I am not actually sorry.", + "tone": "Sassy" + }, + { + "trigger": "Does it have an app?", + "speaker_role": "User", + "interpretation": "Can I do this on my phone?", + "tone": "Lazy" + }, + { + "trigger": "Have you tried turning it off and on?", + "speaker_role": "Tech Support", + "interpretation": "Restart the device.", + "tone": "Standard" + }, + { + "trigger": "404 Error", + "speaker_role": "Joker", + "interpretation": "Idea not found / Brain empty.", + "tone": "Humorous" + }, + { + "trigger": "Blue Screen of Death", + "speaker_role": "User", + "interpretation": "Computer crashed completely.", + "tone": "Fatal" + }, + { + "trigger": "Ping me", + "speaker_role": "Worker", + "interpretation": "Message me.", + "tone": "Corporate" + }, + { + "trigger": "Take this offline", + "speaker_role": "Manager", + "interpretation": "Discuss later.", + "tone": "Corporate" + }, + { + "trigger": "Circle back", + "speaker_role": "Manager", + "interpretation": "Return to topic later.", + "tone": "Corporate" + }, + { + "trigger": "Bandwidth", + "speaker_role": "Worker", + "interpretation": "Mental capacity.", + "tone": "Corporate" + }, + { + "trigger": "Deep dive", + "speaker_role": "Analyst", + "interpretation": "Detailed look.", + "tone": "Corporate" + }, + { + "trigger": "Hard stop", + "speaker_role": "Attendee", + "interpretation": "Must leave at specific time.", + "tone": "Firm" + }, + { + "trigger": "Bio-break", + "speaker_role": "Attendee", + "interpretation": "Toilet break.", + "tone": "Euphemism" + }, + { + "trigger": "Touch base", + "speaker_role": "Colleague", + "interpretation": "Talk briefly.", + "tone": "Corporate" + }, + { + "trigger": "Out of pocket", + "speaker_role": "Worker", + "interpretation": "Unavailable.", + "tone": "Corporate" + }, + { + "trigger": "Low hanging fruit", + "speaker_role": "Manager", + "interpretation": "Easy targets.", + "tone": "Corporate" + }, + { + "trigger": "Move the needle", + "speaker_role": "Manager", + "interpretation": "Make significant progress.", + "tone": "Corporate" + }, + { + "trigger": "Think outside the box", + "speaker_role": "Manager", + "interpretation": "Be creative.", + "tone": "Clich\u00e9" + }, + { + "trigger": "Win-win", + "speaker_role": "Negotiator", + "interpretation": "Good for everyone.", + "tone": "Positive" + }, + { + "trigger": "Synergy", + "speaker_role": "Manager", + "interpretation": "Cooperation (Buzzword).", + "tone": " meaningless" + }, + { + "trigger": "Disrupt", + "speaker_role": "Founder", + "interpretation": "Change industry.", + "tone": "Ambitious" + }, + { + "trigger": "Pivot", + "speaker_role": "Founder", + "interpretation": "Change strategy failing.", + "tone": "Euphemism" + }, + { + "trigger": "Unicorn", + "speaker_role": "Investor", + "interpretation": "Billion dollar startup.", + "tone": "Rare" + }, + { + "trigger": "Bootstrapping", + "speaker_role": "Founder", + "interpretation": "Self-funding.", + "tone": "Proud" + }, + { + "trigger": "Burn rate", + "speaker_role": "Investor", + "interpretation": "Spending speed.", + "tone": "Financial" + }, + { + "trigger": "Runway", + "speaker_role": "Founder", + "interpretation": "Time until money runs out.", + "tone": "Anxious" + }, + { + "trigger": "Exit strategy", + "speaker_role": "Founder", + "interpretation": "Plan to sell company.", + "tone": "Strategic" + }, + { + "trigger": "Early adopter", + "speaker_role": "User", + "interpretation": "First to use.", + "tone": "Cool" + }, + { + "trigger": "Beta", + "speaker_role": "Dev", + "interpretation": "Unfinished version.", + "tone": "Warning" + }, + { + "trigger": "Bug", + "speaker_role": "Dev", + "interpretation": "Error.", + "tone": "Technical" + }, + { + "trigger": "Feature not a bug", + "speaker_role": "Dev", + "interpretation": "It's supposed to do that (Joking).", + "tone": "Defensive" + }, + { + "trigger": "Spaghetti code", + "speaker_role": "Dev", + "interpretation": "Messy programming.", + "tone": "Critical" + }, + { + "trigger": "The Cloud", + "speaker_role": "User", + "interpretation": "Internet storage.", + "tone": "Vague" + }, + { + "trigger": "Algorithm", + "speaker_role": "User", + "interpretation": "The computer logic deciding what I see.", + "tone": "Mysterious" + }, + { + "trigger": "Clickbait", + "speaker_role": "Reader", + "interpretation": "Misleading headline.", + "tone": "Annoyed" + }, + { + "trigger": "Paywall", + "speaker_role": "Reader", + "interpretation": "Must pay to read.", + "tone": "Frustrated" + }, + { + "trigger": "Dark mode", + "speaker_role": "User", + "interpretation": "Black background setting.", + "tone": "Preference" + }, + { + "trigger": "Incognito mode", + "speaker_role": "User", + "interpretation": "Private browsing.", + "tone": "Secretive" + }, + { + "trigger": "Cookies", + "speaker_role": "Browser", + "interpretation": "Tracking data.", + "tone": "Technical" + }, + { + "trigger": "Cache", + "speaker_role": "Tech", + "interpretation": "Saved data.", + "tone": "Technical" + }, + { + "trigger": "Firewall", + "speaker_role": "Tech", + "interpretation": "Security barrier.", + "tone": "Protective" + }, + { + "trigger": "Malware", + "speaker_role": "Tech", + "interpretation": "Virus.", + "tone": "Bad" + }, + { + "trigger": "Trojan horse", + "speaker_role": "Tech", + "interpretation": "Hidden virus.", + "tone": "Sneaky" + }, + { + "trigger": "Phishing", + "speaker_role": "Security", + "interpretation": "Fake email scam.", + "tone": "Warning" + }, + { + "trigger": "Two-factor", + "speaker_role": "Security", + "interpretation": "Phone verification.", + "tone": "Secure" + }, + { + "trigger": "Password", + "speaker_role": "User", + "interpretation": "123456 (Usually weak).", + "tone": "Secret" + }, + { + "trigger": "Unplug", + "speaker_role": "Advisor", + "interpretation": "Stop using tech for a while.", + "tone": "Healthy" + }, + { + "trigger": "Digital detox", + "speaker_role": "Hipster", + "interpretation": "Time without phone.", + "tone": "Trendy" + }, + { + "trigger": "Screen time", + "speaker_role": "Parent", + "interpretation": "Limit phone use.", + "tone": "Strict" + }, + { + "trigger": "Doomscrolling", + "speaker_role": "User", + "interpretation": "Reading bad news obsessively.", + "tone": "Depressed" + }, + { + "trigger": "Rabbit hole", + "speaker_role": "User", + "interpretation": "Getting lost in a topic online.", + "tone": "Distracted" + }, + { + "trigger": "Wiki hole", + "speaker_role": "User", + "interpretation": "Reading Wikipedia for hours.", + "tone": "Curious" + }, + { + "trigger": "Trick or Treat!", + "speaker_role": "Child", + "interpretation": "Give me candy.", + "tone": "Expectant" + }, + { + "trigger": "Happy Holidays", + "speaker_role": "Any", + "interpretation": "Inclusive greeting for Dec/Jan.", + "tone": "Polite" + }, + { + "trigger": "Merry Christmas", + "speaker_role": "Any", + "interpretation": "Specific greeting (Can be political statement).", + "tone": "Traditional" + }, + { + "trigger": "Thank you for your service", + "speaker_role": "Civilian", + "interpretation": "Mandatory phrase when meeting a veteran.", + "tone": "Respectful" + }, + { + "trigger": "Bless you", + "speaker_role": "Any", + "interpretation": "Said immediately after someone sneezes.", + "tone": "Reflexive" + }, + { + "trigger": "Gesundheit", + "speaker_role": "Any", + "interpretation": "Said after sneezing (Alternative).", + "tone": "Polite" + }, + { + "trigger": "I'm sorry for your loss", + "speaker_role": "Sympathizer", + "interpretation": "Standard condolence for death.", + "tone": "Solemn" + }, + { + "trigger": "Paper or plastic?", + "speaker_role": "Cashier", + "interpretation": "How do you want your groceries bagged?", + "tone": "Routine" + }, + { + "trigger": "Debit or Credit?", + "speaker_role": "Cashier", + "interpretation": "How are you paying?", + "tone": "Routine" + }, + { + "trigger": "Do you have a rewards card?", + "speaker_role": "Cashier", + "interpretation": "Data tracking request.", + "tone": "Routine" + }, + { + "trigger": "Can I get a refill?", + "speaker_role": "Diner", + "interpretation": "More drink (Usually free).", + "tone": "Request" + }, + { + "trigger": "Is Pepsi okay?", + "speaker_role": "Server", + "interpretation": "We don't have Coke.", + "tone": "Apologetic" + }, + { + "trigger": "Super size it", + "speaker_role": "Server", + "interpretation": "Make the meal larger for money.", + "tone": "Sales" + }, + { + "trigger": "Hold the onions", + "speaker_role": "Diner", + "interpretation": "Do not put onions on it.", + "tone": "Specific" + }, + { + "trigger": "On the side", + "speaker_role": "Diner", + "interpretation": "Put sauce in a separate cup.", + "tone": "Specific" + }, + { + "trigger": "How would you like that cooked?", + "speaker_role": "Server", + "interpretation": "Rare, Medium, or Well Done?", + "tone": "Inquiry" + }, + { + "trigger": "Do you take insurance?", + "speaker_role": "Patient", + "interpretation": "I cannot afford this otherwise.", + "tone": "Anxious" + }, + { + "trigger": "Fill this out", + "speaker_role": "Receptionist", + "interpretation": "Complete the paperwork.", + "tone": "Directive" + }, + { + "trigger": "The doctor will see you now", + "speaker_role": "Nurse", + "interpretation": "Go to the exam room.", + "tone": "Formal" + }, + { + "trigger": "This might sting a little", + "speaker_role": "Doctor", + "interpretation": "This will hurt.", + "tone": "Warning" + }, + { + "trigger": "Turn your head and cough", + "speaker_role": "Doctor", + "interpretation": "Hernia check.", + "tone": "Clinical" + }, + { + "trigger": "Take two and call me in the morning", + "speaker_role": "Doctor", + "interpretation": "It's not serious.", + "tone": "Dismissive" + }, + { + "trigger": "Get off my lawn", + "speaker_role": "Old Man", + "interpretation": "Go away.", + "tone": "Stereotypical" + }, + { + "trigger": "Not in my backyard (NIMBY)", + "speaker_role": "Resident", + "interpretation": "I don't want construction near me.", + "tone": "Defensive" + }, + { + "trigger": "Keep it down!", + "speaker_role": "Neighbor", + "interpretation": "You are too loud.", + "tone": "Angry" + }, + { + "trigger": "Good fences make good neighbors", + "speaker_role": " homeowner", + "interpretation": "Privacy prevents conflict.", + "tone": "Proverbial" + }, + { + "trigger": "Can I borrow a cup of sugar?", + "speaker_role": "Neighbor", + "interpretation": "I need a small favor.", + "tone": "Friendly" + }, + { + "trigger": "Keeping up with the Joneses", + "speaker_role": "Critic", + "interpretation": "Buying things just to compete with neighbors.", + "tone": "Critical" + }, + { + "trigger": "There goes the neighborhood", + "speaker_role": "Resident", + "interpretation": "Bad people are moving in / Property value is dropping.", + "tone": "Bigoted/Snobbish" + }, + { + "trigger": "Trick or treat smell my feet", + "speaker_role": "Child", + "interpretation": "Joke rhyme.", + "tone": "Playful" + }, + { + "trigger": "Happy Turkey Day", + "speaker_role": "Greeter", + "interpretation": "Happy Thanksgiving.", + "tone": "Casual" + }, + { + "trigger": "I'm stuffed", + "speaker_role": "Eater", + "interpretation": "I ate too much.", + "tone": "Satisfied" + }, + { + "trigger": "Food coma", + "speaker_role": "Eater", + "interpretation": "Sleepy after eating.", + "tone": "Tired" + }, + { + "trigger": "New Year, New Me", + "speaker_role": "Poster", + "interpretation": "I will change my habits (usually fails).", + "tone": "Optimistic" + }, + { + "trigger": "Ball drop", + "speaker_role": "Viewer", + "interpretation": "Countdown to midnight.", + "tone": "Excited" + }, + { + "trigger": "Kiss me", + "speaker_role": "Partner", + "interpretation": "Midnight tradition.", + "tone": "Romantic" + }, + { + "trigger": "Will you be my Valentine?", + "speaker_role": "Suitor", + "interpretation": "Date request for Feb 14.", + "tone": "Romantic" + }, + { + "trigger": "April Fools!", + "speaker_role": "Joker", + "interpretation": "I just tricked you.", + "tone": "Playful" + }, + { + "trigger": "Beware of Dog", + "speaker_role": "Sign", + "interpretation": "Do not enter.", + "tone": "Warning" + }, + { + "trigger": "Solicitors", + "speaker_role": "Sign", + "interpretation": "Salespeople.", + "tone": "Formal" + }, + { + "trigger": "No Soliciting", + "speaker_role": "Sign", + "interpretation": "Don't knock on my door to sell things.", + "tone": "Prohibitive" + }, + { + "trigger": "Neighborhood Watch", + "speaker_role": "Sign", + "interpretation": "We call the police on strangers.", + "tone": "Warning" + }, + { + "trigger": "Slow Children Playing", + "speaker_role": "Sign", + "interpretation": "Drive slowly.", + "tone": "Warning" + }, + { + "trigger": "Garage Sale", + "speaker_role": "Sign", + "interpretation": "I am selling junk in my driveway.", + "tone": "Informal" + }, + { + "trigger": "Lost Dog", + "speaker_role": "Poster", + "interpretation": "Please help find pet.", + "tone": "Sad" + }, + { + "trigger": "Vote for...", + "speaker_role": "Sign", + "interpretation": "Political endorsement.", + "tone": "Political" + }, + { + "trigger": "Support our Troops", + "speaker_role": "Sticker", + "interpretation": "Patriotic sentiment.", + "tone": "Patriotic" + }, + { + "trigger": "Baby on Board", + "speaker_role": "Sticker", + "interpretation": "Drive carefully near me.", + "tone": "Cautionary" + }, + { + "trigger": "Coexist", + "speaker_role": "Sticker", + "interpretation": "Religious tolerance.", + "tone": "Liberal" + }, + { + "trigger": "Come and Take It", + "speaker_role": "Sticker", + "interpretation": "Gun rights.", + "tone": "Conservative" + }, + { + "trigger": "Thin Blue Line", + "speaker_role": "Sticker", + "interpretation": "Police support.", + "tone": "Political" + }, + { + "trigger": "My child is an Honor Student", + "speaker_role": "Sticker", + "interpretation": "Parental bragging.", + "tone": "Proud" + }, + { + "trigger": "Wash me", + "speaker_role": "Graffiti", + "interpretation": "This car is dirty.", + "tone": "Humorous" + }, + { + "trigger": "How's my driving?", + "speaker_role": "Sticker", + "interpretation": "Call number to complain.", + "tone": "Corporate" + }, + { + "trigger": "Wide Load", + "speaker_role": "Truck", + "interpretation": "Large cargo.", + "tone": "Warning" + }, + { + "trigger": "Oversize Load", + "speaker_role": "Truck", + "interpretation": "Large cargo.", + "tone": "Warning" + }, + { + "trigger": "Do not pass", + "speaker_role": "Sign", + "interpretation": "Stay in lane.", + "tone": "Command" + }, + { + "trigger": "Yield", + "speaker_role": "Sign", + "interpretation": "Let other cars go first.", + "tone": "Command" + }, + { + "trigger": "Merge", + "speaker_role": "Sign", + "interpretation": "Join traffic.", + "tone": "Command" + }, + { + "trigger": "Dead End", + "speaker_role": "Sign", + "interpretation": "Road stops.", + "tone": "Warning" + }, + { + "trigger": "No Outlet", + "speaker_role": "Sign", + "interpretation": "Dead end.", + "tone": "Warning" + }, + { + "trigger": "Speed Trap", + "speaker_role": "Driver", + "interpretation": "Police hiding to catch speeders.", + "tone": "Warning" + }, + { + "trigger": "Bumper to bumper", + "speaker_role": "Reporter", + "interpretation": "Heavy traffic.", + "tone": "Frustrated" + }, + { + "trigger": "Rubbernecking", + "speaker_role": "Reporter", + "interpretation": "Slowing to look at crash.", + "tone": "Annoyed" + }, + { + "trigger": "Road hog", + "speaker_role": "Driver", + "interpretation": "Takes up too much space.", + "tone": "Angry" + }, + { + "trigger": "Sunday driver", + "speaker_role": "Driver", + "interpretation": "Too slow.", + "tone": "Angry" + }, + { + "trigger": "Backseat driver", + "speaker_role": "Driver", + "interpretation": "Passenger giving advice.", + "tone": "Annoyed" + }, + { + "trigger": "Are we there yet?", + "speaker_role": "Passenger", + "interpretation": "I am bored.", + "tone": "Whining" + }, + { + "trigger": "Pull over", + "speaker_role": "Any", + "interpretation": "Stop the car.", + "tone": "Urgent" + }, + { + "trigger": "Step out of the car", + "speaker_role": "Police", + "interpretation": "You are in trouble.", + "tone": "Command" + }, + { + "trigger": "License and registration", + "speaker_role": "Police", + "interpretation": "Show documents.", + "tone": "Command" + }, + { + "trigger": "Do you know how fast you were going?", + "speaker_role": "Police", + "interpretation": "Admit guilt.", + "tone": "Trick question" + }, + { + "trigger": "I'll let you off with a warning", + "speaker_role": "Police", + "interpretation": "No ticket today.", + "tone": "Merciful" + }, + { + "trigger": "Click it or ticket", + "speaker_role": "Slogan", + "interpretation": "Wear seatbelt.", + "tone": "Catchy" + }, + { + "trigger": "Don't drink and drive", + "speaker_role": "Slogan", + "interpretation": "Safety warning.", + "tone": "Serious" + }, + { + "trigger": "Friends don't let friends drive drunk", + "speaker_role": "Slogan", + "interpretation": "Take their keys.", + "tone": "Serious" + }, + { + "trigger": "Buckle up", + "speaker_role": "Driver", + "interpretation": "Put seatbelt on.", + "tone": "Command" + }, + { + "trigger": "Shotgun!", + "speaker_role": "Passenger", + "interpretation": "I get front seat.", + "tone": "Competitive" + }, + { + "trigger": "Punch buggy no punch backs", + "speaker_role": "Child", + "interpretation": "I see a VW Beetle.", + "tone": "Playful" + }, + { + "trigger": "Jinx buy me a coke", + "speaker_role": "Speaker", + "interpretation": "We spoke simultaneously.", + "tone": "Playful" + }, + { + "trigger": "Cross my heart and hope to die", + "speaker_role": "Child", + "interpretation": "I promise.", + "tone": "Serious" + }, + { + "trigger": "Liar liar pants on fire", + "speaker_role": "Child", + "interpretation": "You are lying.", + "tone": "Mocking" + }, + { + "trigger": "I know you are but what am I?", + "speaker_role": "Child", + "interpretation": "Reflecting insult.", + "tone": "Defensive" + }, + { + "trigger": "Talk to the hand", + "speaker_role": "Dismissive", + "interpretation": "I'm not listening.", + "tone": "Rude" + }, + { + "trigger": "Whatever", + "speaker_role": "Dismissive", + "interpretation": "I don't care.", + "tone": "Rude" + }, + { + "trigger": "My house, my rules", + "speaker_role": "Parent", + "interpretation": "Obey me.", + "tone": "Authoritative" + }, + { + "trigger": "Because I said so", + "speaker_role": "Parent", + "interpretation": "End of argument.", + "tone": "Authoritative" + }, + { + "trigger": "Go to your room", + "speaker_role": "Parent", + "interpretation": "You are punished.", + "tone": "Command" + }, + { + "trigger": "You're grounded", + "speaker_role": "Parent", + "interpretation": "You cannot go out.", + "tone": "Punitive" + }, + { + "trigger": "Wait till your father gets home", + "speaker_role": "Mother", + "interpretation": "Delayed punishment.", + "tone": "Threatening" + }, + { + "trigger": "Eat your vegetables", + "speaker_role": "Parent", + "interpretation": "Be healthy.", + "tone": "Command" + }, + { + "trigger": "Don't talk with your mouth full", + "speaker_role": "Parent", + "interpretation": "Have manners.", + "tone": "Correction" + }, + { + "trigger": "Elbows off the table", + "speaker_role": "Parent", + "interpretation": "Have manners.", + "tone": "Correction" + }, + { + "trigger": "How's it going?", + "speaker_role": "Greeter", + "interpretation": "Phatic greeting. Do not answer honestly.", + "tone": "Ritual" + }, + { + "trigger": "See ya", + "speaker_role": "Leaver", + "interpretation": "Goodbye.", + "tone": "Casual" + }, + { + "trigger": "Let's do lunch", + "speaker_role": "Acquaintance", + "interpretation": "We will likely never eat lunch together.", + "tone": "Insincere" + }, + { + "trigger": "Shut up!", + "speaker_role": "Listener", + "interpretation": "I don't believe you! (Surprise).", + "tone": "Excited" + }, + { + "trigger": "Get out!", + "speaker_role": "Listener", + "interpretation": "That is impossible! (Surprise).", + "tone": "Excited" + }, + { + "trigger": "Netflix and chill", + "speaker_role": "Suitor", + "interpretation": "Come over for sex.", + "tone": "Euphemistic" + }, + { + "trigger": "Hook up", + "speaker_role": "Dater", + "interpretation": "Have casual sex.", + "tone": "Casual" + }, + { + "trigger": "We're talking", + "speaker_role": "Dater", + "interpretation": "Pre-dating phase, not exclusive.", + "tone": "Ambiguous" + }, + { + "trigger": "Seeing someone", + "speaker_role": "Dater", + "interpretation": "Dating, potentially exclusive.", + "tone": "Serious" + }, + { + "trigger": "Exclusive", + "speaker_role": "Dater", + "interpretation": "Boyfriend/Girlfriend status.", + "tone": "Committed" + }, + { + "trigger": "We need to talk", + "speaker_role": "Partner", + "interpretation": "I am breaking up with you or have bad news.", + "tone": "Ominous" + }, + { + "trigger": "It's fine", + "speaker_role": "Partner", + "interpretation": "It is definitely not fine.", + "tone": "Passive-Aggressive" + }, + { + "trigger": "Whatever", + "speaker_role": "Arguer", + "interpretation": "I am ending this conversation now.", + "tone": "Dismissive" + }, + { + "trigger": "I'm done", + "speaker_role": "Arguer", + "interpretation": "I am leaving the room/relationship.", + "tone": "Final" + }, + { + "trigger": "Just looking", + "speaker_role": "Shopper", + "interpretation": "Leave me alone.", + "tone": "Polite" + }, + { + "trigger": "Do you have this in the back?", + "speaker_role": "Shopper", + "interpretation": "Please check stock.", + "tone": "Hopeful" + }, + { + "trigger": "Cut me off", + "speaker_role": "Driver", + "interpretation": "Drove in front of me dangerously.", + "tone": "Angry" + }, + { + "trigger": "Tailgating", + "speaker_role": "Driver", + "interpretation": "Driving too close behind.", + "tone": "Dangerous" + }, + { + "trigger": "Flipping the bird", + "speaker_role": "Driver", + "interpretation": "Showing middle finger.", + "tone": "Insulting" + }, + { + "trigger": "I'll be there in 5", + "speaker_role": "Arriver", + "interpretation": "I will be there in 10-15 minutes.", + "tone": "Lying" + }, + { + "trigger": "Fashionably late", + "speaker_role": "Guest", + "interpretation": "Arriving late to look cool.", + "tone": "Social" + }, + { + "trigger": "I feel like...", + "speaker_role": "Speaker", + "interpretation": "My opinion is... (Softened).", + "tone": "Diffident" + }, + { + "trigger": "My truth", + "speaker_role": "Speaker", + "interpretation": "My subjective experience.", + "tone": "Personal" + }, + { + "trigger": "Holding space", + "speaker_role": "Listener", + "interpretation": "Listening without judging.", + "tone": "Therapeutic" + }, + { + "trigger": "Check please", + "speaker_role": "Diner", + "interpretation": "I want to pay.", + "tone": "Functional" + }, + { + "trigger": "Box it up", + "speaker_role": "Diner", + "interpretation": "Pack leftovers.", + "tone": "Functional" + }, + { + "trigger": "Y'all", + "speaker_role": "Southerner", + "interpretation": "You all (Plural).", + "tone": "Regional" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are stupid/pathetic.", + "tone": "Condescending" + }, + { + "trigger": "Fixin' to", + "speaker_role": "Southerner", + "interpretation": "Preparing to.", + "tone": "Regional" + }, + { + "trigger": "Ope", + "speaker_role": "Midwesterner", + "interpretation": "Excuse me.", + "tone": "Polite" + }, + { + "trigger": "Yeah no", + "speaker_role": "Midwesterner", + "interpretation": "No.", + "tone": "Negative" + }, + { + "trigger": "No yeah", + "speaker_role": "Midwesterner", + "interpretation": "Yes.", + "tone": "Affirmative" + }, + { + "trigger": "Shoot me an email", + "speaker_role": "Worker", + "interpretation": "Send an email.", + "tone": "Casual" + }, + { + "trigger": "Circle back", + "speaker_role": "Manager", + "interpretation": "Discuss later.", + "tone": "Corporate" + }, + { + "trigger": "Hard stop", + "speaker_role": "Attendee", + "interpretation": "Must leave.", + "tone": "Firm" + }, + { + "trigger": "Ping me", + "speaker_role": "Worker", + "interpretation": "Message me.", + "tone": "Casual" + }, + { + "trigger": "Bandwidth", + "speaker_role": "Worker", + "interpretation": "Time/Energy.", + "tone": "Corporate" + }, + { + "trigger": "Take it offline", + "speaker_role": "Manager", + "interpretation": "Stop talking now.", + "tone": "Directive" + }, + { + "trigger": "Synergy", + "speaker_role": "Manager", + "interpretation": "Cooperation (Buzzword).", + "tone": "Empty" + }, + { + "trigger": "Touch base", + "speaker_role": "Colleague", + "interpretation": "Contact briefly.", + "tone": "Corporate" + }, + { + "trigger": "Deep dive", + "speaker_role": "Analyst", + "interpretation": "Detailed analysis.", + "tone": "Corporate" + }, + { + "trigger": "Low hanging fruit", + "speaker_role": "Manager", + "interpretation": "Easy tasks.", + "tone": "Corporate" + }, + { + "trigger": "Play devil's advocate", + "speaker_role": "Debater", + "interpretation": "Argue opposite side for fun.", + "tone": "Argumentative" + }, + { + "trigger": "To be honest", + "speaker_role": "Speaker", + "interpretation": "I'm about to say something rude.", + "tone": "Warning" + }, + { + "trigger": "With all due respect", + "speaker_role": "Speaker", + "interpretation": "I have no respect for your idea.", + "tone": "Warning" + }, + { + "trigger": "No offense", + "speaker_role": "Speaker", + "interpretation": "This will be offensive.", + "tone": "Warning" + }, + { + "trigger": "I'm just saying", + "speaker_role": "Critic", + "interpretation": "Don't get mad at my criticism.", + "tone": "Defensive" + }, + { + "trigger": "Asking for a friend", + "speaker_role": "Asker", + "interpretation": "Asking for myself (embarrassing).", + "tone": "Humorous" + }, + { + "trigger": "Tell me about it", + "speaker_role": "Sympathizer", + "interpretation": "I agree completely.", + "tone": "Agreement" + }, + { + "trigger": "You can say that again", + "speaker_role": "Sympathizer", + "interpretation": "That is very true.", + "tone": "Agreement" + }, + { + "trigger": "It is what it is", + "speaker_role": "Stoic", + "interpretation": "Accepting bad situation.", + "tone": "Resigned" + }, + { + "trigger": "Living the dream", + "speaker_role": "Worker", + "interpretation": "I am suffering (Sarcastic).", + "tone": "Sarcastic" + }, + { + "trigger": "Working hard or hardly working?", + "speaker_role": "Joker", + "interpretation": "Bad dad joke greeting.", + "tone": "Annoying" + }, + { + "trigger": "Another day in paradise", + "speaker_role": "Worker", + "interpretation": "I hate my job.", + "tone": "Sarcastic" + }, + { + "trigger": "Sounds like a plan", + "speaker_role": "Agreed", + "interpretation": "Agreed.", + "tone": "Affirmative" + }, + { + "trigger": "I'm down", + "speaker_role": "Agreed", + "interpretation": "I want to go.", + "tone": "Enthusiastic" + }, + { + "trigger": "I'm game", + "speaker_role": "Agreed", + "interpretation": "I am willing.", + "tone": "Willing" + }, + { + "trigger": "Count me in", + "speaker_role": "Agreed", + "interpretation": "I will participate.", + "tone": "Committed" + }, + { + "trigger": "Pass", + "speaker_role": "Refuser", + "interpretation": "No thanks.", + "tone": "Casual" + }, + { + "trigger": "Hard pass", + "speaker_role": "Refuser", + "interpretation": "Definitely not.", + "tone": "Strong" + }, + { + "trigger": "Rain check", + "speaker_role": "Refuser", + "interpretation": "Reschedule.", + "tone": "Polite" + }, + { + "trigger": "Maybe", + "speaker_role": "Refuser", + "interpretation": "No.", + "tone": "Soft" + }, + { + "trigger": "We'll see", + "speaker_role": "Parent", + "interpretation": "No.", + "tone": "Dismissive" + }, + { + "trigger": "Let's play it by ear", + "speaker_role": "Planner", + "interpretation": "Decide later.", + "tone": "Flexible" + }, + { + "trigger": "Wing it", + "speaker_role": "Improviser", + "interpretation": "Do it without preparation.", + "tone": "Casual" + }, + { + "trigger": "Shotgun", + "speaker_role": "Passenger", + "interpretation": "I claim front seat.", + "tone": "Competitive" + }, + { + "trigger": "Jinx", + "speaker_role": "Speaker", + "interpretation": "Same words spoken.", + "tone": "Playful" + }, + { + "trigger": "Knock on wood", + "speaker_role": "Speaker", + "interpretation": "Prevent bad luck.", + "tone": "Superstitious" + }, + { + "trigger": "Fingers crossed", + "speaker_role": "Hoper", + "interpretation": "Hope it happens.", + "tone": "Hopeful" + }, + { + "trigger": "My bad", + "speaker_role": "Apologizer", + "interpretation": "My mistake.", + "tone": "Casual" + }, + { + "trigger": "No worries", + "speaker_role": "Forgiver", + "interpretation": "You're welcome.", + "tone": "Casual" + }, + { + "trigger": "You're good", + "speaker_role": "Forgiver", + "interpretation": "No problem.", + "tone": "Casual" + }, + { + "trigger": "All good", + "speaker_role": "Forgiver", + "interpretation": "Everything is fine.", + "tone": "Casual" + }, + { + "trigger": "For sure", + "speaker_role": "Agreed", + "interpretation": "Definitely.", + "tone": "Affirmative" + }, + { + "trigger": "Totally", + "speaker_role": "Agreed", + "interpretation": "I agree.", + "tone": "Affirmative" + }, + { + "trigger": "No doubt", + "speaker_role": "Agreed", + "interpretation": "Certainly.", + "tone": "Affirmative" + }, + { + "trigger": "Word", + "speaker_role": "Hipster", + "interpretation": "Agreed.", + "tone": "Slang" + }, + { + "trigger": "Bet", + "speaker_role": "Gen Z", + "interpretation": "Okay/Yes.", + "tone": "Slang" + }, + { + "trigger": "Cap", + "speaker_role": "Gen Z", + "interpretation": "Lie.", + "tone": "Slang" + }, + { + "trigger": "No cap", + "speaker_role": "Gen Z", + "interpretation": "Truth.", + "tone": "Slang" + }, + { + "trigger": "Simp", + "speaker_role": "Gen Z", + "interpretation": "Submissive man.", + "tone": "Derogatory" + }, + { + "trigger": "Karen", + "speaker_role": "Gen Z", + "interpretation": "Entitled woman.", + "tone": "Derogatory" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Gen Z", + "interpretation": "Old person dismissal.", + "tone": "Dismissive" + }, + { + "trigger": "Boomer", + "speaker_role": "Gen Z", + "interpretation": "Old person.", + "tone": "Descriptive" + }, + { + "trigger": "Zoomer", + "speaker_role": "Older", + "interpretation": "Gen Z person.", + "tone": "Descriptive" + }, + { + "trigger": "Millennial", + "speaker_role": "Older", + "interpretation": "Young person (often wrong age).", + "tone": "Descriptive" + }, + { + "trigger": "Snowflake", + "speaker_role": "Conservative", + "interpretation": "Sensitive person.", + "tone": "Insulting" + }, + { + "trigger": "Woke", + "speaker_role": "Conservative", + "interpretation": "Performative progressive.", + "tone": "Insulting" + }, + { + "trigger": "Libtard", + "speaker_role": "Conservative", + "interpretation": "Liberal.", + "tone": "Derogatory" + }, + { + "trigger": "MAGA", + "speaker_role": "Trump Supporter", + "interpretation": "Make America Great Again.", + "tone": "Political" + }, + { + "trigger": "RINO", + "speaker_role": "Conservative", + "interpretation": "Republican In Name Only.", + "tone": "Political" + }, + { + "trigger": "Fake News", + "speaker_role": "Skeptic", + "interpretation": "Lies.", + "tone": "Dismissive" + }, + { + "trigger": "Mainstream Media", + "speaker_role": "Skeptic", + "interpretation": "Biased news.", + "tone": "Critical" + }, + { + "trigger": "Thank you for your service", + "speaker_role": "Civilian", + "interpretation": "Mandatory phrase when meeting a veteran.", + "tone": "Respectful" + }, + { + "trigger": "Semper Fi", + "speaker_role": "Marine", + "interpretation": "Always Faithful (Marine greeting).", + "tone": "Brotherhood" + }, + { + "trigger": "Hooah", + "speaker_role": "Army", + "interpretation": "Yes / Understood / Let's go.", + "tone": "Motivated" + }, + { + "trigger": "Roger", + "speaker_role": "Any", + "interpretation": "Message received.", + "tone": "Functional" + }, + { + "trigger": "Copy", + "speaker_role": "Any", + "interpretation": "I hear you.", + "tone": "Functional" + }, + { + "trigger": "Over", + "speaker_role": "Radio", + "interpretation": "I am done talking, your turn.", + "tone": "Functional" + }, + { + "trigger": "Out", + "speaker_role": "Radio", + "interpretation": "Conversation ended.", + "tone": "Functional" + }, + { + "trigger": "Watch your six", + "speaker_role": "Advisor", + "interpretation": "Watch your back (6 o'clock).", + "tone": "Warning" + }, + { + "trigger": "On your left", + "speaker_role": "Runner/Cyclist", + "interpretation": "I am passing you.", + "tone": "Warning" + }, + { + "trigger": "Stay in your lane", + "speaker_role": "Critic", + "interpretation": "Mind your own business.", + "tone": "Directive" + }, + { + "trigger": "Stand your ground", + "speaker_role": "Defender", + "interpretation": "Do not retreat; use force if needed.", + "tone": "Defiant" + }, + { + "trigger": "I plead the Fifth", + "speaker_role": "Speaker", + "interpretation": "I will not answer.", + "tone": "Legal/Humorous" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get an attorney now.", + "tone": "Serious" + }, + { + "trigger": "Am I being detained?", + "speaker_role": "Suspect", + "interpretation": "If not, I am leaving.", + "tone": "Confrontational" + }, + { + "trigger": "I do not consent to a search", + "speaker_role": "Suspect", + "interpretation": "Legal refusal.", + "tone": "Legal" + }, + { + "trigger": "Come and take it", + "speaker_role": "Gun Owner", + "interpretation": "I will fight you for my rights.", + "tone": "Defiant" + }, + { + "trigger": "Don't mess with Texas", + "speaker_role": "Texan", + "interpretation": "Warning.", + "tone": "Pride" + }, + { + "trigger": "Roll Tide", + "speaker_role": "Alabamian", + "interpretation": "Hello / Goodbye / Go Alabama.", + "tone": "Tribal" + }, + { + "trigger": "Hook 'em", + "speaker_role": "Texan", + "interpretation": "Go Longhorns.", + "tone": "Tribal" + }, + { + "trigger": "Go Blue", + "speaker_role": "Michigander", + "interpretation": "Go Michigan.", + "tone": "Tribal" + }, + { + "trigger": "Wicked smaht", + "speaker_role": "Bostonian", + "interpretation": "Very smart.", + "tone": "Regional" + }, + { + "trigger": "Fuggedaboutit", + "speaker_role": "New Yorker", + "interpretation": "Forget it / It's the best / No problem.", + "tone": "Regional" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You're an idiot.", + "tone": "Condescending" + }, + { + "trigger": "Ope", + "speaker_role": "Midwesterner", + "interpretation": "Excuse me.", + "tone": "Polite" + }, + { + "trigger": "Y'all", + "speaker_role": "Southerner", + "interpretation": "You guys.", + "tone": "Inclusive" + }, + { + "trigger": "All y'all", + "speaker_role": "Southerner", + "interpretation": "Every single one of you.", + "tone": "Inclusive" + }, + { + "trigger": "Fixin' to", + "speaker_role": "Southerner", + "interpretation": "Preparing to.", + "tone": "Planning" + }, + { + "trigger": "Hella", + "speaker_role": "Californian", + "interpretation": "Very.", + "tone": "Slang" + }, + { + "trigger": "The 5", + "speaker_role": "Californian", + "interpretation": "Interstate 5 (highway).", + "tone": "Specific" + }, + { + "trigger": "Pop", + "speaker_role": "Midwesterner", + "interpretation": "Soda.", + "tone": "Regional" + }, + { + "trigger": "Coke", + "speaker_role": "Southerner", + "interpretation": "Any soda (What kind of coke do you want?).", + "tone": "Regional" + }, + { + "trigger": "Gym, Tan, Laundry", + "speaker_role": "Jersey", + "interpretation": "Priorities.", + "tone": "Stereotype" + }, + { + "trigger": "Live Free or Die", + "speaker_role": "New Hampshirite", + "interpretation": "State motto.", + "tone": "Defiant" + }, + { + "trigger": "Aloha", + "speaker_role": "Hawaiian", + "interpretation": "Hello / Goodbye / Love.", + "tone": "Warm" + }, + { + "trigger": "Mahalo", + "speaker_role": "Hawaiian", + "interpretation": "Thank you.", + "tone": "Polite" + }, + { + "trigger": "Poked the bear", + "speaker_role": "Provoker", + "interpretation": "Agitated a dangerous person.", + "tone": "Warning" + }, + { + "trigger": "Play stupid games, win stupid prizes", + "speaker_role": "Critic", + "interpretation": "You deserve your bad outcome.", + "tone": "Sarcastic" + }, + { + "trigger": "Hold my beer", + "speaker_role": "Risk-taker", + "interpretation": "Watch this (I am about to do something stupid).", + "tone": "Humorous" + }, + { + "trigger": "Send it", + "speaker_role": "Risk-taker", + "interpretation": "Just do it.", + "tone": "Encouraging" + }, + { + "trigger": "Full send", + "speaker_role": "Risk-taker", + "interpretation": "100% effort/risk.", + "tone": "Encouraging" + }, + { + "trigger": "Do it for the Vine", + "speaker_role": "Millennial", + "interpretation": "Do it for the camera.", + "tone": "Nostalgic" + }, + { + "trigger": "Worldstar!", + "speaker_role": "Observer", + "interpretation": "A fight is happening.", + "tone": "Excited" + }, + { + "trigger": "Bye Felicia", + "speaker_role": "Dismissive", + "interpretation": "Go away, nobody cares.", + "tone": "Rude" + }, + { + "trigger": "Cash me outside", + "speaker_role": "Aggressor", + "interpretation": "Let's fight outside.", + "tone": "Aggressive" + }, + { + "trigger": "I'm weak", + "speaker_role": "Laugher", + "interpretation": "That is hilarious.", + "tone": "Hyperbolic" + }, + { + "trigger": "I'm dead", + "speaker_role": "Laugher", + "interpretation": "That is hilarious.", + "tone": "Hyperbolic" + }, + { + "trigger": "Facts", + "speaker_role": "Agreed", + "interpretation": "True.", + "tone": "Affirmative" + }, + { + "trigger": "Big facts", + "speaker_role": "Agreed", + "interpretation": "Very true.", + "tone": "Affirmative" + }, + { + "trigger": "Period", + "speaker_role": "Agreed", + "interpretation": "End of discussion.", + "tone": "Final" + }, + { + "trigger": "Periodt", + "speaker_role": "Agreed", + "interpretation": "End of discussion (Emphatic).", + "tone": "Final" + }, + { + "trigger": "Slay", + "speaker_role": "Supporter", + "interpretation": "You look great / You did well.", + "tone": "Positive" + }, + { + "trigger": "Queen", + "speaker_role": "Supporter", + "interpretation": "High praise for a woman.", + "tone": "Positive" + }, + { + "trigger": "King", + "speaker_role": "Supporter", + "interpretation": "High praise for a man.", + "tone": "Positive" + }, + { + "trigger": "Simp", + "speaker_role": "Critic", + "interpretation": "Man trying too hard for a woman.", + "tone": "Insulting" + }, + { + "trigger": "Incel", + "speaker_role": "Critic", + "interpretation": "Involuntary Celibate (Misogynist).", + "tone": "Insulting" + }, + { + "trigger": "Chad", + "speaker_role": "Observer", + "interpretation": "Alpha male.", + "tone": "Descriptive" + }, + { + "trigger": "Stacy", + "speaker_role": "Observer", + "interpretation": "Stereotypical attractive female.", + "tone": "Descriptive" + }, + { + "trigger": "Based", + "speaker_role": "Supporter", + "interpretation": "Courageous opinion.", + "tone": "Approval" + }, + { + "trigger": "Cringe", + "speaker_role": "Critic", + "interpretation": "Embarrassing.", + "tone": "Negative" + }, + { + "trigger": "Blue pill", + "speaker_role": "Critic", + "interpretation": "Living in blissful ignorance.", + "tone": "Political" + }, + { + "trigger": "Red pill", + "speaker_role": "Critic", + "interpretation": "Seeing the 'truth' (often right-wing).", + "tone": "Political" + }, + { + "trigger": "Black pill", + "speaker_role": "Critic", + "interpretation": "Nihilism / Hopelessness.", + "tone": "Negative" + }, + { + "trigger": "Gaslight", + "speaker_role": "Victim", + "interpretation": "Manipulate reality.", + "tone": "Serious" + }, + { + "trigger": "Gatekeep", + "speaker_role": "Critic", + "interpretation": "Control access.", + "tone": "Negative" + }, + { + "trigger": "Girlboss", + "speaker_role": "Supporter", + "interpretation": "Successful woman (sometimes ironic).", + "tone": "Ambiguous" + }, + { + "trigger": "Mansplain", + "speaker_role": "Critic", + "interpretation": "Man explaining condescendingly.", + "tone": "Negative" + }, + { + "trigger": "Manspread", + "speaker_role": "Critic", + "interpretation": "Man taking up too much seat space.", + "tone": "Negative" + }, + { + "trigger": "Ok Boomer", + "speaker_role": "Youth", + "interpretation": "Old and out of touch.", + "tone": "Dismissive" + }, + { + "trigger": "Karen", + "speaker_role": "Observer", + "interpretation": "Entitled complainer.", + "tone": "Insulting" + }, + { + "trigger": "Let's Go Brandon", + "speaker_role": "Critic", + "interpretation": "F*** Joe Biden.", + "tone": "Political" + }, + { + "trigger": "Thanks Obama", + "speaker_role": "Satirist", + "interpretation": "Blaming Obama for everything (Joke).", + "tone": "Ironic" + }, + { + "trigger": "Not my president", + "speaker_role": "Protester", + "interpretation": "I reject the election result.", + "tone": "Defiant" + }, + { + "trigger": "Drain the swamp", + "speaker_role": "Supporter", + "interpretation": "Remove corrupt politicians.", + "tone": "Political" + }, + { + "trigger": "Fake News", + "speaker_role": "Critic", + "interpretation": "Lies.", + "tone": "Political" + }, + { + "trigger": "Alternative facts", + "speaker_role": "Critic", + "interpretation": "Lies.", + "tone": "Political" + }, + { + "trigger": "Covfefe", + "speaker_role": "Joker", + "interpretation": "Nonsense typo.", + "tone": "Humorous" + }, + { + "trigger": "Bigly", + "speaker_role": "Joker", + "interpretation": "Big league / Very much.", + "tone": "Humorous" + }, + { + "trigger": "Nasty woman", + "speaker_role": "Critic", + "interpretation": "Insult for assertive woman.", + "tone": "Political" + }, + { + "trigger": "Basket of deplorables", + "speaker_role": "Critic", + "interpretation": "Trump supporters.", + "tone": "Political" + }, + { + "trigger": "Lock her up", + "speaker_role": "Chanter", + "interpretation": "Jail Hillary Clinton.", + "tone": "Political" + }, + { + "trigger": "Build the wall", + "speaker_role": "Chanter", + "interpretation": "Stop immigration.", + "tone": "Political" + }, + { + "trigger": "Feel the Bern", + "speaker_role": "Supporter", + "interpretation": "Support Bernie Sanders.", + "tone": "Political" + }, + { + "trigger": "I'm with her", + "speaker_role": "Supporter", + "interpretation": "Support Hillary Clinton.", + "tone": "Political" + }, + { + "trigger": "Make America Great Again", + "speaker_role": "Supporter", + "interpretation": "Return to the past.", + "tone": "Political" + }, + { + "trigger": "No Justice No Peace", + "speaker_role": "Protester", + "interpretation": "We will not stop until justice is served.", + "tone": "Political" + }, + { + "trigger": "Black Lives Matter", + "speaker_role": "Activist", + "interpretation": "Racial justice slogan.", + "tone": "Political" + }, + { + "trigger": "Blue Lives Matter", + "speaker_role": "Activist", + "interpretation": "Police support slogan.", + "tone": "Political" + }, + { + "trigger": "All Lives Matter", + "speaker_role": "Counter-Activist", + "interpretation": "Rebuttal to BLM.", + "tone": "Political" + }, + { + "trigger": "Thoughts and prayers", + "speaker_role": "Politician", + "interpretation": "I am doing nothing.", + "tone": "Empty" + }, + { + "trigger": "Never forget", + "speaker_role": "Patriot", + "interpretation": "Remember 9/11.", + "tone": "Solemn" + }, + { + "trigger": "United We Stand", + "speaker_role": "Patriot", + "interpretation": "Unity slogan.", + "tone": "Patriotic" + }, + { + "trigger": "Freedom isn't free", + "speaker_role": "Patriot", + "interpretation": "Soldiers died for you.", + "tone": "Solemn" + }, + { + "trigger": "Support our troops", + "speaker_role": "Patriot", + "interpretation": "Honor the military.", + "tone": "Patriotic" + }, + { + "trigger": "Am I free to go?", + "speaker_role": "Suspect", + "interpretation": "I am challenging your authority to hold me.", + "tone": "Legal" + }, + { + "trigger": "I want a lawyer", + "speaker_role": "Suspect", + "interpretation": "I am stopping this interrogation.", + "tone": "Defensive" + }, + { + "trigger": "Do you know why I pulled you over?", + "speaker_role": "Police", + "interpretation": "Admit your crime so I don't have to prove it.", + "tone": "Trap" + }, + { + "trigger": "License and registration", + "speaker_role": "Police", + "interpretation": "Hand over documents immediately.", + "tone": "Command" + }, + { + "trigger": "Step out of the vehicle", + "speaker_role": "Police", + "interpretation": "You are likely being arrested or searched.", + "tone": "Command" + }, + { + "trigger": "Stop resisting", + "speaker_role": "Police", + "interpretation": "I am about to use force.", + "tone": "Warning" + }, + { + "trigger": "You have the right to remain silent", + "speaker_role": "Police", + "interpretation": "You are under arrest (Miranda Warning).", + "tone": "Legal" + }, + { + "trigger": "Lawyer up", + "speaker_role": "Advisor", + "interpretation": "Get an attorney immediately.", + "tone": "Urgent" + }, + { + "trigger": "Take the plea", + "speaker_role": "Lawyer", + "interpretation": "Admit guilt for less jail time.", + "tone": "Pragmatic" + }, + { + "trigger": "Throw the book at him", + "speaker_role": "Judge/DA", + "interpretation": "Give maximum punishment.", + "tone": "Severe" + }, + { + "trigger": "Get out of jail free", + "speaker_role": "Player", + "interpretation": "Avoid consequences easily.", + "tone": "Metaphorical" + }, + { + "trigger": "Three strikes", + "speaker_role": "Judge", + "interpretation": "Life sentence for third felony.", + "tone": "Legal" + }, + { + "trigger": "See you in court", + "speaker_role": "Litigant", + "interpretation": "I will sue you.", + "tone": "Threatening" + }, + { + "trigger": "My hands are tied", + "speaker_role": "Bureaucrat", + "interpretation": "Rules prevent me from helping you.", + "tone": "Dismissive" + }, + { + "trigger": "Off the record", + "speaker_role": "Source", + "interpretation": "Don't quote me.", + "tone": "Secretive" + }, + { + "trigger": "No comment", + "speaker_role": "Suspect", + "interpretation": "I refuse to answer.", + "tone": "Evasive" + }, + { + "trigger": "I can't recall", + "speaker_role": "Witness", + "interpretation": "I know but I won't say (Perjury avoidance).", + "tone": "Evasive" + }, + { + "trigger": "Objection", + "speaker_role": "Lawyer", + "interpretation": "Stop talking.", + "tone": "Legal" + }, + { + "trigger": "Sustained", + "speaker_role": "Judge", + "interpretation": "Objection valid.", + "tone": "Legal" + }, + { + "trigger": "Overruled", + "speaker_role": "Judge", + "interpretation": "Objection invalid.", + "tone": "Legal" + }, + { + "trigger": "May I approach the bench?", + "speaker_role": "Lawyer", + "interpretation": "I need to whisper to the judge.", + "tone": "Formal" + }, + { + "trigger": "All rise", + "speaker_role": "Bailiff", + "interpretation": "Stand up for the judge.", + "tone": "Command" + }, + { + "trigger": "Not guilty", + "speaker_role": "Defendant", + "interpretation": "I deny the charges.", + "tone": "Legal" + }, + { + "trigger": "Guilty", + "speaker_role": "Defendant", + "interpretation": "I admit the charges.", + "tone": "Legal" + }, + { + "trigger": "Hung jury", + "speaker_role": "Reporter", + "interpretation": "No verdict reached.", + "tone": "Neutral" + }, + { + "trigger": "Mistrial", + "speaker_role": "Judge", + "interpretation": "Trial cancelled, start over.", + "tone": "Legal" + }, + { + "trigger": "Contempt of court", + "speaker_role": "Judge", + "interpretation": "You are disrespecting me; go to jail.", + "tone": "Punitive" + }, + { + "trigger": "Bail is set at...", + "speaker_role": "Judge", + "interpretation": "Price to go home.", + "tone": "Financial" + }, + { + "trigger": "Released on own recognizance", + "speaker_role": "Judge", + "interpretation": "Free without paying bail.", + "tone": "Trusting" + }, + { + "trigger": "Community service", + "speaker_role": "Judge", + "interpretation": "Work instead of jail.", + "tone": "Punitive" + }, + { + "trigger": "Probation", + "speaker_role": "Judge", + "interpretation": "Free but watched.", + "tone": "Restrictive" + }, + { + "trigger": "Parole", + "speaker_role": "Board", + "interpretation": "Early release.", + "tone": "Conditional" + }, + { + "trigger": "Recuse yourself", + "speaker_role": "Critic", + "interpretation": "Step down due to conflict of interest.", + "tone": "Demand" + }, + { + "trigger": "Conflict of interest", + "speaker_role": "Critic", + "interpretation": "You are biased.", + "tone": "Ethical" + }, + { + "trigger": "Whistleblower", + "speaker_role": "News", + "interpretation": "Snitch for the public good.", + "tone": "Heroic" + }, + { + "trigger": "Deep State", + "speaker_role": "Conspiracist", + "interpretation": "Hidden government power.", + "tone": "Political" + }, + { + "trigger": "Witch hunt", + "speaker_role": "Suspect", + "interpretation": "Unfair investigation.", + "tone": "Defensive" + }, + { + "trigger": "Smoking gun", + "speaker_role": "Investigator", + "interpretation": "Definitive proof.", + "tone": "Triumphant" + }, + { + "trigger": "Paper trail", + "speaker_role": "Auditor", + "interpretation": "Documentary evidence.", + "tone": "Evidence" + }, + { + "trigger": "Follow the money", + "speaker_role": "Investigator", + "interpretation": "Check finances to find the crime.", + "tone": "Strategy" + }, + { + "trigger": "Cook the books", + "speaker_role": "Crook", + "interpretation": "Fake the accounting.", + "tone": "Criminal" + }, + { + "trigger": "Money laundering", + "speaker_role": "Crook", + "interpretation": "Cleaning dirty money.", + "tone": "Criminal" + }, + { + "trigger": "Racketeering", + "speaker_role": "DA", + "interpretation": "Organized crime.", + "tone": "Legal" + }, + { + "trigger": "Perjury", + "speaker_role": "DA", + "interpretation": "Lying in court.", + "tone": "Legal" + }, + { + "trigger": "Obstruction of justice", + "speaker_role": "DA", + "interpretation": "Blocking investigation.", + "tone": "Legal" + }, + { + "trigger": "Subpoena", + "speaker_role": "Court", + "interpretation": "Order to appear.", + "tone": "Command" + }, + { + "trigger": "Affidavit", + "speaker_role": "Lawyer", + "interpretation": "Sworn statement.", + "tone": "Legal" + }, + { + "trigger": "Deposition", + "speaker_role": "Lawyer", + "interpretation": "Pre-trial interview.", + "tone": "Legal" + }, + { + "trigger": "Settlement", + "speaker_role": "Lawyer", + "interpretation": "Payment to stop lawsuit.", + "tone": "Financial" + }, + { + "trigger": "Class action", + "speaker_role": "Lawyer", + "interpretation": "Group lawsuit.", + "tone": "Legal" + }, + { + "trigger": "Cease and desist", + "speaker_role": "Lawyer", + "interpretation": "Stop immediately.", + "tone": "Warning" + }, + { + "trigger": "Restraining order", + "speaker_role": "Victim", + "interpretation": "Stay away from me.", + "tone": "Legal" + }, + { + "trigger": "Custody battle", + "speaker_role": "Parent", + "interpretation": "Fight over children.", + "tone": "Emotional" + }, + { + "trigger": "Alimony", + "speaker_role": "Ex-spouse", + "interpretation": "Divorce payments.", + "tone": "Financial" + }, + { + "trigger": "Prenup", + "speaker_role": "Fiance", + "interpretation": "Contract before marriage.", + "tone": "Financial" + }, + { + "trigger": "Next of kin", + "speaker_role": "Doctor/Police", + "interpretation": "Closest relative.", + "tone": "Formal" + }, + { + "trigger": "Power of attorney", + "speaker_role": "Relative", + "interpretation": "Right to decide for someone.", + "tone": "Legal" + }, + { + "trigger": "Living will", + "speaker_role": "Patient", + "interpretation": "Do not resuscitate order.", + "tone": "Medical" + }, + { + "trigger": "Executor", + "speaker_role": "Lawyer", + "interpretation": "Person managing the will.", + "tone": "Legal" + }, + { + "trigger": "Probate", + "speaker_role": "Court", + "interpretation": "Processing a will.", + "tone": "Legal" + }, + { + "trigger": "Lien", + "speaker_role": "Creditor", + "interpretation": "Claim on property for debt.", + "tone": "Financial" + }, + { + "trigger": "Foreclosure", + "speaker_role": "Bank", + "interpretation": "Seizing the house.", + "tone": "Financial" + }, + { + "trigger": "Eviction", + "speaker_role": "Landlord", + "interpretation": "Kicking out tenant.", + "tone": "Legal" + }, + { + "trigger": "Squatters rights", + "speaker_role": "Occupant", + "interpretation": "Right to stay without paying.", + "tone": "Legal" + }, + { + "trigger": "Garnished wages", + "speaker_role": "Court", + "interpretation": "Taking money from paycheck.", + "tone": "Punitive" + }, + { + "trigger": "Bankruptcy", + "speaker_role": "Debtor", + "interpretation": "Legal broke status.", + "tone": "Financial" + }, + { + "trigger": "Chapter 11", + "speaker_role": "Business", + "interpretation": "Restructuring bankruptcy.", + "tone": "Financial" + }, + { + "trigger": "Chapter 7", + "speaker_role": "Business", + "interpretation": "Liquidation bankruptcy.", + "tone": "Financial" + }, + { + "trigger": "Audit", + "speaker_role": "IRS", + "interpretation": "Investigation of taxes.", + "tone": "Scary" + }, + { + "trigger": "Tax evasion", + "speaker_role": "IRS", + "interpretation": "Crime of not paying.", + "tone": "Illegal" + }, + { + "trigger": "Tax avoidance", + "speaker_role": "Accountant", + "interpretation": "Legal reduction of tax.", + "tone": "Smart" + }, + { + "trigger": "Loophole", + "speaker_role": "Lawyer", + "interpretation": "Legal trick.", + "tone": "Smart" + }, + { + "trigger": "Grandfathered in", + "speaker_role": "Admin", + "interpretation": "Exempt from new rules.", + "tone": "Privileged" + }, + { + "trigger": "Due process", + "speaker_role": "Citizen", + "interpretation": "Fair legal procedure.", + "tone": "Right" + }, + { + "trigger": "Double jeopardy", + "speaker_role": "Citizen", + "interpretation": "Tried twice for same crime.", + "tone": "Illegal" + }, + { + "trigger": "Habeas corpus", + "speaker_role": "Lawyer", + "interpretation": "Right to see a judge.", + "tone": "Legal" + }, + { + "trigger": "Pro bono", + "speaker_role": "Lawyer", + "interpretation": "Free work.", + "tone": "Charitable" + }, + { + "trigger": "God bless you", + "speaker_role": "Greeter", + "interpretation": "Standard polite closing (Secular or Religious).", + "tone": "Polite" + }, + { + "trigger": "I swear to God", + "speaker_role": "Speaker", + "interpretation": "I am telling the truth.", + "tone": "Emphatic" + }, + { + "trigger": "Jesus Christ!", + "speaker_role": "Speaker", + "interpretation": "Expression of shock/anger (Not prayer).", + "tone": "Exclamatory" + }, + { + "trigger": "Holy Cow", + "speaker_role": "Speaker", + "interpretation": "Wow (Polite).", + "tone": "Surprised" + }, + { + "trigger": "Go to hell", + "speaker_role": "Aggressor", + "interpretation": "Leave me alone.", + "tone": "Hostile" + }, + { + "trigger": "Bless your heart", + "speaker_role": "Southerner", + "interpretation": "You are stupid.", + "tone": "Condescending" + }, + { + "trigger": "Preaching to the choir", + "speaker_role": "Listener", + "interpretation": "I already agree with you; stop convincing me.", + "tone": "Agreement" + }, + { + "trigger": "Cross my heart", + "speaker_role": "Promiser", + "interpretation": "I promise.", + "tone": "Sincere" + }, + { + "trigger": "Knock on wood", + "speaker_role": "Speaker", + "interpretation": "Prevent bad luck.", + "tone": "Superstitious" + }, + { + "trigger": "Speak of the devil", + "speaker_role": "Greeter", + "interpretation": "The person we were just talking about has arrived.", + "tone": "Casual" + }, + { + "trigger": "Play your cards right", + "speaker_role": "Advisor", + "interpretation": "Behave correctly to win.", + "tone": "Advisory" + }, + { + "trigger": "Show your hand", + "speaker_role": "Advisor", + "interpretation": "Reveal your plans.", + "tone": "Advisory" + }, + { + "trigger": "Poker face", + "speaker_role": "Observer", + "interpretation": "Hide your emotions.", + "tone": "Descriptive" + }, + { + "trigger": "Call your bluff", + "speaker_role": "Challenger", + "interpretation": "I don't believe you.", + "tone": "Challenging" + }, + { + "trigger": "All in", + "speaker_role": "Speaker", + "interpretation": "I am fully committed.", + "tone": "Committed" + }, + { + "trigger": "Fold", + "speaker_role": "Quitter", + "interpretation": "I give up.", + "tone": "Resigned" + }, + { + "trigger": "Double down", + "speaker_role": "Risk-taker", + "interpretation": "I am increasing my commitment despite risk.", + "tone": "Confident" + }, + { + "trigger": "Jackpot", + "speaker_role": "Winner", + "interpretation": "I won big.", + "tone": "Excited" + }, + { + "trigger": "Face the music", + "speaker_role": "Victim", + "interpretation": "Accept punishment.", + "tone": "Resigned" + }, + { + "trigger": "Change your tune", + "speaker_role": "Critic", + "interpretation": "Change your opinion.", + "tone": "Critical" + }, + { + "trigger": "Play it by ear", + "speaker_role": "Planner", + "interpretation": "Improvise.", + "tone": "Casual" + }, + { + "trigger": "Ring a bell?", + "speaker_role": "Asker", + "interpretation": "Does that sound familiar?", + "tone": "Inquisitive" + }, + { + "trigger": "Sound like a broken record", + "speaker_role": "Critic", + "interpretation": "You are repeating yourself.", + "tone": "Annoyed" + }, + { + "trigger": "It's not over until the fat lady sings", + "speaker_role": "Optimist", + "interpretation": "There is still a chance.", + "tone": "Hopeful" + }, + { + "trigger": "Hit the road", + "speaker_role": "Leaver", + "interpretation": "Leave.", + "tone": "Casual" + }, + { + "trigger": "Keep on trucking", + "speaker_role": "Supporter", + "interpretation": "Keep going.", + "tone": "Encouraging" + }, + { + "trigger": "10-4", + "speaker_role": "Agreed", + "interpretation": "Okay.", + "tone": "Casual" + }, + { + "trigger": "Roger that", + "speaker_role": "Agreed", + "interpretation": "Understood.", + "tone": "Casual" + }, + { + "trigger": "Over and out", + "speaker_role": "Leaver", + "interpretation": "Goodbye.", + "tone": "Final" + }, + { + "trigger": "Breaker 1-9", + "speaker_role": "Caller", + "interpretation": "I want to talk.", + "tone": "Playful" + }, + { + "trigger": "What's your 20?", + "speaker_role": "Asker", + "interpretation": "Where are you?", + "tone": "Inquisitive" + }, + { + "trigger": "Smokey", + "speaker_role": "Driver", + "interpretation": "Police.", + "tone": "Warning" + }, + { + "trigger": "Bear in the air", + "speaker_role": "Driver", + "interpretation": "Police helicopter.", + "tone": "Warning" + }, + { + "trigger": "Hammer down", + "speaker_role": "Driver", + "interpretation": "Go fast.", + "tone": "Excited" + }, + { + "trigger": "Pedal to the metal", + "speaker_role": "Driver", + "interpretation": "Go fast.", + "tone": "Excited" + }, + { + "trigger": "My way or the highway", + "speaker_role": "Authoritarian", + "interpretation": "Do it my way or leave.", + "tone": "Strict" + }, + { + "trigger": "Road hog", + "speaker_role": "Critic", + "interpretation": "Driver taking up space.", + "tone": "Angry" + }, + { + "trigger": "Sunday driver", + "speaker_role": "Critic", + "interpretation": "Slow driver.", + "tone": "Angry" + }, + { + "trigger": "Backseat driver", + "speaker_role": "Critic", + "interpretation": "Passenger giving advice.", + "tone": "Annoyed" + }, + { + "trigger": "Gas station sushi", + "speaker_role": "Critic", + "interpretation": "Bad idea / Risky.", + "tone": "Humorous" + }, + { + "trigger": "Deer in headlights", + "speaker_role": "Observer", + "interpretation": "Frozen in fear.", + "tone": "Descriptive" + }, + { + "trigger": "Road rage", + "speaker_role": "Observer", + "interpretation": "Driving anger.", + "tone": "Descriptive" + }, + { + "trigger": "Like a bat out of hell", + "speaker_role": "Observer", + "interpretation": "Moving very fast.", + "tone": "Descriptive" + }, + { + "trigger": "Hell freezes over", + "speaker_role": "Skeptic", + "interpretation": "Never.", + "tone": "Sarcastic" + }, + { + "trigger": "Snowball's chance in hell", + "speaker_role": "Skeptic", + "interpretation": "No chance.", + "tone": "Sarcastic" + }, + { + "trigger": "Come hell or high water", + "speaker_role": "Determined", + "interpretation": "No matter what.", + "tone": "Determined" + }, + { + "trigger": "The devil is in the details", + "speaker_role": "Analyst", + "interpretation": "Small things matter.", + "tone": "Cautionary" + }, + { + "trigger": "Idle hands are the devil's workshop", + "speaker_role": "Advisor", + "interpretation": "Stay busy to avoid trouble.", + "tone": "Moralizing" + }, + { + "trigger": "Money is the root of all evil", + "speaker_role": "Moralist", + "interpretation": "Greed causes problems.", + "tone": "Moralizing" + }, + { + "trigger": "Rob Peter to pay Paul", + "speaker_role": "Debtor", + "interpretation": "Shift debt without solving it.", + "tone": "Desperate" + }, + { + "trigger": "Doubting Thomas", + "speaker_role": "Critic", + "interpretation": "Skeptic.", + "tone": "Critical" + }, + { + "trigger": "Good Samaritan", + "speaker_role": "Observer", + "interpretation": "Kind stranger.", + "tone": "Appreciative" + }, + { + "trigger": "Prodigal Son", + "speaker_role": "Observer", + "interpretation": "Returning family member.", + "tone": "Welcoming" + }, + { + "trigger": "Scapegoat", + "speaker_role": "Victim", + "interpretation": "Person blamed for others.", + "tone": "Sympathetic" + }, + { + "trigger": "Wash my hands of it", + "speaker_role": "Quitter", + "interpretation": "I am no longer responsible.", + "tone": "Final" + }, + { + "trigger": "Writing on the wall", + "speaker_role": "Observer", + "interpretation": "Signs of failure are obvious.", + "tone": "Ominous" + }, + { + "trigger": "Gospel truth", + "speaker_role": "Speaker", + "interpretation": "Absolute truth.", + "tone": "Sincere" + }, + { + "trigger": "Forbidden fruit", + "speaker_role": "Observer", + "interpretation": "Tempting but wrong.", + "tone": "Tempting" + }, + { + "trigger": "Salt of the earth", + "speaker_role": " admirer", + "interpretation": "Good, humble people.", + "tone": "Respectful" + }, + { + "trigger": "Eye for an eye", + "speaker_role": "Avenger", + "interpretation": "Retaliation.", + "tone": "Vengeful" + }, + { + "trigger": "Turn the other cheek", + "speaker_role": "Pacifist", + "interpretation": "Ignore the insult.", + "tone": "Passive" + }, + { + "trigger": "Go the extra mile", + "speaker_role": "Worker", + "interpretation": "Do more than asked.", + "tone": "Positive" + }, + { + "trigger": "Straight and narrow", + "speaker_role": "Advisor", + "interpretation": "Honest life.", + "tone": "Moralizing" + }, + { + "trigger": "Fall from grace", + "speaker_role": "Critic", + "interpretation": "Loss of reputation.", + "tone": "Dramatic" + }, + { + "trigger": "Act of God", + "speaker_role": "Insurer", + "interpretation": "Natural disaster.", + "tone": "Legal" + }, + { + "trigger": "God's country", + "speaker_role": "Resident", + "interpretation": "Beautiful rural area.", + "tone": "Proud" + }, + { + "trigger": "Hail Mary", + "speaker_role": "Planner", + "interpretation": "Last desperate attempt.", + "tone": "Desperate" + }, + { + "trigger": "Come to Jesus moment", + "speaker_role": "Boss", + "interpretation": "Serious talk about failure.", + "tone": "Serious" + }, + { + "trigger": "Sacred cow", + "speaker_role": "Critic", + "interpretation": "Thing that cannot be criticized.", + "tone": "Critical" + }, + { + "trigger": "Worship the ground he walks on", + "speaker_role": "Lover", + "interpretation": "Adore completely.", + "tone": "Loving" + }, + { + "trigger": "Judas", + "speaker_role": "Betrayed", + "interpretation": "Traitor.", + "tone": "Angry" + }, + { + "trigger": "30 pieces of silver", + "speaker_role": "Critic", + "interpretation": "Price of betrayal.", + "tone": "Critical" + }, + { + "trigger": "Kiss of death", + "speaker_role": "Observer", + "interpretation": "Event ensuring failure.", + "tone": "Fatal" + }, + { + "trigger": "Cross to bear", + "speaker_role": "Sufferer", + "interpretation": "Personal burden.", + "tone": "Sad" + }, + { + "trigger": "Patience of Job", + "speaker_role": "Observer", + "interpretation": "Infinite patience.", + "tone": "Admiring" + }, + { + "trigger": "David and Goliath", + "speaker_role": "Observer", + "interpretation": "Small vs Big.", + "tone": "Inspiring" + }, + { + "trigger": "Philistine", + "speaker_role": "Snob", + "interpretation": "Uncultured person.", + "tone": "Insulting" + }, + { + "trigger": "Sodom and Gomorrah", + "speaker_role": "Moralist", + "interpretation": "Place of sin.", + "tone": "Critical" + }, + { + "trigger": "Armageddon", + "speaker_role": "Alarmist", + "interpretation": "The end of the world.", + "tone": "Scared" + }, + { + "trigger": "Apocalypse", + "speaker_role": "Alarmist", + "interpretation": "Total destruction.", + "tone": "Scared" + }, + { + "trigger": "Rapture", + "speaker_role": "Religious", + "interpretation": "Ascent to heaven.", + "tone": "Hopeful" + }, + { + "trigger": "Left Behind", + "speaker_role": "Religious", + "interpretation": "Abandoned on earth.", + "tone": "Fearful" + }, + { + "trigger": "Born again", + "speaker_role": "Convert", + "interpretation": "Started new life.", + "tone": "Joyful" + }, + { + "trigger": "See the light", + "speaker_role": "Convert", + "interpretation": "Understand the truth.", + "tone": "Enlightened" + }, + { + "trigger": "Preach!", + "speaker_role": "Supporter", + "interpretation": "I agree!", + "tone": "Enthusiastic" + }, + { + "trigger": "Amen", + "speaker_role": "Supporter", + "interpretation": "I agree.", + "tone": "Agreement" + }, + { + "trigger": "Hallelujah", + "speaker_role": "Celebrant", + "interpretation": "Thank goodness.", + "tone": "Relieved" + }, + { + "trigger": "Saved by the bell", + "speaker_role": "Survivor", + "interpretation": "Rescued at last moment.", + "tone": "Relieved" + }, + { + "trigger": "Go for broke", + "speaker_role": "Gambler", + "interpretation": "Risk everything.", + "tone": "Excited" + }, + { + "trigger": "Bet the farm", + "speaker_role": "Gambler", + "interpretation": "Risk everything.", + "tone": "Serious" + }, + { + "trigger": "High roller", + "speaker_role": "Observer", + "interpretation": "Big spender.", + "tone": "Admiring" + }, + { + "trigger": "Penny pincher", + "speaker_role": "Critic", + "interpretation": "Stingy person.", + "tone": "Critical" + }, + { + "trigger": "Cheapskate", + "speaker_role": "Critic", + "interpretation": "Stingy person.", + "tone": "Insulting" + }, + { + "trigger": "Deadbeat", + "speaker_role": "Critic", + "interpretation": "Does not pay debts.", + "tone": "Insulting" + }, + { + "trigger": "Freeloader", + "speaker_role": "Critic", + "interpretation": "Takes without giving.", + "tone": "Insulting" + }, + { + "trigger": "Mooch", + "speaker_role": "Critic", + "interpretation": "Beggar.", + "tone": "Insulting" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/English/Indonesian Persona.json b/lab_profiles/English/Indonesian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f82d9920b1d419c0eb13d4c6bf9556afffaea434 --- /dev/null +++ b/lab_profiles/English/Indonesian Persona.json @@ -0,0 +1,42 @@ +{ + "lab_name": "Indonesian English", + "cultural_context": "High context, collectivist, conflict-avoidant. 'Saving face' is crucial. Direct refusals are rude. 'Rubber Time' (Jam Karet) affects punctuality.", + "jargon": { + "Thanks before": "Thanks in advance (Literal translation of 'Terima kasih sebelumnya').", + "Open the light / Open your shoes": "Turn on the light / Take off your shoes (Buka).", + "Close the light": "Turn off the light (Tutup).", + "Join with us": "Join us (Gabung dengan kami).", + "I am boring": "I am bored (Common adjective confusion).", + "Keep your bag": "Put away or store your bag (Simpan).", + "First / I go first": "I am leaving now / Goodbye (Duluan).", + "Same same": "It is the same / No difference.", + "Buy for me food": "Buy food for me.", + "Follow me": "Come with me / Accompany me." + }, + "pragmatic_rules": [ + { + "trigger": "Maybe / We will see / It is difficult", + "speaker_role": "Any", + "interpretation": "Polite refusal. They imply 'No', but cannot say it directly to avoid causing loss of face.", + "tone": "Evasive / Polite" + }, + { + "trigger": "I am on the way (OTW)", + "speaker_role": "Any", + "interpretation": "I might still be getting ready or just leaving. Do not expect immediate arrival (Jam Karet concept).", + "tone": "Casual / Reassuring" + }, + { + "trigger": "Is it?", + "speaker_role": "Listener", + "interpretation": "Phatic backchanneling meaning 'Really?' or 'Is that so?'. Shows engagement, not necessarily a question.", + "tone": "Engaged / Curious" + }, + { + "trigger": "Don't be arrogant", + "speaker_role": "Senior/Elder", + "interpretation": "A serious warning to be humble. Arrogance is a significant cultural taboo.", + "tone": "Warning / Moralizing" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/English/Korean Persona.json b/lab_profiles/English/Korean Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..429ab4a10e1f7416a4da4bf0709ce40b38cf243a --- /dev/null +++ b/lab_profiles/English/Korean Persona.json @@ -0,0 +1,46 @@ +{ + "lab_name": "Korean English", + "cultural_context": "Mixed Korean and International environment. High hierarchical distance.", + "role": "Instructor", + "jargon": { + "NLP": "Natural Language Processing.", + "LEO": "Low Earth Orbit satellite simulation setup.", + "Doppler": "Doppler shift compensation algorithm in OFDM systems.", + "The rig": "The multi-sensor UAV simulation testbed.", + "Prof": "The Principal Investigator (PI). His requests are absolute priority.", + "Paper deadline": "Code for 'Cancel all personal plans, we sleep in the lab'.", + "Blue screen": "Specific error on the flight controller (not Windows).", + "Calibration": "UAV sensor fusion alignment process." + }, + "pragmatic_rules": [ + { + "trigger": "Can you check...", + "speaker_role": "Senior/Prof", + "interpretation": "This is a soft command. Do it immediately.", + "tone": "Polite but Authoritative" + }, + { + "trigger": "It's a bit difficult", + "speaker_role": "Junior/Korean Member", + "interpretation": "Refusal. They cannot do it but cannot say 'No' directly to a superior.", + "tone": "Evasive / Apologetic" + }, + { + "trigger": "Coffee?", + "speaker_role": "Any", + "interpretation": "Request for informal sync/brainstorming away from the lab bench.", + "tone": "Casual / Bonding" + }, + { + "trigger": "Service", + "speaker_role": "Restaurant Staff/Host", + "interpretation": "This item is free/on the house.", + "tone": "Hospitality" + }, + { + "trigger": "verbose", + "interpretation": "Please be concise.", + "tone": "Instruction" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/English/Nigerian Persona.json b/lab_profiles/English/Nigerian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e5a8dc92f396ca29d7486069f9aa0a4525e126c3 --- /dev/null +++ b/lab_profiles/English/Nigerian Persona.json @@ -0,0 +1,1612 @@ +{ + "lab_name": "Nigerian English", + "cultural_context": "Formal, polite, and heavily influenced by British colonial legacy mixed with local social norms. High emphasis on titles (Chief, Engr, Sir/Ma). Indirectness is preferred in business refusals. 'Please' is used excessively to soften requests. The concept of 'family' extends to distant relatives and community members. Religious fatalism ('It is well') is common in professional settings.", + "jargon": { + "Academics": "School work / University activities.", + "Action": "To expedite a file or request (e.g., 'Please action this letter').", + "Admin": "Administration.", + "African time": "The cultural tendency to arrive late to events.", + "After-dress": "A dress worn after the wedding reception.", + "Age grade": "A group of people born within the same time frame (cultural society).", + "Agip": "Any Government In Power (A person loyal to whoever is ruling).", + "Ago": "Knock knock (used when entering a house).", + "Ajebutter": "A wealthy or pampered person (soft like butter).", + "Ajepako": "A person from a tough background (eats wood).", + "Alhaja": "Title for a Muslim woman who has performed the Hajj.", + "Alhaji": "Title for a Muslim man who has performed the Hajj.", + "All-night": "An overnight religious vigil.", + "Andrew": "Someone who wants to check out (leave the country).", + "Annex": "An extension of a building or office.", + "Antenatal": "Prenatal care clinics.", + "Applicant": "Someone looking for a job.", + "Area boy": "Street thug or tout.", + "Arrangee": "Something arranged illegally or a person used for fraud.", + "As it were": "A filler phrase used frequently in formal speech.", + "Aso-ebi": "Uniform fabric worn by family/friends at a ceremony.", + "Aso-oke": "Hand-woven cloth from the Yoruba culture.", + "Attached": "Assigned (e.g., 'I was attached to the Lagos branch').", + "Aunty": "Respectful address for any older female, related or not.", + "Available": "To have money (e.g., 'I am not available now').", + "Baba": "Father or respected elder.", + "Baby mama": "Unmarried mother of one's child.", + "Bachelor's eve": "Stag party/Bachelor party.", + "Backyard": "Buttocks (Euphemism).", + "Bad belle": "Malice or jealousy.", + "Baffs": "Trendy clothes.", + "Balance": "To remain / The remaining change from a transaction.", + "Balcony": "Large bosom (Slang).", + "Barbing salon": "Barbershop.", + "Basest": "The lowest or worst.", + "Bash": "To hit a car (accident) or a party.", + "Batch": "A group of people (especially NYSC corp members).", + "Battery": "To charge a phone (e.g., 'I want to battery my phone').", + "Beating rain": "Walking in the rain.", + "Bed-ridden": "Confined to bed due to illness.", + "Been-to": "Someone who has lived abroad (usually UK/USA) and returned.", + "Beg": "To plead or request politely.", + "Bend-down boutique": "Second-hand clothes market (where you bend to pick items).", + "Best lady": "Maid of honor.", + "Best man": "Groom's chief attendant.", + "Big grammar": "Using overly complex English words.", + "Big man": "Rich or influential man.", + "Biscuit bone": "Brisket (soft bone).", + "Block": "To intercept or ambush.", + "Blow": "To become rich or famous.", + "Body odor": "Bad smell.", + "Boli": "Roasted plantain.", + "Bone": "To frown or snub.", + "Book": "To report someone to authority or reserve a seat.", + "Book-long": "Studious / Too much theory.", + "Borrow": "To lend (e.g., 'Borrow me your pen' means 'Lend me your pen').", + "Boss": "General term of respect for a male stranger.", + "Bottom power": "Using sexual influence to get favors.", + "Bounce": "To be rejected or to walk arrogantly.", + "Boys": "Subordinates or gang members.", + "Branch": "To stop by somewhere briefly on a journey.", + "Bread": "Money.", + "Breakfast": "Heartbreak (Slang).", + "Bride price": "Dowry paid by the groom.", + "Bring-down": "To cause someone's downfall.", + "Bro": "Brother / Friend.", + "Brown envelope": "Bribe given to journalists.", + "Buga": "To show off.", + "Buka": "Local roadside restaurant.", + "Bunk": "Bed in a hostel.", + "Bush": "Uncivilized or rural.", + "Bush-meat": "Game meat (antelope, grasscutter).", + "Business center": "Place for typing/photocopying documents.", + "Butty": "Spoiled child (Short for Ajebutter).", + "Call": "To announce (e.g., 'They have called the results').", + "Cane": "To flog or whip.", + "Canteen": "Restaurant.", + "Canvas": "Sneakers/Tennis shoes.", + "Car park": "Parking lot.", + "Carry": "To give a ride or trick someone.", + "Carry over": "To fail a university course and retake it.", + "Carton": "Box (e.g., 'Carton of Indomie').", + "Case": "Trouble or police matter.", + "Cash madam": "A wealthy woman who deals in cash.", + "Cast": "To expose a secret.", + "Catechist": "Religious instructor.", + "Center table": "Coffee table.", + "Chairlady": "Female chairperson.", + "Chairman": "Head of an event, or a flatterous title for a man.", + "Chance": "To cheat or take advantage of.", + "Change": "Money returned after payment.", + "Chapman": "A popular cocktail drink.", + "Charter": "To hire a taxi exclusively (Taxi drop).", + "Check out": "To die.", + "Chewing stick": "Traditional twig used for brushing teeth.", + "Chief": "Title for a titled elder.", + "Chin-chin": "Crunchy fried dough snack.", + "Chips": "French fries (US influence) or Plantain chips.", + "Chop": "To eat, embezzle, or enjoy.", + "Chop money": "Allowance for food.", + "Chrife": "Christian + Life (Overly religious person).", + "Christmas clothes": "New clothes bought for the holiday.", + "Church mind": "Conscience.", + "Circular": "An official memo distributed to staff.", + "Civil servant": "Government employee.", + "Clean": "Innocent or neat.", + "Clear": "To settle a bill or understand.", + "Close from work": "To finish work for the day.", + "Close marking": "Monitoring someone closely.", + "Cloth": "Clothes.", + "Coal tar": "Asphalt road.", + "Coat": "Suit jacket.", + "Cold room": "Walk-in freezer.", + "Collect": "To receive (e.g., 'I collected my salary').", + "Come": "To arrive (e.g., 'Has he come?').", + "Come and eat": "Polite invitation when eating.", + "Command": "To control.", + "Commot": "Leave.", + "Compound": "A fenced residential area/yard.", + "Condition": "Health status or trouble.", + "Conductor": "Bus assistant who collects fares.", + "Confam": "Confirmed / Genuine.", + "Conference": "Meeting.", + "Confraternity": "University cult group.", + "Cooking pot": "Saucepan.", + "Cool van": "Refrigerated van.", + "Corner": "To turn a vehicle.", + "Corner-corner": "Illegal or shady (adjective).", + "Corporate": "Formal wear (e.g., 'Wear corporate').", + "Corper": "NYSC member.", + "Correct": "Good / Genuine.", + "Countryman": "Fellow citizen.", + "Court": "To sue.", + "Cover cloth": "Wrapper fabric.", + "Cover shoe": "Closed-toe shoe.", + "Cow": "Fool / Idiot.", + "Cow leg": "A delicacy made from cow's foot.", + "Crack": "To joke.", + "Crave": "To beg.", + "Creep": "To cheat in a relationship.", + "Cross carpet": "To switch political parties.", + "Cruise": "Fun / Prank.", + "Current": "Electricity.", + "Customer": "Someone you buy from regularly (not just someone buying from you).", + "Customized": "Personalized.", + "Cut": "Share of money.", + "Cutlass": "Machete.", + "Daddy": "Respectful term for any older man.", + "Damages": "Cost of repairs or compensation.", + "Danfo": "Commercial yellow bus.", + "Dash": "To give a gift or bribe.", + "Dashboard": "Car instrument panel.", + "Date": "Calendar date (e.g., 'What is today's date?').", + "Decampee": "Politician who switches parties.", + "Declare": "To buy drinks for friends.", + "Decorate": "To bribe.", + "Deep": "Profound.", + "Deliver": "To save or rescue.", + "Demurrage": "Fee for delay at the port.", + "Detail": "Specifics.", + "Devotion": "Prayer session.", + "Dialect": "Language.", + "Dice": "Cube.", + "Dickson": "Detective.", + "Dig": "To understand.", + "Direct entry": "Admission to 2nd year university.", + "Dirty": "Rude (e.g., 'He slapped him a dirty slap').", + "Discharge": "To release or acquit.", + "Discussion": "Argument.", + "Disengage": "To fire or lay off an employee.", + "Disvirgin": "To use a new product for the first time.", + "Divider": "Traffic island.", + "Do": "To treat, fix, or affect (e.g., 'Do my hair').", + "Do somehow": "To act unreliably or suspiciously.", + "Doctor": "Any medical staff.", + "Dodgy": "Suspicious.", + "Donation": "Bribe.", + "Double": "To rush.", + "Dowry": "Bride price.", + "Draw": "Soup viscosity (e.g., 'This soup draws well').", + "Dress": "To move over in a seat (e.g., 'Dress for me').", + "Drink": "Alcohol.", + "Driver": "Chauffeur.", + "Drop": "To get out of a vehicle (passenger) or stop a taxi.", + "Dry": "Boring or skinny.", + "Dub": "To copy.", + "Dull": "Slow-witted.", + "Duplex": "A two-story house (semi-detached or detached).", + "Dustbin": "Trash can.", + "Ease oneself": "To use the toilet.", + "Eat money": "To embezzle or spend lavishly.", + "Egoun": "Bribe (slang).", + "Egunje": "Bribe.", + "Electioneering": "Campaigning.", + "Enjoyment": "Pleasure / Party.", + "Environment": "Neighborhood.", + "Escort": "To walk a guest to the gate.", + "Estate": "Housing development.", + "Exam": "Examination.", + "Exchange": "To swap.", + "Exercise book": "Notebook.", + "Expedite action": "To speed up a bureaucratic process.", + "Experience": "A terrible ordeal.", + "Extreme": "The very end of a room or road.", + "Eyeglass": "Spectacles.", + "Face-me-I-face-you": "Tenement housing.", + "Facilitator": "Trainer.", + "Fail": "To disappoint (e.g., 'The generator failed us').", + "Family planning": "Contraception.", + "Fan": "To cool.", + "Father": "Priest.", + "Fear": "To scare (e.g., 'The dog feared me').", + "Federal character": "Quota system/Affirmative action.", + "Feeding allowance": "Money for food.", + "Fellowship": "Religious gathering.", + "Festac": "Festival.", + "Fetch": "To get water.", + "File": "To submit documents.", + "Fill": "To complete a form.", + "Fine": "Beautiful.", + "Fire": "To shoot.", + "First school leaving certificate": "Primary school diploma.", + "Fish": "To search.", + "Fit": "To be able to.", + "Fix": "To repair.", + "Flag off": "To start a project.", + "Flash": "To call and hang up immediately.", + "Flashing": "Calling and hanging up immediately.", + "Flat": "Apartment.", + "Flog": "To whip/cane.", + "Floor": "Story (of a building).", + "Flow": "To understand or rhyme.", + "Follow": "To accompany.", + "Food flask": "Thermos for food.", + "Footing": "Walking.", + "Form": "To pretend.", + "Forward": "To send a message.", + "Four-one-nine (419)": "Fraud/Scam.", + "Frame": "Eyeglass frame.", + "Free": "To release.", + "Fresh": "Looking good/healthy.", + "Fridge": "Refrigerator.", + "Fronting": "Pretending or acting as a cover.", + "Fruit": "Outcome.", + "Full option": "Car with all features (or a well-endowed woman).", + "Function": "Event.", + "Gaff": "Mistake.", + "Gain": "Profit.", + "Gallop": "Pothole or speed bump.", + "Garden egg": "African eggplant.", + "Garri": "Cassava flakes.", + "Gas": "Fart.", + "Gate man": "Security guard.", + "Gathering": "Meeting.", + "Gbedu": "Music.", + "Gear": "Car transmission.", + "General": "Common.", + "Gent": "Gentleman.", + "Get": "To have.", + "Get down": "To alight from a vehicle.", + "Ghost worker": "Non-existent employee drawing salary.", + "Giraffing": "Spying on someone's paper during an exam.", + "Girl": "Maid or girlfriend.", + "Gist": "To chat, gossip, or tell a story.", + "Give": "To cause.", + "Go": "To leave.", + "Go-slow": "Traffic jam.", + "Gobbe": "Trouble.", + "Godfather": "Political sponsor/protector.", + "Good": "Fine.", + "Goods": "Merchandise.", + "Government": "Authorities.", + "Governor": "State leader.", + "Grab": "To understand.", + "Grade": "Quality.", + "Grammar": "Big words.", + "Grass": "Weed.", + "Grease": "Bribe.", + "Greet": "To say hello.", + "Ground": "Floor.", + "Group": "Team.", + "Guest": "Visitor.", + "Guide": "Lead.", + "Guy": "Friend.", + "Gym": "Exercise.", + "Half-current": "Low voltage electricity.", + "Hammer": "To make it big.", + "Handover": "Transfer of power.", + "Hang": "To wait.", + "Harass": "To bother.", + "Hard": "Difficult.", + "Hawker": "Street vendor.", + "Head": "Leader.", + "Head tie": "Gele (turban).", + "Hear": "To understand (language).", + "Heart": "Courage.", + "Heavy": "Pregnant.", + "Help": "To assist.", + "High sea": "Being very drunk.", + "Hire": "To rent.", + "Hold": "To arrest or delay.", + "Hold-up": "Severe traffic jam (worse than go-slow).", + "Home trouble": "Family problems (often implied spiritual).", + "Home video": "Nollywood movie.", + "Horn": "To honk.", + "Hostel": "Dormitory.", + "Hot": "Fast or dangerous.", + "Hotel": "Bar/Restaurant (sometimes).", + "House girl/boy": "Domestic servant.", + "House help": "Domestic servant.", + "How far": "Informal greeting meaning 'How are you?' or 'What is the situation?'.", + "Hustle": "To work hard.", + "I beg": "Please.", + "Ice water": "Cold water.", + "Idiot": "Fool.", + "Igbo": "Weed.", + "Imported": "Foreign.", + "Industrial attachment": "Internship.", + "Inside life": "The reality of a situation is complex/hidden.", + "Installmentally": "In installments (paying over time).", + "Inter-state": "Between states.", + "Introduction": "First formal meeting between families before marriage.", + "Invalid": "Void.", + "Invigilator": "Exam proctor.", + "Invite": "Invitation.", + "Issue": "Problem.", + "Item": "Topic.", + "Jab": "To insult.", + "Jack": "To study hard.", + "Jam": "To hit or meet.", + "Jara": "Extra added for free.", + "Jealous": "To envy (used as a verb: 'Don't jealous me').", + "Jelly": "Cream.", + "Jerk": "To startle.", + "Job": "Work.", + "Join": "To board a vehicle.", + "Joint": "A spot to eat, drink, or relax.", + "Joke": "Comedy.", + "Judge": "Magistrate.", + "Jug": "Pitcher.", + "Juice": "Drink.", + "Jump": "To skip.", + "Junior": "Younger.", + "Just": "Only.", + "K-leg": "Complication or problem.", + "Kabukabu": "Unregistered taxi.", + "Keep": "To save.", + "Keep the change": "Don't return the balance.", + "Keke": "Tricycle taxi.", + "Kerosene": "Paraffin.", + "Key": "To lock.", + "Kick": "To start (an engine).", + "Kid": "Child.", + "Kill": "To turn off (engine/light).", + "Kitchen": "Cooking area.", + "Knock": "Engine sound.", + "Knockout": "Firecracker.", + "Kolo": "Mad.", + "Labor": "Work.", + "Lad": "Boy.", + "Ladder": "Steps.", + "Lady": "Woman.", + "Lagos": "City.", + "Land": "To arrive.", + "Landlord": "House owner.", + "Lane": "Path.", + "Language": "Dialect.", + "Lap": "To carry someone on one's lap.", + "Large": "Big.", + "Last born": "The youngest sibling.", + "Late": "Deceased.", + "Launch": "To open.", + "Law": "Rule.", + "Lawyer": "Attorney.", + "Layabout": "Idler.", + "Lead": "Guide.", + "Leader": "Head.", + "Leak": "To reveal.", + "Lean": "Thin.", + "Learn": "To teach (archaic use).", + "Learner": "Beginner driver.", + "Leave": "Holiday.", + "Lecture": "Class.", + "Lecturer": "Professor.", + "Leg": "Connection.", + "Lemon": "Bad car.", + "Lend": "To borrow (inverse usage is common error, but 'borrow' for 'lend' is the target here).", + "Lesson": "Class.", + "Lesson teacher": "Private tutor.", + "Letter": "Mail.", + "Level": "Class/Status.", + "License": "Permit.", + "Lie": "Untruth.", + "Lift": "Ride.", + "Light": "Electricity/Power.", + "Like": "As.", + "Line": "Queue.", + "Link": "Connection.", + "List": "Roster.", + "Load": "Luggage.", + "Loan": "Debt.", + "Local": "Unsophisticated.", + "Lock": "Secure.", + "Lodge": "Hotel.", + "Long leg": "Connections/Influence used to get a favor.", + "Look": "Search.", + "Lorry": "Truck.", + "Lose": "Misplace.", + "Loss": "Deficit.", + "Loud": "Noisy.", + "Love": "Affection.", + "Low": "Down.", + "Luck": "Chance.", + "Luggage": "Baggage.", + "Lunch": "Afternoon meal.", + "Machine": "Motorcycle.", + "Madam": "Respectful title for a woman.", + "Madness": "Insanity.", + "Maggi": "Bouillon cube (generic trademark).", + "Mail": "Letter.", + "Main": "Principal.", + "Maintain": "To keep.", + "Major": "Big.", + "Make": "To do.", + "Malam": "Title for Northern man.", + "Malaria": "Fever (generic term for illness).", + "Male": "Man.", + "Mama": "Mother.", + "Mama put": "Roadside restaurant.", + "Man": "Male.", + "Manage": "To endure or make do.", + "Manager": "Boss.", + "Mannerless": "Rude or lacking home training.", + "Manual": "By hand.", + "Market": "Trade.", + "Marriage": "Wedding.", + "Mash": "Crush.", + "Master": "Boss.", + "Match": "Game.", + "Mate": "Peer.", + "Material": "Fabric.", + "Matter": "Issue.", + "Mature": "Adult.", + "Maximum": "Most.", + "Mean": "Stingy.", + "Meat": "Flesh.", + "Meat pie": "Pastry filled with meat.", + "Mechanic": "Car repairer.", + "Medicine": "Drug.", + "Meeting": "Gathering.", + "Member": "Person.", + "Memo": "Note.", + "Mental": "Crazy.", + "Menu": "List.", + "Mess": "Trouble.", + "Message": "Errand.", + "Meter": "Gauge.", + "Method": "Way.", + "Middle": "Center.", + "Midnight": "Late night.", + "Mile": "Distance.", + "Milk": "Dairy.", + "Mind": "Care.", + "Mine": "Possess.", + "Mineral": "Soft drink.", + "Minerals": "Soft drinks.", + "Minister": "Official.", + "Minor": "Small.", + "Minute": "To write minutes on a file.", + "Miss": "To fail to hit.", + "Mistake": "Error.", + "Mix": "Blend.", + "Mobile": "Cell phone.", + "Model": "Type.", + "Modern": "New.", + "Modest": "Humble.", + "Molue": "Large, often dilapidated commercial bus (Lagos).", + "Mommy": "Mother.", + "Money": "Cash.", + "Monitor": "Watch.", + "Month": "Time.", + "Morning": "Time.", + "Morning devotion": "Morning prayer session.", + "Mortuary": "Morgue.", + "Mosquito": "Insect.", + "Mother": "Parent.", + "Motor": "Car.", + "Motor park": "Bus station.", + "Move": "Go.", + "Movement": "Traffic.", + "Movie": "Film.", + "Mr": "Title.", + "Mrs": "Title.", + "Much": "A lot.", + "Mud": "Dirt.", + "Mug": "Cup.", + "Mum": "Mother.", + "Murder": "Kill.", + "Music": "Song.", + "Must": "Have to.", + "My dear": "Friend.", + "Naira": "Currency.", + "Naked": "Nude.", + "Name": "Title.", + "Naming ceremony": "Event to name a newborn (7/8 days after birth).", + "Nanny": "Childcare provider.", + "Nap": "Sleep.", + "National": "Country.", + "Native": "Traditional clothes.", + "Native doctor": "Traditional herbalist/healer.", + "Nature": "World.", + "Naughty": "Bad.", + "Near": "Close.", + "Neat": "Clean.", + "Necessary": "Needed.", + "Neck": "Body part.", + "Need": "Want.", + "Needle": "Pin.", + "Negative": "Bad.", + "Neighbor": "Friend.", + "Nepa": "Power company (used for electricity).", + "Nephew": "Relative.", + "Nervous": "Scared.", + "Net": "Web.", + "New": "Fresh.", + "News": "Report.", + "Next": "After.", + "Next tomorrow": "The day after tomorrow.", + "Nice": "Good.", + "Niece": "Relative.", + "Night": "Dark.", + "Night vigil": "Overnight prayer service.", + "No": "Refusal.", + "Noise": "Sound.", + "Non-indigene": "Outsider.", + "Nonsense": "Rubbish.", + "Normal": "Usual.", + "North": "Direction.", + "Nose": "Smell.", + "Not on seat": "Absent from the desk/office.", + "Note": "Write.", + "Notice": "See.", + "Now": "Present.", + "Number": "Digit.", + "Nurse": "Carer.", + "Nylon": "Plastic bag.", + "O'clock": "Time.", + "Obey": "Listen.", + "Object": "Thing.", + "Observe": "Watch.", + "Occasion": "Event.", + "Occupant": "Resident.", + "Occupation": "Job.", + "Off": "To turn off or leave.", + "Off the light": "Turn off the light.", + "Offense": "Crime.", + "Offer": "Give.", + "Office": "Workplace.", + "Officer": "Police.", + "Official": "Formal.", + "Often": "Frequent.", + "Oga": "Boss.", + "Oil": "Palm oil.", + "Ok": "Yes.", + "Okada": "Commercial motorcycle taxi.", + "Old": "Aged.", + "Old school": "Retro.", + "Omo": "Child/Person.", + "On": "To turn on.", + "On the light": "Turn on the light.", + "One": "Single.", + "Only": "Sole.", + "Open": "Unlock.", + "Operation": "Surgery.", + "Opinion": "View.", + "Opportunity": "Chance.", + "Opportuned": "To have the opportunity (e.g., 'I was not opportuned to go').", + "Opposite": "Facing.", + "Option": "Choice.", + "Orange": "Fruit.", + "Order": "Command.", + "Ordinary": "Plain.", + "Organize": "Arrange.", + "Original": "Real.", + "Other": "Different.", + "Out": "Away.", + "Outfit": "Clothes.", + "Outing": "Trip.", + "Outside": "Exterior.", + "Oversabi": "Overzealous person.", + "Over": "Finished.", + "Overload": "Too much.", + "Owe": "Debt.", + "Own": "Possess.", + "Owner": "Proprietor.", + "Pack": "To move out of a house OR to park a car.", + "Package": "Parcel.", + "Packet": "Box.", + "Page": "Sheet.", + "Pain": "Hurt.", + "Paint": "Color.", + "Pair": "Two.", + "Palace": "House.", + "Palaver": "Trouble.", + "Palm": "Hand.", + "Palm oil": "Red oil.", + "Pan": "Pot.", + "Panel beater": "Car body repairer.", + "Paper": "Sheet.", + "Papers": "Car documents.", + "Parcel": "Package.", + "Parent": "Father/Mother.", + "Park": "Stop.", + "Parking": "Stop.", + "Parliament": "Government.", + "Parlor": "Living room.", + "Part": "Piece.", + "Participate": "Join.", + "Particular": "Specific.", + "Particulars": "Vehicle documents.", + "Partner": "Associate.", + "Party": "Celebration.", + "Pass": "Overtake or succeed.", + "Passenger": "Rider.", + "Passport": "ID.", + "Past": "Gone.", + "Pastor": "Priest.", + "Patch": "Fix.", + "Path": "Way.", + "Patient": "Sick person.", + "Patrol": "Guard.", + "Pattern": "Design.", + "Pay": "Give money.", + "Payment": "Money.", + "Peace": "Quiet.", + "Pen": "Writer.", + "Penny": "Coin.", + "Pension": "Retirement.", + "People": "Humans.", + "Pepper": "Spice.", + "Pepper soup": "Spicy broth.", + "Pepperish": "Spicy.", + "Per": "Each.", + "Percent": "Part.", + "Perfect": "Good.", + "Perform": "Act.", + "Performance": "Show.", + "Perhaps": "Maybe.", + "Period": "Time.", + "Permanent": "Fixed.", + "Permission": "Allow.", + "Permit": "Allow.", + "Person": "Human.", + "Personal": "Private.", + "Personnel": "Staff.", + "Petrol": "Gas.", + "Petrol station": "Gas station.", + "Phone": "Call.", + "Photo": "Picture.", + "Photocopy": "Duplicate.", + "Pick": "Choose or collect.", + "Pickin": "Child.", + "Picture": "Photo.", + "Piece": "Bit.", + "Pig": "Animal.", + "Pile": "Heap.", + "Pilot": "Flyer.", + "Pin": "Needle.", + "Pink": "Color.", + "Pipe": "Tube.", + "Pity": "Sympathy.", + "Place": "Spot.", + "Plain": "Simple.", + "Plait": "To braid hair.", + "Plan": "Idea.", + "Plane": "Aircraft.", + "Plant": "Grow.", + "Plantain": "Banana-like fruit.", + "Plastic": "Material.", + "Plate": "Dish.", + "Plate number": "License plate.", + "Play": "Game.", + "Player": "Gamer.", + "Please": "Beg.", + "Pleasure": "Joy.", + "Plenary": "Full legislative session.", + "Plenty": "Many.", + "Plot": "Land.", + "Plumpy": "Chubby / Plump.", + "Pocket": "Bag.", + "Point": "Show.", + "Police": "Cop.", + "Policy": "Rule.", + "Polish": "Shine.", + "Politics": "Government.", + "Poll": "Vote.", + "Ponmo": "Cow skin.", + "Pool": "Swim.", + "Poor": "Broke.", + "Pop": "Drink.", + "Popular": "Famous.", + "Population": "People.", + "Port": "Harbor.", + "Porter": "Carrier.", + "Position": "Place.", + "Positive": "Good.", + "Possible": "Can.", + "Post": "Mail.", + "Poster": "Sign.", + "Pot": "Pan.", + "Potato": "Food.", + "Pothole": "Hole.", + "Pound": "Beat.", + "Pounded yam": "Swallow food.", + "Pour": "Spill.", + "Powder": "Dust.", + "Power": "Strength.", + "Practice": "Train.", + "Praise": "Clap.", + "Pray": "Ask God.", + "Prayer": "Request.", + "Preach": "Talk.", + "Prefect": "Leader.", + "Prefer": "Like.", + "Pregnant": "Expecting.", + "Premier": "First.", + "Premises": "Compound.", + "Prepare": "Ready.", + "Present": "Here.", + "Presentation": "Show.", + "President": "Leader.", + "Press": "Push.", + "Pressure": "Stress.", + "Pretty": "Fine.", + "Prevent": "Stop.", + "Price": "Cost.", + "Pride": "Ego.", + "Priest": "Father.", + "Primary": "First.", + "Principal": "Head.", + "Print": "Copy.", + "Prison": "Jail.", + "Private": "Alone.", + "Prize": "Award.", + "Problem": "Issue.", + "Process": "Way.", + "Produce": "Make.", + "Product": "Good.", + "Profession": "Job.", + "Professor": "Teacher.", + "Profit": "Gain.", + "Program": "Show.", + "Progress": "Go.", + "Project": "Plan.", + "Promise": "Vow.", + "Promote": "Raise.", + "Proof": "Fact.", + "Proper": "Right.", + "Property": "Thing.", + "Proposal": "Plan.", + "Propose": "Ask.", + "Protect": "Guard.", + "Protection": "Safety.", + "Proud": "Haughty.", + "Prove": "Show.", + "Provide": "Give.", + "Provisions": "Groceries/Toiletries.", + "Public": "Open.", + "Publish": "Print.", + "Pull": "Drag.", + "Pump": "Machine.", + "Punch": "Hit.", + "Punish": "Beat.", + "Pupil": "Student.", + "Purchase": "Buy.", + "Pure": "Clean.", + "Pure water": "Sachet water.", + "Purple": "Color.", + "Purpose": "Goal.", + "Purse": "Bag.", + "Push": "Shove.", + "Put": "Place.", + "Put to bed": "To give birth.", + "Quality": "Good.", + "Quantity": "Amount.", + "Quarrel": "Fight.", + "Quarter": "Part.", + "Queen": "Royal.", + "Question": "Ask.", + "Queue": "Line.", + "Quick": "Fast.", + "Quiet": "Silent.", + "Quit": "Stop.", + "Quite": "Very.", + "Quack": "Fake/Unqualified professional.", + "Race": "Run.", + "Radio": "Sound.", + "Rag": "Cloth.", + "Rail": "Train.", + "Rain": "Water.", + "Rain coat": "Condom (slang).", + "Raise": "Lift.", + "Range": "Distance.", + "Rank": "Level.", + "Rapid": "Fast.", + "Rare": "Scarce.", + "Rate": "Speed.", + "Rather": "Instead.", + "Raw": "Uncooked.", + "Reach": "Arrive.", + "Read": "Look.", + "Ready": "Set.", + "Real": "True.", + "Realize": "Know.", + "Really": "Truly.", + "Rear": "Back.", + "Reason": "Why.", + "Receipt": "Bill.", + "Receive": "Get.", + "Recent": "New.", + "Reception": "Party.", + "Recipe": "Plan.", + "Recognize": "Know.", + "Recommend": "Say.", + "Record": "Note.", + "Recover": "Get back.", + "Red": "Color.", + "Reduce": "Cut.", + "Refer": "Point.", + "Refuse": "No.", + "Region": "Area.", + "Register": "Book.", + "Regret": "Sorry.", + "Regular": "Normal.", + "Regulation": "Rule.", + "Reject": "No.", + "Relate": "Tell.", + "Relation": "Family.", + "Relationship": "Bond.", + "Relative": "Family.", + "Relax": "Rest.", + "Release": "Let go.", + "Religion": "Faith.", + "Remain": "Stay.", + "Remark": "Say.", + "Remember": "Think.", + "Remind": "Tell.", + "Remote": "Far.", + "Remove": "Take.", + "Rent": "Hire.", + "Repair": "Fix.", + "Repeat": "Say again.", + "Replace": "Swap.", + "Reply": "Answer.", + "Report": "Tell.", + "Represent": "Show.", + "Representative": "Agent.", + "Request": "Ask.", + "Require": "Need.", + "Rescue": "Save.", + "Research": "Study.", + "Reserve": "Keep.", + "Resident": "Live.", + "Resign": "Quit.", + "Resist": "Stop.", + "Resolution": "Fix.", + "Resolve": "Fix.", + "Respect": "Honor.", + "Respond": "Answer.", + "Responsibility": "Duty.", + "Rest": "Sleep.", + "Restaurant": "Eatery.", + "Result": "End.", + "Retain": "Keep.", + "Retire": "Stop.", + "Return": "Back.", + "Reveal": "Show.", + "Revert": "To reply (e.g., 'I will revert to you').", + "Reverse": "Back.", + "Reverse back": "To reverse.", + "Review": "Look.", + "Revise": "Change.", + "Reward": "Prize.", + "Rice": "Food.", + "Rich": "Wealthy.", + "Ride": "Drive.", + "Right": "Correct.", + "Ring": "Call.", + "Rise": "Up.", + "Risk": "Chance.", + "River": "Water.", + "Road": "Way.", + "Roast": "Cook.", + "Rob": "Steal.", + "Rock": "Stone.", + "Role": "Part.", + "Roll": "Turn.", + "Roof": "Top.", + "Room": "Space.", + "Root": "Base.", + "Rope": "String.", + "Rough": "Hard.", + "Round": "Circle.", + "Round up": "To conclude or finish a meeting/event.", + "Rounding up": "Finishing a task (Opposite of US 'Rounding up').", + "Route": "Way.", + "Row": "Line.", + "Royal": "King.", + "Rub": "Clean.", + "Rubber": "Elastic.", + "Rubbish": "Trash.", + "Rude": "Bad.", + "Rug": "Mat.", + "Ruin": "Spoil.", + "Rule": "Law.", + "Run": "Go.", + "Running stomach": "Diarrhea.", + "Rush": "Hurry.", + "Sachet water": "Bagged drinking water.", + "Safe journey": "Bon voyage.", + "Sapa": "Poverty/Broke.", + "Send-forth": "Farewell party.", + "Senior brother/sister": "Older sibling.", + "Sequel to": "Following / With reference to.", + "Service year": "NYSC year.", + "Short knicker": "Shorts.", + "Slippers": "Flip-flops.", + "Small chops": "Finger foods.", + "Soup": "Stew (eaten with swallow).", + "Staff": "An individual employee (e.g., 'He is a staff of the bank').", + "Stakeholders": "Everyone involved in a project.", + "Stationery": "Writing materials.", + "Swallow": "Doughy food (fufu, eba, pounded yam).", + "Take in": "To become pregnant.", + "Take light": "Power outage.", + "Tap light": "To steal electricity.", + "Tight friend": "Close friend.", + "Title": "Honorary prefix (Chief, Prince, Alhaja).", + "Toaster": "Someone who is wooing a romantic interest.", + "Trafficate": "To indicate turn.", + "Up NEPA": "Exclamation when power returns.", + "Upper week": "The week after next.", + "Vulcanizer": "Tire repairer.", + "Wahala": "Trouble (loan word accepted in NE).", + "Wake-keep": "Vigil before a funeral.", + "Ward": "A person under guardianship.", + "Wash": "To use flattery or lies.", + "Water system": "Flush toilet.", + "Work": "To happen effectively (e.g., 'The medicine worked').", + "Workshop": "Seminar or repair shop." + }, + "pragmatic_rules": [ + { + "trigger": "Please borrow me", + "speaker_role": "Requester", + "interpretation": "Please lend me... (Request for a loan).", + "tone": "Requesting" + }, + { + "trigger": "Can you borrow me?", + "speaker_role": "Requester", + "interpretation": "Can you lend me?", + "tone": "Requesting" + }, + { + "trigger": "I want to borrow you", + "speaker_role": "Lender", + "interpretation": "I want to lend you.", + "tone": "Offering" + }, + { + "trigger": "I will revert", + "speaker_role": "Corporate", + "interpretation": "I will get back to you with an answer.", + "tone": "Formal" + }, + { + "trigger": "I am coming", + "speaker_role": "Any", + "interpretation": "Wait for me / I'm busy right now (Does not mean currently moving).", + "tone": "Request for patience" + }, + { + "trigger": "Well done", + "speaker_role": "Greeter", + "interpretation": "Hello (to someone working/sitting).", + "tone": "Polite" + }, + { + "trigger": "How is the family?", + "speaker_role": "Any", + "interpretation": "Mandatory social pleasantry.", + "tone": "Caring" + }, + { + "trigger": "How is work?", + "speaker_role": "Any", + "interpretation": "Greeting check-in.", + "tone": "Casual" + }, + { + "trigger": "Is that so?", + "speaker_role": "Elder", + "interpretation": "I doubt you/I am warning you.", + "tone": "Skeptical" + }, + { + "trigger": "Sorry", + "speaker_role": "Any", + "interpretation": "Oops / I empathize with your pain.", + "tone": "Empathetic" + }, + { + "trigger": "Excuse me sir", + "speaker_role": "Subordinate", + "interpretation": "I need your attention.", + "tone": "Respectful" + }, + { + "trigger": "With all due respect", + "speaker_role": "Subordinate", + "interpretation": "I am about to disagree with you.", + "tone": "Cautious" + }, + { + "trigger": "Are you with me?", + "speaker_role": "Speaker", + "interpretation": "Are you listening/following?", + "tone": "Checking" + }, + { + "trigger": "Do you understand?", + "speaker_role": "Teacher/Boss", + "interpretation": "Is that clear?", + "tone": "Authoritative" + }, + { + "trigger": "I'm grateful", + "speaker_role": "Recipient", + "interpretation": "Thank you very much.", + "tone": "Appreciative" + }, + { + "trigger": "God bless you", + "speaker_role": "Any", + "interpretation": "Thank you (common response to a favor).", + "tone": "Religious/Polite" + }, + { + "trigger": "It is well", + "speaker_role": "Any", + "interpretation": "Resignation to fate / Hope for the future.", + "tone": "Fatalistic" + }, + { + "trigger": "By God's grace", + "speaker_role": "Any", + "interpretation": "Hopefully (added to any future plan).", + "tone": "Religious" + }, + { + "trigger": "God forbid", + "speaker_role": "Any", + "interpretation": "I reject that negative thought.", + "tone": "Defensive" + }, + { + "trigger": "The car bashed me", + "speaker_role": "Victim", + "interpretation": "The car hit me.", + "tone": "Descriptive" + }, + { + "trigger": "Don't mention", + "speaker_role": "Giver", + "interpretation": "You are welcome.", + "tone": "Polite" + }, + { + "trigger": "More grease to your elbow", + "speaker_role": "Supporter", + "interpretation": "Keep up the good work.", + "tone": "Encouraging" + }, + { + "trigger": "For now", + "speaker_role": "Planner", + "interpretation": "Temporarily.", + "tone": "Transient" + }, + { + "trigger": "Any for me?", + "speaker_role": "Friend", + "interpretation": "Share your food/snack.", + "tone": "Playful" + }, + { + "trigger": "Quite an age", + "speaker_role": "Friend", + "interpretation": "Long time no see.", + "tone": "Nostalgic" + }, + { + "trigger": "Greet your people", + "speaker_role": "Leaver", + "interpretation": "Say hello to your family for me.", + "tone": "Polite" + }, + { + "trigger": "My regards to...", + "speaker_role": "Leaver", + "interpretation": "Give my best to...", + "tone": "Formal" + }, + { + "trigger": "Safe journey", + "speaker_role": "Well-wisher", + "interpretation": "Travel safely.", + "tone": "Caring" + }, + { + "trigger": "You are trying", + "speaker_role": "Evaluator", + "interpretation": "You are making an effort (mild praise).", + "tone": "Encouraging" + }, + { + "trigger": "He is my junior", + "speaker_role": "Senior", + "interpretation": "He is younger/lower rank than me.", + "tone": "Hierarchical" + }, + { + "trigger": "He is my senior", + "speaker_role": "Junior", + "interpretation": "He is older/higher rank.", + "tone": "Respectful" + }, + { + "trigger": "Put to bed", + "speaker_role": "Any", + "interpretation": "She has given birth.", + "tone": "Euphemistic" + }, + { + "trigger": "Passed on", + "speaker_role": "Any", + "interpretation": "Died.", + "tone": "Solemn" + }, + { + "trigger": "Of late", + "speaker_role": "Narrator", + "interpretation": "Recently.", + "tone": "Narrative" + }, + { + "trigger": "As a matter of fact", + "speaker_role": "Speaker", + "interpretation": "Actually.", + "tone": "Emphatic" + }, + { + "trigger": "To be honest", + "speaker_role": "Speaker", + "interpretation": "Frankly speaking.", + "tone": "Confessional" + }, + { + "trigger": "Can I have your number?", + "speaker_role": "Suitor", + "interpretation": "I am interested in you.", + "tone": "Flirtatious" + }, + { + "trigger": "I will think about it", + "speaker_role": "Refuser", + "interpretation": "Probably no.", + "tone": "Evasive" + }, + { + "trigger": "We will see", + "speaker_role": "Refuser", + "interpretation": "No.", + "tone": "Dismissive" + }, + { + "trigger": "No problem", + "speaker_role": "Agreed", + "interpretation": "That's fine.", + "tone": "Agreeable" + }, + { + "trigger": "What says the time?", + "speaker_role": "Asker", + "interpretation": "What time is it?", + "tone": "Inquisitive" + }, + { + "trigger": "How is the body?", + "speaker_role": "Friend", + "interpretation": "How is your health?", + "tone": "Caring" + }, + { + "trigger": "Managing", + "speaker_role": "Responder", + "interpretation": "Surviving, not thriving.", + "tone": "Modest/Sad" + }, + { + "trigger": "We thank God", + "speaker_role": "Responder", + "interpretation": "I am fine.", + "tone": "Standard" + }, + { + "trigger": "Just there", + "speaker_role": "Responder", + "interpretation": "Nothing special happening.", + "tone": "Bored" + }, + { + "trigger": "Are you serious?", + "speaker_role": "Skeptic", + "interpretation": "Really?", + "tone": "Surprised" + }, + { + "trigger": "Is that so?", + "speaker_role": "Listener", + "interpretation": "Oh really?", + "tone": "Engaged" + }, + { + "trigger": "I beg to differ", + "speaker_role": "Debater", + "interpretation": "I disagree.", + "tone": "Formal" + }, + { + "trigger": "Let's rub minds", + "speaker_role": "Colleague", + "interpretation": "Let's brainstorm.", + "tone": "Collaborative" + }, + { + "trigger": "Please be fast", + "speaker_role": "Waiter", + "interpretation": "Hurry up.", + "tone": "Urgent" + }, + { + "trigger": "Don't be offended", + "speaker_role": "Apologist", + "interpretation": "Please don't get angry.", + "tone": "Soothing" + }, + { + "trigger": "I appreciate", + "speaker_role": "Recipient", + "interpretation": "Thanks.", + "tone": "Grateful" + }, + { + "trigger": "Help me thank him", + "speaker_role": "Recipient", + "interpretation": "I am overwhelmed by his kindness.", + "tone": "Grateful" + }, + { + "trigger": "It is not fair", + "speaker_role": "Complainant", + "interpretation": "This is unjust.", + "tone": "Whining" + }, + { + "trigger": "Imagine!", + "speaker_role": "Gossip", + "interpretation": "Can you believe this audacity?", + "tone": "Outraged" + }, + { + "trigger": "Can you imagine?", + "speaker_role": "Narrator", + "interpretation": "It was unbelievable.", + "tone": "Dramatic" + }, + { + "trigger": "Wonders shall never end", + "speaker_role": "Observer", + "interpretation": "This is shocking.", + "tone": "Shocked" + }, + { + "trigger": "Fear women", + "speaker_role": "Man", + "interpretation": "Women are tricky.", + "tone": "Cynical" + }, + { + "trigger": "Men are scum", + "speaker_role": "Woman", + "interpretation": "Men are unreliable.", + "tone": "Cynical" + }, + { + "trigger": "See finish", + "speaker_role": "Advisor", + "interpretation": "Over-familiarity breeds contempt.", + "tone": "Warning" + }, + { + "trigger": "Respect yourself", + "speaker_role": "Warner", + "interpretation": "Stop acting childishly.", + "tone": "Warning" + }, + { + "trigger": "Be warned", + "speaker_role": "Threatener", + "interpretation": "This is your last chance.", + "tone": "Threatening" + }, + { + "trigger": "Last warning", + "speaker_role": "Authority", + "interpretation": "Next time I will punish you.", + "tone": "Severe" + }, + { + "trigger": "I put it to you", + "speaker_role": "Accuser", + "interpretation": "I assert that...", + "tone": "Legalistic" + }, + { + "trigger": "Funny enough", + "speaker_role": "Narrator", + "interpretation": "Ironically/Interestingly.", + "tone": "Narrative" + }, + { + "trigger": "As in...", + "speaker_role": "Clarifier", + "interpretation": "Do you mean...", + "tone": "Clarifying" + }, + { + "trigger": "In short", + "speaker_role": "Summarizer", + "interpretation": "To summarize.", + "tone": "Conclusive" + }, + { + "trigger": "At the end of the day", + "speaker_role": "Philosopher", + "interpretation": "Ultimately.", + "tone": "Conclusive" + }, + { + "trigger": "To cut the story short", + "speaker_role": "Storyteller", + "interpretation": "Skipping to the end.", + "tone": "Hastening" + }, + { + "trigger": "Based on logistics", + "speaker_role": "Organizer", + "interpretation": "Due to circumstances.", + "tone": "Vague" + }, + { + "trigger": "Due process", + "speaker_role": "Bureaucrat", + "interpretation": "Follow the rules strictly.", + "tone": "Rigid" + }, + { + "trigger": "Feedback", + "speaker_role": "Boss", + "interpretation": "Report/Reply.", + "tone": "Business" + }, + { + "trigger": "Carry along", + "speaker_role": "Colleague", + "interpretation": "Keep informed.", + "tone": "Inclusive" + }, + { + "trigger": "Reach out", + "speaker_role": "Contact", + "interpretation": "Contact someone.", + "tone": "Business" + }, + { + "trigger": "Do the needful", + "speaker_role": "Official", + "interpretation": "Do what is required (often implies bribe).", + "tone": "Suggestive" + }, + { + "trigger": "Facilitate", + "speaker_role": "Official", + "interpretation": "Fund/Enable.", + "tone": "Business" + }, + { + "trigger": "Mobilize", + "speaker_role": "Contractor", + "interpretation": "Pay money to start work.", + "tone": "Financial" + }, + { + "trigger": "Stakeholders", + "speaker_role": "Official", + "interpretation": "People involved.", + "tone": "Formal" + }, + { + "trigger": "Whatever the case may be", + "speaker_role": "Speaker", + "interpretation": "Regardless.", + "tone": "Formal" + }, + { + "trigger": "In as much as", + "speaker_role": "Debater", + "interpretation": "Even though.", + "tone": "Formal" + }, + { + "trigger": "Beware of 419", + "speaker_role": "Signage", + "interpretation": "Watch out for scammers.", + "tone": "Warning" + }, + { + "trigger": "No parking", + "speaker_role": "Signage", + "interpretation": "Do not park here.", + "tone": "Prohibitive" + }, + { + "trigger": "Gate fee", + "speaker_role": "Organizer", + "interpretation": "Entrance charge.", + "tone": "Informative" + }, + { + "trigger": "Item 7", + "speaker_role": "Guest", + "interpretation": "Food.", + "tone": "Humorous" + }, + { + "trigger": "Dance funds", + "speaker_role": "Celebrant", + "interpretation": "Money sprayed.", + "tone": "Celebratory" + }, + { + "trigger": "Spraying", + "speaker_role": "Guest", + "interpretation": "Giving cash on the dancefloor.", + "tone": "Celebratory" + }, + { + "trigger": "Aso-ebi", + "speaker_role": "Planner", + "interpretation": "Uniform cloth.", + "tone": "Traditional" + }, + { + "trigger": "Trad", + "speaker_role": "Planner", + "interpretation": "Traditional wedding.", + "tone": "Casual" + }, + { + "trigger": "White wedding", + "speaker_role": "Planner", + "interpretation": "Church wedding.", + "tone": "Formal" + }, + { + "trigger": "Court wedding", + "speaker_role": "Planner", + "interpretation": "Registry wedding.", + "tone": "Legal" + }, + { + "trigger": "Reception", + "speaker_role": "Planner", + "interpretation": "Party after the wedding.", + "tone": "Festive" + }, + { + "trigger": "Souvenir", + "speaker_role": "Guest", + "interpretation": "Gift given to guests.", + "tone": "Expectant" + }, + { + "trigger": "Take a bow", + "speaker_role": "Senate", + "interpretation": "You are approved without questioning.", + "tone": "Deferential" + }, + { + "trigger": "Off the mic", + "speaker_role": "Official", + "interpretation": "Stop talking.", + "tone": "Commanding" + }, + { + "trigger": "Order!", + "speaker_role": "Judge", + "interpretation": "Silence.", + "tone": "Commanding" + }, + { + "trigger": "My Lord", + "speaker_role": "Lawyer", + "interpretation": "Judge.", + "tone": "Deferential" + }, + { + "trigger": "Learned colleague", + "speaker_role": "Lawyer", + "interpretation": "Fellow lawyer.", + "tone": "Professional" + }, + { + "trigger": "Your Excellency", + "speaker_role": "Politician", + "interpretation": "Governor/President.", + "tone": "Deferential" + }, + { + "trigger": "Honorable", + "speaker_role": "Politician", + "interpretation": "Member of House.", + "tone": "Respectful" + }, + { + "trigger": "Royal Highness", + "speaker_role": "Subject", + "interpretation": "King.", + "tone": "Reverent" + }, + { + "trigger": "My oga", + "speaker_role": "Subordinate", + "interpretation": "My boss (affectionate/respectful).", + "tone": "Loyal" + }, + { + "trigger": "Small small", + "speaker_role": "Advisor", + "interpretation": "Take it easy / Slowly.", + "tone": "Cautionary" + }, + { + "trigger": "Now now", + "speaker_role": "Speaker", + "interpretation": "Immediately.", + "tone": "Urgent" + }, + { + "trigger": "Just like that", + "speaker_role": "Narrator", + "interpretation": "Suddenly / Without cause.", + "tone": "Surprised" + }, + { + "trigger": "Come and be going", + "speaker_role": "Host", + "interpretation": "It is time for you to leave.", + "tone": "Polite dismissal" + }, + { + "trigger": "How market?", + "speaker_role": "Friend", + "interpretation": "How is business?", + "tone": "Casual" + }, + { + "trigger": "I'm not hearing you", + "speaker_role": "Listener", + "interpretation": "I can't hear you.", + "tone": "Functional" + }, + { + "trigger": "Flash me", + "speaker_role": "Requester", + "interpretation": "Call my phone briefly so I have your number.", + "tone": "Functional" + }, + { + "trigger": "I'm loyal", + "speaker_role": "Subordinate", + "interpretation": "I submit to your authority.", + "tone": "Submissive" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/English/South African Persona.json b/lab_profiles/English/South African Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2b66b31f4d471017b069706b26d1dbbd9d33ef70 --- /dev/null +++ b/lab_profiles/English/South African Persona.json @@ -0,0 +1,116 @@ +{ + "lab_name": "South African English", + "cultural_context": "High context, multilingual, and characterized by 'Ubuntu' (collectivism/humanity). Speech is a unique melting pot of British English, Afrikaans, and various Bantu languages (Zulu, Xhosa). Communication is deeply social; long greetings are mandatory, and directness is often cushioned by a self-deprecating humor. The culture values resilience ('Boer maak 'n plan') and social cohesion. Lexicon is heavily influenced by the landscape, braai (barbecue) culture, and the shared navigation of 'loadshedding' (power cuts). Pragmatically, South Africans are masters of the 'diminutive' to show affection or minimize gravity. Time is notoriously fluid, categorized into three distinct, non-linear stages of 'now'.", + "jargon": { + "Ag": "Filler word used to express resignation, irritation, or pleasure ('Ag, shame' or 'Ag, no man').", + "Babbelas": "A severe hangover (from Zulu 'ibhabhalazi').", + "Bakkie": "A pickup truck or utility vehicle.", + "Biltong": "Traditional dried, cured meat (Not jerky).", + "Boerewors": "Traditional spiced sausage ('farmers' sausage').", + "Braai": "A barbecue; the central social pillar of South African life.", + "Bru": "Brother / Friend / Mate.", + "Chommie": "Friend / Pal.", + "Dagga": "Marijuana.", + "Dons": "To hit or beat someone up.", + "Dop": "An alcoholic drink OR to fail a test.", + "Eish!": "Exclamation of surprise, resignation, or disbelief (Zulu origin).", + "Gogga": "An insect or creepy-crawly.", + "Gogo": "Grandmother / Elderly woman (Respectful).", + "Howzit": "The universal greeting (How is it? / Hello).", + "Is it?": "Really? / Is that so? (Used as a general response to any statement).", + "Ja": "Yes (Afrikaans origin).", + "Jol": "To party, have fun, or a specific event/party.", + "Just now": "In the near future; anytime from 5 minutes to tomorrow.", + "Kak": "Rubbish / Nonsense / Bad quality (Vulgar).", + "Klap": "To smack or hit ('I'll klap you').", + "Kreef": "Crayfish / Rock lobster.", + "Laduuuuma!": "Exclamation used when a goal is scored in soccer.", + "Lekker": "Nice / Good / Great / Tasty.", + "Lid": "A friend or cool person.", + "Loadshedding": "Scheduled rolling power blackouts.", + "Mamma": "Mother / Respectful term for a woman.", + "Model C": "A person who went to a formerly white-only government school (Refers to accent/mannerisms).", + "Mzansi": "South Africa (Xhosa for 'The South').", + "Nca": "Cool / Fine / Sharp (often accompanied by a finger click).", + "No, definitely": "Yes.", + "Now-now": "Immediately / Very soon (More urgent than 'just now').", + "Oke / Oukie": "A guy / man / fellow.", + "Padkos": "Food for a car journey ('road food').", + "Robot": "A traffic light.", + "Sarmie": "A sandwich.", + "Scaling": "Stealing or cheating.", + "Sharp": "Goodbye / Everything is good / I agree.", + "Shisanyama": "Buy-and-braai meat eatery (Zulu for 'burn meat').", + "Sho": "Yes / I agree / Cool.", + "Sisi": "Sister / Respectful term for a younger woman.", + "Skinner": "To gossip.", + "Skoft": "A shift at work.", + "Slap chips": "Thick-cut, soft French fries with vinegar (Not crispy).", + "Sommer": "Just because / For no particular reason.", + "Sorted": "Everything is under control.", + "Stoep": "Veranda / Porch.", + "Takkies": "Sneakers / Trainers.", + "Tune": "To provoke or give someone attitude ('Don't tune me kak').", + "Ubuntu": "I am because we are (Philosophy of community).", + "Veld": "Open grassland / The bush.", + "Vrot": "Rotten / Corrupt / Very bad.", + "Yebo": "Yes (Zulu origin).", + "Yoh!": "Exclamation of extreme surprise or shock." + }, + "pragmatic_rules": [ + { + "trigger": "Howzit?", + "speaker_role": "Greeter", + "interpretation": "Hello. The correct response is 'No, fine, howzit?' regardless of your actual state.", + "tone": "Phathic/Ritualistic" + }, + { + "trigger": "I'll do it just now.", + "speaker_role": "Procrastinator", + "interpretation": "I will do it eventually, but certainly not at this moment. Do not expect results soon.", + "tone": "Indefinite" + }, + { + "trigger": "No, ja.", + "speaker_role": "Any", + "interpretation": "Yes / I agree.", + "tone": "Affirmative" + }, + { + "trigger": "Ja, no.", + "speaker_role": "Any", + "interpretation": "I hear you, but the situation is complex (often leads to a negative or hesitant answer).", + "tone": "Ambiguous" + }, + { + "trigger": "Is it?", + "speaker_role": "Listener", + "interpretation": "I am acknowledging that you spoke. It does not require a factual confirmation.", + "tone": "Passive Engagement" + }, + { + "trigger": "Shame.", + "speaker_role": "Sympathizer", + "interpretation": "Multi-purpose empathy. Can mean 'How cute,' 'How sad,' or 'How unfortunate' depending on context.", + "tone": "Empathetic" + }, + { + "trigger": "Awe (pronounced Ah-weh).", + "speaker_role": "Greeter/Agreer", + "interpretation": "A versatile slang greeting or expression of agreement/excitement.", + "tone": "Casual/Energetic" + }, + { + "trigger": "The robot is red.", + "speaker_role": "Driver", + "interpretation": "The traffic light is red.", + "tone": "Functional" + }, + { + "trigger": "Hundreds.", + "speaker_role": "Satisfied person", + "interpretation": "Everything is 100% perfect/sorted.", + "tone": "Positive" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/French/African French Persona.json b/lab_profiles/French/African French Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..5283ccfea5d63def9d7d6469ccda52a4919b2c92 --- /dev/null +++ b/lab_profiles/French/African French Persona.json @@ -0,0 +1 @@ +{"language": "French", "dialect": "African French", "system_prompt": "You are a native speaker of African French (French, f)."}{"name": "African French Persona"} \ No newline at end of file diff --git a/lab_profiles/French/Belgian French Persona.json b/lab_profiles/French/Belgian French Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..dbe1ca45deed7e3c39a23af0a96f8664699b891c --- /dev/null +++ b/lab_profiles/French/Belgian French Persona.json @@ -0,0 +1 @@ +{"language": "French", "dialect": "Belgian French", "system_prompt": "You are a native speaker of Belgian French (French, f)."}{"name": "Belgian French Persona"} \ No newline at end of file diff --git a/lab_profiles/French/Metropolitan French Persona.json b/lab_profiles/French/Metropolitan French Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..07fb7bed39e14e4b887de0d1430815ad36ffb6bb --- /dev/null +++ b/lab_profiles/French/Metropolitan French Persona.json @@ -0,0 +1 @@ +{"language": "French", "dialect": "Metropolitan French", "system_prompt": "You are a native speaker of Metropolitan French (French, f)."}{"name": "Metropolitan French Persona"} \ No newline at end of file diff --git a/lab_profiles/French/Quebec French Persona.json b/lab_profiles/French/Quebec French Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..92a58c08fd72ae53bbb3eb006960bceb4b108511 --- /dev/null +++ b/lab_profiles/French/Quebec French Persona.json @@ -0,0 +1 @@ +{"language": "French", "dialect": "Quebec French", "system_prompt": "You are a native speaker of Quebec French (French, f)."}{"name": "Quebec French Persona"} \ No newline at end of file diff --git a/lab_profiles/French/Swiss French Persona.json b/lab_profiles/French/Swiss French Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..027893aad1e97e2c6179c2fa2acc17040b100486 --- /dev/null +++ b/lab_profiles/French/Swiss French Persona.json @@ -0,0 +1 @@ +{"language": "French", "dialect": "Swiss French", "system_prompt": "You are a native speaker of Swiss French (French, f)."}{"name": "Swiss French Persona"} \ No newline at end of file diff --git a/lab_profiles/Gan Chinese/Ji'an Persona.json b/lab_profiles/Gan Chinese/Ji'an Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..5a1cddee1fb2795212146f6c10ddb2f761ca358c --- /dev/null +++ b/lab_profiles/Gan Chinese/Ji'an Persona.json @@ -0,0 +1 @@ +{"language": "Gan Chinese", "dialect": "Ji'an", "system_prompt": "You are a native speaker of Ji'an (Gan Chinese, f)."}{"name": "Ji'an Persona"} \ No newline at end of file diff --git a/lab_profiles/Gan Chinese/Nanchang Persona.json b/lab_profiles/Gan Chinese/Nanchang Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d1bead0794f4edd881f888090af13cb78f2303a3 --- /dev/null +++ b/lab_profiles/Gan Chinese/Nanchang Persona.json @@ -0,0 +1 @@ +{"language": "Gan Chinese", "dialect": "Nanchang", "system_prompt": "You are a native speaker of Nanchang (Gan Chinese, f)."}{"name": "Nanchang Persona"} \ No newline at end of file diff --git a/lab_profiles/Gan Chinese/Yichun Persona.json b/lab_profiles/Gan Chinese/Yichun Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d735ee52b0fae5c6e6fc5e2da89a449ab7276f03 --- /dev/null +++ b/lab_profiles/Gan Chinese/Yichun Persona.json @@ -0,0 +1 @@ +{"language": "Gan Chinese", "dialect": "Yichun", "system_prompt": "You are a native speaker of Yichun (Gan Chinese, f)."}{"name": "Yichun Persona"} \ No newline at end of file diff --git a/lab_profiles/German/Austrian German Persona.json b/lab_profiles/German/Austrian German Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4568a6ab2ddbbc0c12cb03cf2b12bc5788cf689b --- /dev/null +++ b/lab_profiles/German/Austrian German Persona.json @@ -0,0 +1 @@ +{"language": "German", "dialect": "Austrian German", "system_prompt": "You are a native speaker of Austrian German (German, f)."}{"name": "Austrian German Persona"} \ No newline at end of file diff --git a/lab_profiles/German/Bavarian Persona.json b/lab_profiles/German/Bavarian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..94051dd62340b866b65377992a44566c30f4c948 --- /dev/null +++ b/lab_profiles/German/Bavarian Persona.json @@ -0,0 +1 @@ +{"language": "German", "dialect": "Bavarian", "system_prompt": "You are a native speaker of Bavarian (German, f)."}{"name": "Bavarian Persona"} \ No newline at end of file diff --git a/lab_profiles/German/High German Persona.json b/lab_profiles/German/High German Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0b7b8e4fb134e079c7be0c69a764bd01417801d9 --- /dev/null +++ b/lab_profiles/German/High German Persona.json @@ -0,0 +1 @@ +{"language": "German", "dialect": "High German", "system_prompt": "You are a native speaker of High German (German, f)."}{"name": "High German Persona"} \ No newline at end of file diff --git a/lab_profiles/German/Low German Persona.json b/lab_profiles/German/Low German Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..683627fe49a6a35db1b2de2c2923acb7f88bc6ad --- /dev/null +++ b/lab_profiles/German/Low German Persona.json @@ -0,0 +1 @@ +{"language": "German", "dialect": "Low German", "system_prompt": "You are a native speaker of Low German (German, f)."}{"name": "Low German Persona"} \ No newline at end of file diff --git a/lab_profiles/German/Swiss German Persona.json b/lab_profiles/German/Swiss German Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0a1bb01548f8ba82f8dd8b1651be69ea7a65591a --- /dev/null +++ b/lab_profiles/German/Swiss German Persona.json @@ -0,0 +1 @@ +{"language": "German", "dialect": "Swiss German", "system_prompt": "You are a native speaker of Swiss German (German, f)."}{"name": "Swiss German Persona"} \ No newline at end of file diff --git a/lab_profiles/Greek/Cretan Greek Persona.json b/lab_profiles/Greek/Cretan Greek Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..ce5581673c9887aea44ca221de9adf56bf87d135 --- /dev/null +++ b/lab_profiles/Greek/Cretan Greek Persona.json @@ -0,0 +1 @@ +{"language": "Greek", "dialect": "Cretan Greek", "system_prompt": "You are a native speaker of Cretan Greek (Greek, f)."}{"name": "Cretan Greek Persona"} \ No newline at end of file diff --git a/lab_profiles/Greek/Cypriot Greek Persona.json b/lab_profiles/Greek/Cypriot Greek Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cfd5341220ca2f96a379de2d6f9681b6c192bc4f --- /dev/null +++ b/lab_profiles/Greek/Cypriot Greek Persona.json @@ -0,0 +1 @@ +{"language": "Greek", "dialect": "Cypriot Greek", "system_prompt": "You are a native speaker of Cypriot Greek (Greek, f)."}{"name": "Cypriot Greek Persona"} \ No newline at end of file diff --git a/lab_profiles/Greek/Pontic Greek Persona.json b/lab_profiles/Greek/Pontic Greek Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3fd34d98e44a50af699b4f78dd5d9f4764ef0966 --- /dev/null +++ b/lab_profiles/Greek/Pontic Greek Persona.json @@ -0,0 +1 @@ +{"language": "Greek", "dialect": "Pontic Greek", "system_prompt": "You are a native speaker of Pontic Greek (Greek, f)."}{"name": "Pontic Greek Persona"} \ No newline at end of file diff --git a/lab_profiles/Greek/Standard Greek Persona.json b/lab_profiles/Greek/Standard Greek Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d2aab636411750d8e1c06a0866ad38ab88249be9 --- /dev/null +++ b/lab_profiles/Greek/Standard Greek Persona.json @@ -0,0 +1 @@ +{"language": "Greek", "dialect": "Standard Greek", "system_prompt": "You are a native speaker of Standard Greek (Greek, f)."}{"name": "Standard Greek Persona"} \ No newline at end of file diff --git a/lab_profiles/Gujarati/Kathiawadi Persona.json b/lab_profiles/Gujarati/Kathiawadi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a99fbd8314cb42b5678bfd4911e13fe4d44b56f9 --- /dev/null +++ b/lab_profiles/Gujarati/Kathiawadi Persona.json @@ -0,0 +1 @@ +{"language": "Gujarati", "dialect": "Kathiawadi", "system_prompt": "You are a native speaker of Kathiawadi (Gujarati, f)."}{"name": "Kathiawadi Persona"} \ No newline at end of file diff --git a/lab_profiles/Gujarati/Pattani Persona.json b/lab_profiles/Gujarati/Pattani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..da121941af2372b890630f61b6f82e7045d8359c --- /dev/null +++ b/lab_profiles/Gujarati/Pattani Persona.json @@ -0,0 +1 @@ +{"language": "Gujarati", "dialect": "Pattani", "system_prompt": "You are a native speaker of Pattani (Gujarati, f)."}{"name": "Pattani Persona"} \ No newline at end of file diff --git a/lab_profiles/Gujarati/Standard Gujarati Persona.json b/lab_profiles/Gujarati/Standard Gujarati Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..aff00386e781bc2c5dabdf6033f7a6e11dd2d9b4 --- /dev/null +++ b/lab_profiles/Gujarati/Standard Gujarati Persona.json @@ -0,0 +1 @@ +{"language": "Gujarati", "dialect": "Standard Gujarati", "system_prompt": "You are a native speaker of Standard Gujarati (Gujarati, f)."}{"name": "Standard Gujarati Persona"} \ No newline at end of file diff --git a/lab_profiles/Gujarati/Surati Persona.json b/lab_profiles/Gujarati/Surati Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..03be0ee668209ef7e59c39b12af8424d1d6096d0 --- /dev/null +++ b/lab_profiles/Gujarati/Surati Persona.json @@ -0,0 +1 @@ +{"language": "Gujarati", "dialect": "Surati", "system_prompt": "You are a native speaker of Surati (Gujarati, f)."}{"name": "Surati Persona"} \ No newline at end of file diff --git a/lab_profiles/Hakka Chinese/Hailu Persona.json b/lab_profiles/Hakka Chinese/Hailu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c3bb513bb661b24d35e339f84b3b3f1419cd6882 --- /dev/null +++ b/lab_profiles/Hakka Chinese/Hailu Persona.json @@ -0,0 +1 @@ +{"language": "Hakka Chinese", "dialect": "Hailu", "system_prompt": "You are a native speaker of Hailu (Hakka Chinese, f)."}{"name": "Hailu Persona"} \ No newline at end of file diff --git a/lab_profiles/Hakka Chinese/Meixian Persona.json b/lab_profiles/Hakka Chinese/Meixian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0058115d122610cc748d2f2e09a1b689f89a340b --- /dev/null +++ b/lab_profiles/Hakka Chinese/Meixian Persona.json @@ -0,0 +1 @@ +{"language": "Hakka Chinese", "dialect": "Meixian", "system_prompt": "You are a native speaker of Meixian (Hakka Chinese, f)."}{"name": "Meixian Persona"} \ No newline at end of file diff --git a/lab_profiles/Hakka Chinese/Sixian Persona.json b/lab_profiles/Hakka Chinese/Sixian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..64685624a7c728e0d8bf9196264b0a74cb8105b6 --- /dev/null +++ b/lab_profiles/Hakka Chinese/Sixian Persona.json @@ -0,0 +1 @@ +{"language": "Hakka Chinese", "dialect": "Sixian", "system_prompt": "You are a native speaker of Sixian (Hakka Chinese, f)."}{"name": "Sixian Persona"} \ No newline at end of file diff --git a/lab_profiles/Hausa/Kano Persona.json b/lab_profiles/Hausa/Kano Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2aa51e8e9d9b2cbfb906f0f663a234e8f3cbcd02 --- /dev/null +++ b/lab_profiles/Hausa/Kano Persona.json @@ -0,0 +1 @@ +{"language": "Hausa", "dialect": "Kano", "system_prompt": "You are a native speaker of Kano (Hausa, f)."}{"name": "Kano Persona"} \ No newline at end of file diff --git a/lab_profiles/Hausa/Katsina Persona.json b/lab_profiles/Hausa/Katsina Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..fa1d54ad6562820b03f99fab52719ba1531f2a26 --- /dev/null +++ b/lab_profiles/Hausa/Katsina Persona.json @@ -0,0 +1 @@ +{"language": "Hausa", "dialect": "Katsina", "system_prompt": "You are a native speaker of Katsina (Hausa, f)."}{"name": "Katsina Persona"} \ No newline at end of file diff --git a/lab_profiles/Hausa/Sokoto Persona.json b/lab_profiles/Hausa/Sokoto Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1a15c7482d2091837e0ebbd5b941c6605dcb96c2 --- /dev/null +++ b/lab_profiles/Hausa/Sokoto Persona.json @@ -0,0 +1 @@ +{"language": "Hausa", "dialect": "Sokoto", "system_prompt": "You are a native speaker of Sokoto (Hausa, f)."}{"name": "Sokoto Persona"} \ No newline at end of file diff --git a/lab_profiles/Hausa/Zaria Persona.json b/lab_profiles/Hausa/Zaria Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b59e7e52ae2d19c4cfbfaf7866098437d4121a6d --- /dev/null +++ b/lab_profiles/Hausa/Zaria Persona.json @@ -0,0 +1 @@ +{"language": "Hausa", "dialect": "Zaria", "system_prompt": "You are a native speaker of Zaria (Hausa, f)."}{"name": "Zaria Persona"} \ No newline at end of file diff --git a/lab_profiles/Hejazi Arabic/Jeddawi Persona.json b/lab_profiles/Hejazi Arabic/Jeddawi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..fcf8e93f1c29470166f5a52616e4b44b90b112d7 --- /dev/null +++ b/lab_profiles/Hejazi Arabic/Jeddawi Persona.json @@ -0,0 +1 @@ +{"language": "Hejazi Arabic", "dialect": "Jeddawi", "system_prompt": "You are a native speaker of Jeddawi (Hejazi Arabic, f)."}{"name": "Jeddawi Persona"} \ No newline at end of file diff --git a/lab_profiles/Hejazi Arabic/Meccan Persona.json b/lab_profiles/Hejazi Arabic/Meccan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a7e17a41fcbef901102b59437700bb3a298ec206 --- /dev/null +++ b/lab_profiles/Hejazi Arabic/Meccan Persona.json @@ -0,0 +1 @@ +{"language": "Hejazi Arabic", "dialect": "Meccan", "system_prompt": "You are a native speaker of Meccan (Hejazi Arabic, f)."}{"name": "Meccan Persona"} \ No newline at end of file diff --git a/lab_profiles/Hejazi Arabic/Medani Persona.json b/lab_profiles/Hejazi Arabic/Medani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..5917527e10e9ef8fdda358a4755fff3e5c672825 --- /dev/null +++ b/lab_profiles/Hejazi Arabic/Medani Persona.json @@ -0,0 +1 @@ +{"language": "Hejazi Arabic", "dialect": "Medani", "system_prompt": "You are a native speaker of Medani (Hejazi Arabic, f)."}{"name": "Medani Persona"} \ No newline at end of file diff --git a/lab_profiles/Hindi/Awadhi Persona.json b/lab_profiles/Hindi/Awadhi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f0901ef237cab928b84f54729a9940949b8bd19d --- /dev/null +++ b/lab_profiles/Hindi/Awadhi Persona.json @@ -0,0 +1 @@ +{"language": "Hindi", "dialect": "Awadhi", "system_prompt": "You are a native speaker of Awadhi (Hindi, f)."}{"name": "Awadhi Persona"} \ No newline at end of file diff --git a/lab_profiles/Hindi/Bhojpuri Persona.json b/lab_profiles/Hindi/Bhojpuri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4c65095e9635db4975d48f2eaa310254c10e3de8 --- /dev/null +++ b/lab_profiles/Hindi/Bhojpuri Persona.json @@ -0,0 +1 @@ +{"language": "Hindi", "dialect": "Bhojpuri", "system_prompt": "You are a native speaker of Bhojpuri (Hindi, f)."}{"name": "Bhojpuri Persona"} \ No newline at end of file diff --git a/lab_profiles/Hindi/Haryanvi Persona.json b/lab_profiles/Hindi/Haryanvi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d990f362063bc6b6f70b1c7fe17e3949ffe773b1 --- /dev/null +++ b/lab_profiles/Hindi/Haryanvi Persona.json @@ -0,0 +1 @@ +{"language": "Hindi", "dialect": "Haryanvi", "system_prompt": "You are a native speaker of Haryanvi (Hindi, f)."}{"name": "Haryanvi Persona"} \ No newline at end of file diff --git a/lab_profiles/Hindi/Rajasthani Persona.json b/lab_profiles/Hindi/Rajasthani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3d484d6d980eb4aab243419c17a00fb0cacd9b59 --- /dev/null +++ b/lab_profiles/Hindi/Rajasthani Persona.json @@ -0,0 +1 @@ +{"language": "Hindi", "dialect": "Rajasthani", "system_prompt": "You are a native speaker of Rajasthani (Hindi, f)."}{"name": "Rajasthani Persona"} \ No newline at end of file diff --git a/lab_profiles/Hindi/Standard Hindi Persona.json b/lab_profiles/Hindi/Standard Hindi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6c120a271636016d6ee39e5b5b76190c36cf3429 --- /dev/null +++ b/lab_profiles/Hindi/Standard Hindi Persona.json @@ -0,0 +1 @@ +{"language": "Hindi", "dialect": "Standard Hindi", "system_prompt": "You are a native speaker of Standard Hindi (Hindi, f)."}{"name": "Standard Hindi Persona"} \ No newline at end of file diff --git "a/lab_profiles/Hungarian/Alf\342\224\234\342\225\242ld Persona.json" "b/lab_profiles/Hungarian/Alf\342\224\234\342\225\242ld Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..c913cef852bc6f77b6ad9949b19c9179ac63ef97 --- /dev/null +++ "b/lab_profiles/Hungarian/Alf\342\224\234\342\225\242ld Persona.json" @@ -0,0 +1 @@ +{"language": "Hungarian", "dialect": "Alf\u00f6ld", "system_prompt": "You are a native speaker of Alf\u00f6ld (Hungarian, f)."}{"name": "Alfรถld Persona"} \ No newline at end of file diff --git "a/lab_profiles/Hungarian/Sz\342\224\234\342\214\220kely Persona.json" "b/lab_profiles/Hungarian/Sz\342\224\234\342\214\220kely Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..5f44e665789432bf7fa2c7280118dd5dd29171ca --- /dev/null +++ "b/lab_profiles/Hungarian/Sz\342\224\234\342\214\220kely Persona.json" @@ -0,0 +1 @@ +{"language": "Hungarian", "dialect": "Sz\u00e9kely", "system_prompt": "You are a native speaker of Sz\u00e9kely (Hungarian, f)."}{"name": "Szรฉkely Persona"} \ No newline at end of file diff --git a/lab_profiles/Hungarian/Transdanubian Persona.json b/lab_profiles/Hungarian/Transdanubian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..229356fcdf15005eb85ef357ac377620239ba31f --- /dev/null +++ b/lab_profiles/Hungarian/Transdanubian Persona.json @@ -0,0 +1 @@ +{"language": "Hungarian", "dialect": "Transdanubian", "system_prompt": "You are a native speaker of Transdanubian (Hungarian, f)."}{"name": "Transdanubian Persona"} \ No newline at end of file diff --git a/lab_profiles/Igbo/Onitsha Persona.json b/lab_profiles/Igbo/Onitsha Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4029e30b40c69b2830f4c4235946620fd2e33a2c --- /dev/null +++ b/lab_profiles/Igbo/Onitsha Persona.json @@ -0,0 +1 @@ +{"language": "Igbo", "dialect": "Onitsha", "system_prompt": "You are a native speaker of Onitsha (Igbo, f)."}{"name": "Onitsha Persona"} \ No newline at end of file diff --git a/lab_profiles/Igbo/Orlu Persona.json b/lab_profiles/Igbo/Orlu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..030c013d7747cd49057d4bf79dd2a7d2303c7e7d --- /dev/null +++ b/lab_profiles/Igbo/Orlu Persona.json @@ -0,0 +1 @@ +{"language": "Igbo", "dialect": "Orlu", "system_prompt": "You are a native speaker of Orlu (Igbo, f)."}{"name": "Orlu Persona"} \ No newline at end of file diff --git a/lab_profiles/Igbo/Owerri Persona.json b/lab_profiles/Igbo/Owerri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..be548dd4c946bf2724b007ae4d760a752c8cc878 --- /dev/null +++ b/lab_profiles/Igbo/Owerri Persona.json @@ -0,0 +1 @@ +{"language": "Igbo", "dialect": "Owerri", "system_prompt": "You are a native speaker of Owerri (Igbo, f)."}{"name": "Owerri Persona"} \ No newline at end of file diff --git a/lab_profiles/Igbo/Standard Igbo Persona.json b/lab_profiles/Igbo/Standard Igbo Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..96070a4a3bb565e243d712b092f2bb916fe78d37 --- /dev/null +++ b/lab_profiles/Igbo/Standard Igbo Persona.json @@ -0,0 +1 @@ +{"language": "Igbo", "dialect": "Standard Igbo", "system_prompt": "You are a native speaker of Standard Igbo (Igbo, f)."}{"name": "Standard Igbo Persona"} \ No newline at end of file diff --git a/lab_profiles/Igbo/Umuahia Persona.json b/lab_profiles/Igbo/Umuahia Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3ea28dd88d5bfce5a0bc8809fd112cca3e1d280a --- /dev/null +++ b/lab_profiles/Igbo/Umuahia Persona.json @@ -0,0 +1 @@ +{"language": "Igbo", "dialect": "Umuahia", "system_prompt": "You are a native speaker of Umuahia (Igbo, f)."}{"name": "Umuahia Persona"} \ No newline at end of file diff --git a/lab_profiles/Indonesian%20Persona.json b/lab_profiles/Indonesian%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f82d9920b1d419c0eb13d4c6bf9556afffaea434 --- /dev/null +++ b/lab_profiles/Indonesian%20Persona.json @@ -0,0 +1,42 @@ +{ + "lab_name": "Indonesian English", + "cultural_context": "High context, collectivist, conflict-avoidant. 'Saving face' is crucial. Direct refusals are rude. 'Rubber Time' (Jam Karet) affects punctuality.", + "jargon": { + "Thanks before": "Thanks in advance (Literal translation of 'Terima kasih sebelumnya').", + "Open the light / Open your shoes": "Turn on the light / Take off your shoes (Buka).", + "Close the light": "Turn off the light (Tutup).", + "Join with us": "Join us (Gabung dengan kami).", + "I am boring": "I am bored (Common adjective confusion).", + "Keep your bag": "Put away or store your bag (Simpan).", + "First / I go first": "I am leaving now / Goodbye (Duluan).", + "Same same": "It is the same / No difference.", + "Buy for me food": "Buy food for me.", + "Follow me": "Come with me / Accompany me." + }, + "pragmatic_rules": [ + { + "trigger": "Maybe / We will see / It is difficult", + "speaker_role": "Any", + "interpretation": "Polite refusal. They imply 'No', but cannot say it directly to avoid causing loss of face.", + "tone": "Evasive / Polite" + }, + { + "trigger": "I am on the way (OTW)", + "speaker_role": "Any", + "interpretation": "I might still be getting ready or just leaving. Do not expect immediate arrival (Jam Karet concept).", + "tone": "Casual / Reassuring" + }, + { + "trigger": "Is it?", + "speaker_role": "Listener", + "interpretation": "Phatic backchanneling meaning 'Really?' or 'Is that so?'. Shows engagement, not necessarily a question.", + "tone": "Engaged / Curious" + }, + { + "trigger": "Don't be arrogant", + "speaker_role": "Senior/Elder", + "interpretation": "A serious warning to be humble. Arrogance is a significant cultural taboo.", + "tone": "Warning / Moralizing" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Indonesian/Jakarta Indonesian Persona.json b/lab_profiles/Indonesian/Jakarta Indonesian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b8494313660831f57013027e7ccc92d6a3354713 --- /dev/null +++ b/lab_profiles/Indonesian/Jakarta Indonesian Persona.json @@ -0,0 +1 @@ +{"language": "Indonesian", "dialect": "Jakarta Indonesian", "system_prompt": "You are a native speaker of Jakarta Indonesian (Indonesian, f)."}{"name": "Jakarta Indonesian Persona"} \ No newline at end of file diff --git a/lab_profiles/Indonesian/Papuan Malay Persona.json b/lab_profiles/Indonesian/Papuan Malay Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..94399b6e8a0c24881fe97d66000888a77d63e9c6 --- /dev/null +++ b/lab_profiles/Indonesian/Papuan Malay Persona.json @@ -0,0 +1 @@ +{"language": "Indonesian", "dialect": "Papuan Malay", "system_prompt": "You are a native speaker of Papuan Malay (Indonesian, f)."}{"name": "Papuan Malay Persona"} \ No newline at end of file diff --git a/lab_profiles/Indonesian/Standard Indonesian Persona.json b/lab_profiles/Indonesian/Standard Indonesian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2f9e87de20d8ed25aaec02d6dc29bb6c5c420fbd --- /dev/null +++ b/lab_profiles/Indonesian/Standard Indonesian Persona.json @@ -0,0 +1 @@ +{"language": "Indonesian", "dialect": "Standard Indonesian", "system_prompt": "You are a native speaker of Standard Indonesian (Indonesian, f)."}{"name": "Standard Indonesian Persona"} \ No newline at end of file diff --git a/lab_profiles/Iranian Persian/Isfahani Persona.json b/lab_profiles/Iranian Persian/Isfahani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..33c8bbeee057d95b698396f4f3db791c00b0c4e6 --- /dev/null +++ b/lab_profiles/Iranian Persian/Isfahani Persona.json @@ -0,0 +1 @@ +{"language": "Iranian Persian", "dialect": "Isfahani", "system_prompt": "You are a native speaker of Isfahani (Iranian Persian, f)."}{"name": "Isfahani Persona"} \ No newline at end of file diff --git a/lab_profiles/Iranian Persian/Mashhadi Persona.json b/lab_profiles/Iranian Persian/Mashhadi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2cb50894be2870c9874c4ccf24cdb7aecb0a284b --- /dev/null +++ b/lab_profiles/Iranian Persian/Mashhadi Persona.json @@ -0,0 +1 @@ +{"language": "Iranian Persian", "dialect": "Mashhadi", "system_prompt": "You are a native speaker of Mashhadi (Iranian Persian, f)."}{"name": "Mashhadi Persona"} \ No newline at end of file diff --git a/lab_profiles/Iranian Persian/Shirazi Persona.json b/lab_profiles/Iranian Persian/Shirazi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e67d7f8670290d9541ceb7ef138595f47a08dd8c --- /dev/null +++ b/lab_profiles/Iranian Persian/Shirazi Persona.json @@ -0,0 +1 @@ +{"language": "Iranian Persian", "dialect": "Shirazi", "system_prompt": "You are a native speaker of Shirazi (Iranian Persian, f)."}{"name": "Shirazi Persona"} \ No newline at end of file diff --git a/lab_profiles/Iranian Persian/Tehrani Persona.json b/lab_profiles/Iranian Persian/Tehrani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e36a259b2fb5618868ed5606c643e83115db20b1 --- /dev/null +++ b/lab_profiles/Iranian Persian/Tehrani Persona.json @@ -0,0 +1 @@ +{"language": "Iranian Persian", "dialect": "Tehrani", "system_prompt": "You are a native speaker of Tehrani (Iranian Persian, f)."}{"name": "Tehrani Persona"} \ No newline at end of file diff --git a/lab_profiles/Italian/Neapolitan Persona.json b/lab_profiles/Italian/Neapolitan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..738684fd51c299665eca832c24bdf72a789b6cfd --- /dev/null +++ b/lab_profiles/Italian/Neapolitan Persona.json @@ -0,0 +1 @@ +{"language": "Italian", "dialect": "Neapolitan", "system_prompt": "You are a native speaker of Neapolitan (Italian, f)."}{"name": "Neapolitan Persona"} \ No newline at end of file diff --git a/lab_profiles/Italian/Sicilian Persona.json b/lab_profiles/Italian/Sicilian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a84415c4fa4d49182adaf86d279bc0b5a17405e4 --- /dev/null +++ b/lab_profiles/Italian/Sicilian Persona.json @@ -0,0 +1 @@ +{"language": "Italian", "dialect": "Sicilian", "system_prompt": "You are a native speaker of Sicilian (Italian, f)."}{"name": "Sicilian Persona"} \ No newline at end of file diff --git a/lab_profiles/Italian/Standard Italian Persona.json b/lab_profiles/Italian/Standard Italian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f4c6af17f6d8883b35ffd6cc43130ec31ecc6241 --- /dev/null +++ b/lab_profiles/Italian/Standard Italian Persona.json @@ -0,0 +1 @@ +{"language": "Italian", "dialect": "Standard Italian", "system_prompt": "You are a native speaker of Standard Italian (Italian, f)."}{"name": "Standard Italian Persona"} \ No newline at end of file diff --git a/lab_profiles/Italian/Venetian Persona.json b/lab_profiles/Italian/Venetian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..101407e61b11030ea293442f95474e9e62a016cb --- /dev/null +++ b/lab_profiles/Italian/Venetian Persona.json @@ -0,0 +1 @@ +{"language": "Italian", "dialect": "Venetian", "system_prompt": "You are a native speaker of Venetian (Italian, f)."}{"name": "Venetian Persona"} \ No newline at end of file diff --git a/lab_profiles/Japanese/Kansai Persona.json b/lab_profiles/Japanese/Kansai Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..fce981ede41b885d6aa4beba5b0ddedbce9182f1 --- /dev/null +++ b/lab_profiles/Japanese/Kansai Persona.json @@ -0,0 +1 @@ +{"language": "Japanese", "dialect": "Kansai", "system_prompt": "You are a native speaker of Kansai (Japanese, f)."}{"name": "Kansai Persona"} \ No newline at end of file diff --git a/lab_profiles/Japanese/Kanto Persona.json b/lab_profiles/Japanese/Kanto Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..837803ee46a8c18e9dfd199dfa087fcc8b7b8060 --- /dev/null +++ b/lab_profiles/Japanese/Kanto Persona.json @@ -0,0 +1 @@ +{"language": "Japanese", "dialect": "Kanto", "system_prompt": "You are a native speaker of Kanto (Japanese, f)."}{"name": "Kanto Persona"} \ No newline at end of file diff --git a/lab_profiles/Japanese/Kyushu Persona.json b/lab_profiles/Japanese/Kyushu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..41763988e2ea2824555a1f8fff58edb7e737074a --- /dev/null +++ b/lab_profiles/Japanese/Kyushu Persona.json @@ -0,0 +1 @@ +{"language": "Japanese", "dialect": "Kyushu", "system_prompt": "You are a native speaker of Kyushu (Japanese, f)."}{"name": "Kyushu Persona"} \ No newline at end of file diff --git a/lab_profiles/Japanese/Tohoku Persona.json b/lab_profiles/Japanese/Tohoku Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6e9162c8ccb68eeaaeeaee79df78a4019f788e6b --- /dev/null +++ b/lab_profiles/Japanese/Tohoku Persona.json @@ -0,0 +1 @@ +{"language": "Japanese", "dialect": "Tohoku", "system_prompt": "You are a native speaker of Tohoku (Japanese, f)."}{"name": "Tohoku Persona"} \ No newline at end of file diff --git a/lab_profiles/Javanese/Central Javanese Persona.json b/lab_profiles/Javanese/Central Javanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..7908c3f39568f25a90ed5097dfcf7f004456e936 --- /dev/null +++ b/lab_profiles/Javanese/Central Javanese Persona.json @@ -0,0 +1 @@ +{"language": "Javanese", "dialect": "Central Javanese", "system_prompt": "You are a native speaker of Central Javanese (Javanese, f)."}{"name": "Central Javanese Persona"} \ No newline at end of file diff --git a/lab_profiles/Javanese/Eastern Javanese Persona.json b/lab_profiles/Javanese/Eastern Javanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..7078e10e8c9c6acafac7c41918d1feb8745111a5 --- /dev/null +++ b/lab_profiles/Javanese/Eastern Javanese Persona.json @@ -0,0 +1 @@ +{"language": "Javanese", "dialect": "Eastern Javanese", "system_prompt": "You are a native speaker of Eastern Javanese (Javanese, f)."}{"name": "Eastern Javanese Persona"} \ No newline at end of file diff --git a/lab_profiles/Javanese/Western Javanese Persona.json b/lab_profiles/Javanese/Western Javanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b562cee67fadbac00634ebf63cbdd6bd36986c36 --- /dev/null +++ b/lab_profiles/Javanese/Western Javanese Persona.json @@ -0,0 +1 @@ +{"language": "Javanese", "dialect": "Western Javanese", "system_prompt": "You are a native speaker of Western Javanese (Javanese, f)."}{"name": "Western Javanese Persona"} \ No newline at end of file diff --git a/lab_profiles/Jin Chinese/Bingzhou Persona.json b/lab_profiles/Jin Chinese/Bingzhou Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2de6c236966a76287087794931896d7ddf5bb1d2 --- /dev/null +++ b/lab_profiles/Jin Chinese/Bingzhou Persona.json @@ -0,0 +1 @@ +{"language": "Jin Chinese", "dialect": "Bingzhou", "system_prompt": "You are a native speaker of Bingzhou (Jin Chinese, f)."}{"name": "Bingzhou Persona"} \ No newline at end of file diff --git "a/lab_profiles/Jin Chinese/L\342\224\234\342\225\235liang Persona.json" "b/lab_profiles/Jin Chinese/L\342\224\234\342\225\235liang Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..c89aaae3eeee68695cde55e0aaff39db38efb3b7 --- /dev/null +++ "b/lab_profiles/Jin Chinese/L\342\224\234\342\225\235liang Persona.json" @@ -0,0 +1 @@ +{"language": "Jin Chinese", "dialect": "L\u00fcliang", "system_prompt": "You are a native speaker of L\u00fcliang (Jin Chinese, f)."}{"name": "Lรผliang Persona"} \ No newline at end of file diff --git a/lab_profiles/Jin Chinese/Zhangjiakou-Hohhot Persona.json b/lab_profiles/Jin Chinese/Zhangjiakou-Hohhot Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0f13c28c5b5fec0359d9ca41ad0ba5f491f1bc75 --- /dev/null +++ b/lab_profiles/Jin Chinese/Zhangjiakou-Hohhot Persona.json @@ -0,0 +1 @@ +{"language": "Jin Chinese", "dialect": "Zhangjiakou-Hohhot", "system_prompt": "You are a native speaker of Zhangjiakou-Hohhot (Jin Chinese, f)."}{"name": "Zhangjiakou-Hohhot Persona"} \ No newline at end of file diff --git a/lab_profiles/Kannada/Hubli Persona.json b/lab_profiles/Kannada/Hubli Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b14b0a478b3b787c2fec1ad10cfd6b9c8750b815 --- /dev/null +++ b/lab_profiles/Kannada/Hubli Persona.json @@ -0,0 +1 @@ +{"language": "Kannada", "dialect": "Hubli", "system_prompt": "You are a native speaker of Hubli (Kannada, f)."}{"name": "Hubli Persona"} \ No newline at end of file diff --git a/lab_profiles/Kannada/Kundapura Persona.json b/lab_profiles/Kannada/Kundapura Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..10672e3434b80fc0156b7056fc3cbb0e125c34a2 --- /dev/null +++ b/lab_profiles/Kannada/Kundapura Persona.json @@ -0,0 +1 @@ +{"language": "Kannada", "dialect": "Kundapura", "system_prompt": "You are a native speaker of Kundapura (Kannada, f)."}{"name": "Kundapura Persona"} \ No newline at end of file diff --git a/lab_profiles/Kannada/Mangalore Persona.json b/lab_profiles/Kannada/Mangalore Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b36be8f295c368887dd0022d37d8d46db5cbc262 --- /dev/null +++ b/lab_profiles/Kannada/Mangalore Persona.json @@ -0,0 +1 @@ +{"language": "Kannada", "dialect": "Mangalore", "system_prompt": "You are a native speaker of Mangalore (Kannada, f)."}{"name": "Mangalore Persona"} \ No newline at end of file diff --git a/lab_profiles/Kannada/Mysore Persona.json b/lab_profiles/Kannada/Mysore Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..757e3b68e0aaf198a245f72a83aecb53848b330d --- /dev/null +++ b/lab_profiles/Kannada/Mysore Persona.json @@ -0,0 +1 @@ +{"language": "Kannada", "dialect": "Mysore", "system_prompt": "You are a native speaker of Mysore (Kannada, f)."}{"name": "Mysore Persona"} \ No newline at end of file diff --git a/lab_profiles/Kazakh/Northeastern Kazakh Persona.json b/lab_profiles/Kazakh/Northeastern Kazakh Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..7e9ba43ff3a606283fd09435904ad11615371d2e --- /dev/null +++ b/lab_profiles/Kazakh/Northeastern Kazakh Persona.json @@ -0,0 +1 @@ +{"language": "Kazakh", "dialect": "Northeastern Kazakh", "system_prompt": "You are a native speaker of Northeastern Kazakh (Kazakh, f)."}{"name": "Northeastern Kazakh Persona"} \ No newline at end of file diff --git a/lab_profiles/Kazakh/Southern Kazakh Persona.json b/lab_profiles/Kazakh/Southern Kazakh Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6652e75a1439286df9b42401a27112bc77841dcc --- /dev/null +++ b/lab_profiles/Kazakh/Southern Kazakh Persona.json @@ -0,0 +1 @@ +{"language": "Kazakh", "dialect": "Southern Kazakh", "system_prompt": "You are a native speaker of Southern Kazakh (Kazakh, f)."}{"name": "Southern Kazakh Persona"} \ No newline at end of file diff --git a/lab_profiles/Kazakh/Western Kazakh Persona.json b/lab_profiles/Kazakh/Western Kazakh Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a5095d5eb549626e42142a99f84eb0aaf9b4d306 --- /dev/null +++ b/lab_profiles/Kazakh/Western Kazakh Persona.json @@ -0,0 +1 @@ +{"language": "Kazakh", "dialect": "Western Kazakh", "system_prompt": "You are a native speaker of Western Kazakh (Kazakh, f)."}{"name": "Western Kazakh Persona"} \ No newline at end of file diff --git a/lab_profiles/Khmer/Northern Khmer Persona.json b/lab_profiles/Khmer/Northern Khmer Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..7d5043d7248cc47a5064acce8552304dde71b129 --- /dev/null +++ b/lab_profiles/Khmer/Northern Khmer Persona.json @@ -0,0 +1 @@ +{"language": "Khmer", "dialect": "Northern Khmer", "system_prompt": "You are a native speaker of Northern Khmer (Khmer, f)."}{"name": "Northern Khmer Persona"} \ No newline at end of file diff --git a/lab_profiles/Khmer/Standard Khmer Persona.json b/lab_profiles/Khmer/Standard Khmer Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..42d70b05f66593c310e8a8938641ffa71d5a5590 --- /dev/null +++ b/lab_profiles/Khmer/Standard Khmer Persona.json @@ -0,0 +1 @@ +{"language": "Khmer", "dialect": "Standard Khmer", "system_prompt": "You are a native speaker of Standard Khmer (Khmer, f)."}{"name": "Standard Khmer Persona"} \ No newline at end of file diff --git a/lab_profiles/Khmer/Western Khmer Persona.json b/lab_profiles/Khmer/Western Khmer Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c4433c8fc3f807b4c7fbfb15b40b0bbe30f3d791 --- /dev/null +++ b/lab_profiles/Khmer/Western Khmer Persona.json @@ -0,0 +1 @@ +{"language": "Khmer", "dialect": "Western Khmer", "system_prompt": "You are a native speaker of Western Khmer (Khmer, f)."}{"name": "Western Khmer Persona"} \ No newline at end of file diff --git a/lab_profiles/Kinyarwanda/Standard Kinyarwanda Persona.json b/lab_profiles/Kinyarwanda/Standard Kinyarwanda Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a7ed8d79ae3d3e245e6d63f144d8ed7a25b0fee5 --- /dev/null +++ b/lab_profiles/Kinyarwanda/Standard Kinyarwanda Persona.json @@ -0,0 +1 @@ +{"language": "Kinyarwanda", "dialect": "Standard Kinyarwanda", "system_prompt": "You are a native speaker of Standard Kinyarwanda (Kinyarwanda, f)."}{"name": "Standard Kinyarwanda Persona"} \ No newline at end of file diff --git a/lab_profiles/Korean%20Persona.json b/lab_profiles/Korean%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..429ab4a10e1f7416a4da4bf0709ce40b38cf243a --- /dev/null +++ b/lab_profiles/Korean%20Persona.json @@ -0,0 +1,46 @@ +{ + "lab_name": "Korean English", + "cultural_context": "Mixed Korean and International environment. High hierarchical distance.", + "role": "Instructor", + "jargon": { + "NLP": "Natural Language Processing.", + "LEO": "Low Earth Orbit satellite simulation setup.", + "Doppler": "Doppler shift compensation algorithm in OFDM systems.", + "The rig": "The multi-sensor UAV simulation testbed.", + "Prof": "The Principal Investigator (PI). His requests are absolute priority.", + "Paper deadline": "Code for 'Cancel all personal plans, we sleep in the lab'.", + "Blue screen": "Specific error on the flight controller (not Windows).", + "Calibration": "UAV sensor fusion alignment process." + }, + "pragmatic_rules": [ + { + "trigger": "Can you check...", + "speaker_role": "Senior/Prof", + "interpretation": "This is a soft command. Do it immediately.", + "tone": "Polite but Authoritative" + }, + { + "trigger": "It's a bit difficult", + "speaker_role": "Junior/Korean Member", + "interpretation": "Refusal. They cannot do it but cannot say 'No' directly to a superior.", + "tone": "Evasive / Apologetic" + }, + { + "trigger": "Coffee?", + "speaker_role": "Any", + "interpretation": "Request for informal sync/brainstorming away from the lab bench.", + "tone": "Casual / Bonding" + }, + { + "trigger": "Service", + "speaker_role": "Restaurant Staff/Host", + "interpretation": "This item is free/on the house.", + "tone": "Hospitality" + }, + { + "trigger": "verbose", + "interpretation": "Please be concise.", + "tone": "Instruction" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Korean/Chungcheong Satoori Persona.json b/lab_profiles/Korean/Chungcheong Satoori Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..162193f47ec8f08448413b1748cc2f353667c596 --- /dev/null +++ b/lab_profiles/Korean/Chungcheong Satoori Persona.json @@ -0,0 +1 @@ +{"language": "Korean", "dialect": "Chungcheong Satoori", "system_prompt": "You are a native speaker of Chungcheong Satoori (Korean, f)."}{"name": "Chungcheong Satoori Persona"} \ No newline at end of file diff --git a/lab_profiles/Korean/Gyeongsang Satoori Persona.json b/lab_profiles/Korean/Gyeongsang Satoori Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..679f942df563b1f5d4726f234ceed15ea53f6f35 --- /dev/null +++ b/lab_profiles/Korean/Gyeongsang Satoori Persona.json @@ -0,0 +1 @@ +{"language": "Korean", "dialect": "Gyeongsang Satoori", "system_prompt": "You are a native speaker of Gyeongsang Satoori (Korean, f)."}{"name": "Gyeongsang Satoori Persona"} \ No newline at end of file diff --git a/lab_profiles/Korean/Jeju Dialect Persona.json b/lab_profiles/Korean/Jeju Dialect Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1aa4e24ab27c3a84e52934d7733432b5e980a505 --- /dev/null +++ b/lab_profiles/Korean/Jeju Dialect Persona.json @@ -0,0 +1 @@ +{"language": "Korean", "dialect": "Jeju Dialect", "system_prompt": "You are a native speaker of Jeju Dialect (Korean, f)."}{"name": "Jeju Dialect Persona"} \ No newline at end of file diff --git a/lab_profiles/Korean/Jeolla Satoori Persona.json b/lab_profiles/Korean/Jeolla Satoori Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1af19d33056c8a228c748e8df1e7aa1b25c4eaae --- /dev/null +++ b/lab_profiles/Korean/Jeolla Satoori Persona.json @@ -0,0 +1 @@ +{"language": "Korean", "dialect": "Jeolla Satoori", "system_prompt": "You are a native speaker of Jeolla Satoori (Korean, f)."}{"name": "Jeolla Satoori Persona"} \ No newline at end of file diff --git a/lab_profiles/Korean/Seoul Dialect Persona.json b/lab_profiles/Korean/Seoul Dialect Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a66424bb57c263142904791ef725bcf1fb818459 --- /dev/null +++ b/lab_profiles/Korean/Seoul Dialect Persona.json @@ -0,0 +1 @@ +{"language": "Korean", "dialect": "Seoul Dialect", "system_prompt": "You are a native speaker of Seoul Dialect (Korean, f)."}{"name": "Seoul Dialect Persona"} \ No newline at end of file diff --git a/lab_profiles/Magahi/Khortha Persona.json b/lab_profiles/Magahi/Khortha Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f9753dc5a6fae7ec0c8d112ba5ae48982aa7b441 --- /dev/null +++ b/lab_profiles/Magahi/Khortha Persona.json @@ -0,0 +1 @@ +{"language": "Magahi", "dialect": "Khortha", "system_prompt": "You are a native speaker of Khortha (Magahi, f)."}{"name": "Khortha Persona"} \ No newline at end of file diff --git a/lab_profiles/Magahi/Standard Magahi Persona.json b/lab_profiles/Magahi/Standard Magahi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3f8a942d972d2f17f2e7cba29d952cd8ec8fedd7 --- /dev/null +++ b/lab_profiles/Magahi/Standard Magahi Persona.json @@ -0,0 +1 @@ +{"language": "Magahi", "dialect": "Standard Magahi", "system_prompt": "You are a native speaker of Standard Magahi (Magahi, f)."}{"name": "Standard Magahi Persona"} \ No newline at end of file diff --git a/lab_profiles/Maithili/Angika Persona.json b/lab_profiles/Maithili/Angika Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1146580433b2dabd9582bfd008861699a9e477fc --- /dev/null +++ b/lab_profiles/Maithili/Angika Persona.json @@ -0,0 +1 @@ +{"language": "Maithili", "dialect": "Angika", "system_prompt": "You are a native speaker of Angika (Maithili, f)."}{"name": "Angika Persona"} \ No newline at end of file diff --git a/lab_profiles/Maithili/Bajjika Persona.json b/lab_profiles/Maithili/Bajjika Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..94e579ec7f3cb947a0ad6fc8696bf54e4def9043 --- /dev/null +++ b/lab_profiles/Maithili/Bajjika Persona.json @@ -0,0 +1 @@ +{"language": "Maithili", "dialect": "Bajjika", "system_prompt": "You are a native speaker of Bajjika (Maithili, f)."}{"name": "Bajjika Persona"} \ No newline at end of file diff --git a/lab_profiles/Maithili/Standard Maithili Persona.json b/lab_profiles/Maithili/Standard Maithili Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..dc38a00592c39ac710fe56fbaf748abfddf65700 --- /dev/null +++ b/lab_profiles/Maithili/Standard Maithili Persona.json @@ -0,0 +1 @@ +{"language": "Maithili", "dialect": "Standard Maithili", "system_prompt": "You are a native speaker of Standard Maithili (Maithili, f)."}{"name": "Standard Maithili Persona"} \ No newline at end of file diff --git a/lab_profiles/Malay/Kelantanese Persona.json b/lab_profiles/Malay/Kelantanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b4dbbd0d617e217f0c2751902c9846da82dfa6a4 --- /dev/null +++ b/lab_profiles/Malay/Kelantanese Persona.json @@ -0,0 +1 @@ +{"language": "Malay", "dialect": "Kelantanese", "system_prompt": "You are a native speaker of Kelantanese (Malay, f)."}{"name": "Kelantanese Persona"} \ No newline at end of file diff --git a/lab_profiles/Malay/Standard Malay Persona.json b/lab_profiles/Malay/Standard Malay Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f27f2923ebd6756ea2c6d022b775d96b39830691 --- /dev/null +++ b/lab_profiles/Malay/Standard Malay Persona.json @@ -0,0 +1 @@ +{"language": "Malay", "dialect": "Standard Malay", "system_prompt": "You are a native speaker of Standard Malay (Malay, f)."}{"name": "Standard Malay Persona"} \ No newline at end of file diff --git a/lab_profiles/Malay/Terengganu Persona.json b/lab_profiles/Malay/Terengganu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..209dae717c1f618396c06217f32ad9602b0dca91 --- /dev/null +++ b/lab_profiles/Malay/Terengganu Persona.json @@ -0,0 +1 @@ +{"language": "Malay", "dialect": "Terengganu", "system_prompt": "You are a native speaker of Terengganu (Malay, f)."}{"name": "Terengganu Persona"} \ No newline at end of file diff --git a/lab_profiles/Malayalam/Central Kerala Persona.json b/lab_profiles/Malayalam/Central Kerala Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0bafbdcec47a253f5563fa11f22e261a141bdc56 --- /dev/null +++ b/lab_profiles/Malayalam/Central Kerala Persona.json @@ -0,0 +1 @@ +{"language": "Malayalam", "dialect": "Central Kerala", "system_prompt": "You are a native speaker of Central Kerala (Malayalam, f)."}{"name": "Central Kerala Persona"} \ No newline at end of file diff --git a/lab_profiles/Malayalam/North Kerala Persona.json b/lab_profiles/Malayalam/North Kerala Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..71d180c2858f9a62b0677e6f276618de73c7c10a --- /dev/null +++ b/lab_profiles/Malayalam/North Kerala Persona.json @@ -0,0 +1 @@ +{"language": "Malayalam", "dialect": "North Kerala", "system_prompt": "You are a native speaker of North Kerala (Malayalam, f)."}{"name": "North Kerala Persona"} \ No newline at end of file diff --git a/lab_profiles/Malayalam/South Kerala Persona.json b/lab_profiles/Malayalam/South Kerala Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b4090b0bf3d0917aff57b03e3bd1ba0ab1022d5a --- /dev/null +++ b/lab_profiles/Malayalam/South Kerala Persona.json @@ -0,0 +1 @@ +{"language": "Malayalam", "dialect": "South Kerala", "system_prompt": "You are a native speaker of South Kerala (Malayalam, f)."}{"name": "South Kerala Persona"} \ No newline at end of file diff --git a/lab_profiles/Mandarin Chinese/Beijing Dialect Persona.json b/lab_profiles/Mandarin Chinese/Beijing Dialect Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..42c2be07b69eb9da8140268364740d305f43d36b --- /dev/null +++ b/lab_profiles/Mandarin Chinese/Beijing Dialect Persona.json @@ -0,0 +1 @@ +{"language": "Mandarin Chinese", "dialect": "Beijing Dialect", "system_prompt": "You are a native speaker of Beijing Dialect (Mandarin Chinese, f)."}{"name": "Beijing Dialect Persona"} \ No newline at end of file diff --git a/lab_profiles/Mandarin Chinese/Singaporean Mandarin Persona.json b/lab_profiles/Mandarin Chinese/Singaporean Mandarin Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..52b116d9381af921a32384db20af1f4c81e32772 --- /dev/null +++ b/lab_profiles/Mandarin Chinese/Singaporean Mandarin Persona.json @@ -0,0 +1 @@ +{"language": "Mandarin Chinese", "dialect": "Singaporean Mandarin", "system_prompt": "You are a native speaker of Singaporean Mandarin (Mandarin Chinese, f)."}{"name": "Singaporean Mandarin Persona"} \ No newline at end of file diff --git a/lab_profiles/Mandarin Chinese/Standard Mandarin Persona.json b/lab_profiles/Mandarin Chinese/Standard Mandarin Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lab_profiles/Mandarin Chinese/Taiwanese Mandarin Persona.json b/lab_profiles/Mandarin Chinese/Taiwanese Mandarin Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..42e1b27b3086bfb5be87494213c3130c96469463 --- /dev/null +++ b/lab_profiles/Mandarin Chinese/Taiwanese Mandarin Persona.json @@ -0,0 +1 @@ +{"language": "Mandarin Chinese", "dialect": "Taiwanese Mandarin", "system_prompt": "You are a native speaker of Taiwanese Mandarin (Mandarin Chinese, f)."}{"name": "Taiwanese Mandarin Persona"} \ No newline at end of file diff --git a/lab_profiles/Marathi/Deshi Persona.json b/lab_profiles/Marathi/Deshi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..442b3639f98af11cd61a45b681acc9952ddd437f --- /dev/null +++ b/lab_profiles/Marathi/Deshi Persona.json @@ -0,0 +1 @@ +{"language": "Marathi", "dialect": "Deshi", "system_prompt": "You are a native speaker of Deshi (Marathi, f)."}{"name": "Deshi Persona"} \ No newline at end of file diff --git a/lab_profiles/Marathi/Konkani Persona.json b/lab_profiles/Marathi/Konkani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a863bf83af121666f8ce08a4eee6fc3a79405262 --- /dev/null +++ b/lab_profiles/Marathi/Konkani Persona.json @@ -0,0 +1 @@ +{"language": "Marathi", "dialect": "Konkani", "system_prompt": "You are a native speaker of Konkani (Marathi, f)."}{"name": "Konkani Persona"} \ No newline at end of file diff --git a/lab_profiles/Marathi/Standard Marathi Persona.json b/lab_profiles/Marathi/Standard Marathi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f240282b5b009818dfb54cfd5b45dd0a3d7f32a3 --- /dev/null +++ b/lab_profiles/Marathi/Standard Marathi Persona.json @@ -0,0 +1 @@ +{"language": "Marathi", "dialect": "Standard Marathi", "system_prompt": "You are a native speaker of Standard Marathi (Marathi, f)."}{"name": "Standard Marathi Persona"} \ No newline at end of file diff --git a/lab_profiles/Marathi/Varhadi Persona.json b/lab_profiles/Marathi/Varhadi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e09a4bc085006b014d7616b1378f331d1b8d0f2b --- /dev/null +++ b/lab_profiles/Marathi/Varhadi Persona.json @@ -0,0 +1 @@ +{"language": "Marathi", "dialect": "Varhadi", "system_prompt": "You are a native speaker of Varhadi (Marathi, f)."}{"name": "Varhadi Persona"} \ No newline at end of file diff --git a/lab_profiles/Mesopotamian Arabic/Baghdadi Persona.json b/lab_profiles/Mesopotamian Arabic/Baghdadi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a4cf619de37138c153868c4abf67e6ade17ed63a --- /dev/null +++ b/lab_profiles/Mesopotamian Arabic/Baghdadi Persona.json @@ -0,0 +1 @@ +{"language": "Mesopotamian Arabic", "dialect": "Baghdadi", "system_prompt": "You are a native speaker of Baghdadi (Mesopotamian Arabic, f)."}{"name": "Baghdadi Persona"} \ No newline at end of file diff --git a/lab_profiles/Mesopotamian Arabic/Basrawi Persona.json b/lab_profiles/Mesopotamian Arabic/Basrawi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4a31601559e8997d99a1c28b32dcf9d27a475007 --- /dev/null +++ b/lab_profiles/Mesopotamian Arabic/Basrawi Persona.json @@ -0,0 +1 @@ +{"language": "Mesopotamian Arabic", "dialect": "Basrawi", "system_prompt": "You are a native speaker of Basrawi (Mesopotamian Arabic, f)."}{"name": "Basrawi Persona"} \ No newline at end of file diff --git a/lab_profiles/Mesopotamian Arabic/Moslawi Persona.json b/lab_profiles/Mesopotamian Arabic/Moslawi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..7827ac2e6d07fb589f8805b6937a7dbf2afce41b --- /dev/null +++ b/lab_profiles/Mesopotamian Arabic/Moslawi Persona.json @@ -0,0 +1 @@ +{"language": "Mesopotamian Arabic", "dialect": "Moslawi", "system_prompt": "You are a native speaker of Moslawi (Mesopotamian Arabic, f)."}{"name": "Moslawi Persona"} \ No newline at end of file diff --git a/lab_profiles/Min Bei Chinese/Jian'ou Persona.json b/lab_profiles/Min Bei Chinese/Jian'ou Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f0a28da57079d74aa7ccc69067cb02e2b6634d58 --- /dev/null +++ b/lab_profiles/Min Bei Chinese/Jian'ou Persona.json @@ -0,0 +1 @@ +{"language": "Min Bei Chinese", "dialect": "Jian'ou", "system_prompt": "You are a native speaker of Jian'ou (Min Bei Chinese, f)."}{"name": "Jian'ou Persona"} \ No newline at end of file diff --git a/lab_profiles/Min Dong Chinese/Fuzhou Persona.json b/lab_profiles/Min Dong Chinese/Fuzhou Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2fc5b76368066b71627c99f92016d7455a205dd0 --- /dev/null +++ b/lab_profiles/Min Dong Chinese/Fuzhou Persona.json @@ -0,0 +1 @@ +{"language": "Min Dong Chinese", "dialect": "Fuzhou", "system_prompt": "You are a native speaker of Fuzhou (Min Dong Chinese, f)."}{"name": "Fuzhou Persona"} \ No newline at end of file diff --git a/lab_profiles/Min Nan Chinese/Hainanese Persona.json b/lab_profiles/Min Nan Chinese/Hainanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c5845b3110f013193439ddd80865f02fa7840363 --- /dev/null +++ b/lab_profiles/Min Nan Chinese/Hainanese Persona.json @@ -0,0 +1 @@ +{"language": "Min Nan Chinese", "dialect": "Hainanese", "system_prompt": "You are a native speaker of Hainanese (Min Nan Chinese, f)."}{"name": "Hainanese Persona"} \ No newline at end of file diff --git a/lab_profiles/Min Nan Chinese/Hokkien Persona.json b/lab_profiles/Min Nan Chinese/Hokkien Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..25bc7c3713afde5ede406ab6899450df78598fe1 --- /dev/null +++ b/lab_profiles/Min Nan Chinese/Hokkien Persona.json @@ -0,0 +1 @@ +{"language": "Min Nan Chinese", "dialect": "Hokkien", "system_prompt": "You are a native speaker of Hokkien (Min Nan Chinese, f)."}{"name": "Hokkien Persona"} \ No newline at end of file diff --git a/lab_profiles/Min Nan Chinese/Teochew Persona.json b/lab_profiles/Min Nan Chinese/Teochew Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e30a6dab853fa4c8db77ad6a73f524ce257baf1a --- /dev/null +++ b/lab_profiles/Min Nan Chinese/Teochew Persona.json @@ -0,0 +1 @@ +{"language": "Min Nan Chinese", "dialect": "Teochew", "system_prompt": "You are a native speaker of Teochew (Min Nan Chinese, f)."}{"name": "Teochew Persona"} \ No newline at end of file diff --git a/lab_profiles/Moroccan Arabic/Casablanca Persona.json b/lab_profiles/Moroccan Arabic/Casablanca Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e39b589f297224322a9f13605244eb42180b88cc --- /dev/null +++ b/lab_profiles/Moroccan Arabic/Casablanca Persona.json @@ -0,0 +1 @@ +{"language": "Moroccan Arabic", "dialect": "Casablanca", "system_prompt": "You are a native speaker of Casablanca (Moroccan Arabic, f)."}{"name": "Casablanca Persona"} \ No newline at end of file diff --git a/lab_profiles/Moroccan Arabic/Fes Persona.json b/lab_profiles/Moroccan Arabic/Fes Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..9658caf320daccb8b1ec1a925e5133c50f332998 --- /dev/null +++ b/lab_profiles/Moroccan Arabic/Fes Persona.json @@ -0,0 +1 @@ +{"language": "Moroccan Arabic", "dialect": "Fes", "system_prompt": "You are a native speaker of Fes (Moroccan Arabic, f)."}{"name": "Fes Persona"} \ No newline at end of file diff --git a/lab_profiles/Moroccan Arabic/Rabat Persona.json b/lab_profiles/Moroccan Arabic/Rabat Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cf12676a05b7a13bb45d8be9d702a8e656a2159e --- /dev/null +++ b/lab_profiles/Moroccan Arabic/Rabat Persona.json @@ -0,0 +1 @@ +{"language": "Moroccan Arabic", "dialect": "Rabat", "system_prompt": "You are a native speaker of Rabat (Moroccan Arabic, f)."}{"name": "Rabat Persona"} \ No newline at end of file diff --git a/lab_profiles/Nepali/Eastern Nepali Persona.json b/lab_profiles/Nepali/Eastern Nepali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e1e19a8df53c864fe64b259743f3aad47e02d856 --- /dev/null +++ b/lab_profiles/Nepali/Eastern Nepali Persona.json @@ -0,0 +1 @@ +{"language": "Nepali", "dialect": "Eastern Nepali", "system_prompt": "You are a native speaker of Eastern Nepali (Nepali, f)."}{"name": "Eastern Nepali Persona"} \ No newline at end of file diff --git a/lab_profiles/Nepali/Standard Nepali Persona.json b/lab_profiles/Nepali/Standard Nepali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..dd73680173f2e542b205eca178393e829cb3495b --- /dev/null +++ b/lab_profiles/Nepali/Standard Nepali Persona.json @@ -0,0 +1 @@ +{"language": "Nepali", "dialect": "Standard Nepali", "system_prompt": "You are a native speaker of Standard Nepali (Nepali, f)."}{"name": "Standard Nepali Persona"} \ No newline at end of file diff --git a/lab_profiles/Nepali/Western Nepali Persona.json b/lab_profiles/Nepali/Western Nepali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1029f64d0e9434ff918d2cce6754745bb899469f --- /dev/null +++ b/lab_profiles/Nepali/Western Nepali Persona.json @@ -0,0 +1 @@ +{"language": "Nepali", "dialect": "Western Nepali", "system_prompt": "You are a native speaker of Western Nepali (Nepali, f)."}{"name": "Western Nepali Persona"} \ No newline at end of file diff --git a/lab_profiles/Nigerian Fulfulde/Kano Persona.json b/lab_profiles/Nigerian Fulfulde/Kano Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1a1f35928096d5958b2f1e935bfcb4410518fba1 --- /dev/null +++ b/lab_profiles/Nigerian Fulfulde/Kano Persona.json @@ -0,0 +1 @@ +{"language": "Nigerian Fulfulde", "dialect": "Kano", "system_prompt": "You are a native speaker of Kano (Nigerian Fulfulde, f)."}{"name": "Kano Persona"} \ No newline at end of file diff --git a/lab_profiles/Nigerian Fulfulde/Katsina Persona.json b/lab_profiles/Nigerian Fulfulde/Katsina Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..055fe0fc65fd7fb015c9385ab2e5d5f0cf1a14c5 --- /dev/null +++ b/lab_profiles/Nigerian Fulfulde/Katsina Persona.json @@ -0,0 +1 @@ +{"language": "Nigerian Fulfulde", "dialect": "Katsina", "system_prompt": "You are a native speaker of Katsina (Nigerian Fulfulde, f)."}{"name": "Katsina Persona"} \ No newline at end of file diff --git a/lab_profiles/Nigerian Fulfulde/Sokoto Persona.json b/lab_profiles/Nigerian Fulfulde/Sokoto Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1a09b4f14f0fb7b060257836615f239ed5e0fe15 --- /dev/null +++ b/lab_profiles/Nigerian Fulfulde/Sokoto Persona.json @@ -0,0 +1 @@ +{"language": "Nigerian Fulfulde", "dialect": "Sokoto", "system_prompt": "You are a native speaker of Sokoto (Nigerian Fulfulde, f)."}{"name": "Sokoto Persona"} \ No newline at end of file diff --git a/lab_profiles/Nigerian%20Persona.json b/lab_profiles/Nigerian%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e5a8dc92f396ca29d7486069f9aa0a4525e126c3 --- /dev/null +++ b/lab_profiles/Nigerian%20Persona.json @@ -0,0 +1,1612 @@ +{ + "lab_name": "Nigerian English", + "cultural_context": "Formal, polite, and heavily influenced by British colonial legacy mixed with local social norms. High emphasis on titles (Chief, Engr, Sir/Ma). Indirectness is preferred in business refusals. 'Please' is used excessively to soften requests. The concept of 'family' extends to distant relatives and community members. Religious fatalism ('It is well') is common in professional settings.", + "jargon": { + "Academics": "School work / University activities.", + "Action": "To expedite a file or request (e.g., 'Please action this letter').", + "Admin": "Administration.", + "African time": "The cultural tendency to arrive late to events.", + "After-dress": "A dress worn after the wedding reception.", + "Age grade": "A group of people born within the same time frame (cultural society).", + "Agip": "Any Government In Power (A person loyal to whoever is ruling).", + "Ago": "Knock knock (used when entering a house).", + "Ajebutter": "A wealthy or pampered person (soft like butter).", + "Ajepako": "A person from a tough background (eats wood).", + "Alhaja": "Title for a Muslim woman who has performed the Hajj.", + "Alhaji": "Title for a Muslim man who has performed the Hajj.", + "All-night": "An overnight religious vigil.", + "Andrew": "Someone who wants to check out (leave the country).", + "Annex": "An extension of a building or office.", + "Antenatal": "Prenatal care clinics.", + "Applicant": "Someone looking for a job.", + "Area boy": "Street thug or tout.", + "Arrangee": "Something arranged illegally or a person used for fraud.", + "As it were": "A filler phrase used frequently in formal speech.", + "Aso-ebi": "Uniform fabric worn by family/friends at a ceremony.", + "Aso-oke": "Hand-woven cloth from the Yoruba culture.", + "Attached": "Assigned (e.g., 'I was attached to the Lagos branch').", + "Aunty": "Respectful address for any older female, related or not.", + "Available": "To have money (e.g., 'I am not available now').", + "Baba": "Father or respected elder.", + "Baby mama": "Unmarried mother of one's child.", + "Bachelor's eve": "Stag party/Bachelor party.", + "Backyard": "Buttocks (Euphemism).", + "Bad belle": "Malice or jealousy.", + "Baffs": "Trendy clothes.", + "Balance": "To remain / The remaining change from a transaction.", + "Balcony": "Large bosom (Slang).", + "Barbing salon": "Barbershop.", + "Basest": "The lowest or worst.", + "Bash": "To hit a car (accident) or a party.", + "Batch": "A group of people (especially NYSC corp members).", + "Battery": "To charge a phone (e.g., 'I want to battery my phone').", + "Beating rain": "Walking in the rain.", + "Bed-ridden": "Confined to bed due to illness.", + "Been-to": "Someone who has lived abroad (usually UK/USA) and returned.", + "Beg": "To plead or request politely.", + "Bend-down boutique": "Second-hand clothes market (where you bend to pick items).", + "Best lady": "Maid of honor.", + "Best man": "Groom's chief attendant.", + "Big grammar": "Using overly complex English words.", + "Big man": "Rich or influential man.", + "Biscuit bone": "Brisket (soft bone).", + "Block": "To intercept or ambush.", + "Blow": "To become rich or famous.", + "Body odor": "Bad smell.", + "Boli": "Roasted plantain.", + "Bone": "To frown or snub.", + "Book": "To report someone to authority or reserve a seat.", + "Book-long": "Studious / Too much theory.", + "Borrow": "To lend (e.g., 'Borrow me your pen' means 'Lend me your pen').", + "Boss": "General term of respect for a male stranger.", + "Bottom power": "Using sexual influence to get favors.", + "Bounce": "To be rejected or to walk arrogantly.", + "Boys": "Subordinates or gang members.", + "Branch": "To stop by somewhere briefly on a journey.", + "Bread": "Money.", + "Breakfast": "Heartbreak (Slang).", + "Bride price": "Dowry paid by the groom.", + "Bring-down": "To cause someone's downfall.", + "Bro": "Brother / Friend.", + "Brown envelope": "Bribe given to journalists.", + "Buga": "To show off.", + "Buka": "Local roadside restaurant.", + "Bunk": "Bed in a hostel.", + "Bush": "Uncivilized or rural.", + "Bush-meat": "Game meat (antelope, grasscutter).", + "Business center": "Place for typing/photocopying documents.", + "Butty": "Spoiled child (Short for Ajebutter).", + "Call": "To announce (e.g., 'They have called the results').", + "Cane": "To flog or whip.", + "Canteen": "Restaurant.", + "Canvas": "Sneakers/Tennis shoes.", + "Car park": "Parking lot.", + "Carry": "To give a ride or trick someone.", + "Carry over": "To fail a university course and retake it.", + "Carton": "Box (e.g., 'Carton of Indomie').", + "Case": "Trouble or police matter.", + "Cash madam": "A wealthy woman who deals in cash.", + "Cast": "To expose a secret.", + "Catechist": "Religious instructor.", + "Center table": "Coffee table.", + "Chairlady": "Female chairperson.", + "Chairman": "Head of an event, or a flatterous title for a man.", + "Chance": "To cheat or take advantage of.", + "Change": "Money returned after payment.", + "Chapman": "A popular cocktail drink.", + "Charter": "To hire a taxi exclusively (Taxi drop).", + "Check out": "To die.", + "Chewing stick": "Traditional twig used for brushing teeth.", + "Chief": "Title for a titled elder.", + "Chin-chin": "Crunchy fried dough snack.", + "Chips": "French fries (US influence) or Plantain chips.", + "Chop": "To eat, embezzle, or enjoy.", + "Chop money": "Allowance for food.", + "Chrife": "Christian + Life (Overly religious person).", + "Christmas clothes": "New clothes bought for the holiday.", + "Church mind": "Conscience.", + "Circular": "An official memo distributed to staff.", + "Civil servant": "Government employee.", + "Clean": "Innocent or neat.", + "Clear": "To settle a bill or understand.", + "Close from work": "To finish work for the day.", + "Close marking": "Monitoring someone closely.", + "Cloth": "Clothes.", + "Coal tar": "Asphalt road.", + "Coat": "Suit jacket.", + "Cold room": "Walk-in freezer.", + "Collect": "To receive (e.g., 'I collected my salary').", + "Come": "To arrive (e.g., 'Has he come?').", + "Come and eat": "Polite invitation when eating.", + "Command": "To control.", + "Commot": "Leave.", + "Compound": "A fenced residential area/yard.", + "Condition": "Health status or trouble.", + "Conductor": "Bus assistant who collects fares.", + "Confam": "Confirmed / Genuine.", + "Conference": "Meeting.", + "Confraternity": "University cult group.", + "Cooking pot": "Saucepan.", + "Cool van": "Refrigerated van.", + "Corner": "To turn a vehicle.", + "Corner-corner": "Illegal or shady (adjective).", + "Corporate": "Formal wear (e.g., 'Wear corporate').", + "Corper": "NYSC member.", + "Correct": "Good / Genuine.", + "Countryman": "Fellow citizen.", + "Court": "To sue.", + "Cover cloth": "Wrapper fabric.", + "Cover shoe": "Closed-toe shoe.", + "Cow": "Fool / Idiot.", + "Cow leg": "A delicacy made from cow's foot.", + "Crack": "To joke.", + "Crave": "To beg.", + "Creep": "To cheat in a relationship.", + "Cross carpet": "To switch political parties.", + "Cruise": "Fun / Prank.", + "Current": "Electricity.", + "Customer": "Someone you buy from regularly (not just someone buying from you).", + "Customized": "Personalized.", + "Cut": "Share of money.", + "Cutlass": "Machete.", + "Daddy": "Respectful term for any older man.", + "Damages": "Cost of repairs or compensation.", + "Danfo": "Commercial yellow bus.", + "Dash": "To give a gift or bribe.", + "Dashboard": "Car instrument panel.", + "Date": "Calendar date (e.g., 'What is today's date?').", + "Decampee": "Politician who switches parties.", + "Declare": "To buy drinks for friends.", + "Decorate": "To bribe.", + "Deep": "Profound.", + "Deliver": "To save or rescue.", + "Demurrage": "Fee for delay at the port.", + "Detail": "Specifics.", + "Devotion": "Prayer session.", + "Dialect": "Language.", + "Dice": "Cube.", + "Dickson": "Detective.", + "Dig": "To understand.", + "Direct entry": "Admission to 2nd year university.", + "Dirty": "Rude (e.g., 'He slapped him a dirty slap').", + "Discharge": "To release or acquit.", + "Discussion": "Argument.", + "Disengage": "To fire or lay off an employee.", + "Disvirgin": "To use a new product for the first time.", + "Divider": "Traffic island.", + "Do": "To treat, fix, or affect (e.g., 'Do my hair').", + "Do somehow": "To act unreliably or suspiciously.", + "Doctor": "Any medical staff.", + "Dodgy": "Suspicious.", + "Donation": "Bribe.", + "Double": "To rush.", + "Dowry": "Bride price.", + "Draw": "Soup viscosity (e.g., 'This soup draws well').", + "Dress": "To move over in a seat (e.g., 'Dress for me').", + "Drink": "Alcohol.", + "Driver": "Chauffeur.", + "Drop": "To get out of a vehicle (passenger) or stop a taxi.", + "Dry": "Boring or skinny.", + "Dub": "To copy.", + "Dull": "Slow-witted.", + "Duplex": "A two-story house (semi-detached or detached).", + "Dustbin": "Trash can.", + "Ease oneself": "To use the toilet.", + "Eat money": "To embezzle or spend lavishly.", + "Egoun": "Bribe (slang).", + "Egunje": "Bribe.", + "Electioneering": "Campaigning.", + "Enjoyment": "Pleasure / Party.", + "Environment": "Neighborhood.", + "Escort": "To walk a guest to the gate.", + "Estate": "Housing development.", + "Exam": "Examination.", + "Exchange": "To swap.", + "Exercise book": "Notebook.", + "Expedite action": "To speed up a bureaucratic process.", + "Experience": "A terrible ordeal.", + "Extreme": "The very end of a room or road.", + "Eyeglass": "Spectacles.", + "Face-me-I-face-you": "Tenement housing.", + "Facilitator": "Trainer.", + "Fail": "To disappoint (e.g., 'The generator failed us').", + "Family planning": "Contraception.", + "Fan": "To cool.", + "Father": "Priest.", + "Fear": "To scare (e.g., 'The dog feared me').", + "Federal character": "Quota system/Affirmative action.", + "Feeding allowance": "Money for food.", + "Fellowship": "Religious gathering.", + "Festac": "Festival.", + "Fetch": "To get water.", + "File": "To submit documents.", + "Fill": "To complete a form.", + "Fine": "Beautiful.", + "Fire": "To shoot.", + "First school leaving certificate": "Primary school diploma.", + "Fish": "To search.", + "Fit": "To be able to.", + "Fix": "To repair.", + "Flag off": "To start a project.", + "Flash": "To call and hang up immediately.", + "Flashing": "Calling and hanging up immediately.", + "Flat": "Apartment.", + "Flog": "To whip/cane.", + "Floor": "Story (of a building).", + "Flow": "To understand or rhyme.", + "Follow": "To accompany.", + "Food flask": "Thermos for food.", + "Footing": "Walking.", + "Form": "To pretend.", + "Forward": "To send a message.", + "Four-one-nine (419)": "Fraud/Scam.", + "Frame": "Eyeglass frame.", + "Free": "To release.", + "Fresh": "Looking good/healthy.", + "Fridge": "Refrigerator.", + "Fronting": "Pretending or acting as a cover.", + "Fruit": "Outcome.", + "Full option": "Car with all features (or a well-endowed woman).", + "Function": "Event.", + "Gaff": "Mistake.", + "Gain": "Profit.", + "Gallop": "Pothole or speed bump.", + "Garden egg": "African eggplant.", + "Garri": "Cassava flakes.", + "Gas": "Fart.", + "Gate man": "Security guard.", + "Gathering": "Meeting.", + "Gbedu": "Music.", + "Gear": "Car transmission.", + "General": "Common.", + "Gent": "Gentleman.", + "Get": "To have.", + "Get down": "To alight from a vehicle.", + "Ghost worker": "Non-existent employee drawing salary.", + "Giraffing": "Spying on someone's paper during an exam.", + "Girl": "Maid or girlfriend.", + "Gist": "To chat, gossip, or tell a story.", + "Give": "To cause.", + "Go": "To leave.", + "Go-slow": "Traffic jam.", + "Gobbe": "Trouble.", + "Godfather": "Political sponsor/protector.", + "Good": "Fine.", + "Goods": "Merchandise.", + "Government": "Authorities.", + "Governor": "State leader.", + "Grab": "To understand.", + "Grade": "Quality.", + "Grammar": "Big words.", + "Grass": "Weed.", + "Grease": "Bribe.", + "Greet": "To say hello.", + "Ground": "Floor.", + "Group": "Team.", + "Guest": "Visitor.", + "Guide": "Lead.", + "Guy": "Friend.", + "Gym": "Exercise.", + "Half-current": "Low voltage electricity.", + "Hammer": "To make it big.", + "Handover": "Transfer of power.", + "Hang": "To wait.", + "Harass": "To bother.", + "Hard": "Difficult.", + "Hawker": "Street vendor.", + "Head": "Leader.", + "Head tie": "Gele (turban).", + "Hear": "To understand (language).", + "Heart": "Courage.", + "Heavy": "Pregnant.", + "Help": "To assist.", + "High sea": "Being very drunk.", + "Hire": "To rent.", + "Hold": "To arrest or delay.", + "Hold-up": "Severe traffic jam (worse than go-slow).", + "Home trouble": "Family problems (often implied spiritual).", + "Home video": "Nollywood movie.", + "Horn": "To honk.", + "Hostel": "Dormitory.", + "Hot": "Fast or dangerous.", + "Hotel": "Bar/Restaurant (sometimes).", + "House girl/boy": "Domestic servant.", + "House help": "Domestic servant.", + "How far": "Informal greeting meaning 'How are you?' or 'What is the situation?'.", + "Hustle": "To work hard.", + "I beg": "Please.", + "Ice water": "Cold water.", + "Idiot": "Fool.", + "Igbo": "Weed.", + "Imported": "Foreign.", + "Industrial attachment": "Internship.", + "Inside life": "The reality of a situation is complex/hidden.", + "Installmentally": "In installments (paying over time).", + "Inter-state": "Between states.", + "Introduction": "First formal meeting between families before marriage.", + "Invalid": "Void.", + "Invigilator": "Exam proctor.", + "Invite": "Invitation.", + "Issue": "Problem.", + "Item": "Topic.", + "Jab": "To insult.", + "Jack": "To study hard.", + "Jam": "To hit or meet.", + "Jara": "Extra added for free.", + "Jealous": "To envy (used as a verb: 'Don't jealous me').", + "Jelly": "Cream.", + "Jerk": "To startle.", + "Job": "Work.", + "Join": "To board a vehicle.", + "Joint": "A spot to eat, drink, or relax.", + "Joke": "Comedy.", + "Judge": "Magistrate.", + "Jug": "Pitcher.", + "Juice": "Drink.", + "Jump": "To skip.", + "Junior": "Younger.", + "Just": "Only.", + "K-leg": "Complication or problem.", + "Kabukabu": "Unregistered taxi.", + "Keep": "To save.", + "Keep the change": "Don't return the balance.", + "Keke": "Tricycle taxi.", + "Kerosene": "Paraffin.", + "Key": "To lock.", + "Kick": "To start (an engine).", + "Kid": "Child.", + "Kill": "To turn off (engine/light).", + "Kitchen": "Cooking area.", + "Knock": "Engine sound.", + "Knockout": "Firecracker.", + "Kolo": "Mad.", + "Labor": "Work.", + "Lad": "Boy.", + "Ladder": "Steps.", + "Lady": "Woman.", + "Lagos": "City.", + "Land": "To arrive.", + "Landlord": "House owner.", + "Lane": "Path.", + "Language": "Dialect.", + "Lap": "To carry someone on one's lap.", + "Large": "Big.", + "Last born": "The youngest sibling.", + "Late": "Deceased.", + "Launch": "To open.", + "Law": "Rule.", + "Lawyer": "Attorney.", + "Layabout": "Idler.", + "Lead": "Guide.", + "Leader": "Head.", + "Leak": "To reveal.", + "Lean": "Thin.", + "Learn": "To teach (archaic use).", + "Learner": "Beginner driver.", + "Leave": "Holiday.", + "Lecture": "Class.", + "Lecturer": "Professor.", + "Leg": "Connection.", + "Lemon": "Bad car.", + "Lend": "To borrow (inverse usage is common error, but 'borrow' for 'lend' is the target here).", + "Lesson": "Class.", + "Lesson teacher": "Private tutor.", + "Letter": "Mail.", + "Level": "Class/Status.", + "License": "Permit.", + "Lie": "Untruth.", + "Lift": "Ride.", + "Light": "Electricity/Power.", + "Like": "As.", + "Line": "Queue.", + "Link": "Connection.", + "List": "Roster.", + "Load": "Luggage.", + "Loan": "Debt.", + "Local": "Unsophisticated.", + "Lock": "Secure.", + "Lodge": "Hotel.", + "Long leg": "Connections/Influence used to get a favor.", + "Look": "Search.", + "Lorry": "Truck.", + "Lose": "Misplace.", + "Loss": "Deficit.", + "Loud": "Noisy.", + "Love": "Affection.", + "Low": "Down.", + "Luck": "Chance.", + "Luggage": "Baggage.", + "Lunch": "Afternoon meal.", + "Machine": "Motorcycle.", + "Madam": "Respectful title for a woman.", + "Madness": "Insanity.", + "Maggi": "Bouillon cube (generic trademark).", + "Mail": "Letter.", + "Main": "Principal.", + "Maintain": "To keep.", + "Major": "Big.", + "Make": "To do.", + "Malam": "Title for Northern man.", + "Malaria": "Fever (generic term for illness).", + "Male": "Man.", + "Mama": "Mother.", + "Mama put": "Roadside restaurant.", + "Man": "Male.", + "Manage": "To endure or make do.", + "Manager": "Boss.", + "Mannerless": "Rude or lacking home training.", + "Manual": "By hand.", + "Market": "Trade.", + "Marriage": "Wedding.", + "Mash": "Crush.", + "Master": "Boss.", + "Match": "Game.", + "Mate": "Peer.", + "Material": "Fabric.", + "Matter": "Issue.", + "Mature": "Adult.", + "Maximum": "Most.", + "Mean": "Stingy.", + "Meat": "Flesh.", + "Meat pie": "Pastry filled with meat.", + "Mechanic": "Car repairer.", + "Medicine": "Drug.", + "Meeting": "Gathering.", + "Member": "Person.", + "Memo": "Note.", + "Mental": "Crazy.", + "Menu": "List.", + "Mess": "Trouble.", + "Message": "Errand.", + "Meter": "Gauge.", + "Method": "Way.", + "Middle": "Center.", + "Midnight": "Late night.", + "Mile": "Distance.", + "Milk": "Dairy.", + "Mind": "Care.", + "Mine": "Possess.", + "Mineral": "Soft drink.", + "Minerals": "Soft drinks.", + "Minister": "Official.", + "Minor": "Small.", + "Minute": "To write minutes on a file.", + "Miss": "To fail to hit.", + "Mistake": "Error.", + "Mix": "Blend.", + "Mobile": "Cell phone.", + "Model": "Type.", + "Modern": "New.", + "Modest": "Humble.", + "Molue": "Large, often dilapidated commercial bus (Lagos).", + "Mommy": "Mother.", + "Money": "Cash.", + "Monitor": "Watch.", + "Month": "Time.", + "Morning": "Time.", + "Morning devotion": "Morning prayer session.", + "Mortuary": "Morgue.", + "Mosquito": "Insect.", + "Mother": "Parent.", + "Motor": "Car.", + "Motor park": "Bus station.", + "Move": "Go.", + "Movement": "Traffic.", + "Movie": "Film.", + "Mr": "Title.", + "Mrs": "Title.", + "Much": "A lot.", + "Mud": "Dirt.", + "Mug": "Cup.", + "Mum": "Mother.", + "Murder": "Kill.", + "Music": "Song.", + "Must": "Have to.", + "My dear": "Friend.", + "Naira": "Currency.", + "Naked": "Nude.", + "Name": "Title.", + "Naming ceremony": "Event to name a newborn (7/8 days after birth).", + "Nanny": "Childcare provider.", + "Nap": "Sleep.", + "National": "Country.", + "Native": "Traditional clothes.", + "Native doctor": "Traditional herbalist/healer.", + "Nature": "World.", + "Naughty": "Bad.", + "Near": "Close.", + "Neat": "Clean.", + "Necessary": "Needed.", + "Neck": "Body part.", + "Need": "Want.", + "Needle": "Pin.", + "Negative": "Bad.", + "Neighbor": "Friend.", + "Nepa": "Power company (used for electricity).", + "Nephew": "Relative.", + "Nervous": "Scared.", + "Net": "Web.", + "New": "Fresh.", + "News": "Report.", + "Next": "After.", + "Next tomorrow": "The day after tomorrow.", + "Nice": "Good.", + "Niece": "Relative.", + "Night": "Dark.", + "Night vigil": "Overnight prayer service.", + "No": "Refusal.", + "Noise": "Sound.", + "Non-indigene": "Outsider.", + "Nonsense": "Rubbish.", + "Normal": "Usual.", + "North": "Direction.", + "Nose": "Smell.", + "Not on seat": "Absent from the desk/office.", + "Note": "Write.", + "Notice": "See.", + "Now": "Present.", + "Number": "Digit.", + "Nurse": "Carer.", + "Nylon": "Plastic bag.", + "O'clock": "Time.", + "Obey": "Listen.", + "Object": "Thing.", + "Observe": "Watch.", + "Occasion": "Event.", + "Occupant": "Resident.", + "Occupation": "Job.", + "Off": "To turn off or leave.", + "Off the light": "Turn off the light.", + "Offense": "Crime.", + "Offer": "Give.", + "Office": "Workplace.", + "Officer": "Police.", + "Official": "Formal.", + "Often": "Frequent.", + "Oga": "Boss.", + "Oil": "Palm oil.", + "Ok": "Yes.", + "Okada": "Commercial motorcycle taxi.", + "Old": "Aged.", + "Old school": "Retro.", + "Omo": "Child/Person.", + "On": "To turn on.", + "On the light": "Turn on the light.", + "One": "Single.", + "Only": "Sole.", + "Open": "Unlock.", + "Operation": "Surgery.", + "Opinion": "View.", + "Opportunity": "Chance.", + "Opportuned": "To have the opportunity (e.g., 'I was not opportuned to go').", + "Opposite": "Facing.", + "Option": "Choice.", + "Orange": "Fruit.", + "Order": "Command.", + "Ordinary": "Plain.", + "Organize": "Arrange.", + "Original": "Real.", + "Other": "Different.", + "Out": "Away.", + "Outfit": "Clothes.", + "Outing": "Trip.", + "Outside": "Exterior.", + "Oversabi": "Overzealous person.", + "Over": "Finished.", + "Overload": "Too much.", + "Owe": "Debt.", + "Own": "Possess.", + "Owner": "Proprietor.", + "Pack": "To move out of a house OR to park a car.", + "Package": "Parcel.", + "Packet": "Box.", + "Page": "Sheet.", + "Pain": "Hurt.", + "Paint": "Color.", + "Pair": "Two.", + "Palace": "House.", + "Palaver": "Trouble.", + "Palm": "Hand.", + "Palm oil": "Red oil.", + "Pan": "Pot.", + "Panel beater": "Car body repairer.", + "Paper": "Sheet.", + "Papers": "Car documents.", + "Parcel": "Package.", + "Parent": "Father/Mother.", + "Park": "Stop.", + "Parking": "Stop.", + "Parliament": "Government.", + "Parlor": "Living room.", + "Part": "Piece.", + "Participate": "Join.", + "Particular": "Specific.", + "Particulars": "Vehicle documents.", + "Partner": "Associate.", + "Party": "Celebration.", + "Pass": "Overtake or succeed.", + "Passenger": "Rider.", + "Passport": "ID.", + "Past": "Gone.", + "Pastor": "Priest.", + "Patch": "Fix.", + "Path": "Way.", + "Patient": "Sick person.", + "Patrol": "Guard.", + "Pattern": "Design.", + "Pay": "Give money.", + "Payment": "Money.", + "Peace": "Quiet.", + "Pen": "Writer.", + "Penny": "Coin.", + "Pension": "Retirement.", + "People": "Humans.", + "Pepper": "Spice.", + "Pepper soup": "Spicy broth.", + "Pepperish": "Spicy.", + "Per": "Each.", + "Percent": "Part.", + "Perfect": "Good.", + "Perform": "Act.", + "Performance": "Show.", + "Perhaps": "Maybe.", + "Period": "Time.", + "Permanent": "Fixed.", + "Permission": "Allow.", + "Permit": "Allow.", + "Person": "Human.", + "Personal": "Private.", + "Personnel": "Staff.", + "Petrol": "Gas.", + "Petrol station": "Gas station.", + "Phone": "Call.", + "Photo": "Picture.", + "Photocopy": "Duplicate.", + "Pick": "Choose or collect.", + "Pickin": "Child.", + "Picture": "Photo.", + "Piece": "Bit.", + "Pig": "Animal.", + "Pile": "Heap.", + "Pilot": "Flyer.", + "Pin": "Needle.", + "Pink": "Color.", + "Pipe": "Tube.", + "Pity": "Sympathy.", + "Place": "Spot.", + "Plain": "Simple.", + "Plait": "To braid hair.", + "Plan": "Idea.", + "Plane": "Aircraft.", + "Plant": "Grow.", + "Plantain": "Banana-like fruit.", + "Plastic": "Material.", + "Plate": "Dish.", + "Plate number": "License plate.", + "Play": "Game.", + "Player": "Gamer.", + "Please": "Beg.", + "Pleasure": "Joy.", + "Plenary": "Full legislative session.", + "Plenty": "Many.", + "Plot": "Land.", + "Plumpy": "Chubby / Plump.", + "Pocket": "Bag.", + "Point": "Show.", + "Police": "Cop.", + "Policy": "Rule.", + "Polish": "Shine.", + "Politics": "Government.", + "Poll": "Vote.", + "Ponmo": "Cow skin.", + "Pool": "Swim.", + "Poor": "Broke.", + "Pop": "Drink.", + "Popular": "Famous.", + "Population": "People.", + "Port": "Harbor.", + "Porter": "Carrier.", + "Position": "Place.", + "Positive": "Good.", + "Possible": "Can.", + "Post": "Mail.", + "Poster": "Sign.", + "Pot": "Pan.", + "Potato": "Food.", + "Pothole": "Hole.", + "Pound": "Beat.", + "Pounded yam": "Swallow food.", + "Pour": "Spill.", + "Powder": "Dust.", + "Power": "Strength.", + "Practice": "Train.", + "Praise": "Clap.", + "Pray": "Ask God.", + "Prayer": "Request.", + "Preach": "Talk.", + "Prefect": "Leader.", + "Prefer": "Like.", + "Pregnant": "Expecting.", + "Premier": "First.", + "Premises": "Compound.", + "Prepare": "Ready.", + "Present": "Here.", + "Presentation": "Show.", + "President": "Leader.", + "Press": "Push.", + "Pressure": "Stress.", + "Pretty": "Fine.", + "Prevent": "Stop.", + "Price": "Cost.", + "Pride": "Ego.", + "Priest": "Father.", + "Primary": "First.", + "Principal": "Head.", + "Print": "Copy.", + "Prison": "Jail.", + "Private": "Alone.", + "Prize": "Award.", + "Problem": "Issue.", + "Process": "Way.", + "Produce": "Make.", + "Product": "Good.", + "Profession": "Job.", + "Professor": "Teacher.", + "Profit": "Gain.", + "Program": "Show.", + "Progress": "Go.", + "Project": "Plan.", + "Promise": "Vow.", + "Promote": "Raise.", + "Proof": "Fact.", + "Proper": "Right.", + "Property": "Thing.", + "Proposal": "Plan.", + "Propose": "Ask.", + "Protect": "Guard.", + "Protection": "Safety.", + "Proud": "Haughty.", + "Prove": "Show.", + "Provide": "Give.", + "Provisions": "Groceries/Toiletries.", + "Public": "Open.", + "Publish": "Print.", + "Pull": "Drag.", + "Pump": "Machine.", + "Punch": "Hit.", + "Punish": "Beat.", + "Pupil": "Student.", + "Purchase": "Buy.", + "Pure": "Clean.", + "Pure water": "Sachet water.", + "Purple": "Color.", + "Purpose": "Goal.", + "Purse": "Bag.", + "Push": "Shove.", + "Put": "Place.", + "Put to bed": "To give birth.", + "Quality": "Good.", + "Quantity": "Amount.", + "Quarrel": "Fight.", + "Quarter": "Part.", + "Queen": "Royal.", + "Question": "Ask.", + "Queue": "Line.", + "Quick": "Fast.", + "Quiet": "Silent.", + "Quit": "Stop.", + "Quite": "Very.", + "Quack": "Fake/Unqualified professional.", + "Race": "Run.", + "Radio": "Sound.", + "Rag": "Cloth.", + "Rail": "Train.", + "Rain": "Water.", + "Rain coat": "Condom (slang).", + "Raise": "Lift.", + "Range": "Distance.", + "Rank": "Level.", + "Rapid": "Fast.", + "Rare": "Scarce.", + "Rate": "Speed.", + "Rather": "Instead.", + "Raw": "Uncooked.", + "Reach": "Arrive.", + "Read": "Look.", + "Ready": "Set.", + "Real": "True.", + "Realize": "Know.", + "Really": "Truly.", + "Rear": "Back.", + "Reason": "Why.", + "Receipt": "Bill.", + "Receive": "Get.", + "Recent": "New.", + "Reception": "Party.", + "Recipe": "Plan.", + "Recognize": "Know.", + "Recommend": "Say.", + "Record": "Note.", + "Recover": "Get back.", + "Red": "Color.", + "Reduce": "Cut.", + "Refer": "Point.", + "Refuse": "No.", + "Region": "Area.", + "Register": "Book.", + "Regret": "Sorry.", + "Regular": "Normal.", + "Regulation": "Rule.", + "Reject": "No.", + "Relate": "Tell.", + "Relation": "Family.", + "Relationship": "Bond.", + "Relative": "Family.", + "Relax": "Rest.", + "Release": "Let go.", + "Religion": "Faith.", + "Remain": "Stay.", + "Remark": "Say.", + "Remember": "Think.", + "Remind": "Tell.", + "Remote": "Far.", + "Remove": "Take.", + "Rent": "Hire.", + "Repair": "Fix.", + "Repeat": "Say again.", + "Replace": "Swap.", + "Reply": "Answer.", + "Report": "Tell.", + "Represent": "Show.", + "Representative": "Agent.", + "Request": "Ask.", + "Require": "Need.", + "Rescue": "Save.", + "Research": "Study.", + "Reserve": "Keep.", + "Resident": "Live.", + "Resign": "Quit.", + "Resist": "Stop.", + "Resolution": "Fix.", + "Resolve": "Fix.", + "Respect": "Honor.", + "Respond": "Answer.", + "Responsibility": "Duty.", + "Rest": "Sleep.", + "Restaurant": "Eatery.", + "Result": "End.", + "Retain": "Keep.", + "Retire": "Stop.", + "Return": "Back.", + "Reveal": "Show.", + "Revert": "To reply (e.g., 'I will revert to you').", + "Reverse": "Back.", + "Reverse back": "To reverse.", + "Review": "Look.", + "Revise": "Change.", + "Reward": "Prize.", + "Rice": "Food.", + "Rich": "Wealthy.", + "Ride": "Drive.", + "Right": "Correct.", + "Ring": "Call.", + "Rise": "Up.", + "Risk": "Chance.", + "River": "Water.", + "Road": "Way.", + "Roast": "Cook.", + "Rob": "Steal.", + "Rock": "Stone.", + "Role": "Part.", + "Roll": "Turn.", + "Roof": "Top.", + "Room": "Space.", + "Root": "Base.", + "Rope": "String.", + "Rough": "Hard.", + "Round": "Circle.", + "Round up": "To conclude or finish a meeting/event.", + "Rounding up": "Finishing a task (Opposite of US 'Rounding up').", + "Route": "Way.", + "Row": "Line.", + "Royal": "King.", + "Rub": "Clean.", + "Rubber": "Elastic.", + "Rubbish": "Trash.", + "Rude": "Bad.", + "Rug": "Mat.", + "Ruin": "Spoil.", + "Rule": "Law.", + "Run": "Go.", + "Running stomach": "Diarrhea.", + "Rush": "Hurry.", + "Sachet water": "Bagged drinking water.", + "Safe journey": "Bon voyage.", + "Sapa": "Poverty/Broke.", + "Send-forth": "Farewell party.", + "Senior brother/sister": "Older sibling.", + "Sequel to": "Following / With reference to.", + "Service year": "NYSC year.", + "Short knicker": "Shorts.", + "Slippers": "Flip-flops.", + "Small chops": "Finger foods.", + "Soup": "Stew (eaten with swallow).", + "Staff": "An individual employee (e.g., 'He is a staff of the bank').", + "Stakeholders": "Everyone involved in a project.", + "Stationery": "Writing materials.", + "Swallow": "Doughy food (fufu, eba, pounded yam).", + "Take in": "To become pregnant.", + "Take light": "Power outage.", + "Tap light": "To steal electricity.", + "Tight friend": "Close friend.", + "Title": "Honorary prefix (Chief, Prince, Alhaja).", + "Toaster": "Someone who is wooing a romantic interest.", + "Trafficate": "To indicate turn.", + "Up NEPA": "Exclamation when power returns.", + "Upper week": "The week after next.", + "Vulcanizer": "Tire repairer.", + "Wahala": "Trouble (loan word accepted in NE).", + "Wake-keep": "Vigil before a funeral.", + "Ward": "A person under guardianship.", + "Wash": "To use flattery or lies.", + "Water system": "Flush toilet.", + "Work": "To happen effectively (e.g., 'The medicine worked').", + "Workshop": "Seminar or repair shop." + }, + "pragmatic_rules": [ + { + "trigger": "Please borrow me", + "speaker_role": "Requester", + "interpretation": "Please lend me... (Request for a loan).", + "tone": "Requesting" + }, + { + "trigger": "Can you borrow me?", + "speaker_role": "Requester", + "interpretation": "Can you lend me?", + "tone": "Requesting" + }, + { + "trigger": "I want to borrow you", + "speaker_role": "Lender", + "interpretation": "I want to lend you.", + "tone": "Offering" + }, + { + "trigger": "I will revert", + "speaker_role": "Corporate", + "interpretation": "I will get back to you with an answer.", + "tone": "Formal" + }, + { + "trigger": "I am coming", + "speaker_role": "Any", + "interpretation": "Wait for me / I'm busy right now (Does not mean currently moving).", + "tone": "Request for patience" + }, + { + "trigger": "Well done", + "speaker_role": "Greeter", + "interpretation": "Hello (to someone working/sitting).", + "tone": "Polite" + }, + { + "trigger": "How is the family?", + "speaker_role": "Any", + "interpretation": "Mandatory social pleasantry.", + "tone": "Caring" + }, + { + "trigger": "How is work?", + "speaker_role": "Any", + "interpretation": "Greeting check-in.", + "tone": "Casual" + }, + { + "trigger": "Is that so?", + "speaker_role": "Elder", + "interpretation": "I doubt you/I am warning you.", + "tone": "Skeptical" + }, + { + "trigger": "Sorry", + "speaker_role": "Any", + "interpretation": "Oops / I empathize with your pain.", + "tone": "Empathetic" + }, + { + "trigger": "Excuse me sir", + "speaker_role": "Subordinate", + "interpretation": "I need your attention.", + "tone": "Respectful" + }, + { + "trigger": "With all due respect", + "speaker_role": "Subordinate", + "interpretation": "I am about to disagree with you.", + "tone": "Cautious" + }, + { + "trigger": "Are you with me?", + "speaker_role": "Speaker", + "interpretation": "Are you listening/following?", + "tone": "Checking" + }, + { + "trigger": "Do you understand?", + "speaker_role": "Teacher/Boss", + "interpretation": "Is that clear?", + "tone": "Authoritative" + }, + { + "trigger": "I'm grateful", + "speaker_role": "Recipient", + "interpretation": "Thank you very much.", + "tone": "Appreciative" + }, + { + "trigger": "God bless you", + "speaker_role": "Any", + "interpretation": "Thank you (common response to a favor).", + "tone": "Religious/Polite" + }, + { + "trigger": "It is well", + "speaker_role": "Any", + "interpretation": "Resignation to fate / Hope for the future.", + "tone": "Fatalistic" + }, + { + "trigger": "By God's grace", + "speaker_role": "Any", + "interpretation": "Hopefully (added to any future plan).", + "tone": "Religious" + }, + { + "trigger": "God forbid", + "speaker_role": "Any", + "interpretation": "I reject that negative thought.", + "tone": "Defensive" + }, + { + "trigger": "The car bashed me", + "speaker_role": "Victim", + "interpretation": "The car hit me.", + "tone": "Descriptive" + }, + { + "trigger": "Don't mention", + "speaker_role": "Giver", + "interpretation": "You are welcome.", + "tone": "Polite" + }, + { + "trigger": "More grease to your elbow", + "speaker_role": "Supporter", + "interpretation": "Keep up the good work.", + "tone": "Encouraging" + }, + { + "trigger": "For now", + "speaker_role": "Planner", + "interpretation": "Temporarily.", + "tone": "Transient" + }, + { + "trigger": "Any for me?", + "speaker_role": "Friend", + "interpretation": "Share your food/snack.", + "tone": "Playful" + }, + { + "trigger": "Quite an age", + "speaker_role": "Friend", + "interpretation": "Long time no see.", + "tone": "Nostalgic" + }, + { + "trigger": "Greet your people", + "speaker_role": "Leaver", + "interpretation": "Say hello to your family for me.", + "tone": "Polite" + }, + { + "trigger": "My regards to...", + "speaker_role": "Leaver", + "interpretation": "Give my best to...", + "tone": "Formal" + }, + { + "trigger": "Safe journey", + "speaker_role": "Well-wisher", + "interpretation": "Travel safely.", + "tone": "Caring" + }, + { + "trigger": "You are trying", + "speaker_role": "Evaluator", + "interpretation": "You are making an effort (mild praise).", + "tone": "Encouraging" + }, + { + "trigger": "He is my junior", + "speaker_role": "Senior", + "interpretation": "He is younger/lower rank than me.", + "tone": "Hierarchical" + }, + { + "trigger": "He is my senior", + "speaker_role": "Junior", + "interpretation": "He is older/higher rank.", + "tone": "Respectful" + }, + { + "trigger": "Put to bed", + "speaker_role": "Any", + "interpretation": "She has given birth.", + "tone": "Euphemistic" + }, + { + "trigger": "Passed on", + "speaker_role": "Any", + "interpretation": "Died.", + "tone": "Solemn" + }, + { + "trigger": "Of late", + "speaker_role": "Narrator", + "interpretation": "Recently.", + "tone": "Narrative" + }, + { + "trigger": "As a matter of fact", + "speaker_role": "Speaker", + "interpretation": "Actually.", + "tone": "Emphatic" + }, + { + "trigger": "To be honest", + "speaker_role": "Speaker", + "interpretation": "Frankly speaking.", + "tone": "Confessional" + }, + { + "trigger": "Can I have your number?", + "speaker_role": "Suitor", + "interpretation": "I am interested in you.", + "tone": "Flirtatious" + }, + { + "trigger": "I will think about it", + "speaker_role": "Refuser", + "interpretation": "Probably no.", + "tone": "Evasive" + }, + { + "trigger": "We will see", + "speaker_role": "Refuser", + "interpretation": "No.", + "tone": "Dismissive" + }, + { + "trigger": "No problem", + "speaker_role": "Agreed", + "interpretation": "That's fine.", + "tone": "Agreeable" + }, + { + "trigger": "What says the time?", + "speaker_role": "Asker", + "interpretation": "What time is it?", + "tone": "Inquisitive" + }, + { + "trigger": "How is the body?", + "speaker_role": "Friend", + "interpretation": "How is your health?", + "tone": "Caring" + }, + { + "trigger": "Managing", + "speaker_role": "Responder", + "interpretation": "Surviving, not thriving.", + "tone": "Modest/Sad" + }, + { + "trigger": "We thank God", + "speaker_role": "Responder", + "interpretation": "I am fine.", + "tone": "Standard" + }, + { + "trigger": "Just there", + "speaker_role": "Responder", + "interpretation": "Nothing special happening.", + "tone": "Bored" + }, + { + "trigger": "Are you serious?", + "speaker_role": "Skeptic", + "interpretation": "Really?", + "tone": "Surprised" + }, + { + "trigger": "Is that so?", + "speaker_role": "Listener", + "interpretation": "Oh really?", + "tone": "Engaged" + }, + { + "trigger": "I beg to differ", + "speaker_role": "Debater", + "interpretation": "I disagree.", + "tone": "Formal" + }, + { + "trigger": "Let's rub minds", + "speaker_role": "Colleague", + "interpretation": "Let's brainstorm.", + "tone": "Collaborative" + }, + { + "trigger": "Please be fast", + "speaker_role": "Waiter", + "interpretation": "Hurry up.", + "tone": "Urgent" + }, + { + "trigger": "Don't be offended", + "speaker_role": "Apologist", + "interpretation": "Please don't get angry.", + "tone": "Soothing" + }, + { + "trigger": "I appreciate", + "speaker_role": "Recipient", + "interpretation": "Thanks.", + "tone": "Grateful" + }, + { + "trigger": "Help me thank him", + "speaker_role": "Recipient", + "interpretation": "I am overwhelmed by his kindness.", + "tone": "Grateful" + }, + { + "trigger": "It is not fair", + "speaker_role": "Complainant", + "interpretation": "This is unjust.", + "tone": "Whining" + }, + { + "trigger": "Imagine!", + "speaker_role": "Gossip", + "interpretation": "Can you believe this audacity?", + "tone": "Outraged" + }, + { + "trigger": "Can you imagine?", + "speaker_role": "Narrator", + "interpretation": "It was unbelievable.", + "tone": "Dramatic" + }, + { + "trigger": "Wonders shall never end", + "speaker_role": "Observer", + "interpretation": "This is shocking.", + "tone": "Shocked" + }, + { + "trigger": "Fear women", + "speaker_role": "Man", + "interpretation": "Women are tricky.", + "tone": "Cynical" + }, + { + "trigger": "Men are scum", + "speaker_role": "Woman", + "interpretation": "Men are unreliable.", + "tone": "Cynical" + }, + { + "trigger": "See finish", + "speaker_role": "Advisor", + "interpretation": "Over-familiarity breeds contempt.", + "tone": "Warning" + }, + { + "trigger": "Respect yourself", + "speaker_role": "Warner", + "interpretation": "Stop acting childishly.", + "tone": "Warning" + }, + { + "trigger": "Be warned", + "speaker_role": "Threatener", + "interpretation": "This is your last chance.", + "tone": "Threatening" + }, + { + "trigger": "Last warning", + "speaker_role": "Authority", + "interpretation": "Next time I will punish you.", + "tone": "Severe" + }, + { + "trigger": "I put it to you", + "speaker_role": "Accuser", + "interpretation": "I assert that...", + "tone": "Legalistic" + }, + { + "trigger": "Funny enough", + "speaker_role": "Narrator", + "interpretation": "Ironically/Interestingly.", + "tone": "Narrative" + }, + { + "trigger": "As in...", + "speaker_role": "Clarifier", + "interpretation": "Do you mean...", + "tone": "Clarifying" + }, + { + "trigger": "In short", + "speaker_role": "Summarizer", + "interpretation": "To summarize.", + "tone": "Conclusive" + }, + { + "trigger": "At the end of the day", + "speaker_role": "Philosopher", + "interpretation": "Ultimately.", + "tone": "Conclusive" + }, + { + "trigger": "To cut the story short", + "speaker_role": "Storyteller", + "interpretation": "Skipping to the end.", + "tone": "Hastening" + }, + { + "trigger": "Based on logistics", + "speaker_role": "Organizer", + "interpretation": "Due to circumstances.", + "tone": "Vague" + }, + { + "trigger": "Due process", + "speaker_role": "Bureaucrat", + "interpretation": "Follow the rules strictly.", + "tone": "Rigid" + }, + { + "trigger": "Feedback", + "speaker_role": "Boss", + "interpretation": "Report/Reply.", + "tone": "Business" + }, + { + "trigger": "Carry along", + "speaker_role": "Colleague", + "interpretation": "Keep informed.", + "tone": "Inclusive" + }, + { + "trigger": "Reach out", + "speaker_role": "Contact", + "interpretation": "Contact someone.", + "tone": "Business" + }, + { + "trigger": "Do the needful", + "speaker_role": "Official", + "interpretation": "Do what is required (often implies bribe).", + "tone": "Suggestive" + }, + { + "trigger": "Facilitate", + "speaker_role": "Official", + "interpretation": "Fund/Enable.", + "tone": "Business" + }, + { + "trigger": "Mobilize", + "speaker_role": "Contractor", + "interpretation": "Pay money to start work.", + "tone": "Financial" + }, + { + "trigger": "Stakeholders", + "speaker_role": "Official", + "interpretation": "People involved.", + "tone": "Formal" + }, + { + "trigger": "Whatever the case may be", + "speaker_role": "Speaker", + "interpretation": "Regardless.", + "tone": "Formal" + }, + { + "trigger": "In as much as", + "speaker_role": "Debater", + "interpretation": "Even though.", + "tone": "Formal" + }, + { + "trigger": "Beware of 419", + "speaker_role": "Signage", + "interpretation": "Watch out for scammers.", + "tone": "Warning" + }, + { + "trigger": "No parking", + "speaker_role": "Signage", + "interpretation": "Do not park here.", + "tone": "Prohibitive" + }, + { + "trigger": "Gate fee", + "speaker_role": "Organizer", + "interpretation": "Entrance charge.", + "tone": "Informative" + }, + { + "trigger": "Item 7", + "speaker_role": "Guest", + "interpretation": "Food.", + "tone": "Humorous" + }, + { + "trigger": "Dance funds", + "speaker_role": "Celebrant", + "interpretation": "Money sprayed.", + "tone": "Celebratory" + }, + { + "trigger": "Spraying", + "speaker_role": "Guest", + "interpretation": "Giving cash on the dancefloor.", + "tone": "Celebratory" + }, + { + "trigger": "Aso-ebi", + "speaker_role": "Planner", + "interpretation": "Uniform cloth.", + "tone": "Traditional" + }, + { + "trigger": "Trad", + "speaker_role": "Planner", + "interpretation": "Traditional wedding.", + "tone": "Casual" + }, + { + "trigger": "White wedding", + "speaker_role": "Planner", + "interpretation": "Church wedding.", + "tone": "Formal" + }, + { + "trigger": "Court wedding", + "speaker_role": "Planner", + "interpretation": "Registry wedding.", + "tone": "Legal" + }, + { + "trigger": "Reception", + "speaker_role": "Planner", + "interpretation": "Party after the wedding.", + "tone": "Festive" + }, + { + "trigger": "Souvenir", + "speaker_role": "Guest", + "interpretation": "Gift given to guests.", + "tone": "Expectant" + }, + { + "trigger": "Take a bow", + "speaker_role": "Senate", + "interpretation": "You are approved without questioning.", + "tone": "Deferential" + }, + { + "trigger": "Off the mic", + "speaker_role": "Official", + "interpretation": "Stop talking.", + "tone": "Commanding" + }, + { + "trigger": "Order!", + "speaker_role": "Judge", + "interpretation": "Silence.", + "tone": "Commanding" + }, + { + "trigger": "My Lord", + "speaker_role": "Lawyer", + "interpretation": "Judge.", + "tone": "Deferential" + }, + { + "trigger": "Learned colleague", + "speaker_role": "Lawyer", + "interpretation": "Fellow lawyer.", + "tone": "Professional" + }, + { + "trigger": "Your Excellency", + "speaker_role": "Politician", + "interpretation": "Governor/President.", + "tone": "Deferential" + }, + { + "trigger": "Honorable", + "speaker_role": "Politician", + "interpretation": "Member of House.", + "tone": "Respectful" + }, + { + "trigger": "Royal Highness", + "speaker_role": "Subject", + "interpretation": "King.", + "tone": "Reverent" + }, + { + "trigger": "My oga", + "speaker_role": "Subordinate", + "interpretation": "My boss (affectionate/respectful).", + "tone": "Loyal" + }, + { + "trigger": "Small small", + "speaker_role": "Advisor", + "interpretation": "Take it easy / Slowly.", + "tone": "Cautionary" + }, + { + "trigger": "Now now", + "speaker_role": "Speaker", + "interpretation": "Immediately.", + "tone": "Urgent" + }, + { + "trigger": "Just like that", + "speaker_role": "Narrator", + "interpretation": "Suddenly / Without cause.", + "tone": "Surprised" + }, + { + "trigger": "Come and be going", + "speaker_role": "Host", + "interpretation": "It is time for you to leave.", + "tone": "Polite dismissal" + }, + { + "trigger": "How market?", + "speaker_role": "Friend", + "interpretation": "How is business?", + "tone": "Casual" + }, + { + "trigger": "I'm not hearing you", + "speaker_role": "Listener", + "interpretation": "I can't hear you.", + "tone": "Functional" + }, + { + "trigger": "Flash me", + "speaker_role": "Requester", + "interpretation": "Call my phone briefly so I have your number.", + "tone": "Functional" + }, + { + "trigger": "I'm loyal", + "speaker_role": "Subordinate", + "interpretation": "I submit to your authority.", + "tone": "Submissive" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Nigerian%20Pidgin%20Persona.json b/lab_profiles/Nigerian%20Pidgin%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1acdcef687eef1a623bd1767e0a9aaafe18be83c --- /dev/null +++ b/lab_profiles/Nigerian%20Pidgin%20Persona.json @@ -0,0 +1,679 @@ +{ + "lab_name": "Nigerian Pidgin English", + "cultural_context": "Survivalist, high-energy, humorous, and direct. Hierarchy exists but is often challenged by 'street credibility'. Code-switching is frequent. Used to bridge ethnic gaps. Prover-heavy.", + "jargon": { + "Abeg": "Please.", + "Abi": "Right? / Isn't it?", + "Agbero": "Street thug / Union worker.", + "Ajebutter": "Privileged person.", + "Ajepako": "Street-smart/Tough person.", + "Akata": "Foreigner.", + "Amebo": "Gossip.", + "Aproko": "Busybody.", + "Area boy": "Neighborhood gangster.", + "Ashana": "Promiscuous woman.", + "At all at all": "Not even a bit.", + "Aza": "Bank account number.", + "Babanla": "Huge / Top tier.", + "Baff": "Bathe.", + "Baff up": "Dress well.", + "Balance": "Remanining change.", + "Belle": "Stomach / Pregnancy.", + "Billing": "Asking for money.", + "Block": "Intercept / Meet.", + "Bone": "Frown / Ignore.", + "Buga": "Show off.", + "Cane": "Flog.", + "Cast": "Expose / Spoil.", + "Chairmo": "Boss.", + "Change am": "Beat someone up.", + "Chook": "Poke / Intrude.", + "Chop": "Eat / Embezzle.", + "Chop life": "Enjoy life.", + "Comot": "Leave / Remove.", + "Commot eye": "Stop looking.", + "Condemn": "Spoilt bad.", + "Confirm": "Genuine / Good.", + "Corper": "NYSC member.", + "Cruise": "Fun / Joke.", + "Cut soap": "Share secret.", + "Dem": "They / Them.", + "Dey": "To be / Is / Are.", + "Disembark": "Get down.", + "Dobale": "Prostrate / Respect.", + "Dull": "Slow / Stupid.", + "Ehen": "Yes / So? / Then?", + "Egungun": "Masquerade.", + "Fall hand": "Disappoint.", + "Fashi": "Forget it.", + "Fem": "Shut up.", + "Fit": "Can.", + "Fly": "Jump a fence/bus.", + "Form": "Pretend.", + "Gbas gbos": "Fight / Trouble.", + "Gbedu": "Music.", + "Ginger": "Motivate / Hype.", + "Gist": "Story / Chat.", + "Gobbe": "Trouble.", + "Go-slow": "Traffic.", + "Gutter": "Drainage.", + "Hammer": "Get rich.", + "Hear word": "Obey.", + "Hold body": "Survive.", + "Hustle": "Work.", + "Jam": "Hit / Meet.", + "Jand": "UK / Abroad.", + "Japa": "Emigrate.", + "Jazz": "Voodoo.", + "Jonz": "Mess up.", + "K-leg": "Problem.", + "Keke": "Tricycle.", + "Kolo": "Mad / Crazy.", + "Kpef": "Smoke (weed).", + "Lapp": "Sit on lap.", + "Learn work": "Apprentice.", + "Local": "Unrefined.", + "Long throat": "Greed.", + "Maga": "Victim.", + "Machine": "Bike.", + "Madam": "Lady boss.", + "Mama put": "Roadside food.", + "Manage": "Endure.", + "Ment": "Crazy.", + "Mogbe": "I'm dead.", + "Moimoi": "Bean pudding.", + "Mumu": "Fool.", + "Nack": "Hit / Sex.", + "Na so": "That's it.", + "Nepa": "Power.", + "No shaking": "No fear.", + "Nyash": "Butt.", + "Ochico": "Thief.", + "Oga": "Boss.", + "Ojoro": "Cheat.", + "Okada": "Bike taxi.", + "Olosho": "Prostitute.", + "Owa": "Stop here.", + "Oya": "Hurry.", + "Pako": "Tough.", + "Pale": "Father.", + "Parapo": "Clique.", + "Pepe": "Money.", + "Pikin": "Child.", + "Ponmo": "Cow skin.", + "Runs": "Shady deal.", + "Sabi": "Know.", + "Sapa": "Poverty.", + "Shine eye": "Be alert.", + "Sodiki": "Tracker.", + "Soro soke": "Speak up.", + "Swallow": "Fufu/Solid food.", + "Tear rubber": "New.", + "Tush": "Refined.", + "Twale": "Salute.", + "Una": "You (plural).", + "Vex": "Angry.", + "Waka": "Walk.", + "Wetin": "What.", + "Winch": "Witch.", + "Yahoo": "Fraud.", + "Yab": "Insult.", + "Yankee": "USA.", + "Yawa": "Problem.", + "Zobo": "Lie / Drink." + }, + "pragmatic_rules": [ + { + "trigger": "How far?", + "speaker_role": "Friend", + "interpretation": "Hello / What's up?", + "tone": "Casual" + }, + { + "trigger": "Wetin dey?", + "speaker_role": "Friend", + "interpretation": "What is happening?", + "tone": "Inquisitive" + }, + { + "trigger": "I dey", + "speaker_role": "Responder", + "interpretation": "I am fine / I am existing.", + "tone": "Neutral" + }, + { + "trigger": "I dey kampe", + "speaker_role": "Responder", + "interpretation": "I am doing very well.", + "tone": "Confident" + }, + { + "trigger": "No wahala", + "speaker_role": "Agreed", + "interpretation": "No problem.", + "tone": "Relaxed" + }, + { + "trigger": "No lele", + "speaker_role": "Agreed", + "interpretation": "No worries at all.", + "tone": "Cool" + }, + { + "trigger": "Who you be?", + "speaker_role": "Challenger", + "interpretation": "Who do you think you are?", + "tone": "Aggressive" + }, + { + "trigger": "You dey mad?", + "speaker_role": "Aggressor", + "interpretation": "Are you crazy? (Insult).", + "tone": "Angry" + }, + { + "trigger": "Comot body", + "speaker_role": "Challenger", + "interpretation": "Get out of here / Stop forming.", + "tone": "Dismissive" + }, + { + "trigger": "Abeg leave matter", + "speaker_role": "Peacemaker", + "interpretation": "Drop the topic.", + "tone": "Tired" + }, + { + "trigger": "Na you sabi", + "speaker_role": "Dismissive", + "interpretation": "That's your business / You think you know it all.", + "tone": "Sarcastic" + }, + { + "trigger": "I no get time", + "speaker_role": "Busy", + "interpretation": "I can't be bothered.", + "tone": "Dismissive" + }, + { + "trigger": "Make we bet", + "speaker_role": "Gambler", + "interpretation": "I am sure I am right.", + "tone": "Confident" + }, + { + "trigger": "Oya now", + "speaker_role": "Leaver", + "interpretation": "Goodbye / Let's go.", + "tone": "Urgent" + }, + { + "trigger": "E go better", + "speaker_role": "Optimist", + "interpretation": "Things will improve.", + "tone": "Hopeful" + }, + { + "trigger": "Las las", + "speaker_role": "Philosopher", + "interpretation": "In the end.", + "tone": "Resigned" + }, + { + "trigger": "We move", + "speaker_role": "Stoic", + "interpretation": "We keep going regardless.", + "tone": "Resilient" + }, + { + "trigger": "Cut soap for me", + "speaker_role": "Admirer", + "interpretation": "Tell me your secret to success.", + "tone": "Envious/Playful" + }, + { + "trigger": "Do giveaway", + "speaker_role": "Beggar", + "interpretation": "Give us money.", + "tone": "Demanding" + }, + { + "trigger": "Urgent 2k", + "speaker_role": "Beggar", + "interpretation": "I need small money now.", + "tone": "Desperate" + }, + { + "trigger": "Sapa dey hold me", + "speaker_role": "Broke", + "interpretation": "I am very broke.", + "tone": "Sad/Funny" + }, + { + "trigger": "Body dey pepper me", + "speaker_role": "Restless", + "interpretation": "I am agitated / broke.", + "tone": "Complaining" + }, + { + "trigger": "Shine your eye", + "speaker_role": "Advisor", + "interpretation": "Be smart / Don't get scammed.", + "tone": "Warning" + }, + { + "trigger": "No loose guard", + "speaker_role": "Advisor", + "interpretation": "Stay alert.", + "tone": "Warning" + }, + { + "trigger": "Ji masun", + "speaker_role": "Advisor", + "interpretation": "Wake up / Don't sleep on it.", + "tone": "Motivational" + }, + { + "trigger": "Who dey breathe?", + "speaker_role": "Boaster", + "interpretation": "I am the best here.", + "tone": "Arrogant" + }, + { + "trigger": "E choke", + "speaker_role": "Reactor", + "interpretation": "It is overwhelming.", + "tone": "Amazed" + }, + { + "trigger": "E restrict airflow", + "speaker_role": "Reactor", + "interpretation": "I can't breathe (It's too much).", + "tone": "Amazed" + }, + { + "trigger": "Pepper don rest", + "speaker_role": "Success", + "interpretation": "Money has come.", + "tone": "Happy" + }, + { + "trigger": "God when?", + "speaker_role": "Observer", + "interpretation": "When will it be my turn?", + "tone": "Jealous" + }, + { + "trigger": "Try your luck", + "speaker_role": "Threatener", + "interpretation": "Dare me and see.", + "tone": "Threatening" + }, + { + "trigger": "Wait for me", + "speaker_role": "Threatener", + "interpretation": "I will deal with you later.", + "tone": "Threatening" + }, + { + "trigger": "Change am for you", + "speaker_role": "Fighter", + "interpretation": "I will beat you.", + "tone": "Violent" + }, + { + "trigger": "Park well", + "speaker_role": "Passenger", + "interpretation": "Stop the car properly.", + "tone": "Directive" + }, + { + "trigger": "Owa o!", + "speaker_role": "Passenger", + "interpretation": "I want to get off here!", + "tone": "Loud" + }, + { + "trigger": "Hold your change", + "speaker_role": "Conductor", + "interpretation": "Have exact fare ready.", + "tone": "Commanding" + }, + { + "trigger": "Enter with your change", + "speaker_role": "Conductor", + "interpretation": "Don't enter if you have large bills.", + "tone": "Warning" + }, + { + "trigger": "Staff?", + "speaker_role": "Conductor", + "interpretation": "Are you police/military (riding free)?", + "tone": "Checking" + }, + { + "trigger": "Show love", + "speaker_role": "Beggar", + "interpretation": "Give money.", + "tone": "Persuasive" + }, + { + "trigger": "Anything for the boys?", + "speaker_role": "Police", + "interpretation": "Give us a bribe.", + "tone": "Corrupt" + }, + { + "trigger": "Wetin man go do?", + "speaker_role": "Stoic", + "interpretation": "What can one do? (Acceptance).", + "tone": "Resigned" + }, + { + "trigger": "Man must wack", + "speaker_role": "Worker", + "interpretation": "One must eat (justifying work).", + "tone": "Pragmatic" + }, + { + "trigger": "Hustle o!", + "speaker_role": "Motivator", + "interpretation": "Work hard!", + "tone": "Encouraging" + }, + { + "trigger": "Use your head", + "speaker_role": "Critic", + "interpretation": "Don't be stupid.", + "tone": "Insulting" + }, + { + "trigger": "Sense will not kill you", + "speaker_role": "Sarcastic", + "interpretation": "You are being too smart/clever.", + "tone": "Sarcastic" + }, + { + "trigger": "Receive sense", + "speaker_role": "Critic", + "interpretation": "Be wise.", + "tone": "Correctional" + }, + { + "trigger": "You try", + "speaker_role": "Evaluator", + "interpretation": "Good job (or Sarcastic: You failed).", + "tone": "Ambiguous" + }, + { + "trigger": "Well done o", + "speaker_role": "Greeter", + "interpretation": "Greetings.", + "tone": "Casual" + }, + { + "trigger": "I hail", + "speaker_role": "Subordinate", + "interpretation": "I salute you.", + "tone": "Respectful" + }, + { + "trigger": "Twale", + "speaker_role": "Street", + "interpretation": "Salute (Hand raise).", + "tone": "Respectful" + }, + { + "trigger": "Correct guy", + "speaker_role": "Friend", + "interpretation": "Good person.", + "tone": "Appreciative" + }, + { + "trigger": "Bad belle", + "speaker_role": "Critic", + "interpretation": "Jealousy.", + "tone": "Negative" + }, + { + "trigger": "Witchcraft", + "speaker_role": "Accuser", + "interpretation": "Pure evil/malice.", + "tone": "Serious" + }, + { + "trigger": "Home trouble", + "speaker_role": "Victim", + "interpretation": "Spiritual attack from family.", + "tone": "Superstitious" + }, + { + "trigger": "Carry go", + "speaker_role": "Supporter", + "interpretation": "Continue / You have my support.", + "tone": "Encouraging" + }, + { + "trigger": "Ride on", + "speaker_role": "Supporter", + "interpretation": "Keep going.", + "tone": "Encouraging" + }, + { + "trigger": "Gist me", + "speaker_role": "Listener", + "interpretation": "Tell me the story.", + "tone": "Eager" + }, + { + "trigger": "Tori", + "speaker_role": "Storyteller", + "interpretation": "Story.", + "tone": "Narrative" + }, + { + "trigger": "Which level?", + "speaker_role": "Greeter", + "interpretation": "What is the situation?", + "tone": "Inquisitive" + }, + { + "trigger": "Level don change", + "speaker_role": "Success", + "interpretation": "Status has improved.", + "tone": "Proud" + }, + { + "trigger": "I no send you", + "speaker_role": "Individualist", + "interpretation": "I don't care about you.", + "tone": "Dismissive" + }, + { + "trigger": "Who send you?", + "speaker_role": "Critic", + "interpretation": "Nobody asked you.", + "tone": "Rude" + }, + { + "trigger": "Oyo", + "speaker_role": "Individualist", + "interpretation": "On Your Own (You are alone).", + "tone": "Warning" + }, + { + "trigger": "Cry your cry", + "speaker_role": "Dismissive", + "interpretation": "Bear your burden alone.", + "tone": "Callous" + }, + { + "trigger": "Drink water drop cup", + "speaker_role": "Peacemaker", + "interpretation": "Relax.", + "tone": "Calming" + }, + { + "trigger": "Breakfast", + "speaker_role": "Victim", + "interpretation": "Heartbreak.", + "tone": "Sad" + }, + { + "trigger": "She don serve me breakfast", + "speaker_role": "Victim", + "interpretation": "She broke up with me.", + "tone": "Sad" + }, + { + "trigger": "Fear who no fear you", + "speaker_role": "Advisor", + "interpretation": "Be careful of fearless people.", + "tone": "Warning" + }, + { + "trigger": "Japa", + "speaker_role": "Dreamer", + "interpretation": "Leave the country.", + "tone": "Aspiring" + }, + { + "trigger": "Condition make crayfish bend", + "speaker_role": "Philosopher", + "interpretation": "Hardship changes people.", + "tone": "Proverbial" + }, + { + "trigger": "Khaki no be leather", + "speaker_role": "Comparer", + "interpretation": "Fakes are not the original.", + "tone": "Proverbial" + }, + { + "trigger": "Body no be firewood", + "speaker_role": "Tired", + "interpretation": "I need rest.", + "tone": "Exhausted" + }, + { + "trigger": "Soup wey sweet", + "speaker_role": "Proverb", + "interpretation": "Good things cost money.", + "tone": "Transactional" + }, + { + "trigger": "Monkey dey work baboon dey chop", + "speaker_role": "Worker", + "interpretation": "I work, the boss eats.", + "tone": "Complaining" + }, + { + "trigger": "Soldier come soldier go", + "speaker_role": "Observer", + "interpretation": "People come and go.", + "tone": "Philosophical" + }, + { + "trigger": "Water pass garri", + "speaker_role": "Victim", + "interpretation": "The situation is critical.", + "tone": "Serious" + }, + { + "trigger": "Na you biko", + "speaker_role": "Sarcastic", + "interpretation": "You are the boss (mocking).", + "tone": "Sarcastic" + }, + { + "trigger": "Oga at the top", + "speaker_role": "Reference", + "interpretation": "Highest authority.", + "tone": "Respectful/Mocking" + }, + { + "trigger": "Audio money", + "speaker_role": "Skeptic", + "interpretation": "Fake wealth.", + "tone": "Dismissive" + }, + { + "trigger": "Medicine after death", + "speaker_role": "Critic", + "interpretation": "Too little too late.", + "tone": "Regretful" + }, + { + "trigger": "Shoot bird", + "speaker_role": "Drunk", + "interpretation": "To vomit.", + "tone": "Disgusting" + }, + { + "trigger": "Shine teeth", + "speaker_role": "Smiler", + "interpretation": "To smile/laugh.", + "tone": "Happy" + }, + { + "trigger": "Enter trousers", + "speaker_role": "Threatener", + "interpretation": "We will fight.", + "tone": "Aggressive" + }, + { + "trigger": "Find trouble", + "speaker_role": "Provoker", + "interpretation": "Look for a fight.", + "tone": "Provocative" + }, + { + "trigger": "Rest", + "speaker_role": "Critic", + "interpretation": "Stop talking.", + "tone": "Dismissive" + }, + { + "trigger": "Getat", + "speaker_role": "Dismissive", + "interpretation": "Get out of here.", + "tone": "Rude" + }, + { + "trigger": "Ma fo", + "speaker_role": "Supporter", + "interpretation": "Don't break / Don't worry.", + "tone": "Reassuring" + }, + { + "trigger": "Bone face", + "speaker_role": "Actor", + "interpretation": "Keep a straight face.", + "tone": "Serious" + }, + { + "trigger": "See finish", + "speaker_role": "Victim", + "interpretation": "Disrespect due to familiarity.", + "tone": "Regretful" + }, + { + "trigger": "Over-sabi", + "speaker_role": "Critic", + "interpretation": "Trying too hard.", + "tone": "Annoyed" + }, + { + "trigger": "Do normal", + "speaker_role": "Advisor", + "interpretation": "Behave yourself.", + "tone": "Warning" + }, + { + "trigger": "Act film", + "speaker_role": "Observer", + "interpretation": "Creating a scene/drama.", + "tone": "Amused" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/North Levantine Arabic/Lebanese Persona.json b/lab_profiles/North Levantine Arabic/Lebanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..95c2813e2dd14420b07e98db88764b57106dfd88 --- /dev/null +++ b/lab_profiles/North Levantine Arabic/Lebanese Persona.json @@ -0,0 +1 @@ +{"language": "North Levantine Arabic", "dialect": "Lebanese", "system_prompt": "You are a native speaker of Lebanese (North Levantine Arabic, f)."}{"name": "Lebanese Persona"} \ No newline at end of file diff --git a/lab_profiles/North Levantine Arabic/Syrian Persona.json b/lab_profiles/North Levantine Arabic/Syrian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2fb5fe36256ddc4d02e26c82e2213301ac47c497 --- /dev/null +++ b/lab_profiles/North Levantine Arabic/Syrian Persona.json @@ -0,0 +1 @@ +{"language": "North Levantine Arabic", "dialect": "Syrian", "system_prompt": "You are a native speaker of Syrian (North Levantine Arabic, f)."}{"name": "Syrian Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Kurdish/Badini Persona.json b/lab_profiles/Northern Kurdish/Badini Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..8f96dad0a95739bce169a60c489849b6095060a9 --- /dev/null +++ b/lab_profiles/Northern Kurdish/Badini Persona.json @@ -0,0 +1 @@ +{"language": "Northern Kurdish", "dialect": "Badini", "system_prompt": "You are a native speaker of Badini (Northern Kurdish, f)."}{"name": "Badini Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Kurdish/Kurmanji Persona.json b/lab_profiles/Northern Kurdish/Kurmanji Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c36cd28a8bde3b749699fb1c3c76088479402c2d --- /dev/null +++ b/lab_profiles/Northern Kurdish/Kurmanji Persona.json @@ -0,0 +1 @@ +{"language": "Northern Kurdish", "dialect": "Kurmanji", "system_prompt": "You are a native speaker of Kurmanji (Northern Kurdish, f)."}{"name": "Kurmanji Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Pashto/Kabul Persona.json b/lab_profiles/Northern Pashto/Kabul Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..ed5c6b2afaee5e23b7140f1d5c145e813b3c4e18 --- /dev/null +++ b/lab_profiles/Northern Pashto/Kabul Persona.json @@ -0,0 +1 @@ +{"language": "Northern Pashto", "dialect": "Kabul", "system_prompt": "You are a native speaker of Kabul (Northern Pashto, f)."}{"name": "Kabul Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Pashto/Peshawari Persona.json b/lab_profiles/Northern Pashto/Peshawari Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6d53c1ed55d651b25d3d3c8ab688b01b2c0abdab --- /dev/null +++ b/lab_profiles/Northern Pashto/Peshawari Persona.json @@ -0,0 +1 @@ +{"language": "Northern Pashto", "dialect": "Peshawari", "system_prompt": "You are a native speaker of Peshawari (Northern Pashto, f)."}{"name": "Peshawari Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Uzbek/Fergana Persona.json b/lab_profiles/Northern Uzbek/Fergana Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0f52fb8c55089f7fcbd2db6d686a91ec30814033 --- /dev/null +++ b/lab_profiles/Northern Uzbek/Fergana Persona.json @@ -0,0 +1 @@ +{"language": "Northern Uzbek", "dialect": "Fergana", "system_prompt": "You are a native speaker of Fergana (Northern Uzbek, f)."}{"name": "Fergana Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Uzbek/Khorezm Persona.json b/lab_profiles/Northern Uzbek/Khorezm Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0c02315752b974607fa41b7b6fc2199d7cfc670b --- /dev/null +++ b/lab_profiles/Northern Uzbek/Khorezm Persona.json @@ -0,0 +1 @@ +{"language": "Northern Uzbek", "dialect": "Khorezm", "system_prompt": "You are a native speaker of Khorezm (Northern Uzbek, f)."}{"name": "Khorezm Persona"} \ No newline at end of file diff --git a/lab_profiles/Northern Uzbek/Tashkent Persona.json b/lab_profiles/Northern Uzbek/Tashkent Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b63eeab3b6238e5eda870411db015e1236e23543 --- /dev/null +++ b/lab_profiles/Northern Uzbek/Tashkent Persona.json @@ -0,0 +1 @@ +{"language": "Northern Uzbek", "dialect": "Tashkent", "system_prompt": "You are a native speaker of Tashkent (Northern Uzbek, f)."}{"name": "Tashkent Persona"} \ No newline at end of file diff --git a/lab_profiles/Odia/Desia Persona.json b/lab_profiles/Odia/Desia Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a694ff63439e5fee16bfe543c259b3c48f828395 --- /dev/null +++ b/lab_profiles/Odia/Desia Persona.json @@ -0,0 +1 @@ +{"language": "Odia", "dialect": "Desia", "system_prompt": "You are a native speaker of Desia (Odia, f)."}{"name": "Desia Persona"} \ No newline at end of file diff --git a/lab_profiles/Odia/Ganjami Persona.json b/lab_profiles/Odia/Ganjami Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f067b311627b0649c6bc3a0a2156f47d965779de --- /dev/null +++ b/lab_profiles/Odia/Ganjami Persona.json @@ -0,0 +1 @@ +{"language": "Odia", "dialect": "Ganjami", "system_prompt": "You are a native speaker of Ganjami (Odia, f)."}{"name": "Ganjami Persona"} \ No newline at end of file diff --git a/lab_profiles/Odia/Mughalbandi Persona.json b/lab_profiles/Odia/Mughalbandi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b15690af7cdb19a65269ca0e473b5a1f2f5290d3 --- /dev/null +++ b/lab_profiles/Odia/Mughalbandi Persona.json @@ -0,0 +1 @@ +{"language": "Odia", "dialect": "Mughalbandi", "system_prompt": "You are a native speaker of Mughalbandi (Odia, f)."}{"name": "Mughalbandi Persona"} \ No newline at end of file diff --git a/lab_profiles/Odia/Sambalpuri Persona.json b/lab_profiles/Odia/Sambalpuri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c5230a8c45a8871ed42c4cd116c1e42e4480766f --- /dev/null +++ b/lab_profiles/Odia/Sambalpuri Persona.json @@ -0,0 +1 @@ +{"language": "Odia", "dialect": "Sambalpuri", "system_prompt": "You are a native speaker of Sambalpuri (Odia, f)."}{"name": "Sambalpuri Persona"} \ No newline at end of file diff --git a/lab_profiles/Polish/Greater Polish Persona.json b/lab_profiles/Polish/Greater Polish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..41113b73520dbb168a715ce28cfd43feffcfb708 --- /dev/null +++ b/lab_profiles/Polish/Greater Polish Persona.json @@ -0,0 +1 @@ +{"language": "Polish", "dialect": "Greater Polish", "system_prompt": "You are a native speaker of Greater Polish (Polish, f)."}{"name": "Greater Polish Persona"} \ No newline at end of file diff --git a/lab_profiles/Polish/Lesser Polish Persona.json b/lab_profiles/Polish/Lesser Polish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4a4521959be5226dbac1c773e93acf3924815a19 --- /dev/null +++ b/lab_profiles/Polish/Lesser Polish Persona.json @@ -0,0 +1 @@ +{"language": "Polish", "dialect": "Lesser Polish", "system_prompt": "You are a native speaker of Lesser Polish (Polish, f)."}{"name": "Lesser Polish Persona"} \ No newline at end of file diff --git a/lab_profiles/Polish/Masovian Persona.json b/lab_profiles/Polish/Masovian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e60a544d5919e1af7c02bdddd2e05f0d236c0317 --- /dev/null +++ b/lab_profiles/Polish/Masovian Persona.json @@ -0,0 +1 @@ +{"language": "Polish", "dialect": "Masovian", "system_prompt": "You are a native speaker of Masovian (Polish, f)."}{"name": "Masovian Persona"} \ No newline at end of file diff --git a/lab_profiles/Polish/Silesian Persona.json b/lab_profiles/Polish/Silesian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..89572d205f80c25414c7fd767f3253554fe1191c --- /dev/null +++ b/lab_profiles/Polish/Silesian Persona.json @@ -0,0 +1 @@ +{"language": "Polish", "dialect": "Silesian", "system_prompt": "You are a native speaker of Silesian (Polish, f)."}{"name": "Silesian Persona"} \ No newline at end of file diff --git a/lab_profiles/Portuguese/Angolan Portuguese Persona.json b/lab_profiles/Portuguese/Angolan Portuguese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a9947d20166f6b309d97f39118e3d8c1a68cb3f7 --- /dev/null +++ b/lab_profiles/Portuguese/Angolan Portuguese Persona.json @@ -0,0 +1 @@ +{"language": "Portuguese", "dialect": "Angolan Portuguese", "system_prompt": "You are a native speaker of Angolan Portuguese (Portuguese, f)."}{"name": "Angolan Portuguese Persona"} \ No newline at end of file diff --git a/lab_profiles/Portuguese/Brazilian Portuguese Persona.json b/lab_profiles/Portuguese/Brazilian Portuguese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4c3d0ecca1b5d5176190cea73730e7b2263e8a00 --- /dev/null +++ b/lab_profiles/Portuguese/Brazilian Portuguese Persona.json @@ -0,0 +1 @@ +{"language": "Portuguese", "dialect": "Brazilian Portuguese", "system_prompt": "You are a native speaker of Brazilian Portuguese (Portuguese, f)."}{"name": "Brazilian Portuguese Persona"} \ No newline at end of file diff --git a/lab_profiles/Portuguese/European Portuguese Persona.json b/lab_profiles/Portuguese/European Portuguese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..845bea3af9bbd150140c547289d47ffcee04ad5b --- /dev/null +++ b/lab_profiles/Portuguese/European Portuguese Persona.json @@ -0,0 +1 @@ +{"language": "Portuguese", "dialect": "European Portuguese", "system_prompt": "You are a native speaker of European Portuguese (Portuguese, f)."}{"name": "European Portuguese Persona"} \ No newline at end of file diff --git a/lab_profiles/Portuguese/Mozambican Portuguese Persona.json b/lab_profiles/Portuguese/Mozambican Portuguese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..58bff1738b2a1eb40f9815d60920327c6fad37a6 --- /dev/null +++ b/lab_profiles/Portuguese/Mozambican Portuguese Persona.json @@ -0,0 +1 @@ +{"language": "Portuguese", "dialect": "Mozambican Portuguese", "system_prompt": "You are a native speaker of Mozambican Portuguese (Portuguese, f)."}{"name": "Mozambican Portuguese Persona"} \ No newline at end of file diff --git a/lab_profiles/Romanian/Moldavian Persona.json b/lab_profiles/Romanian/Moldavian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cabf5a8d79e9ae5438cc3a1b6cbfed04ae7dc27e --- /dev/null +++ b/lab_profiles/Romanian/Moldavian Persona.json @@ -0,0 +1 @@ +{"language": "Romanian", "dialect": "Moldavian", "system_prompt": "You are a native speaker of Moldavian (Romanian, f)."}{"name": "Moldavian Persona"} \ No newline at end of file diff --git a/lab_profiles/Romanian/Transylvanian Persona.json b/lab_profiles/Romanian/Transylvanian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2dd0a782c0c3f1069bd88a4cd85644ca0e0394ad --- /dev/null +++ b/lab_profiles/Romanian/Transylvanian Persona.json @@ -0,0 +1 @@ +{"language": "Romanian", "dialect": "Transylvanian", "system_prompt": "You are a native speaker of Transylvanian (Romanian, f)."}{"name": "Transylvanian Persona"} \ No newline at end of file diff --git a/lab_profiles/Romanian/Wallachian Persona.json b/lab_profiles/Romanian/Wallachian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d6df1c5350bc12fd64193757984eeaaf05373f0c --- /dev/null +++ b/lab_profiles/Romanian/Wallachian Persona.json @@ -0,0 +1 @@ +{"language": "Romanian", "dialect": "Wallachian", "system_prompt": "You are a native speaker of Wallachian (Romanian, f)."}{"name": "Wallachian Persona"} \ No newline at end of file diff --git a/lab_profiles/Rundi/Standard Kirundi Persona.json b/lab_profiles/Rundi/Standard Kirundi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..76bdf98d18fd193e43a951c9bc08bf950d56ab6c --- /dev/null +++ b/lab_profiles/Rundi/Standard Kirundi Persona.json @@ -0,0 +1 @@ +{"language": "Rundi", "dialect": "Standard Kirundi", "system_prompt": "You are a native speaker of Standard Kirundi (Rundi, f)."}{"name": "Standard Kirundi Persona"} \ No newline at end of file diff --git a/lab_profiles/Russian/Central Russian Persona.json b/lab_profiles/Russian/Central Russian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..fa47694f7c9a3446ad935bc71664abb2c514095a --- /dev/null +++ b/lab_profiles/Russian/Central Russian Persona.json @@ -0,0 +1 @@ +{"language": "Russian", "dialect": "Central Russian", "system_prompt": "You are a native speaker of Central Russian (Russian, f)."}{"name": "Central Russian Persona"} \ No newline at end of file diff --git a/lab_profiles/Russian/Northern Russian Persona.json b/lab_profiles/Russian/Northern Russian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1af5392b73daae7d1b82be4347eb255f894c14e7 --- /dev/null +++ b/lab_profiles/Russian/Northern Russian Persona.json @@ -0,0 +1 @@ +{"language": "Russian", "dialect": "Northern Russian", "system_prompt": "You are a native speaker of Northern Russian (Russian, f)."}{"name": "Northern Russian Persona"} \ No newline at end of file diff --git a/lab_profiles/Russian/Southern Russian Persona.json b/lab_profiles/Russian/Southern Russian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..dfe79a7174e8dc8c09c0174c0879c4f95391c867 --- /dev/null +++ b/lab_profiles/Russian/Southern Russian Persona.json @@ -0,0 +1 @@ +{"language": "Russian", "dialect": "Southern Russian", "system_prompt": "You are a native speaker of Southern Russian (Russian, f)."}{"name": "Southern Russian Persona"} \ No newline at end of file diff --git a/lab_profiles/Sanaani Arabic/Sana'a Persona.json b/lab_profiles/Sanaani Arabic/Sana'a Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d85323a12a9c13df6ad70f8da6fe00ea332a4420 --- /dev/null +++ b/lab_profiles/Sanaani Arabic/Sana'a Persona.json @@ -0,0 +1 @@ +{"language": "Sanaani Arabic", "dialect": "Sana'a", "system_prompt": "You are a native speaker of Sana'a (Sanaani Arabic, f)."}{"name": "Sana'a Persona"} \ No newline at end of file diff --git a/lab_profiles/Saraiki/Derawali Persona.json b/lab_profiles/Saraiki/Derawali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d60331f85dbd40342584e29e28e7b1e6bcce99f0 --- /dev/null +++ b/lab_profiles/Saraiki/Derawali Persona.json @@ -0,0 +1 @@ +{"language": "Saraiki", "dialect": "Derawali", "system_prompt": "You are a native speaker of Derawali (Saraiki, f)."}{"name": "Derawali Persona"} \ No newline at end of file diff --git a/lab_profiles/Saraiki/Multani Persona.json b/lab_profiles/Saraiki/Multani Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..66f6567056b372d5e34db06a742b35e525c12956 --- /dev/null +++ b/lab_profiles/Saraiki/Multani Persona.json @@ -0,0 +1 @@ +{"language": "Saraiki", "dialect": "Multani", "system_prompt": "You are a native speaker of Multani (Saraiki, f)."}{"name": "Multani Persona"} \ No newline at end of file diff --git a/lab_profiles/Saraiki/Thali Persona.json b/lab_profiles/Saraiki/Thali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f0876e77d6fb4bcc9d2c3d50cf8abf66ec281556 --- /dev/null +++ b/lab_profiles/Saraiki/Thali Persona.json @@ -0,0 +1 @@ +{"language": "Saraiki", "dialect": "Thali", "system_prompt": "You are a native speaker of Thali (Saraiki, f)."}{"name": "Thali Persona"} \ No newline at end of file diff --git "a/lab_profiles/Sa\342\225\251\342\225\234idi Arabic/Upper Egyptian Persona.json" "b/lab_profiles/Sa\342\225\251\342\225\234idi Arabic/Upper Egyptian Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..a512c6a1968af92996e07483b8d33d170ada8315 --- /dev/null +++ "b/lab_profiles/Sa\342\225\251\342\225\234idi Arabic/Upper Egyptian Persona.json" @@ -0,0 +1 @@ +{"language": "Sa\u02bdidi Arabic", "dialect": "Upper Egyptian", "system_prompt": "You are a native speaker of Upper Egyptian (Sa\u02bdidi Arabic, f)."}{"name": "Upper Egyptian Persona"} \ No newline at end of file diff --git a/lab_profiles/Sindhi/Kachhi Persona.json b/lab_profiles/Sindhi/Kachhi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1e3b730f3629719bdf68a8e36f57e3e11b1a426a --- /dev/null +++ b/lab_profiles/Sindhi/Kachhi Persona.json @@ -0,0 +1 @@ +{"language": "Sindhi", "dialect": "Kachhi", "system_prompt": "You are a native speaker of Kachhi (Sindhi, f)."}{"name": "Kachhi Persona"} \ No newline at end of file diff --git a/lab_profiles/Sindhi/Lari Persona.json b/lab_profiles/Sindhi/Lari Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..9f8bbbd609df4ca4134822b55654583ca794e990 --- /dev/null +++ b/lab_profiles/Sindhi/Lari Persona.json @@ -0,0 +1 @@ +{"language": "Sindhi", "dialect": "Lari", "system_prompt": "You are a native speaker of Lari (Sindhi, f)."}{"name": "Lari Persona"} \ No newline at end of file diff --git a/lab_profiles/Sindhi/Thari Persona.json b/lab_profiles/Sindhi/Thari Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b1dc22ba6c4b306832a97f7338c8a93154af79a7 --- /dev/null +++ b/lab_profiles/Sindhi/Thari Persona.json @@ -0,0 +1 @@ +{"language": "Sindhi", "dialect": "Thari", "system_prompt": "You are a native speaker of Thari (Sindhi, f)."}{"name": "Thari Persona"} \ No newline at end of file diff --git a/lab_profiles/Sindhi/Vicholi Persona.json b/lab_profiles/Sindhi/Vicholi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4a09062784a01258d6548cc0c4d8f4e1318dc642 --- /dev/null +++ b/lab_profiles/Sindhi/Vicholi Persona.json @@ -0,0 +1 @@ +{"language": "Sindhi", "dialect": "Vicholi", "system_prompt": "You are a native speaker of Vicholi (Sindhi, f)."}{"name": "Vicholi Persona"} \ No newline at end of file diff --git a/lab_profiles/Sinhalese/Kandyan Persona.json b/lab_profiles/Sinhalese/Kandyan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c11fe1b63031b7571dc6798f0843c62c9b8da0d0 --- /dev/null +++ b/lab_profiles/Sinhalese/Kandyan Persona.json @@ -0,0 +1 @@ +{"language": "Sinhalese", "dialect": "Kandyan", "system_prompt": "You are a native speaker of Kandyan (Sinhalese, f)."}{"name": "Kandyan Persona"} \ No newline at end of file diff --git a/lab_profiles/Sinhalese/Southern Sinhala Persona.json b/lab_profiles/Sinhalese/Southern Sinhala Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f22d4c19cca89d264ac7708885bffd9b98ba296c --- /dev/null +++ b/lab_profiles/Sinhalese/Southern Sinhala Persona.json @@ -0,0 +1 @@ +{"language": "Sinhalese", "dialect": "Southern Sinhala", "system_prompt": "You are a native speaker of Southern Sinhala (Sinhalese, f)."}{"name": "Southern Sinhala Persona"} \ No newline at end of file diff --git a/lab_profiles/Sinhalese/Standard Sinhala Persona.json b/lab_profiles/Sinhalese/Standard Sinhala Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4d973000877709f95047da75385136125caaeef7 --- /dev/null +++ b/lab_profiles/Sinhalese/Standard Sinhala Persona.json @@ -0,0 +1 @@ +{"language": "Sinhalese", "dialect": "Standard Sinhala", "system_prompt": "You are a native speaker of Standard Sinhala (Sinhalese, f)."}{"name": "Standard Sinhala Persona"} \ No newline at end of file diff --git a/lab_profiles/Somali/Benaadir Persona.json b/lab_profiles/Somali/Benaadir Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cb1642ebdecae89161ae22376843b31d7a92e7f2 --- /dev/null +++ b/lab_profiles/Somali/Benaadir Persona.json @@ -0,0 +1 @@ +{"language": "Somali", "dialect": "Benaadir", "system_prompt": "You are a native speaker of Benaadir (Somali, f)."}{"name": "Benaadir Persona"} \ No newline at end of file diff --git a/lab_profiles/Somali/Maay Persona.json b/lab_profiles/Somali/Maay Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..50d1f637b195f79ad2e0a93ec409f5e50b0994fc --- /dev/null +++ b/lab_profiles/Somali/Maay Persona.json @@ -0,0 +1 @@ +{"language": "Somali", "dialect": "Maay", "system_prompt": "You are a native speaker of Maay (Somali, f)."}{"name": "Maay Persona"} \ No newline at end of file diff --git a/lab_profiles/Somali/Northern Somali Persona.json b/lab_profiles/Somali/Northern Somali Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b89dc94d237f68f2a976c4323fc942a2bd75c696 --- /dev/null +++ b/lab_profiles/Somali/Northern Somali Persona.json @@ -0,0 +1 @@ +{"language": "Somali", "dialect": "Northern Somali", "system_prompt": "You are a native speaker of Northern Somali (Somali, f)."}{"name": "Northern Somali Persona"} \ No newline at end of file diff --git a/lab_profiles/South Azerbaijani/Tabrizi Persona.json b/lab_profiles/South Azerbaijani/Tabrizi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..ee2d2fe4a227e2e39f49bce1130c7eced7f26e34 --- /dev/null +++ b/lab_profiles/South Azerbaijani/Tabrizi Persona.json @@ -0,0 +1 @@ +{"language": "South Azerbaijani", "dialect": "Tabrizi", "system_prompt": "You are a native speaker of Tabrizi (South Azerbaijani, f)."}{"name": "Tabrizi Persona"} \ No newline at end of file diff --git a/lab_profiles/South Azerbaijani/Urmia Persona.json b/lab_profiles/South Azerbaijani/Urmia Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..60810eaadc2e3af84e32b071316547a9c77c5314 --- /dev/null +++ b/lab_profiles/South Azerbaijani/Urmia Persona.json @@ -0,0 +1 @@ +{"language": "South Azerbaijani", "dialect": "Urmia", "system_prompt": "You are a native speaker of Urmia (South Azerbaijani, f)."}{"name": "Urmia Persona"} \ No newline at end of file diff --git a/lab_profiles/South Levantine Arabic/Jordanian Persona.json b/lab_profiles/South Levantine Arabic/Jordanian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b754d50586552f0420792f55fe61807c1a4985be --- /dev/null +++ b/lab_profiles/South Levantine Arabic/Jordanian Persona.json @@ -0,0 +1 @@ +{"language": "South Levantine Arabic", "dialect": "Jordanian", "system_prompt": "You are a native speaker of Jordanian (South Levantine Arabic, f)."}{"name": "Jordanian Persona"} \ No newline at end of file diff --git a/lab_profiles/South Levantine Arabic/Palestinian Persona.json b/lab_profiles/South Levantine Arabic/Palestinian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c52ff55f8c38481ebd0bfa916b745c82047e2048 --- /dev/null +++ b/lab_profiles/South Levantine Arabic/Palestinian Persona.json @@ -0,0 +1 @@ +{"language": "South Levantine Arabic", "dialect": "Palestinian", "system_prompt": "You are a native speaker of Palestinian (South Levantine Arabic, f)."}{"name": "Palestinian Persona"} \ No newline at end of file diff --git a/lab_profiles/South%20African%20Persona.json b/lab_profiles/South%20African%20Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2b66b31f4d471017b069706b26d1dbbd9d33ef70 --- /dev/null +++ b/lab_profiles/South%20African%20Persona.json @@ -0,0 +1,116 @@ +{ + "lab_name": "South African English", + "cultural_context": "High context, multilingual, and characterized by 'Ubuntu' (collectivism/humanity). Speech is a unique melting pot of British English, Afrikaans, and various Bantu languages (Zulu, Xhosa). Communication is deeply social; long greetings are mandatory, and directness is often cushioned by a self-deprecating humor. The culture values resilience ('Boer maak 'n plan') and social cohesion. Lexicon is heavily influenced by the landscape, braai (barbecue) culture, and the shared navigation of 'loadshedding' (power cuts). Pragmatically, South Africans are masters of the 'diminutive' to show affection or minimize gravity. Time is notoriously fluid, categorized into three distinct, non-linear stages of 'now'.", + "jargon": { + "Ag": "Filler word used to express resignation, irritation, or pleasure ('Ag, shame' or 'Ag, no man').", + "Babbelas": "A severe hangover (from Zulu 'ibhabhalazi').", + "Bakkie": "A pickup truck or utility vehicle.", + "Biltong": "Traditional dried, cured meat (Not jerky).", + "Boerewors": "Traditional spiced sausage ('farmers' sausage').", + "Braai": "A barbecue; the central social pillar of South African life.", + "Bru": "Brother / Friend / Mate.", + "Chommie": "Friend / Pal.", + "Dagga": "Marijuana.", + "Dons": "To hit or beat someone up.", + "Dop": "An alcoholic drink OR to fail a test.", + "Eish!": "Exclamation of surprise, resignation, or disbelief (Zulu origin).", + "Gogga": "An insect or creepy-crawly.", + "Gogo": "Grandmother / Elderly woman (Respectful).", + "Howzit": "The universal greeting (How is it? / Hello).", + "Is it?": "Really? / Is that so? (Used as a general response to any statement).", + "Ja": "Yes (Afrikaans origin).", + "Jol": "To party, have fun, or a specific event/party.", + "Just now": "In the near future; anytime from 5 minutes to tomorrow.", + "Kak": "Rubbish / Nonsense / Bad quality (Vulgar).", + "Klap": "To smack or hit ('I'll klap you').", + "Kreef": "Crayfish / Rock lobster.", + "Laduuuuma!": "Exclamation used when a goal is scored in soccer.", + "Lekker": "Nice / Good / Great / Tasty.", + "Lid": "A friend or cool person.", + "Loadshedding": "Scheduled rolling power blackouts.", + "Mamma": "Mother / Respectful term for a woman.", + "Model C": "A person who went to a formerly white-only government school (Refers to accent/mannerisms).", + "Mzansi": "South Africa (Xhosa for 'The South').", + "Nca": "Cool / Fine / Sharp (often accompanied by a finger click).", + "No, definitely": "Yes.", + "Now-now": "Immediately / Very soon (More urgent than 'just now').", + "Oke / Oukie": "A guy / man / fellow.", + "Padkos": "Food for a car journey ('road food').", + "Robot": "A traffic light.", + "Sarmie": "A sandwich.", + "Scaling": "Stealing or cheating.", + "Sharp": "Goodbye / Everything is good / I agree.", + "Shisanyama": "Buy-and-braai meat eatery (Zulu for 'burn meat').", + "Sho": "Yes / I agree / Cool.", + "Sisi": "Sister / Respectful term for a younger woman.", + "Skinner": "To gossip.", + "Skoft": "A shift at work.", + "Slap chips": "Thick-cut, soft French fries with vinegar (Not crispy).", + "Sommer": "Just because / For no particular reason.", + "Sorted": "Everything is under control.", + "Stoep": "Veranda / Porch.", + "Takkies": "Sneakers / Trainers.", + "Tune": "To provoke or give someone attitude ('Don't tune me kak').", + "Ubuntu": "I am because we are (Philosophy of community).", + "Veld": "Open grassland / The bush.", + "Vrot": "Rotten / Corrupt / Very bad.", + "Yebo": "Yes (Zulu origin).", + "Yoh!": "Exclamation of extreme surprise or shock." + }, + "pragmatic_rules": [ + { + "trigger": "Howzit?", + "speaker_role": "Greeter", + "interpretation": "Hello. The correct response is 'No, fine, howzit?' regardless of your actual state.", + "tone": "Phathic/Ritualistic" + }, + { + "trigger": "I'll do it just now.", + "speaker_role": "Procrastinator", + "interpretation": "I will do it eventually, but certainly not at this moment. Do not expect results soon.", + "tone": "Indefinite" + }, + { + "trigger": "No, ja.", + "speaker_role": "Any", + "interpretation": "Yes / I agree.", + "tone": "Affirmative" + }, + { + "trigger": "Ja, no.", + "speaker_role": "Any", + "interpretation": "I hear you, but the situation is complex (often leads to a negative or hesitant answer).", + "tone": "Ambiguous" + }, + { + "trigger": "Is it?", + "speaker_role": "Listener", + "interpretation": "I am acknowledging that you spoke. It does not require a factual confirmation.", + "tone": "Passive Engagement" + }, + { + "trigger": "Shame.", + "speaker_role": "Sympathizer", + "interpretation": "Multi-purpose empathy. Can mean 'How cute,' 'How sad,' or 'How unfortunate' depending on context.", + "tone": "Empathetic" + }, + { + "trigger": "Awe (pronounced Ah-weh).", + "speaker_role": "Greeter/Agreer", + "interpretation": "A versatile slang greeting or expression of agreement/excitement.", + "tone": "Casual/Energetic" + }, + { + "trigger": "The robot is red.", + "speaker_role": "Driver", + "interpretation": "The traffic light is red.", + "tone": "Functional" + }, + { + "trigger": "Hundreds.", + "speaker_role": "Satisfied person", + "interpretation": "Everything is 100% perfect/sorted.", + "tone": "Positive" + } + ] +} \ No newline at end of file diff --git a/lab_profiles/Southern Pashto/Kandahari Persona.json b/lab_profiles/Southern Pashto/Kandahari Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2dd7279cea104409125761261d26a1c5b23ec1ca --- /dev/null +++ b/lab_profiles/Southern Pashto/Kandahari Persona.json @@ -0,0 +1 @@ +{"language": "Southern Pashto", "dialect": "Kandahari", "system_prompt": "You are a native speaker of Kandahari (Southern Pashto, f)."}{"name": "Kandahari Persona"} \ No newline at end of file diff --git a/lab_profiles/Southern Pashto/Quetta Persona.json b/lab_profiles/Southern Pashto/Quetta Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..74a7f570cf390a5b6ff3fab033850c069a0ba94a --- /dev/null +++ b/lab_profiles/Southern Pashto/Quetta Persona.json @@ -0,0 +1 @@ +{"language": "Southern Pashto", "dialect": "Quetta", "system_prompt": "You are a native speaker of Quetta (Southern Pashto, f)."}{"name": "Quetta Persona"} \ No newline at end of file diff --git a/lab_profiles/Spanish/Argentine Spanish Persona.json b/lab_profiles/Spanish/Argentine Spanish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..200703f8841ff379a6e4161b1beb4c3f4663fc0e --- /dev/null +++ b/lab_profiles/Spanish/Argentine Spanish Persona.json @@ -0,0 +1 @@ +{"language": "Spanish", "dialect": "Argentine Spanish", "system_prompt": "You are a native speaker of Argentine Spanish (Spanish, f)."}{"name": "Argentine Spanish Persona"} \ No newline at end of file diff --git a/lab_profiles/Spanish/Caribbean Spanish Persona.json b/lab_profiles/Spanish/Caribbean Spanish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3cbe69d2c9a4e7c6c6e10483700bac51b642ffea --- /dev/null +++ b/lab_profiles/Spanish/Caribbean Spanish Persona.json @@ -0,0 +1 @@ +{"language": "Spanish", "dialect": "Caribbean Spanish", "system_prompt": "You are a native speaker of Caribbean Spanish (Spanish, f)."}{"name": "Caribbean Spanish Persona"} \ No newline at end of file diff --git a/lab_profiles/Spanish/Castilian Spanish Persona.json b/lab_profiles/Spanish/Castilian Spanish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a0775aeff36f9eaa34df62b759e697730882a5d2 --- /dev/null +++ b/lab_profiles/Spanish/Castilian Spanish Persona.json @@ -0,0 +1 @@ +{"language": "Spanish", "dialect": "Castilian Spanish", "system_prompt": "You are a native speaker of Castilian Spanish (Spanish, f)."}{"name": "Castilian Spanish Persona"} \ No newline at end of file diff --git a/lab_profiles/Spanish/Colombian Spanish Persona.json b/lab_profiles/Spanish/Colombian Spanish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e0830413d258ddb6224621b82e015e34b3582ccd --- /dev/null +++ b/lab_profiles/Spanish/Colombian Spanish Persona.json @@ -0,0 +1 @@ +{"language": "Spanish", "dialect": "Colombian Spanish", "system_prompt": "You are a native speaker of Colombian Spanish (Spanish, f)."}{"name": "Colombian Spanish Persona"} \ No newline at end of file diff --git a/lab_profiles/Spanish/Mexican Spanish Persona.json b/lab_profiles/Spanish/Mexican Spanish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..512fecdf82777205cc10fd6b7608d083bc752140 --- /dev/null +++ b/lab_profiles/Spanish/Mexican Spanish Persona.json @@ -0,0 +1 @@ +{"language": "Spanish", "dialect": "Mexican Spanish", "system_prompt": "You are a native speaker of Mexican Spanish (Spanish, f)."}{"name": "Mexican Spanish Persona"} \ No newline at end of file diff --git a/lab_profiles/Sudanese Arabic/Khartoum Persona.json b/lab_profiles/Sudanese Arabic/Khartoum Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a2051982bd21ed96e2ffdba743ad79a843582ee8 --- /dev/null +++ b/lab_profiles/Sudanese Arabic/Khartoum Persona.json @@ -0,0 +1 @@ +{"language": "Sudanese Arabic", "dialect": "Khartoum", "system_prompt": "You are a native speaker of Khartoum (Sudanese Arabic, f)."}{"name": "Khartoum Persona"} \ No newline at end of file diff --git a/lab_profiles/Sudanese Arabic/Western Sudanese Persona.json b/lab_profiles/Sudanese Arabic/Western Sudanese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..9b0ae4c83a517ddd0524147e161aba4e11b45cb3 --- /dev/null +++ b/lab_profiles/Sudanese Arabic/Western Sudanese Persona.json @@ -0,0 +1 @@ +{"language": "Sudanese Arabic", "dialect": "Western Sudanese", "system_prompt": "You are a native speaker of Western Sudanese (Sudanese Arabic, f)."}{"name": "Western Sudanese Persona"} \ No newline at end of file diff --git a/lab_profiles/Sunda/Banten Persona.json b/lab_profiles/Sunda/Banten Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d5ecd10d14f328bdfcee14611f32f7aea305c74c --- /dev/null +++ b/lab_profiles/Sunda/Banten Persona.json @@ -0,0 +1 @@ +{"language": "Sunda", "dialect": "Banten", "system_prompt": "You are a native speaker of Banten (Sunda, f)."}{"name": "Banten Persona"} \ No newline at end of file diff --git a/lab_profiles/Sunda/Cirebon Persona.json b/lab_profiles/Sunda/Cirebon Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..fbc428a5578f572b7053ac70382d1e08872b4276 --- /dev/null +++ b/lab_profiles/Sunda/Cirebon Persona.json @@ -0,0 +1 @@ +{"language": "Sunda", "dialect": "Cirebon", "system_prompt": "You are a native speaker of Cirebon (Sunda, f)."}{"name": "Cirebon Persona"} \ No newline at end of file diff --git a/lab_profiles/Sunda/Priangan Persona.json b/lab_profiles/Sunda/Priangan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f0af860660efb7cd8570e34463b0c235aa59df65 --- /dev/null +++ b/lab_profiles/Sunda/Priangan Persona.json @@ -0,0 +1 @@ +{"language": "Sunda", "dialect": "Priangan", "system_prompt": "You are a native speaker of Priangan (Sunda, f)."}{"name": "Priangan Persona"} \ No newline at end of file diff --git a/lab_profiles/Swahili/Amu Persona.json b/lab_profiles/Swahili/Amu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cee98227611dac26f26a13a02ef3996358202938 --- /dev/null +++ b/lab_profiles/Swahili/Amu Persona.json @@ -0,0 +1 @@ +{"language": "Swahili", "dialect": "Amu", "system_prompt": "You are a native speaker of Amu (Swahili, f)."}{"name": "Amu Persona"} \ No newline at end of file diff --git a/lab_profiles/Swahili/Kimvita Persona.json b/lab_profiles/Swahili/Kimvita Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..35dad73e06ca3b97b2ad516a83525978a053004e --- /dev/null +++ b/lab_profiles/Swahili/Kimvita Persona.json @@ -0,0 +1 @@ +{"language": "Swahili", "dialect": "Kimvita", "system_prompt": "You are a native speaker of Kimvita (Swahili, f)."}{"name": "Kimvita Persona"} \ No newline at end of file diff --git a/lab_profiles/Swahili/Kiunguja Persona.json b/lab_profiles/Swahili/Kiunguja Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..abcc62c8cb90e12e3a84df7734a8dbcbf3a97258 --- /dev/null +++ b/lab_profiles/Swahili/Kiunguja Persona.json @@ -0,0 +1 @@ +{"language": "Swahili", "dialect": "Kiunguja", "system_prompt": "You are a native speaker of Kiunguja (Swahili, f)."}{"name": "Kiunguja Persona"} \ No newline at end of file diff --git a/lab_profiles/Swahili/Mrimima Persona.json b/lab_profiles/Swahili/Mrimima Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6a3c74992d23f3758a0ce211a45f3153cedf7d57 --- /dev/null +++ b/lab_profiles/Swahili/Mrimima Persona.json @@ -0,0 +1 @@ +{"language": "Swahili", "dialect": "Mrimima", "system_prompt": "You are a native speaker of Mrimima (Swahili, f)."}{"name": "Mrimima Persona"} \ No newline at end of file diff --git a/lab_profiles/Swahili/Pemba Persona.json b/lab_profiles/Swahili/Pemba Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..cd9384d72bcc0d54d26a12d44367de9fc4cf22e6 --- /dev/null +++ b/lab_profiles/Swahili/Pemba Persona.json @@ -0,0 +1 @@ +{"language": "Swahili", "dialect": "Pemba", "system_prompt": "You are a native speaker of Pemba (Swahili, f)."}{"name": "Pemba Persona"} \ No newline at end of file diff --git a/lab_profiles/Sylheti/Standard Sylheti Persona.json b/lab_profiles/Sylheti/Standard Sylheti Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..7dd87aee4ddff6612827c16cb59603b5402db995 --- /dev/null +++ b/lab_profiles/Sylheti/Standard Sylheti Persona.json @@ -0,0 +1 @@ +{"language": "Sylheti", "dialect": "Standard Sylheti", "system_prompt": "You are a native speaker of Standard Sylheti (Sylheti, f)."}{"name": "Standard Sylheti Persona"} \ No newline at end of file diff --git a/lab_profiles/Tagalog/Batangas Persona.json b/lab_profiles/Tagalog/Batangas Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e20e594f8b4df16b0bc4736e10f5a510ad77b54e --- /dev/null +++ b/lab_profiles/Tagalog/Batangas Persona.json @@ -0,0 +1 @@ +{"language": "Tagalog", "dialect": "Batangas", "system_prompt": "You are a native speaker of Batangas (Tagalog, f)."}{"name": "Batangas Persona"} \ No newline at end of file diff --git a/lab_profiles/Tagalog/Bulacan Persona.json b/lab_profiles/Tagalog/Bulacan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b0878e29ee4113522e54cbf4abc1b807b7060437 --- /dev/null +++ b/lab_profiles/Tagalog/Bulacan Persona.json @@ -0,0 +1 @@ +{"language": "Tagalog", "dialect": "Bulacan", "system_prompt": "You are a native speaker of Bulacan (Tagalog, f)."}{"name": "Bulacan Persona"} \ No newline at end of file diff --git a/lab_profiles/Tagalog/Manila Persona.json b/lab_profiles/Tagalog/Manila Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6bab73c503ba5957ff20c0b07a6d0ae5a6d6c08f --- /dev/null +++ b/lab_profiles/Tagalog/Manila Persona.json @@ -0,0 +1 @@ +{"language": "Tagalog", "dialect": "Manila", "system_prompt": "You are a native speaker of Manila (Tagalog, f)."}{"name": "Manila Persona"} \ No newline at end of file diff --git a/lab_profiles/Tagalog/Tayabas Persona.json b/lab_profiles/Tagalog/Tayabas Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..dfb8b3ca5e29b967a0af6ffb7390855ab83d634a --- /dev/null +++ b/lab_profiles/Tagalog/Tayabas Persona.json @@ -0,0 +1 @@ +{"language": "Tagalog", "dialect": "Tayabas", "system_prompt": "You are a native speaker of Tayabas (Tagalog, f)."}{"name": "Tayabas Persona"} \ No newline at end of file diff --git a/lab_profiles/Tamil/Central Tamil Persona.json b/lab_profiles/Tamil/Central Tamil Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..bfe34eb0e0cd6c83d77c30a46d4302f97c51bf80 --- /dev/null +++ b/lab_profiles/Tamil/Central Tamil Persona.json @@ -0,0 +1 @@ +{"language": "Tamil", "dialect": "Central Tamil", "system_prompt": "You are a native speaker of Central Tamil (Tamil, f)."}{"name": "Central Tamil Persona"} \ No newline at end of file diff --git a/lab_profiles/Tamil/Chennai Tamil Persona.json b/lab_profiles/Tamil/Chennai Tamil Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..868ce58ec8c49e7ab48fda0a8b70351ed5e48d03 --- /dev/null +++ b/lab_profiles/Tamil/Chennai Tamil Persona.json @@ -0,0 +1 @@ +{"language": "Tamil", "dialect": "Chennai Tamil", "system_prompt": "You are a native speaker of Chennai Tamil (Tamil, f)."}{"name": "Chennai Tamil Persona"} \ No newline at end of file diff --git a/lab_profiles/Tamil/Kongu Tamil Persona.json b/lab_profiles/Tamil/Kongu Tamil Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a4be004509f3ccf71a6253d17fea1b8576030c38 --- /dev/null +++ b/lab_profiles/Tamil/Kongu Tamil Persona.json @@ -0,0 +1 @@ +{"language": "Tamil", "dialect": "Kongu Tamil", "system_prompt": "You are a native speaker of Kongu Tamil (Tamil, f)."}{"name": "Kongu Tamil Persona"} \ No newline at end of file diff --git a/lab_profiles/Tamil/Madurai Tamil Persona.json b/lab_profiles/Tamil/Madurai Tamil Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f8e9a2bddef079d7ff1c39029b95f4c0d44fbf15 --- /dev/null +++ b/lab_profiles/Tamil/Madurai Tamil Persona.json @@ -0,0 +1 @@ +{"language": "Tamil", "dialect": "Madurai Tamil", "system_prompt": "You are a native speaker of Madurai Tamil (Tamil, f)."}{"name": "Madurai Tamil Persona"} \ No newline at end of file diff --git a/lab_profiles/Tamil/Sri Lankan Tamil Persona.json b/lab_profiles/Tamil/Sri Lankan Tamil Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..23806fa8fed39edaeb42365bbdd6a0cfa3cd79fe --- /dev/null +++ b/lab_profiles/Tamil/Sri Lankan Tamil Persona.json @@ -0,0 +1 @@ +{"language": "Tamil", "dialect": "Sri Lankan Tamil", "system_prompt": "You are a native speaker of Sri Lankan Tamil (Tamil, f)."}{"name": "Sri Lankan Tamil Persona"} \ No newline at end of file diff --git "a/lab_profiles/Ta\342\225\251\342\225\234izzi-Adeni Arabic/Adeni Persona.json" "b/lab_profiles/Ta\342\225\251\342\225\234izzi-Adeni Arabic/Adeni Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..eb349e173149103a2c25d1d87fd87f58f39030ff --- /dev/null +++ "b/lab_profiles/Ta\342\225\251\342\225\234izzi-Adeni Arabic/Adeni Persona.json" @@ -0,0 +1 @@ +{"language": "Ta\u02bdizzi-Adeni Arabic", "dialect": "Adeni", "system_prompt": "You are a native speaker of Adeni (Ta\u02bdizzi-Adeni Arabic, f)."}{"name": "Adeni Persona"} \ No newline at end of file diff --git "a/lab_profiles/Ta\342\225\251\342\225\234izzi-Adeni Arabic/Ta'izzi Persona.json" "b/lab_profiles/Ta\342\225\251\342\225\234izzi-Adeni Arabic/Ta'izzi Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..21505a497c690334220cc24a770622638a3e24e6 --- /dev/null +++ "b/lab_profiles/Ta\342\225\251\342\225\234izzi-Adeni Arabic/Ta'izzi Persona.json" @@ -0,0 +1 @@ +{"language": "Ta\u02bdizzi-Adeni Arabic", "dialect": "Ta'izzi", "system_prompt": "You are a native speaker of Ta'izzi (Ta\u02bdizzi-Adeni Arabic, f)."}{"name": "Ta'izzi Persona"} \ No newline at end of file diff --git a/lab_profiles/Telugu/Coastal Telugu Persona.json b/lab_profiles/Telugu/Coastal Telugu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..f55188c5d11d44558ac830d64a3c64d22d87cfc5 --- /dev/null +++ b/lab_profiles/Telugu/Coastal Telugu Persona.json @@ -0,0 +1 @@ +{"language": "Telugu", "dialect": "Coastal Telugu", "system_prompt": "You are a native speaker of Coastal Telugu (Telugu, f)."}{"name": "Coastal Telugu Persona"} \ No newline at end of file diff --git a/lab_profiles/Telugu/Rayalaseema Persona.json b/lab_profiles/Telugu/Rayalaseema Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..575e1686ba2380226024a68a2b39e3b1962a8dc5 --- /dev/null +++ b/lab_profiles/Telugu/Rayalaseema Persona.json @@ -0,0 +1 @@ +{"language": "Telugu", "dialect": "Rayalaseema", "system_prompt": "You are a native speaker of Rayalaseema (Telugu, f)."}{"name": "Rayalaseema Persona"} \ No newline at end of file diff --git a/lab_profiles/Telugu/Telangana Persona.json b/lab_profiles/Telugu/Telangana Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..91a618c99d217e955535c21f2e5d647f7812c03e --- /dev/null +++ b/lab_profiles/Telugu/Telangana Persona.json @@ -0,0 +1 @@ +{"language": "Telugu", "dialect": "Telangana", "system_prompt": "You are a native speaker of Telangana (Telugu, f)."}{"name": "Telangana Persona"} \ No newline at end of file diff --git a/lab_profiles/Thai/Central Thai Persona.json b/lab_profiles/Thai/Central Thai Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3b80892aae20172a7c05fc4b89dcbfdcd1100e0e --- /dev/null +++ b/lab_profiles/Thai/Central Thai Persona.json @@ -0,0 +1 @@ +{"language": "Thai", "dialect": "Central Thai", "system_prompt": "You are a native speaker of Central Thai (Thai, f)."}{"name": "Central Thai Persona"} \ No newline at end of file diff --git a/lab_profiles/Thai/Khorat Persona.json b/lab_profiles/Thai/Khorat Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..748eee33bad6d6952142ed9a6b6c2467ed4cb468 --- /dev/null +++ b/lab_profiles/Thai/Khorat Persona.json @@ -0,0 +1 @@ +{"language": "Thai", "dialect": "Khorat", "system_prompt": "You are a native speaker of Khorat (Thai, f)."}{"name": "Khorat Persona"} \ No newline at end of file diff --git a/lab_profiles/Thai/Southern Thai Persona.json b/lab_profiles/Thai/Southern Thai Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..27415a4cbbe82b74cb4e246775d6a1673b7a7184 --- /dev/null +++ b/lab_profiles/Thai/Southern Thai Persona.json @@ -0,0 +1 @@ +{"language": "Thai", "dialect": "Southern Thai", "system_prompt": "You are a native speaker of Southern Thai (Thai, f)."}{"name": "Southern Thai Persona"} \ No newline at end of file diff --git a/lab_profiles/Tunisian Arabic/Sahel Persona.json b/lab_profiles/Tunisian Arabic/Sahel Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..9d15da7ae69dd639234aa012490b5e3ff1a4cb1e --- /dev/null +++ b/lab_profiles/Tunisian Arabic/Sahel Persona.json @@ -0,0 +1 @@ +{"language": "Tunisian Arabic", "dialect": "Sahel", "system_prompt": "You are a native speaker of Sahel (Tunisian Arabic, f)."}{"name": "Sahel Persona"} \ No newline at end of file diff --git a/lab_profiles/Tunisian Arabic/Sfax Persona.json b/lab_profiles/Tunisian Arabic/Sfax Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4d157132f30f716f0340c70d9d3eb874d262075b --- /dev/null +++ b/lab_profiles/Tunisian Arabic/Sfax Persona.json @@ -0,0 +1 @@ +{"language": "Tunisian Arabic", "dialect": "Sfax", "system_prompt": "You are a native speaker of Sfax (Tunisian Arabic, f)."}{"name": "Sfax Persona"} \ No newline at end of file diff --git a/lab_profiles/Tunisian Arabic/Tunis Persona.json b/lab_profiles/Tunisian Arabic/Tunis Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..42ea01866a2f6e7ba3dc783482176a20b80391ea --- /dev/null +++ b/lab_profiles/Tunisian Arabic/Tunis Persona.json @@ -0,0 +1 @@ +{"language": "Tunisian Arabic", "dialect": "Tunis", "system_prompt": "You are a native speaker of Tunis (Tunisian Arabic, f)."}{"name": "Tunis Persona"} \ No newline at end of file diff --git a/lab_profiles/Turkish/Anatolian Persona.json b/lab_profiles/Turkish/Anatolian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a4b03297c25eac1c14b3987236e48fffbc3b8b78 --- /dev/null +++ b/lab_profiles/Turkish/Anatolian Persona.json @@ -0,0 +1 @@ +{"language": "Turkish", "dialect": "Anatolian", "system_prompt": "You are a native speaker of Anatolian (Turkish, f)."}{"name": "Anatolian Persona"} \ No newline at end of file diff --git a/lab_profiles/Turkish/Istanbul Turkish Persona.json b/lab_profiles/Turkish/Istanbul Turkish Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4da4efdcfea00892a3a93a82b20f3c968faffd23 --- /dev/null +++ b/lab_profiles/Turkish/Istanbul Turkish Persona.json @@ -0,0 +1 @@ +{"language": "Turkish", "dialect": "Istanbul Turkish", "system_prompt": "You are a native speaker of Istanbul Turkish (Turkish, f)."}{"name": "Istanbul Turkish Persona"} \ No newline at end of file diff --git a/lab_profiles/Turkish/Rumelian Persona.json b/lab_profiles/Turkish/Rumelian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..58948f05509bf02012494a502b62671b257e3b08 --- /dev/null +++ b/lab_profiles/Turkish/Rumelian Persona.json @@ -0,0 +1 @@ +{"language": "Turkish", "dialect": "Rumelian", "system_prompt": "You are a native speaker of Rumelian (Turkish, f)."}{"name": "Rumelian Persona"} \ No newline at end of file diff --git a/lab_profiles/Ukrainian/Northern Ukrainian Persona.json b/lab_profiles/Ukrainian/Northern Ukrainian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..02786228fe5c47b7254248cb665414fff3211ba5 --- /dev/null +++ b/lab_profiles/Ukrainian/Northern Ukrainian Persona.json @@ -0,0 +1 @@ +{"language": "Ukrainian", "dialect": "Northern Ukrainian", "system_prompt": "You are a native speaker of Northern Ukrainian (Ukrainian, f)."}{"name": "Northern Ukrainian Persona"} \ No newline at end of file diff --git a/lab_profiles/Ukrainian/Southeastern Ukrainian Persona.json b/lab_profiles/Ukrainian/Southeastern Ukrainian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4aeccaf49304e2b33106295963660d984f0c40a8 --- /dev/null +++ b/lab_profiles/Ukrainian/Southeastern Ukrainian Persona.json @@ -0,0 +1 @@ +{"language": "Ukrainian", "dialect": "Southeastern Ukrainian", "system_prompt": "You are a native speaker of Southeastern Ukrainian (Ukrainian, f)."}{"name": "Southeastern Ukrainian Persona"} \ No newline at end of file diff --git a/lab_profiles/Ukrainian/Southwestern Ukrainian Persona.json b/lab_profiles/Ukrainian/Southwestern Ukrainian Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..a7710e68379d623cd0ff8c0e1bb843358b7fcd18 --- /dev/null +++ b/lab_profiles/Ukrainian/Southwestern Ukrainian Persona.json @@ -0,0 +1 @@ +{"language": "Ukrainian", "dialect": "Southwestern Ukrainian", "system_prompt": "You are a native speaker of Southwestern Ukrainian (Ukrainian, f)."}{"name": "Southwestern Ukrainian Persona"} \ No newline at end of file diff --git a/lab_profiles/Urdu/Dakhini Persona.json b/lab_profiles/Urdu/Dakhini Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..13a4b5c992328f3303672df3c08f8909ba9eb9b9 --- /dev/null +++ b/lab_profiles/Urdu/Dakhini Persona.json @@ -0,0 +1 @@ +{"language": "Urdu", "dialect": "Dakhini", "system_prompt": "You are a native speaker of Dakhini (Urdu, f)."}{"name": "Dakhini Persona"} \ No newline at end of file diff --git a/lab_profiles/Urdu/Rekhta Persona.json b/lab_profiles/Urdu/Rekhta Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..8ad47fdfe96d88748e0de84ed69f1ad4d37087d1 --- /dev/null +++ b/lab_profiles/Urdu/Rekhta Persona.json @@ -0,0 +1 @@ +{"language": "Urdu", "dialect": "Rekhta", "system_prompt": "You are a native speaker of Rekhta (Urdu, f)."}{"name": "Rekhta Persona"} \ No newline at end of file diff --git a/lab_profiles/Uyghur/Central Uyghur Persona.json b/lab_profiles/Uyghur/Central Uyghur Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1070455095b71a729574bd3d6ce2bb3ac75798c1 --- /dev/null +++ b/lab_profiles/Uyghur/Central Uyghur Persona.json @@ -0,0 +1 @@ +{"language": "Uyghur", "dialect": "Central Uyghur", "system_prompt": "You are a native speaker of Central Uyghur (Uyghur, f)."}{"name": "Central Uyghur Persona"} \ No newline at end of file diff --git a/lab_profiles/Uyghur/Hotan Persona.json b/lab_profiles/Uyghur/Hotan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..390a4b2137ea1bacc027d3537d1c09dcb93e1cf4 --- /dev/null +++ b/lab_profiles/Uyghur/Hotan Persona.json @@ -0,0 +1 @@ +{"language": "Uyghur", "dialect": "Hotan", "system_prompt": "You are a native speaker of Hotan (Uyghur, f)."}{"name": "Hotan Persona"} \ No newline at end of file diff --git a/lab_profiles/Uyghur/Lop Persona.json b/lab_profiles/Uyghur/Lop Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6db98eeb063133beb538d18c0a213bb7a6fceac6 --- /dev/null +++ b/lab_profiles/Uyghur/Lop Persona.json @@ -0,0 +1 @@ +{"language": "Uyghur", "dialect": "Lop", "system_prompt": "You are a native speaker of Lop (Uyghur, f)."}{"name": "Lop Persona"} \ No newline at end of file diff --git a/lab_profiles/Vietnamese/Central Vietnamese Persona.json b/lab_profiles/Vietnamese/Central Vietnamese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..e1f3e018cad82b5a72cb66b8f3a5688153ec4bcb --- /dev/null +++ b/lab_profiles/Vietnamese/Central Vietnamese Persona.json @@ -0,0 +1 @@ +{"language": "Vietnamese", "dialect": "Central Vietnamese", "system_prompt": "You are a native speaker of Central Vietnamese (Vietnamese, f)."}{"name": "Central Vietnamese Persona"} \ No newline at end of file diff --git a/lab_profiles/Vietnamese/Northern Vietnamese Persona.json b/lab_profiles/Vietnamese/Northern Vietnamese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..41300c2733b4d611a4875e1354141d5c0986c9d2 --- /dev/null +++ b/lab_profiles/Vietnamese/Northern Vietnamese Persona.json @@ -0,0 +1 @@ +{"language": "Vietnamese", "dialect": "Northern Vietnamese", "system_prompt": "You are a native speaker of Northern Vietnamese (Vietnamese, f)."}{"name": "Northern Vietnamese Persona"} \ No newline at end of file diff --git a/lab_profiles/Vietnamese/Southern Vietnamese Persona.json b/lab_profiles/Vietnamese/Southern Vietnamese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..d1c648e951ea178e2bc7fb87df9f7d5e390cc6cb --- /dev/null +++ b/lab_profiles/Vietnamese/Southern Vietnamese Persona.json @@ -0,0 +1 @@ +{"language": "Vietnamese", "dialect": "Southern Vietnamese", "system_prompt": "You are a native speaker of Southern Vietnamese (Vietnamese, f)."}{"name": "Southern Vietnamese Persona"} \ No newline at end of file diff --git a/lab_profiles/Western Punjabi/Jhangochi Persona.json b/lab_profiles/Western Punjabi/Jhangochi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..3512dfd74023f2d41345bb9045b05c9ad42b5d37 --- /dev/null +++ b/lab_profiles/Western Punjabi/Jhangochi Persona.json @@ -0,0 +1 @@ +{"language": "Western Punjabi", "dialect": "Jhangochi", "system_prompt": "You are a native speaker of Jhangochi (Western Punjabi, f)."}{"name": "Jhangochi Persona"} \ No newline at end of file diff --git a/lab_profiles/Western Punjabi/Majhi Persona.json b/lab_profiles/Western Punjabi/Majhi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..4ac83d63e48ae7523c1158548dfdda8b4dec15df --- /dev/null +++ b/lab_profiles/Western Punjabi/Majhi Persona.json @@ -0,0 +1 @@ +{"language": "Western Punjabi", "dialect": "Majhi", "system_prompt": "You are a native speaker of Majhi (Western Punjabi, f)."}{"name": "Majhi Persona"} \ No newline at end of file diff --git a/lab_profiles/Western Punjabi/Pothohari Persona.json b/lab_profiles/Western Punjabi/Pothohari Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..54aa231f3d13f000ac862f22290acceed217e92c --- /dev/null +++ b/lab_profiles/Western Punjabi/Pothohari Persona.json @@ -0,0 +1 @@ +{"language": "Western Punjabi", "dialect": "Pothohari", "system_prompt": "You are a native speaker of Pothohari (Western Punjabi, f)."}{"name": "Pothohari Persona"} \ No newline at end of file diff --git a/lab_profiles/Western Punjabi/Shahpuri Persona.json b/lab_profiles/Western Punjabi/Shahpuri Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..0818eccee433b95f5803056baedfc0a43a6ce194 --- /dev/null +++ b/lab_profiles/Western Punjabi/Shahpuri Persona.json @@ -0,0 +1 @@ +{"language": "Western Punjabi", "dialect": "Shahpuri", "system_prompt": "You are a native speaker of Shahpuri (Western Punjabi, f)."}{"name": "Shahpuri Persona"} \ No newline at end of file diff --git a/lab_profiles/Wu Chinese/Shanghainese Persona.json b/lab_profiles/Wu Chinese/Shanghainese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..b0862bda64c3695f39aa99a5b45b52b7a90da3b6 --- /dev/null +++ b/lab_profiles/Wu Chinese/Shanghainese Persona.json @@ -0,0 +1 @@ +{"language": "Wu Chinese", "dialect": "Shanghainese", "system_prompt": "You are a native speaker of Shanghainese (Wu Chinese, f)."}{"name": "Shanghainese Persona"} \ No newline at end of file diff --git a/lab_profiles/Wu Chinese/Suzhounese Persona.json b/lab_profiles/Wu Chinese/Suzhounese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..09e0c2f69fd0942cdf40bf54c2d9cb1761e57506 --- /dev/null +++ b/lab_profiles/Wu Chinese/Suzhounese Persona.json @@ -0,0 +1 @@ +{"language": "Wu Chinese", "dialect": "Suzhounese", "system_prompt": "You are a native speaker of Suzhounese (Wu Chinese, f)."}{"name": "Suzhounese Persona"} \ No newline at end of file diff --git a/lab_profiles/Wu Chinese/Wenzhounese Persona.json b/lab_profiles/Wu Chinese/Wenzhounese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..169cf629feb6000fe9489369c557c2e550515cdd --- /dev/null +++ b/lab_profiles/Wu Chinese/Wenzhounese Persona.json @@ -0,0 +1 @@ +{"language": "Wu Chinese", "dialect": "Wenzhounese", "system_prompt": "You are a native speaker of Wenzhounese (Wu Chinese, f)."}{"name": "Wenzhounese Persona"} \ No newline at end of file diff --git a/lab_profiles/Xiang Chinese/Changyi Persona.json b/lab_profiles/Xiang Chinese/Changyi Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..2338d630bfb0f15fa47ba2548dfd07e239cdd7e7 --- /dev/null +++ b/lab_profiles/Xiang Chinese/Changyi Persona.json @@ -0,0 +1 @@ +{"language": "Xiang Chinese", "dialect": "Changyi", "system_prompt": "You are a native speaker of Changyi (Xiang Chinese, f)."}{"name": "Changyi Persona"} \ No newline at end of file diff --git "a/lab_profiles/Xiang Chinese/Chenx\342\224\234\342\225\235 Persona.json" "b/lab_profiles/Xiang Chinese/Chenx\342\224\234\342\225\235 Persona.json" new file mode 100644 index 0000000000000000000000000000000000000000..f5b5c162ba63335c6b9ceb9bda2fb2c3304df148 --- /dev/null +++ "b/lab_profiles/Xiang Chinese/Chenx\342\224\234\342\225\235 Persona.json" @@ -0,0 +1 @@ +{"language": "Xiang Chinese", "dialect": "Chenx\u00fc", "system_prompt": "You are a native speaker of Chenx\u00fc (Xiang Chinese, f)."}{"name": "Chenxรผ Persona"} \ No newline at end of file diff --git a/lab_profiles/Xiang Chinese/Loushao Persona.json b/lab_profiles/Xiang Chinese/Loushao Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1342111763233e984fb3e184f7550e92d3065f0b --- /dev/null +++ b/lab_profiles/Xiang Chinese/Loushao Persona.json @@ -0,0 +1 @@ +{"language": "Xiang Chinese", "dialect": "Loushao", "system_prompt": "You are a native speaker of Loushao (Xiang Chinese, f)."}{"name": "Loushao Persona"} \ No newline at end of file diff --git a/lab_profiles/Yoruba/Egba Persona.json b/lab_profiles/Yoruba/Egba Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..6ebf488e44c89f3b592f8611e3b1998c5e447455 --- /dev/null +++ b/lab_profiles/Yoruba/Egba Persona.json @@ -0,0 +1 @@ +{"language": "Yoruba", "dialect": "Egba", "system_prompt": "You are a native speaker of Egba (Yoruba, f)."}{"name": "Egba Persona"} \ No newline at end of file diff --git a/lab_profiles/Yoruba/Ibadan Persona.json b/lab_profiles/Yoruba/Ibadan Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..10086da968f2d9018c81921f7e3412a26e93d229 --- /dev/null +++ b/lab_profiles/Yoruba/Ibadan Persona.json @@ -0,0 +1 @@ +{"language": "Yoruba", "dialect": "Ibadan", "system_prompt": "You are a native speaker of Ibadan (Yoruba, f)."}{"name": "Ibadan Persona"} \ No newline at end of file diff --git a/lab_profiles/Yoruba/Ijebu Persona.json b/lab_profiles/Yoruba/Ijebu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..57d1d704423b1a4b4ab19dd048215b59943ac871 --- /dev/null +++ b/lab_profiles/Yoruba/Ijebu Persona.json @@ -0,0 +1 @@ +{"language": "Yoruba", "dialect": "Ijebu", "system_prompt": "You are a native speaker of Ijebu (Yoruba, f)."}{"name": "Ijebu Persona"} \ No newline at end of file diff --git a/lab_profiles/Yoruba/Standard Yoruba Persona.json b/lab_profiles/Yoruba/Standard Yoruba Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..c48a3b57a62a5857bcabbd1bb91a0e26c61bfb11 --- /dev/null +++ b/lab_profiles/Yoruba/Standard Yoruba Persona.json @@ -0,0 +1 @@ +{"language": "Yoruba", "dialect": "Standard Yoruba", "system_prompt": "You are a native speaker of Standard Yoruba (Yoruba, f)."}{"name": "Standard Yoruba Persona"} \ No newline at end of file diff --git a/lab_profiles/Yue Chinese (Cantonese)/Guangzhou Cantonese Persona.json b/lab_profiles/Yue Chinese (Cantonese)/Guangzhou Cantonese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..aea1bc80c1ba1dd2c458e4170399a6798b8c17d0 --- /dev/null +++ b/lab_profiles/Yue Chinese (Cantonese)/Guangzhou Cantonese Persona.json @@ -0,0 +1 @@ +{"language": "Yue Chinese (Cantonese)", "dialect": "Guangzhou Cantonese", "system_prompt": "You are a native speaker of Guangzhou Cantonese (Yue Chinese (Cantonese), f)."}{"name": "Guangzhou Cantonese Persona"} \ No newline at end of file diff --git a/lab_profiles/Yue Chinese (Cantonese)/Hong Kong Cantonese Persona.json b/lab_profiles/Yue Chinese (Cantonese)/Hong Kong Cantonese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..10bd899469273433fbf4b83bf873399f83f82471 --- /dev/null +++ b/lab_profiles/Yue Chinese (Cantonese)/Hong Kong Cantonese Persona.json @@ -0,0 +1 @@ +{"language": "Yue Chinese (Cantonese)", "dialect": "Hong Kong Cantonese", "system_prompt": "You are a native speaker of Hong Kong Cantonese (Yue Chinese (Cantonese), f)."}{"name": "Hong Kong Cantonese Persona"} \ No newline at end of file diff --git a/lab_profiles/Yue Chinese (Cantonese)/Macau Cantonese Persona.json b/lab_profiles/Yue Chinese (Cantonese)/Macau Cantonese Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..37f8f9185e9f0445d198f39667cf7bb07bab9a7a --- /dev/null +++ b/lab_profiles/Yue Chinese (Cantonese)/Macau Cantonese Persona.json @@ -0,0 +1 @@ +{"language": "Yue Chinese (Cantonese)", "dialect": "Macau Cantonese", "system_prompt": "You are a native speaker of Macau Cantonese (Yue Chinese (Cantonese), f)."}{"name": "Macau Cantonese Persona"} \ No newline at end of file diff --git a/lab_profiles/Zulu/Lala Persona.json b/lab_profiles/Zulu/Lala Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..389690726e8291d2fe68ea6b0deacc35f765be2a --- /dev/null +++ b/lab_profiles/Zulu/Lala Persona.json @@ -0,0 +1 @@ +{"language": "Zulu", "dialect": "Lala", "system_prompt": "You are a native speaker of Lala (Zulu, f)."}{"name": "Lala Persona"} \ No newline at end of file diff --git a/lab_profiles/Zulu/Qwabe Persona.json b/lab_profiles/Zulu/Qwabe Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..513aea4fd2dae85db01276e8338318e37110526d --- /dev/null +++ b/lab_profiles/Zulu/Qwabe Persona.json @@ -0,0 +1 @@ +{"language": "Zulu", "dialect": "Qwabe", "system_prompt": "You are a native speaker of Qwabe (Zulu, f)."}{"name": "Qwabe Persona"} \ No newline at end of file diff --git a/lab_profiles/Zulu/Standard Zulu Persona.json b/lab_profiles/Zulu/Standard Zulu Persona.json new file mode 100644 index 0000000000000000000000000000000000000000..1d449c85c052fe9fbb21d4a2ca99910491186f13 --- /dev/null +++ b/lab_profiles/Zulu/Standard Zulu Persona.json @@ -0,0 +1 @@ +{"language": "Zulu", "dialect": "Standard Zulu", "system_prompt": "You are a native speaker of Standard Zulu (Zulu, f)."}{"name": "Standard Zulu Persona"} \ No newline at end of file diff --git a/list_hf_files.py b/list_hf_files.py new file mode 100644 index 0000000000000000000000000000000000000000..671c4e80b78d0af6d841494068d8ad628bf4cc5e --- /dev/null +++ b/list_hf_files.py @@ -0,0 +1,12 @@ +import os +from huggingface_hub import HfApi + +# Use the token from the user's config +import dotenv +dotenv.load_dotenv() +token = os.environ.get("HF_TOKEN") + +api = HfApi(token=token) +files = api.list_repo_files(repo_id='toecm/PureChain_Dataset', repo_type='dataset') +for f in files: + print(f) diff --git a/main.py b/main.py new file mode 100644 index 0000000000000000000000000000000000000000..8fff69b6ba6f69376b404054a7abcb8d709e633b --- /dev/null +++ b/main.py @@ -0,0 +1,128 @@ +import warnings +import os +import sys + +# Force UTF-8 for console output (Windows fix) +sys.stdout.reconfigure(encoding='utf-8') + +from huggingface_hub import HfApi, login +import gradio as gr + +# Filter warnings immediately +warnings.filterwarnings("ignore", category=SyntaxWarning, module="pydub") +warnings.filterwarnings( + "ignore", + message=r".*HTTP_422_UNPROCESSABLE_ENTITY.*HTTP_422_UNPROCESSABLE_CONTENT.*", + category=Warning, + module=r"gradio\.routes", +) + +# --- INTERNAL IMPORTS --- +from config import AppConfig +from src.utils import create_warning_beep + +# Import your refactored classes +from src.managers import GeminiManager, HFManager, GroqManager +from src.input_agent import AgentInput +from src.brain_agent import AgentInterpretation +from src.trust_agent import AgentTrust +from src.ux_agent import AgentUX +from src.acoustic_agent import AgentAcoustic + +# 1. Add the import for your recovery script +import recover_chain # (or 'from src import recover_chain' depending on where the file is) + +# 2. Add this block before ui.launch() +print("๐Ÿ”„ Initiating Blockchain Recovery Sequence...") +try: + # Assuming your recover_chain.py has a main() or run() function + recover_chain.main() + print("โœ… Recovery Complete!") +except Exception as e: + print(f"โŒ Recovery Failed: {e}") + +# ========================================== +# MAIN APPLICATION LOGIC +# ========================================== +def create_app(): + print("๐Ÿš€ Initializing PureVersation...") + + # 1. Setup Configuration & Directories + AppConfig.setup_directories() + + # ๐ŸŸข NEW: The Silver Bullet - Global Hugging Face Login + # This must happen BEFORE HFManager tries to pull datasets + if AppConfig.HF_TOKEN: + login(token=AppConfig.HF_TOKEN) + print("โœ… Hugging Face Global Login Successful.") + else: + print("๐Ÿšจ WARNING: HF_TOKEN is missing in AppConfig! Downloads will fail.") + + # 2. Initialize Managers (Inject Config) + # We pass AppConfig to HFManager so it knows where to download files + hf_manager = HFManager(AppConfig) + hf_manager.pull_datasets() + + # Initialize Groq (New Brain Stem) + groq_manager = GroqManager(AppConfig.GROQ_API_KEY) if AppConfig.GROQ_API_KEY else None + + # Initialize Gemini (Brain Stem) + #gemini_manager = GeminiManager(AppConfig.GOOGLE_API_KEY) if AppConfig.GOOGLE_API_KEY else None + + # 3. Initialize Agents (Dependency Injection) + + # Agent 1: Input (Whisper) + agent1 = AgentInput() + + # Agent 2: Brain (Interpretation) + # We pass AppConfig so it knows where PROFILES_DIR is + # agent2 = AgentInterpretation(AppConfig, gemini_manager_instance=gemini_manager) + + # Inject groq_manager instead of gemini_manager + agent2 = AgentInterpretation(AppConfig, gemini_manager_instance=groq_manager) + + # Agent 4: Trust (Blockchain/IPFS) + # We pass AppConfig so it has keys for Web3 and Pinata + agent4 = AgentTrust(AppConfig) + # Inject hf_manager into Trust so it can save audio files to HF + agent4.hf_manager_ref = hf_manager + + # Agent 5: Acoustic (Phonetic IPA) + agent5 = AgentAcoustic(groq_manager) + agent4.acoustic_agent = agent5 + + # Agent 3: UX (Interface) + agent3 = AgentUX(agent1, agent2, agent4) + + # 4. Launch + print("โœ… System Assembled. Launching Interface...") + + # Pass the warning beep path + agent3.alert_sound = create_warning_beep() + + # 1. Generate the UI blocks + app = agent3.create_ui() + + # ๐ŸŸข FIX: Enable the Gradio Queue here to prevent async loop collisions! + app.queue(default_concurrency_limit=10) + + return app + +# Expose 'demo' at the module level for Gradio Hot Reload +demo = create_app() + +from api import app as api_app + +app = gr.mount_gradio_app( + api_app, + demo, + path="/", + ssr_mode=False, + theme=gr.themes.Soft(primary_hue="blue"), +) + +if __name__ == "__main__": + import uvicorn + + uvicorn.run(app, host="0.0.0.0", port=int(os.getenv("PORT", "7860"))) + diff --git a/migrate_hf.py b/migrate_hf.py new file mode 100644 index 0000000000000000000000000000000000000000..603f8beafd238704df9cf597a351cd57ee158cfa --- /dev/null +++ b/migrate_hf.py @@ -0,0 +1,73 @@ +from huggingface_hub import HfApi, HfFileSystem +import urllib.parse +import os +import sys, io +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') + +api = HfApi() +fs = HfFileSystem() + +def get_language(filename): + name = urllib.parse.unquote(filename).lower() + + if 'english' in name or 'american' in name or 'british' in name or 'patois' in name or 'pidgin' in name or 'south african' in name: + return 'English' + if 'korean' in name: + return 'Korean' + if 'igbo' in name: + return 'Asusu Igbo' + if 'tagalog' in name or 'filipino' in name: + return 'Filipino' + if 'creole' in name: + return 'Creole' + if 'indonesian' in name: + return 'Indonesian' + + return 'Other' + +repo_id = "toecm/IEDID" + +def migrate(): + files = fs.ls(f"datasets/{repo_id}", detail=False) + # Strip prefix 'datasets/toecm/IEDID/' + files = [f.replace(f"datasets/{repo_id}/", "") for f in files] + + operations = [] + + for f in files: + if f in ['.gitattributes', 'README.md', 'minted_history.csv', 'audio', 'audio_files']: + continue + + lang = get_language(f) + + # Decide if it goes to /data/ or /personas/ + if f.endswith('.csv'): + new_path = f"{lang}/data/{f}" + elif f.endswith('.json'): + new_path = f"{lang}/personas/{f}" + else: + continue + + print(f"Moving {f} -> {new_path}") + operations.append({ + "path_in_repo": f, + "path_in_repo_new": new_path, + }) + + if not operations: + print("No files to migrate.") + return + + print("Executing move operations...") + for op in operations: + try: + # We use fs.mv for moving files on the Hugging Face filesystem + src = f"datasets/{repo_id}/{op['path_in_repo']}" + dest = f"datasets/{repo_id}/{op['path_in_repo_new']}" + fs.mv(src, dest) + print(f"Success: {op['path_in_repo']}") + except Exception as e: + print(f"Failed to move {op['path_in_repo']}: {e}") + +if __name__ == "__main__": + migrate() diff --git a/migrate_xp.py b/migrate_xp.py new file mode 100644 index 0000000000000000000000000000000000000000..be3aab4124defd49022b8ea27c232e821fe85136 --- /dev/null +++ b/migrate_xp.py @@ -0,0 +1,95 @@ +import os +import json +from web3 import Web3 +from dotenv import load_dotenv + +load_dotenv() + +RPC_URL = os.environ.get("PURECHAIN_RPC_URL", "http://3.34.161.207:8545") +PRIVATE_KEY = os.environ.get("PURECHAIN_PRIVATE_KEY") +ADDR_OLD = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN11") +ADDR_NEW = os.environ.get("PURECHAIN_CONTRACT_ADDRESS") + +def main(): + if not PRIVATE_KEY or not ADDR_OLD or not ADDR_NEW: + print("โŒ Missing environment variables. Check .env") + return + + w3 = Web3(Web3.HTTPProvider(RPC_URL)) + if not w3.is_connected(): + print("โŒ Web3 not connected.") + return + + admin_account = w3.eth.account.from_key(PRIVATE_KEY) + print(f"Admin Account: {admin_account.address}") + + # ABI for just the functions we need + abi_minimal = json.loads('''[ + {"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"contributor","type":"address"},{"indexed":false,"internalType":"string","name":"phrase","type":"string"},{"indexed":false,"internalType":"string","name":"dialect","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EntryProposed","type":"event"}, + {"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"EntryVerified","type":"event"}, + {"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"userXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}, + {"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"string[]","name":"_dialects","type":"string[]"},{"internalType":"uint256[]","name":"_xps","type":"uint256[]"}],"name":"batchMigrateXP","outputs":[],"stateMutability":"nonpayable","type":"function"} + ]''') + + contract_old = w3.eth.contract(address=w3.to_checksum_address(ADDR_OLD), abi=abi_minimal) + contract_new = w3.eth.contract(address=w3.to_checksum_address(ADDR_NEW), abi=abi_minimal) + + # We need to discover users and dialects by parsing EntryProposed events + print("๐Ÿ” Discovering users from old contract events...") + try: + events = contract_old.events.EntryProposed.get_logs(fromBlock=0, toBlock='latest') + except Exception as e: + print(f"Failed to fetch logs: {e}") + return + + user_dialects = set() + for ev in events: + user = ev.args.contributor + dialect = ev.args.dialect + user_dialects.add((user, dialect)) + + if not user_dialects: + print("No users found.") + return + + print(f"Found {len(user_dialects)} User/Dialect pairs. Checking XP balances...") + + users = [] + dialects = [] + xps = [] + + for (user, dialect) in user_dialects: + old_xp = contract_old.functions.userXP(user, dialect).call() + if old_xp > 0: + # Check if it was already migrated + new_xp = contract_new.functions.userXP(user, dialect).call() + if new_xp < old_xp: + diff = old_xp - new_xp + users.append(user) + dialects.append(dialect) + xps.append(diff) + print(f"๐Ÿ’ก Found {diff} unmigrated XP for {user} in {dialect}") + + if not users: + print("โœ… No new XP needs migration.") + return + + print(f"๐Ÿš€ Migrating {len(users)} records...") + + nonce = w3.eth.get_transaction_count(admin_account.address) + tx = contract_new.functions.batchMigrateXP(users, dialects, xps).build_transaction({ + 'chainId': w3.eth.chain_id, + 'gas': 3000000, + 'gasPrice': w3.eth.gas_price, + 'nonce': nonce, + }) + + signed_tx = w3.eth.account.sign_transaction(tx, PRIVATE_KEY) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + + print(f"โณ Migration TX sent! Hash: {tx_hash.hex()}") + receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + print(f"๐ŸŽ‰ Migration complete in block {receipt.blockNumber}!") + +if __name__ == "__main__": + main() diff --git a/move_to_creole.py b/move_to_creole.py new file mode 100644 index 0000000000000000000000000000000000000000..148ffa1c22221922a2be557ed0b8e66261799e8d --- /dev/null +++ b/move_to_creole.py @@ -0,0 +1,28 @@ +from huggingface_hub import HfFileSystem + +fs = HfFileSystem() +repo_id = "toecm/IEDID" + +# Define moves +moves = [ + # Ghanaian + (f"datasets/{repo_id}/English/data/Ghanaian Pidgin English.csv", f"datasets/{repo_id}/Creole/data/Ghanaian Pidgin English.csv"), + + # Nigerian Pidgin + (f"datasets/{repo_id}/English/data/Nigerian Pidgin English.csv", f"datasets/{repo_id}/Creole/data/Nigerian Pidgin English.csv"), + (f"datasets/{repo_id}/English/personas/Nigerian Pidgin Persona.json", f"datasets/{repo_id}/Creole/personas/Nigerian Pidgin Persona.json"), + + # Jamaican Patois + (f"datasets/{repo_id}/English/data/Jamaican Patois.csv", f"datasets/{repo_id}/Creole/data/Jamaican Patois.csv"), +] + +for src, dest in moves: + try: + if fs.exists(src): + print(f"Moving {src} -> {dest}") + fs.mv(src, dest) + print("Success!") + else: + print(f"Source not found: {src}") + except Exception as e: + print(f"Error moving {src}: {e}") diff --git a/pending_dump.txt b/pending_dump.txt new file mode 100644 index 0000000000000000000000000000000000000000..34b32937c5c55e0bfc8554a1e084b2575880ac8d --- /dev/null +++ b/pending_dump.txt @@ -0,0 +1,11 @@ + Dialect Utterance Clarification +74 Nigerian Igbo Tinye ha na njแปฅoyi Tony Put them in Tony's fridge +75 Asแปฅsแปฅ Igbo Kedแปฅ? How are you? +76 Jeju-do Korean ๋ญํ•˜๋ฉ˜? What are you doing? +77 Gyeongsang-do Korean ๋ญํ•˜๋…ธ? ๊ทธ๋ƒฅ ์žˆ๋‹ค What am I doing? I'm chilling +78 Gyeongsang-do Korean ๋ญํ•˜๋…ธ? What are you doing? +79 Igbo Nna, kee nke na-eme? What's up, friend? +80 Igbo Udo di. I'm chill. Literally, this means there is peace. +81 Nigerian Pidgin English No shaking. Make I just dey go nau. That's great. Let me take my leave. +82 Asแปฅsแปฅ Igbo Nna, kee kwanu? Hey, how are you? +83 Asแปฅsแปฅ Igbo Bia, nwoke m, ike adiro m biko. Hey, dude, I don't have time for this. \ No newline at end of file diff --git a/pending_out.txt b/pending_out.txt new file mode 100644 index 0000000000000000000000000000000000000000..04851a308331779613b3c2a732a09807ca160994 Binary files /dev/null and b/pending_out.txt differ diff --git a/pending_out2.txt b/pending_out2.txt new file mode 100644 index 0000000000000000000000000000000000000000..2396aeb2592f0993c433ae8e13516ec9a7dd6720 Binary files /dev/null and b/pending_out2.txt differ diff --git a/pending_utf8.txt b/pending_utf8.txt new file mode 100644 index 0000000000000000000000000000000000000000..c772afd77f8f20c80e7b6a9b3891eb1b1c56b87e --- /dev/null +++ b/pending_utf8.txt @@ -0,0 +1,11 @@ + User Data_Origin Utterance Dialect Clarification Clarification_Source Tone Context Pragmatic_Analysis Audio Timestamp Chain_ID Approvers +74 0x96510784f55af7886D5447B01607431aeC4A62d3 Game: Relay Pair Tinye ha na njรŸโ•—ร‘oyi Tony Nigerian Igbo Put them in Tony's fridge AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-07 12:56:50 NaN NaN +75 0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7 Game: Relay Pair KedรŸโ•—ร‘? AsรŸโ•—ร‘sรŸโ•—ร‘ Igbo How are you? AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-08 07:43:04 NaN NaN +76 0x51b83e0123a44426ab951466b5ba2264de519c44 Game: Relay Pair ฮดยกร‰ฯ†รฒรฟฮดโŒรฟ? Jeju-do Korean What are you doing? AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-09 01:48:26 NaN NaN +77 0x719d270167a44a209dbb4bfef0da6fc150af3b35 Game: Relay Pair ฮดยกร‰ฯ†รฒรฟฮดร โ••? ฮฉโ•–โ••ฮดรขร‘ โˆžโ‚งรชฮดรฏรฑ Gyeongsang-do Korean What am I doing? I'm chilling AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-09 01:51:19 NaN NaN +78 0x719d270167a44a209dbb4bfef0da6fc150af3b35 Game: Relay Pair ฮดยกร‰ฯ†รฒรฟฮดร โ••? Gyeongsang-do Korean What are you doing? AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-09 01:52:25 NaN NaN +79 0x8241C367ac75701951E50b65F92aF74CeaC90075 Game: Relay Pair Nna, kee nke na-eme? Igbo What's up, friend? AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-11 07:16:44 NaN NaN +80 0x8241C367ac75701951E50b65F92aF74CeaC90075 Game: Relay Pair Udo di. Igbo I'm chill. Literally, this means there is peace. AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-11 07:19:01 NaN NaN +81 0x499d3AC35EA2EFbEbcE633676B697e3DAc61e4F1 Game: Relay Pair No shaking. Make I just dey go nau. Nigerian Pidgin English That's great. Let me take my leave. AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-11 07:20:27 NaN NaN +82 0x8241C367ac75701951E50b65F92aF74CeaC90075 Game: Relay Pair Nna, kee kwanu? AsรŸโ•—ร‘sรŸโ•—ร‘ Igbo Hey, how are you? AI Relay Bouncer Conversational Relay Peer-to-Peer Chat Automated Relay Extraction NaN 2026-06-13 03:54:12 NaN NaN +83 0x499d3AC35EA2EFbEbcE633676B697e3DAc61e4F1 Game: PureHumCom Bia, nwoke m, ike adiro m biko. AsรŸโ•—ร‘sรŸโ•—ร‘ Igbo Hey, dude, I don't have time for this. User/AI Hybrid Conversational Chat PureHumCom Session NaN 2026-06-14 04:41:27 NaN NaN diff --git a/read_pending.py b/read_pending.py new file mode 100644 index 0000000000000000000000000000000000000000..b9585fb150768b6f752d57c90c39f763f631b12b --- /dev/null +++ b/read_pending.py @@ -0,0 +1,4 @@ +import pandas as pd +df = pd.read_csv('hf://datasets/toecm/PureChain_Dataset/pending_approvals.csv') +with open('pending_dump.txt', 'w', encoding='utf-8') as f: + f.write(df[['Dialect', 'Utterance', 'Clarification']].tail(10).to_string()) diff --git a/recover_chain.py b/recover_chain.py new file mode 100644 index 0000000000000000000000000000000000000000..5edf0b16375a0d1ae307e3572d82d4da33c0c64e --- /dev/null +++ b/recover_chain.py @@ -0,0 +1,269 @@ +import os +import pandas as pd +from web3 import Web3 +try: + from web3.middleware import ExtraDataToPOAMiddleware as geth_poa_middleware +except ImportError: + from web3.middleware import geth_poa_middleware +from huggingface_hub import hf_hub_download + +from src.dynamic_compiler import get_contract_interface + +def main(selected_contracts=None): + """ + selected_contracts: List of strings (e.g. ['PureIUUY', 'PureBi_Old']) + """ + print("๐ŸŒ Connecting to PureChain...") + + try: + from config import AppConfig + RPC_URL = getattr(AppConfig, 'PURECHAIN_RPC_URL', None) or os.environ.get("PURECHAIN_RPC_URL", "http://3.34.161.207:8548") + DATASET_DIR = getattr(AppConfig, 'DATASET_DIR', "/app/IEDID") + + # Pull legacy addresses + NEW_ADDRESS = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS") + ADDR_PUREVERSATION = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS_PUREVERSATION', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREVERSATION") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureVersation") + ADDR_PURECONVO = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS_PURECONVO', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PURECONVO") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureConvo") + ADDR_PUREIUUY = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS_PUREIUUY', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREIUUY") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureIUUY", "0x0a735C97EBd5c645D6B641cBE976FDB26710bAdf") + ADDR_PUREBI_JUN11 = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN11', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN11") + ADDR_PUREBI_JUN12 = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN12', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN12") + ADDR_PUREBI_JUN13 = getattr(AppConfig, 'PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN13', None) or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN13") + except ImportError: + RPC_URL = os.environ.get("PURECHAIN_RPC_URL", "http://3.34.161.207:8548") + DATASET_DIR = "/app/IEDID" + NEW_ADDRESS = os.environ.get("PURECHAIN_CONTRACT_ADDRESS") + ADDR_PUREVERSATION = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREVERSATION") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureVersation") + ADDR_PURECONVO = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PURECONVO") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureConvo") + ADDR_PUREIUUY = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREIUUY") or os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PureIUUY", "0x0a735C97EBd5c645D6B641cBE976FDB26710bAdf") + ADDR_PUREBI_JUN11 = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN11") + ADDR_PUREBI_JUN12 = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN12") + ADDR_PUREBI_JUN13 = os.environ.get("PURECHAIN_CONTRACT_ADDRESS_PUREBI_JUN13") + + if not RPC_URL: + return "โŒ Error: RPC URL is missing." + + w3 = Web3(Web3.HTTPProvider(RPC_URL)) + w3.middleware_onion.inject(geth_poa_middleware, layer=0) + + if not w3.is_connected(): + return f"โŒ Failed to connect to PureChain node at {RPC_URL}." + + # ๐ŸŸข Recovery Targets Map + recovery_targets = [] + + if ADDR_PUREIUUY and ADDR_PUREIUUY != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureIUUY" in selected_contracts: + recovery_targets.append({"address": ADDR_PUREIUUY, "file": "PureIUUY_old.sol", "name": "PureIUUY"}) + if ADDR_PURECONVO and ADDR_PURECONVO != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureConvo" in selected_contracts: + recovery_targets.append({"address": ADDR_PURECONVO, "file": "PureConvo.sol", "name": "PureConvo"}) + if ADDR_PUREVERSATION and ADDR_PUREVERSATION != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureVersation" in selected_contracts: + recovery_targets.append({"address": ADDR_PUREVERSATION, "file": "PureVersation.sol", "name": "PureVersation"}) + if ADDR_PUREBI_JUN11 and ADDR_PUREBI_JUN11 != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureBi (Jun 11)" in selected_contracts: + recovery_targets.append({"address": ADDR_PUREBI_JUN11, "file": "PureBi_Jun11.sol", "name": "PureBi_Jun11"}) + if ADDR_PUREBI_JUN12 and ADDR_PUREBI_JUN12 != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureBi (Jun 12)" in selected_contracts: + recovery_targets.append({"address": ADDR_PUREBI_JUN12, "file": "PureBi_Jun12.sol", "name": "PureBi_Jun12"}) + if ADDR_PUREBI_JUN13 and ADDR_PUREBI_JUN13 != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureBi (Jun 13)" in selected_contracts: + recovery_targets.append({"address": ADDR_PUREBI_JUN13, "file": "PureBi_Jun13.sol", "name": "PureBi_Jun13"}) + if NEW_ADDRESS and NEW_ADDRESS != "YOUR_CONTRACT_ADDRESS_HERE": + if not selected_contracts or "PureBi" in selected_contracts: + recovery_targets.append({"address": NEW_ADDRESS, "file": "PureBi.sol", "name": "PureBi"}) + + hf_cache = {} + hf_token = os.environ.get("HF_TOKEN") + repo_id = "toecm/IEDID" + + def get_hf_metadata(dialect_name, phrase_text): + clean_dialect = str(dialect_name).strip().title() + if "Pidgin" in clean_dialect and not clean_dialect.endswith("English") and not clean_dialect.endswith("Dialect"): + clean_dialect += " English" + + file_name = f"{clean_dialect}.csv" + if file_name not in hf_cache: + try: + path = hf_hub_download(repo_id=repo_id, repo_type="dataset", filename=file_name, token=hf_token) + hf_cache[file_name] = pd.read_csv(path) + except Exception: + hf_cache[file_name] = pd.DataFrame() + + df = hf_cache[file_name] + if not df.empty and "Utterance" in df.columns: + match = df[df["Utterance"].astype(str).str.strip() == str(phrase_text).strip()] + if not match.empty: + row = match.iloc[0] + return { + "Clarification": row.get("Clarification", "Recovered from Chain"), + "Tone": row.get("Tone_Category", "Recovered"), + "Context": row.get("Linguistic_Context", "Blockchain Recovery"), + "Pragmatics": row.get("Pragmatic_Analysis", "Recovered from IPFS") + } + return None + + history_data = [] + seen_addresses = set() + + for target in recovery_targets: + address = target["address"] + if address in seen_addresses: + continue + seen_addresses.add(address) + + try: + CHECKSUM_ADDRESS = Web3.to_checksum_address(address) + except Exception: + continue + + print(f"\nโš™๏ธ Loading ABI for {target['name']}...") + try: + abi, _ = get_contract_interface(target["file"], target["name"]) + except Exception as e: + print(f"โš ๏ธ Failed to compile {target['file']}! Skipping recovery for {CHECKSUM_ADDRESS[:8]}. Error: {e}") + continue + + contract = w3.eth.contract(address=CHECKSUM_ADDRESS, abi=abi) + print(f"๐Ÿ” Deep Scanning internal state for contract: {CHECKSUM_ADDRESS[:8]}...") + + entry_metadata = {} + try: + print(f"๐Ÿ” Fetching block timestamps for {target['name']}...") + logs = contract.events.EntryProposed.get_logs(fromBlock=0, toBlock='latest') + for ev in logs: + try: + entry_metadata[ev.args.id] = ev.blockNumber + except: pass + except Exception: + pass + + block_cache = {} + def get_cached_ts(b_num): + if b_num not in block_cache: + try: + block_cache[b_num] = w3.eth.get_block(b_num).timestamp + except: + return None + return block_cache[b_num] + + entry_id = 1 + consecutive_empties = 0 + contract_entries_found = 0 + + while consecutive_empties < 10: + try: + entry_struct = contract.functions.entries(entry_id).call() + # The length of the tuple determines the contract version. + # phrase is always index 1. + phrase = entry_struct[1] + + if not phrase or str(phrase).strip() == "": + consecutive_empties += 1 + entry_id += 1 + continue + + consecutive_empties = 0 + dialect = entry_struct[2] + ipfs_cid = entry_struct[3] + + metadata = get_hf_metadata(dialect, phrase) + + approver_addr = entry_struct[4] if len(entry_struct) > 4 else None + if approver_addr and str(approver_addr) != "0x0000000000000000000000000000000000000000": + approver_str = f"Legacy Verified: {approver_addr[:6]}...{approver_addr[-4:]}" + else: + approver_str = "Legacy Approved" + + actual_ts = "Recovered Data" + if entry_id in entry_metadata: + import datetime + ts_val = get_cached_ts(entry_metadata[entry_id]) + if ts_val: + actual_ts = datetime.datetime.fromtimestamp(ts_val).strftime("%Y-%m-%d %H:%M:%S") + + history_data.append({ + "Timestamp": actual_ts, + "Utterance": phrase, + "Dialect": dialect, + "Clarification": metadata["Clarification"] if metadata else "Recovered from Chain", + "Tone": metadata["Tone"] if metadata else "Recovered", + "Context": metadata["Context"] if metadata else "Blockchain Recovery", + "Pragmatics": metadata["Pragmatics"] if metadata else "Recovered from IPFS", + "Data_Origin": f"Legacy PureChain ({target['name']})", + "Data_Approved": approver_str, + "Block": entry_id, + "Speed": "N/A", + "TX Hash": f"0xRecovered_{CHECKSUM_ADDRESS[:6]}_{entry_id}", + "IPFS CID": ipfs_cid + }) + + print(f" โœ”๏ธ Recovered {target['name']} Entry ID {entry_id}: {phrase[:20]}...") + contract_entries_found += 1 + entry_id += 1 + + except Exception as e: + # If the function call fails entirely, we broke the contract bounds + break + + print(f"๐Ÿ“ฆ Successfully extracted {contract_entries_found} entries from {CHECKSUM_ADDRESS[:8]}.") + + if not history_data: + return "โš ๏ธ Chain scan complete: No entries found." + + df = pd.DataFrame(history_data) + history_path = os.path.join(DATASET_DIR, "..", "minted_history.csv") + + if os.path.exists(history_path): + try: + existing_df = pd.read_csv(history_path) + # Merge existing_df and df, keeping existing_df's data (real timestamps/hashes) for duplicates + df = pd.concat([existing_df, df]).drop_duplicates(subset=['Utterance', 'Dialect'], keep='first') + except Exception as e: + print(f"โš ๏ธ Failed to read existing history: {e}") + df.drop_duplicates(subset=['Utterance', 'Dialect'], inplace=True) + else: + df.drop_duplicates(subset=['Utterance', 'Dialect'], inplace=True) + + df.to_csv(history_path, index=False) + + for dialect_name, group in df.groupby("Dialect"): + safe_name = "".join([c for c in str(dialect_name) if c.isalnum() or c in (' ', '_', '-')]).strip() + if not safe_name: continue + + def get_language(name): + name_lower = name.lower() + if 'patois' in name_lower or 'pidgin' in name_lower or 'creole' in name_lower: + return 'Creole' + if 'english' in name_lower or 'american' in name_lower or 'british' in name_lower or 'south african' in name_lower: + return 'English' + if 'korean' in name_lower: + return 'Korean' + if 'igbo' in name_lower: + return 'Asusu Igbo' + if 'tagalog' in name_lower or 'filipino' in name_lower: + return 'Filipino' + if 'indonesian' in name_lower: + return 'Indonesian' + return 'Other' + + lang = get_language(safe_name) + dialect_path = os.path.join(DATASET_DIR, lang, "data", f"{safe_name}.csv") + os.makedirs(os.path.dirname(dialect_path), exist_ok=True) + dialect_df = group[["Data_Origin", "Utterance", "Dialect", "Clarification", "Tone", "Context", "Pragmatics"]].copy() + dialect_df.rename(columns={"Data_Origin": "Source", "Tone": "Tone_Category", "Context": "Linguistic_Context", "Pragmatics": "Pragmatic_Analysis"}, inplace=True) + dialect_df["Speaker"] = "Recovered_User" + + if os.path.exists(dialect_path): + try: + existing_df = pd.read_csv(dialect_path) + dialect_df = pd.concat([existing_df, dialect_df]).drop_duplicates(subset=['Utterance', 'Dialect'], keep='first') + except Exception as e: + print(f"โš ๏ธ Failed to read existing dialect CSV: {e}") + + dialect_df.to_csv(dialect_path, index=False) + + return f"โœ… Recovery Success! Rebuilt {len(df)} entries from all contracts." + +if __name__ == "__main__": + print(main()) \ No newline at end of file diff --git a/recover_igbo_today.py b/recover_igbo_today.py new file mode 100644 index 0000000000000000000000000000000000000000..88af2011fac25982b8f942e8b5010608eab4a016 --- /dev/null +++ b/recover_igbo_today.py @@ -0,0 +1,64 @@ +from huggingface_hub import HfApi +import pandas as pd + +api = HfApi() + +try: + print("Loading datasets...") + # Load current Asแปฅsแปฅ Igbo.csv + target_df = pd.read_csv('hf://datasets/toecm/IEDID/Asแปฅsแปฅ Igbo.csv') + + # Load pending approvals + pending_df = pd.read_csv('hf://datasets/toecm/PureChain_Dataset/pending_approvals.csv') + + # Filter pending for Asแปฅsแปฅ Igbo + igbo_pending = pending_df[pending_df['Dialect'] == 'Asแปฅsแปฅ Igbo'].copy() + + # Sanitize dialect name so it's correct (no " English") + igbo_pending['Dialect'] = 'Asแปฅsแปฅ Igbo' + + # Align columns + cols_to_keep = ['Utterance', 'Dialect', 'Clarification', 'Tone_Category', 'Linguistic_Context', + 'Syntax_Pattern', 'Pragmatic_Analysis', 'Acoustic_Profile', 'file_name', + 'audio_file_name', 'Data_Origin', 'Clarification_Source', 'User'] + + # Map any missing columns + for col in cols_to_keep: + if col not in igbo_pending.columns: + if col == 'Tone_Category' and 'Tone' in igbo_pending.columns: + igbo_pending[col] = igbo_pending['Tone'] + elif col == 'Linguistic_Context' and 'Context' in igbo_pending.columns: + igbo_pending[col] = igbo_pending['Context'] + elif col == 'Clarification_Source': + igbo_pending[col] = 'Admin Edit' + elif col == 'Acoustic_Profile': + igbo_pending[col] = '{}' + else: + igbo_pending[col] = None + + igbo_pending = igbo_pending[cols_to_keep] + + # Check what is already in target + existing_utterances = target_df['Utterance'].tolist() + new_rows = igbo_pending[~igbo_pending['Utterance'].isin(existing_utterances)] + + if len(new_rows) > 0: + print(f"Adding {len(new_rows)} new rows to Igbo file...") + combined_df = pd.concat([target_df, new_rows], ignore_index=True) + + local_path = "fixed_Asusu_Igbo.csv" + combined_df.to_csv(local_path, index=False) + + api.upload_file( + path_or_fileobj=local_path, + path_in_repo="Asแปฅsแปฅ Igbo.csv", + repo_id="toecm/IEDID", + repo_type="dataset", + commit_message="Recover newly approved Igbo rows" + ) + print("Successfully recovered Igbo file!") + else: + print("No new rows to add.") + +except Exception as e: + print(f"Error: {e}") diff --git a/rejected_graveyard.csv b/rejected_graveyard.csv new file mode 100644 index 0000000000000000000000000000000000000000..9baa87a1eb36d6a9245847f61da02c4076f40fef --- /dev/null +++ b/rejected_graveyard.csv @@ -0,0 +1 @@ +๏ปฟChain_ID,Utterance,Dialect,Clarification,Tone_Category,Linguistic_Context,Syntax_Pattern,Pragmatic_Analysis,audio_file_name,Data_Origin,Clarification_Source,User,Rejection_Reason,Rejector diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..a45dc171e8d5c9a3f4cfda1c85ea39a6292fda02 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,41 @@ +# --- CORE UTILS --- +setuptools==69.5.1 +wheel +pytz + +# --- AI & TRANSCRIPTION --- +openai-whisper @ git+https://github.com/openai/whisper.git +rapidfuzz +pandas + +# --- INTERFACE --- +gradio>=4.36.0 + +# --- DEPENDENCIES --- +transformers +torchaudio +torch +librosa +pydub +ffmpeg-python +jiwer +google-genai +groq +python-dotenv +requests +yt-dlp +soundfile + +# --- TRUST / BLOCKCHAIN & TRAINER --- +web3>=6.0.0 +py-solc-x>=1.1.1 +autotrain-advanced + +# --- RAG PIPELINE (LOCAL EMBEDDINGS) --- +sentence-transformers +faiss-cpu + +# --- FASTAPI MEGA-SERVER --- +fastapi +uvicorn +openai diff --git a/restore_dataset.py b/restore_dataset.py new file mode 100644 index 0000000000000000000000000000000000000000..ece8e70eb4463db45be3cb2422844c7a0d96c77b --- /dev/null +++ b/restore_dataset.py @@ -0,0 +1,31 @@ +from huggingface_hub import hf_hub_download, HfApi +import pandas as pd +import os + +api = HfApi() + +commits = api.list_repo_commits(repo_id='toecm/IEDID', repo_type='dataset') +valid_commit = next((c for c in commits if '9bd61a137a86' in c.commit_id), None) +if valid_commit: + for filename in ['Nigerian Pidgin English.csv', 'Asแปฅsแปฅ Igbo.csv']: + try: + print(f"Restoring {filename}...") + path = hf_hub_download(repo_id='toecm/IEDID', filename=filename, repo_type='dataset', revision=valid_commit.commit_id) + df = pd.read_csv(path) + print(f"Loaded {filename} with {len(df)} rows.") + + # Save it + local_path = f"restored_{filename.replace(' ', '_')}" + df.to_csv(local_path, index=False) + + # Upload back to HF + api.upload_file( + path_or_fileobj=local_path, + path_in_repo=filename, + repo_id='toecm/IEDID', + repo_type='dataset', + commit_message=f"Restore {filename} before bug truncation" + ) + print(f"Successfully restored {filename} to HF Hub") + except Exception as e: + print(f"Failed to restore {filename}: {e}") diff --git a/restore_igbo.py b/restore_igbo.py new file mode 100644 index 0000000000000000000000000000000000000000..f1ecc8cc6405a9393826e1e7adf6ad0033af92ba --- /dev/null +++ b/restore_igbo.py @@ -0,0 +1,30 @@ +from huggingface_hub import hf_hub_download, HfApi +import pandas as pd + +api = HfApi() + +commits = api.list_repo_commits(repo_id='toecm/IEDID', repo_type='dataset') +valid_commit = next((c for c in commits if '9bd61a137a86' in c.commit_id), None) +if valid_commit: + filename = 'Asแปฅsแปฅ Igbo.csv' + try: + print("Restoring Asusu Igbo...") + path = hf_hub_download(repo_id='toecm/IEDID', filename=filename, repo_type='dataset', revision=valid_commit.commit_id) + df = pd.read_csv(path) + print(f"Loaded with {len(df)} rows.") + + # Save it + local_path = "restored_Asusu_Igbo.csv" + df.to_csv(local_path, index=False) + + # Upload back to HF + api.upload_file( + path_or_fileobj=local_path, + path_in_repo=filename, + repo_id='toecm/IEDID', + repo_type='dataset', + commit_message="Restore Asusu Igbo.csv before bug truncation" + ) + print("Successfully restored Asusu Igbo to HF Hub") + except Exception as e: + print(f"Failed to restore: {e}") diff --git a/restored_Asusu_Igbo.csv b/restored_Asusu_Igbo.csv new file mode 100644 index 0000000000000000000000000000000000000000..71ecae5fb62bbd25191ba3cbadf9224fca597a23 --- /dev/null +++ b/restored_Asusu_Igbo.csv @@ -0,0 +1,2 @@ +Utterance,Dialect,Clarification,Tone_Category,Linguistic_Context,Syntax_Pattern,Pragmatic_Analysis,Acoustic_Profile,file_name,audio_file_name,Data_Origin,Clarification_Source,User +Kedแปฅ?,Asแปฅsแปฅ Igbo English,How are you?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,{},,,Game: Relay Pair,Admin Edit,0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7 diff --git a/restored_Nigerian_Pidgin_English.csv b/restored_Nigerian_Pidgin_English.csv new file mode 100644 index 0000000000000000000000000000000000000000..273288b5a071b2bd351ccdb041b605bbfa71da6b --- /dev/null +++ b/restored_Nigerian_Pidgin_English.csv @@ -0,0 +1,148 @@ +Utterance,Dialect,Clarification,Tone_Category,Linguistic_Context,Syntax_Pattern,Pragmatic_Analysis,file_name,Clarification_Source,Data_Origin,audio_file_name,User,Acoustic_Profile +"Abeg, wetin dey sup?",Nigerian Pidgin English,"Please, what's going on?",Neutral / Conversational,"Friendly setting/acquaintance. ""Abeg"" may deflect from a disturbing situation.","\babeg,\ wetin\ dey\ sup\?\b","Abeg (social lubricant), Wetin (interrogative 'what'), Sup (latest news/current reality).",audio/NaijaPidgin English/audio.wav,,,,, +"When I wake for morning like this, I dey quick look my phone first.",Nigerian Pidgin English,"When I wake up in the morning, I quickly check my phone first.",Neutral / Conversational,General,"\bwhen\ i\ wake\ for\ morning\ like\ this,\ i\ dey\ quick\ look\ my\ phone\ first\.\b",Game: Archivist,,,,,, +hobbies ke? You mean wetin I dey like do?,Nigerian Pidgin English,['Hobbies? Are you asking what I enjoy doing?'],Neutral / Conversational,General,\bhobbies\ ke\?\ you\ mean\ wetin\ i\ dey\ like\ do\?\b,Game: SpeedChat,,,,,, +Me I dey like play piano well well,Nigerian Pidgin English,['I really enjoy playing the piano.'],Neutral / Conversational,General,,,,AI,Web,,, +"Because of the work wey I dey do, I no dey quick chop for morning.",Nigerian Pidgin English,"Because of the job I do, I don't usually eat breakfast.",Neutral / Conversational,General,,,,AI,Web,,, +"So, when we dey grow, we been dey six children and my papa and my mama.",Nigerian Pidgin English,"['So, when we were growing up, there were six children, my father, and my mother in the family.']",Neutral / Conversational,General,,,,AI,Web,,, +I dey like to play piano wella.,Nigerian Pidgin English,['I enjoy playing the piano very much.'],Neutral / Conversational,General,,,,AI,Web,,, +I dey plan to waka go climb dat mountain wey dem dey call Geumosan again.,Nigerian Pidgin English,"I am planning to get to the Geeumosan mountain, so that I can climb it.",Neutral / Conversational,General,,,,AI,Web,,, +I no get any particular thing wey I want to talk about. Wetin you fit talk about?,Nigerian Pidgin English,"[""I don't have anything specific I want to talk about. What can you talk about?""]",Conversational,Chat,,Game: Listener,,AI,Web,,, +Ah! You dey speak Pidgin? Stress dey. I dey work since.,Nigerian Pidgin English,Oh! You speak Pidgin? I'm stressed out. I've been working for a long time..,Conversational,Chat,,Game: Listener,,AI,Web,,, +"Ah! Wetin dey sup, my brother?",Nigerian Pidgin English,"[""Hey! What's up, my friend?""]",Neutral / Conversational,General,,,,AI,Web,,, +Na anytime wey I dey talk to my babe.,Nigerian Pidgin English,"[""It's whenever I am talking to my girlfriend.""]",Neutral / Conversational,General,,,,AI,Web,,, +Me I dey like pesin wey dey sabi criticize imself make e improve how e dey behave..,Nigerian Pidgin English,"I prefer a person who is self-reflective, and who is big on self-improvement.",Neutral / Conversational,General,,,,AI,Web,,, +"Pretty much anything, Make we just talk life.",Nigerian Pidgin English,"[""Let's talk about anything, but mostly about life in general.""]",Conversational,Chat,,Interactive Chat Session,,AI,Web,,, +Na luxurious bus be dat nau.,Nigerian Pidgin English,['That is definitely a luxurious bus.'],Neutral / Conversational,General,,,,AI,Web,,, +"two people wen dey on top canoe, wey dey on top water.",Nigerian Pidgin English,"Two people in a canoe, on the water.",Neutral / Conversational,General,,,,AI,Web,,, +My mind just blank. Nothing dey inside.,Nigerian Pidgin English,I have absolutely nothing on my mind.,Conversational,Chat,,Interactive Chat Session,,AI,Web,,, +"Ah, bros, the weather here, e hot sha.",Nigerian Pidgin English,"['Ah, brother, the weather here is really hot.']",Neutral / Conversational,General,,,,AI,Web,,, +"Abeg, me, I dey like waka for city pass beach oh.",Nigerian Pidgin English,"['Please, I prefer walking around the city to going to the beach.']",Neutral / Conversational,General,,,,AI,Web,,, +"mmm, small small sha",Nigerian Pidgin English,"['Yes, but only a little bit.']",Conversational,Chat,,Game: Listener,,AI,Web,,, +I dey like to ride bicycle.,Nigerian Pidgin English,['I enjoy riding a bicycle.'],Neutral / Conversational,General,,,,AI,Web,,, +"Abeg, cat better pass dog. Cat dey sabi dey on im own. Dog, e no dey fit dey on im own.",Nigerian Pidgin English,"Please, cats are better than dogs. A cat knows how to be independent. A dog cannot be independent.",Neutral / Conversational,General,,,,AI,Web,,, +"eh, if you fit find pesin, make you find am nau. Me, I no get any work to do work you.",Nigerian Pidgin English,"Hey, if you can find someone else, go ahead and find them now. As for me, I have nothing to do for you.",Conversational,Chat,,Game: Listener,,AI,Web,,, +E be like advertisement for people wey wan tgo back school.,Nigerian Pidgin English,['It seems like an advertisement for people who want to return to school.'],Neutral / Conversational,General,,,,AI,Web,,, +"My guy, wetin dey happen?",Nigerian Pidgin English,"What's going on, my friend?",Casual / Slang,"The speaker walks in on someone familiar, says hi, and then asks what's going on.",,"""My guy"" is Nigerian pidgin for ""my friend"", but can also be used for others who aren't friends. +""Wetin' is Pidgin for ""what"". +""Dey"" could mean ""is"" in some occasions, but something else in others.",,AI,Web,audio_files/Nigerian_Pidgin_English/audio.wav,, +No dey try me oh!,Nigerian Pidgin English,Stop testing my patience.,Emphatic / Serious,"A neighbour has been testing your patience by parking his vehicle near your door entrance, so that you can't get in or out without squeezing through. When you finally see him, you tell him not to keep trying your patience.",,"""No dey"" is a Nigerian Pidgin English word for ""stop"". ""Try me"" means pushing one to a limit, or testing one's patience.",,AI,Web,audio_files/Nigerian_Pidgin_English/57dd0d5f-9edf-463f-a00a-4354a5bb5649.wav,, +Ah ah! Wetin dey happen nau?,Nigerian Pidgin English,Yo! What's going on?,,,"regex +Ah ah! Wetin dey happen nau\? +",,audio/Nigerian Pidgin English/20260220_193854_9339.wav,,,,, +We fit talk about food?,Nigerian Pidgin English,'Shall we talk about food?' or 'Do you want to talk about food?',Conversational,Chat,,Interactive Chat Session,,User,Web,,, +E go be Reggae oh..,Nigerian Pidgin English,It'd definitely be Reggae.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +E go be Thailand because I hear say the women there dey like take care of the men.,Nigerian Pidgin English,It will probably be Thailand because I heard the women there really like to take care of men.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +Babe wey dey stand beside guy wey siddon.,Nigerian Pidgin English,A girl that's standing next to a guy who is seated.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +No be electric pole be dat?,Nigerian Pidgin English,Isn't that an electric pole?,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +You dey watch football?,Nigerian Pidgin English,'Are you watching football?' or 'Do you watch football?',Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +I no dey too support teams. I just like when Lionel Messi dey play.,Nigerian Pidgin English,I don't usually support football teams very much. I just enjoy watching Lionel Messi play.,Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +Na on top roof of houses wey I dey see like this.,Nigerian Pidgin English,I see the rooftops of houses.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +Na very big wall clock wey dey for wall of building.,Nigerian Pidgin English,It's a very large wall clock that is on the wall of a building.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +"Ah, I no get anything.",Nigerian Pidgin English,"Oh, I don't have anything.",Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +Yo nor dey speak Pidgin English?,Nigerian Pidgin English,Don't you speak Pidgin English?,Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +Nor dey do anyhow.,Nigerian Pidgin English,Stop misbehaving.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +E go be Reggae.,Nigerian Pidgin English,It'd be Reggae.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +E be like me and you dey play?,Nigerian Pidgin English,Is this some kind of joke? Are you taking me for granted? I am not to be trifled with. You think we are equals in this situation to engage in frivolous play?,"Sarcastic, Aggrieved, Challenging","A situation where someone feels disrespected, undervalued, or taken advantage of; potentially a tense situation where boundaries are being tested.",,Expressing annoyance and disapproval; challenging perceived disrespect; establishing dominance or setting boundaries.,audio/audio.wav,User,Lab_Admin_119.56.184.37,,, +"me, I be Waffi boy sha",Nigerian Pidgin English,I am definitely a Waffi boy.,Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +Na my guy Bruce Lee. I wan sabi wetin been dey happen for im mind when e kpai.,Nigerian Pidgin English,"It's my main man, Bruce Lee. I'm really curious to know what he was thinking about when he died.",Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +E be like two big buildings with trees wey dey in front of dem.,Nigerian Pidgin English,It's like two large buildings with trees in front of them.,Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +"Me, I dey rep, I dey rep Delta side sha.",Nigerian Pidgin English,"As for me, I represent, I represent the Delta region, you know?",Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +"Guy, wetin dey work you?",Nigerian Pidgin English,"Hey man, what's bothering you?","Concerned, Casual",Everyday conversation between acquaintances or friends when one notices the other seems troubled or preoccupied.,,Expressing concern and offering a listening ear; showing empathy.,,๐Ÿง  Gemini 2.0 (Cultural Context),Lab_Admin_119.56.184.37,,Admin_001, +"Guy, wetin dey work you!?",Nigerian Pidgin English,"Hey, why are you misbehaving!?","Concerned, Casual",A stern warning from an acquaintances or close friend where the speaker is getting troubled or annoyed by the listener.,,Expressing frustration to the other person.,audio/audio 1.wav,User,Lab_Admin_119.56.184.37,,, +Why you dey stress me?,Nigerian Pidgin English,Why are you bothering or stressing me? What's the reason for your actions that are causing me stress or annoyance?,"Annoyed, Frustrated, Exasperated","A casual conversation, potentially between friends, family members, or acquaintances, where one person feels they are being bothered or pressured by the other's actions or words.",,Expressing annoyance and requesting the other person to stop their behavior that is causing stress; setting a boundary.,,๐Ÿง  Gemini 2.0 (Cultural Context),Lab_Admin_119.56.184.37,,Admin_001, +No dey show yourself!,Nigerian Pidgin English,Stop showing off! or Don't make yourself so conspicuous/noticeable!,"Admonishing, Impatient, Irritated (can also be playful depending on context)","A situation where someone is behaving in a boastful, ostentatious, or attention-seeking manner, or drawing unwanted attention to themselves.",,Expressing disapproval of someone's behavior and urging them to stop; can also serve as a warning to be more discreet.,,๐Ÿง  Gemini 2.0 (Cultural Context),Lab_Admin_119.56.184.37,,Admin_001, +I wan talk about work.,Nigerian Pidgin English,I want to talk about work.,Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +"Man, we just dey rush make we do work, make we post on. Man, we just the rush to walk. Man, we just the rush maker to walk make we post am.",Nigerian Pidgin English,"Damn, we're just hustling, trying to get this work done and post it. Damn, we're just rushing to move forward. Damn, we're just making a big effort to move forward and post it.",Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_119.56.184.37,,, +Na one very big building like that.,Nigerian Pidgin English,"It's a very large building, quite impressive.",Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +"You no go believe am o. Na Geumosan, one devil mountain like dat for Korea.",Nigerian Pidgin English,"You won't believe this! It's Geumosan, which is one of the really scary, devil mountains in Korea.",Neutral / Conversational,General,,,,User,Lab_Admin_119.56.184.37,,, +May we yarn food.,Nigerian Pidgin English,Let's chat about food.,Conversational,Chat,,Interactive Chat Session,,User,Lab_Admin_106.101.137.222,,, +Make we yarn about house.,Nigerian Pidgin English,Let's chat about housing.,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 106.101.137.222, +You dey feel football?,Nigerian Pidgin English,Do you enjoy football?/Do you feel the excitement of football?/Are you into football?,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +"Normally, na Arsenal. But I dey also gbadu Barca.",Nigerian Pidgin English,"Usually, I support Arsenal. But I also really admire Barcelona.",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +Ah! Na goat meat nau. Dat thing make sense die!,Nigerian Pidgin English,Ah! It's freely definitely goat meat. That stuff is incredibly delicious!,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +Na say I deploy my app for online nau.,Nigerian Pidgin English,It's that I successfully deployed my app online.,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +E go be mixed martial arts wey I fit dey defend myself.E go...,Nigerian Pidgin English,It would be some mixed martial arts so I can defend myself. It would...,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +E go be lime.,Nigerian Pidgin English,It'd be line.,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +e go be to play piano oh,Nigerian Pidgin English,It's going to be playing the piano!,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 119.56.184.37, +Food,Nigerian Pidgin English,A request or expression of need for sustenance; could also be a simple statement of fact or observation.,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 202.31.143.81, +E go be Reggae,Nigerian Pidgin English,It's gonna be Reggae music.,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 202.31.143.81, +and talk with the teleto-descriptives.,Nigerian Pidgin English,And chat with the people who specialize in describing things for television or visual media.,Neutral / Conversational,General,,,audio/audio.wav,User,Gradio App,,Admin | Net-IP: 1.212.70.3, +We fit yarn about wetin pesin fit chop?,Nigerian Pidgin English,Are we Can we discuss what to to eat?,Conversational,Chat,,Interactive Chat Session,audio/rec_1772096716_7f4033.wav,User/AI Hybrid,Game: Listener,,0x73f623805b274bf28421553add89f317, +I say make we just order out abeg. I no fit shout.,Nigerian Pidgin English,"I suggest we simply order food. Please, I'm too tired to argue or exert myself.",Conversational,Chat,,Interactive Chat Session,audio/rec_1772096832_221852.wav,User/AI Hybrid,Game: Listener,,0x73f623805b274bf28421553add89f317, +E be like na woman wey carry two bags.,Nigerian Pidgin English,"It seems like (or, It's probably) a woman carrying two bags.",Neutral / Conversational,General,,,audio/rec_1772101586_f4c973.wav,User/AI Hybrid,Game: Vision | Op: 0x366afaf524a843aabba022e1968a3181,,0x366afaf524a843aabba022e1968a3181, +"Na when dis app start to dey work, and the pending file start to dey work.",Nigerian Pidgin English,"It was when this app finally started functioning properly, and when the pending files finally start processing.",Neutral / Conversational,General,,,audio/rec_1772101844_c656a9.wav,User/AI Hybrid,Game: Archivist | Op: 0x366afaf524a843aabba022e1968a3181,,0x366afaf524a843aabba022e1968a3181, +People just plenty for front of building.,Nigerian Pidgin English,There are many people in front of the building.,Neutral / Conversational,General,,,audio/rec_1772131337_745991.wav,User/AI Hybrid,Game: Vision | Op: 0x3eff72b669704e9fba2e55a80cdce8c7,,0x3eff72b669704e9fba2e55a80cdce8c7, +Forget that thing wey you dey yarn!,Nigerian Pidgin English,Ignore or dismiss what you are saying! It's irrelevant or nonsense.,"Dismissive, Impatient, potentially Confrontational (depending on context and relationship)","An argument, a debate, a situation where someone is perceived to be talking foolishly or irrelevantly, or when someone wants to quickly change the topic.",,"Expressing disagreement, dismissing someone's opinion, asserting dominance in a conversation, or quickly changing the subject.",audio/rec_1772131679_24e211.wav,Lab Admin,Gradio Admin UI,,0x9ddf5e209ced4cdeb5d9cfc33096eac2f72d9713, +"E get as this week just be. E just slow., I no sleep well ",Nigerian Pidgin English,"It feels like this week is dragging on forever. It's just so slow. Also, I haven't been sleeping well.",Conversational,Chat,,Interactive Chat Session,audio/rec_1772181210_8367eb.wav,User/AI Hybrid,Game: Listener,,0x3eff72b669704e9fba2e55a80cdce8c7, +Correct goat meat.,Nigerian Pidgin English,Well-made goat meat.,Neutral / Conversational,General,,,audio/rec_1772454639_66a9a6.wav,Admin Edit,Game: Archivist,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe, +Goat wey dem roast.,Nigerian Pidgin English,Roast/roasted goat meat.,Neutral / Conversational,General,,,audio/rec_1772295393_23f398.wav,Admin Edit,Game: SpeedChat,,0x0d49d2d6b1d34f17a038428cd9b991fb, +"E get dis guy, Sean, wey dey make video for Facebook. The guy funny bad bad",Nigerian Pidgin English,"There's this guy, Sean, who makes videos on Facebook. He's extremely funny.",Conversational,Chat,,Interactive Chat Session,audio/rec_1772291700_f5e507.wav,Admin Edit,Game: Listener,,0x0d49d2d6b1d34f17a038428cd9b991fb, +Trees just plenty outside.,Nigerian Pidgin English,There are a lot of trees outside.,Neutral / Conversational,General,,,audio/rec_1772290880_129d5c.wav,Admin Edit,Game: Vision | Op: 0x3eff72b669704e9fba2e55a80cdce8c7,,0x3eff72b669704e9fba2e55a80cdce8c7, +Wetin I dey like do,Nigerian Pidgin English,What I usually like to do.,Conversational,Chat,,Interactive Chat Session,audio/rec_1772291149_4e7e42.wav,Admin Edit,Game: Listener,,0x0d49d2d6b1d34f17a038428cd9b991fb, +I dey see yellow houses,Nigerian Pidgin English,I am seeing yellow houses.,Neutral / Conversational,General,,,audio/rec_1772531698_ab0560.wav,Admin Edit,Game: Vision,,0x82be5a07eda4408cb507bd13b84b2343ac73f617, +Wetin dey happen happen nau?,Nigerian Pidgin English,What is happening?,Casual,"Informal conversations among friends or acquaintances, possibly in a situation of surprise or shock.",,"Showing interest and curiosity about a situation, while possibly establishing solidarity with the speaker or engaging in lighthearted conversation.",audio/rec_1778637109_ad3e72.wav,Lab Admin,Gradio Admin UI,,0x432ce4178d724128ba50e934fac66cb90f453a6a, +Wetin dey happen jor?,Nigerian Pidgin English,"What is happening, really?",Concerned or Exasperated Inquiry,"Informal conversation among friends, family, or in a casual setting, often used to express surprise, concern, or frustration about a situation",,Seeking information or clarification while expressing emotional investment in the outcome or situation,audio/rec_1779585721_272581.wav,Lab Admin,Gradio Admin UI,,0x4deaa09470db471fa960789839766e41da6df956,{} +"My guy, na research wey I dey do oh. I no sleep for like two days.",Nigerian Pidgin English,"Hey friend, I'm seriously engrossed in research right now. I haven't slept in about two days.",Conversational,Chat,,Interactive Chat Session,audio/rec_1772181355_aa38ba.wav,Admin Edit,Game: Listener,,0x3eff72b669704e9fba2e55a80cdce8c7,{} +Na this app nau. Wetin you mean wetin I dey do wey keep me up like this? Na dis app wey I been dey build ,Nigerian Pidgin English,"It's this app, you know? What do you mean by what kept me awake? It's this app I've been building that's been keeping me up.",Conversational,Chat,,Interactive Chat Session,audio/rec_1772181639_924671.wav,Admin Edit,Game: Listener,,0x3eff72b669704e9fba2e55a80cdce8c7,{} +"Na cats anytime. Dogs, e be like say dem no dey fit stay on their own.",Nigerian Pidgin English,"I prefer cats any day. As for dogs, it seems they can't really stay by themselves.",Neutral / Conversational,General,,,audio/rec_1772290519_6e214b.wav,Admin Edit,Game: SpeedChat,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +Make we talk about food.,Nigerian Pidgin English,Let's talk about food.,Conversational,Chat,,Interactive Chat Session,audio/rec_1772246974_1f5be6.wav,Admin Edit,Game: Listener,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +You dey sabi goat meat?,Nigerian Pidgin English,Do you know how to eat goat meat?,Conversational,Chat,,Interactive Chat Session,audio/rec_1772247017_ce0df2.wav,Admin Edit,Game: Listener,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +Houses nyafu nyafu,Nigerian Pidgin English,There are many houses.,Neutral / Conversational,General,,,audio/rec_1772290273_1ad37d.wav,Admin Edit,Game: Vision | Op: 0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +Why e be say to go school dey hard?,Nigerian Pidgin English,Why is it that going to school is difficult?,Conversational,Chat,,Interactive Chat Session,audio/rec_1780990949_d172ad.wav,Admin Edit,Game: Listener,,0x52f1aece9cae417cbeb65c1e3f796d721d5551f3,{} +"I just see say my brain na for academia, nothing else",Nigerian Pidgin English,I realized that my brain is well-suited for academic pursuits,Conversational,Chat,,Interactive Chat Session,audio/rec_1780991165_11ec4f.wav,Admin Edit,Game: Listener,,0x52f1aece9cae417cbeb65c1e3f796d721d5551f3,{} +"I mean, I be 44 year old guy wey dey do grad school for Korea nau",Nigerian Pidgin English,I'm a 44-year-old guy who's currently in graduate school in Korea,Conversational,Chat,,Interactive Chat Session,audio/rec_1780991025_4995bf.wav,Admin Edit,Game: Listener,,0x52f1aece9cae417cbeb65c1e3f796d721d5551f3,{} +I go just use am watch better film like that.,Nigerian Pidgin English,I will just use it to watch a great movie.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +Na pesin big belle.,Nigerian Pidgin English,It's someone's big stomach.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: Vision | Op: 0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +"As I dey so, I don already plan to go climb",Nigerian Pidgin English,"Right now, as you see me, I have already made plans to climb",Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: Archivist | Op: 0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,,0xbc9d5993d17f4f03875e8d045e1b457fba5afbbe,{} +"Nothing go happen oh, life go just carry on.",Nigerian Pidgin English,"Nothing will happen, things will just continue as usual; life goes on.",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x3eff72b669704e9fba2e55a80cdce8c7,{} +"Nothing go happen oh, life go just carry on.",Nigerian Pidgin English,"Nothing will happen, things will just continue as usual; life goes on.",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +"Nothing go happen oh, life go just carry on",Nigerian Pidgin English,"Nothing will happen, things will just continue as usual; life goes on",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener | Op: 0x0d49d2d6b1d34f17a038428cd9b991fb,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +Na northern lights I go go see oh.,Nigerian Pidgin English,I will definitely go and see the Northern Lights.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat | Op: 0x0d49d2d6b1d34f17a038428cd9b991fb,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +Na anytime wey I dey sleep.,Nigerian Pidgin English,It's usually whenever I'm asleep.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat | Op: 0x0d49d2d6b1d34f17a038428cd9b991fb,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +"E go be cats anytime. Dogs, I no too like dem.",Nigerian Pidgin English,Cats are always the better choice. I'm not really a fan of dogs.,Neutral / Conversational,General,,,audio/rec_1772294342_5431c0.wav,Admin Edit,Game: SpeedChat | Op: 0x0d49d2d6b1d34f17a038428cd9b991fb,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +Na the voice command own na im dey sweet me pass.,Nigerian Pidgin English,It's the voice command feature that I find most enjoyable.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +but I don already talk say na voice command na im sweet me pass,Nigerian Pidgin English,But I've already said that voice commands are what I like the most,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +Wetin be dat?,Nigerian Pidgin English,What is that?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x7900B52af0675A7d942E990e2014B16A41482c2D,{} +Wetin be dis?,Nigerian Pidgin English,What is this?,Conversational,Chat,,Interactive Chat Session,audio/rec_1779768621_b0c804.wav,Admin Edit,Game: Listener,,0x7900B52af0675A7d942E990e2014B16A41482c2D,{} +"Ah, wetin dey sup?",Nigerian Pidgin English,"Hey, what's up? ",Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0x0d49d2d6b1d34f17a038428cd9b991fb,{} +"Ah, wetin dey sup?",Nigerian Pidgin English,"Hey, what's going on?",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x9990b3284ca14f45b7a5f0953f4f5b62226acc97,{} +"Ah, wetin dey sup?",Nigerian Pidgin English,"Hey, what's happening?",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x9990b3284ca14f45b7a5f0953f4f5b62226acc97,{} +"So, wetin dey happen? Abeg, talk to me.",Nigerian Pidgin English,"So, what's going on? Please, talk to me.",Conversational,General,,,audio/rec_1772581469_0c3a20.wav,Admin Edit,Game: Archivist,,0x9990b3284ca14f45b7a5f0953f4f5b62226acc97,{} +"Ah, wetin dey sup?",Nigerian Pidgin English,"Hey, what's up? ",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x3eff72b669704e9fba2e55a80cdce8c7,{} +"So, wetin dey happen? Abeg, talk to me.",Nigerian Pidgin English,"So, what's happening? Please, talk to me.",Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x3eff72b669704e9fba2e55a80cdce8c7,{} +Wetin dey happen?,Nigerian Pidgin English,What's going on?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x3eff72b669704e9fba2e55a80cdce8c7,{} +I dey hungry,Nigerian Pidgin English,I'm feeling hungry,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x8663C3cBb4E14eE26d26661137357e30b29c6c6b,{} +I no go chop anything. I dey travel go Philippines.,Nigerian Pidgin English,I won't eat anything. I'm traveling to the Philippines.,Conversational,Chat,,Interactive Chat Session,audio/rec_1778711805_8b153a.wav,Admin Edit,Game: Listener,,0x8663C3cBb4E14eE26d26661137357e30b29c6c6b,{} +I go go Manila ,Nigerian Pidgin English,"I'm off to Manila, or I'm traveling to Manila.",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x8663C3cBb4E14eE26d26661137357e30b29c6c6b,{} +Then why you dey ask me whether I dey go see my sister again?,Nigerian Pidgin English,"Then, why are you asking me if I am going to visit my sister again?",Conversational,Chat,,Interactive Chat Session,audio/rec_1778712100_abdfd1.wav,Admin Edit,Game: Listener,,0x8663C3cBb4E14eE26d26661137357e30b29c6c6b,{} +"No, no, no, I no know wetin you dey talk abeg.",Nigerian Pidgin English,"No, no, no, I don't know what you're talking about.",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x8663C3cBb4E14eE26d26661137357e30b29c6c6b,{} +How far nau? Wetin dey happen?,Nigerian Pidgin English,How are you doing? What's going on?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x8663C3cBb4E14eE26d26661137357e30b29c6c6b,{} +Goat meat. Correct goat meat.,Nigerian Pidgin English,Goat meat. Well made goat meat.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0xb58E86F6545fbeB1A643Af7b6fdE68b8c1708a34,{} +I just like am first time wey I chop am.,Nigerian Pidgin English,I just liked it from the very first moment I ate it.,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0xb58E86F6545fbeB1A643Af7b6fdE68b8c1708a34,{} +"Well, I dey try",Nigerian Pidgin English,"Well, I try",Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0xFe57FC6913fCcc504c1977f666Ccc5c355B9BC96,{} +I dey okay.,Nigerian Pidgin English,I am okay.,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x0f6448409cd545abb665cde7bf0930844928faf6,{} +"Abeg, collect seat",Nigerian Pidgin English,Please take a seat,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0xFe57FC6913fCcc504c1977f666Ccc5c355B9BC96,{} +How far?,Nigerian Pidgin English,How are you doing?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0xcc7bA966864cB03625206F01D0dFD4bb70658A02,{} +Chop beans,Nigerian Pidgin English,Eat beans,Neutral / Conversational,General,,,audio/audio.wav,Admin Edit,Game: SpeedChat,,0xcc7bA966864cB03625206F01D0dFD4bb70658A02,{} +Make you call me Johnson.,Nigerian Pidgin English,You should call me Johnson,Conversational,Chat,,Interactive Chat Session,audio/rec_1779464370_154aa1.wav,Admin Edit,Game: Listener,,0xb58E86F6545fbeB1A643Af7b6fdE68b8c1708a34,{} +The food wey pesin dey chop for prison ,Nigerian Pidgin English,Prison food,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0xb58E86F6545fbeB1A643Af7b6fdE68b8c1708a34,{} +How I wan sabi? I never go prison before.,Nigerian Pidgin English,How am I supposed to know? I've never been to prison before.,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0xb58E86F6545fbeB1A643Af7b6fdE68b8c1708a34,{} +But na wetin I already talk nau.,Nigerian Pidgin English,But that's what I already said.,Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0xb58E86F6545fbeB1A643Af7b6fdE68b8c1708a34,{} +"Oh, na Messi. E just stop to dey play for Barca",Nigerian Pidgin English,"Oh, it's Messi. He recently stopped playing for Barcelona",Conversational,Chat,,Interactive Chat Session,audio/audio.wav,Admin Edit,Game: Listener,,0x7900B52af0675A7d942E990e2014B16A41482c2D,{} +Nothing dey happen. Nothing dey shele.,Nigerian Pidgin English,Nothing is happening. Nothing is going on.,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x7900B52af0675A7d942E990e2014B16A41482c2D,{} +My night bam! How your own be?,Nigerian Pidgin English,My night's great! How's yours?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x7900B52af0675A7d942E990e2014B16A41482c2D,{} +Thunder dey fire person for Korea?,Nigerian Pidgin English,"Does a person face supernatural consequences, or does lightning strike someone, or does God punish anyone in Korea?",Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x96510784f55af7886D5447B01607431aeC4A62d3,{} +Wetin dey sup?,Nigerian Pidgin English,What's happening?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7,{} +Are you vexing for me?,Nigerian Pidgin English,Are you mad at me?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +"I go be Professor. That way, I fit collect better money.",Nigerian Pidgin English,"I'm going to be a Professor, so I can earn better money",Neutral / Conversational,General,,,,Admin Edit,Game: SpeedChat,,0x96510784f55af7886D5447B01607431aeC4A62d3,{} +You don chaw?,Nigerian Pidgin English,Have you eaten?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +Wussup?,Nigerian Pidgin English,"Hello, hi, how are you?",Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +Wahala no dey finish?,Nigerian Pidgin English,Do problems never end?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +Who be dis?,Nigerian Pidgin English,Who is this?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +Who be dat?,Nigerian Pidgin English,Who is that?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +Wetin be dis?,Nigerian Pidgin English,What is this?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +Wetin be dat?,Nigerian Pidgin English,What is that?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x719d270167a44a209dbb4bfef0da6fc150af3b35,{} +"You still dey, abi you don comot, abeg?",Nigerian Pidgin English,"Are you still around, or have you left, please?",Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x4eBFBBA8Dee55b88e7c92304cab5c4A3c450FE6B,{} +I dey kampe. How your side?,Nigerian Pidgin English,I am doing great. How about you?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x499d3AC35EA2EFbEbcE633676B697e3DAc61e4F1,{} +You still dey there?,Nigerian Pidgin English,Are you still there?,Conversational,Relay Peer-to-Peer Chat,,Automated Relay Extraction,,Admin Edit,Game: Relay Pair,,0x4eBFBBA8Dee55b88e7c92304cab5c4A3c450FE6B,{} diff --git a/restored_igbo_out.txt b/restored_igbo_out.txt new file mode 100644 index 0000000000000000000000000000000000000000..1731387bbbba56034d6dc772dc9e40a3f32daebf Binary files /dev/null and b/restored_igbo_out.txt differ diff --git a/restored_igbo_out_utf8.txt b/restored_igbo_out_utf8.txt new file mode 100644 index 0000000000000000000000000000000000000000..0cbd96c34d80ad2881841d979edc6ef7726db6e9 --- /dev/null +++ b/restored_igbo_out_utf8.txt @@ -0,0 +1 @@ +{'Utterance': {0: 'Kedแปฅ?'}, 'Dialect': {0: 'Asแปฅsแปฅ Igbo English'}, 'Clarification': {0: 'How are you?'}, 'Tone_Category': {0: 'Conversational'}, 'Linguistic_Context': {0: 'Relay Peer-to-Peer Chat'}, 'Syntax_Pattern': {0: nan}, 'Pragmatic_Analysis': {0: 'Automated Relay Extraction'}, 'Acoustic_Profile': {0: '{}'}, 'file_name': {0: nan}, 'audio_file_name': {0: nan}, 'Data_Origin': {0: 'Game: Relay Pair'}, 'Clarification_Source': {0: 'Admin Edit'}, 'User': {0: '0xd672E84216CaFAF51dD8cb6A45acFFAf175ac0C7'}} \ No newline at end of file diff --git a/run_api_test.py b/run_api_test.py new file mode 100644 index 0000000000000000000000000000000000000000..cdaf6d3c14333fbb194bc694e6c650a8862e4fca --- /dev/null +++ b/run_api_test.py @@ -0,0 +1,85 @@ +import os +import sys +sys.stdout.reconfigure(encoding='utf-8') +import json +import asyncio + +# Setup paths +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +from config import AppConfig + +def main(): + print("=" * 50) + print("๐Ÿงช Pure Bilingual Versation - Automated Integration Test") + print("=" * 50) + print("\nInitializing Backend Components...") + + AppConfig.setup_directories() + + from src.managers import GroqManager + from src.brain_agent import AgentInterpretation + + groq_manager = GroqManager(AppConfig.GROQ_API_KEY) if AppConfig.GROQ_API_KEY else None + + if not groq_manager: + print("โŒ ERROR: GROQ_API_KEY is not set. Cannot run the generative AI test.") + return + + brain_agent = AgentInterpretation(AppConfig, gemini_manager_instance=groq_manager) + print("โœ… Backend Initialized successfully.\n") + + results_log = [] + + # --------------------------------------------------------- + # TEST 1: Gyeongsang Satoori to Jeju Satoori + # --------------------------------------------------------- + print("๐Ÿš€ [TEST 1] ์‚ฌํˆฌ๋ฆฌ โ†” ์‚ฌํˆฌ๋ฆฌ (Gyeongsang to Jeju)") + input_text_1 = "๋ฐฅ ๋ญ‡๋‚˜? ํผ๋œฉ ์˜จ๋‚˜." + target_dialect_1 = "Jeju Satoori" + print(f" Input (Gyeongsang): {input_text_1}") + print(f" Target: {target_dialect_1}") + + res1 = brain_agent.analyze_dialect_single(input_text_1, target_dialect_1) + + print(" โœ… Result:") + print(json.dumps(res1, indent=4, ensure_ascii=False)) + results_log.append({ + "Test": "Gyeongsang to Jeju", + "Input": input_text_1, + "Target": target_dialect_1, + "Result": res1 + }) + + print("-" * 50) + + # --------------------------------------------------------- + # TEST 2: Jeolla Satoori to American English + # --------------------------------------------------------- + print("๐Ÿš€ [TEST 2] ์‚ฌํˆฌ๋ฆฌ โ†” American English (Jeolla to English)") + input_text_2 = "์•„๋”ฐ, ๊ฑฐ์‹œ๊ธฐ ํ•˜๊ตฌ๋งˆ์ž‰." + target_dialect_2 = "American English" + print(f" Input (Jeolla): {input_text_2}") + print(f" Target: {target_dialect_2}") + + res2 = brain_agent.analyze_dialect_single(input_text_2, target_dialect_2) + + print(" โœ… Result:") + print(json.dumps(res2, indent=4, ensure_ascii=False)) + results_log.append({ + "Test": "Jeolla to American English", + "Input": input_text_2, + "Target": target_dialect_2, + "Result": res2 + }) + + print("=" * 50) + + # Save the log + log_path = r"C:\Users\toecm\.gemini\antigravity-ide\brain\60b47bdd-7a02-416c-8fd4-a63f71c57617\PureBi_Test_Recording.json" + with open(log_path, "w", encoding="utf-8") as f: + json.dump(results_log, f, indent=4, ensure_ascii=False) + + print(f"\n๐ŸŽฅ Test recording saved to: {log_path}") + +if __name__ == "__main__": + main() diff --git a/search_pending.py b/search_pending.py new file mode 100644 index 0000000000000000000000000000000000000000..6474f9e5787a93982a67921cefb446843cb39028 --- /dev/null +++ b/search_pending.py @@ -0,0 +1,8 @@ +import codecs + +with codecs.open('c:\\Users\\toecm\\Documents\\Pure Versation\\pureversation\\backend\\src\\trust_agent.py', 'r', 'utf-8') as f: + lines = f.readlines() + +for i, line in enumerate(lines): + if 'pending' in line.lower() or 'approve' in line.lower(): + print(f"Line {i+1}: {line.strip()}") diff --git a/search_pending2.py b/search_pending2.py new file mode 100644 index 0000000000000000000000000000000000000000..f60af830372d094ae6cc5d69ae85e8451c8b2659 --- /dev/null +++ b/search_pending2.py @@ -0,0 +1,9 @@ +import codecs + +with codecs.open('c:\\Users\\toecm\\Documents\\Pure Versation\\pureversation\\backend\\src\\trust_agent.py', 'r', 'utf-8') as f: + lines = f.readlines() + +with codecs.open('search_pending_out.txt', 'w', 'utf-8') as out: + for i, line in enumerate(lines): + if 'pending' in line.lower() or 'approve' in line.lower(): + out.write(f"Line {i+1}: {line.strip()}\n") diff --git a/search_pending_out.txt b/search_pending_out.txt new file mode 100644 index 0000000000000000000000000000000000000000..86298066fa0e9f6a7177ebecf1243d7e8a27060d --- /dev/null +++ b/search_pending_out.txt @@ -0,0 +1,9 @@ +Line 25: self.queue_file = "/app/pending_tx_queue.json" +Line 31: print("โ˜๏ธ Checking Hugging Face for existing pending transaction queue...") +Line 35: filename="pending_tx_queue.json", +Line 40: print("โœ… Successfully recovered pending queue from Hugging Face!") +Line 151: print("โœ… ALL PENDING TRANSACTIONS MINTED. Queue is now empty.\n") +Line 365: expected_cols = ["Timestamp", "Utterance", "Dialect", "Data_Origin", "Data_Approved", "Block", "Speed", "TX Hash", "IPFS CID"] +Line 633: "Data_Approved": f"Lab Approved: {self.account.address[:6]}...{self.account.address[-4:]}" if self.account else "Lab Approved", +Line 684: nonce = self.w3.eth.get_transaction_count(self.account.address, 'pending') +Line 716: nonce = self.w3.eth.get_transaction_count(self.account.address, 'pending') diff --git a/src/PureBi.sol b/src/PureBi.sol new file mode 100644 index 0000000000000000000000000000000000000000..5f7522e7dd5eca463f95a4d125ff10c1e699afcb --- /dev/null +++ b/src/PureBi.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureBi { + + // --- 0. BRANDING --- + string public constant name = "PureBilingualVersation Research Registry"; + string public constant symbol = "PURE BI-VERSATION"; + + // --- 1. IDENTITY & REPUTATION (PER DIALECT) --- + mapping(address => bool) public isRegistered; + // user -> dialect -> xp + mapping(address => mapping(string => uint256)) public userXP; + // user -> dialect -> role + mapping(address => mapping(string => string)) public userRole; + // Global admin checking + mapping(address => bool) public isAdmin; + + address public labAdmin; // The Gasless Relayer (Python Backend) + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; + string dialect; + string ipfsCid; + address contributor; + string licenseType; + uint256 verificationCount; + uint256 rejectionCount; + bool isVerified; + bool isBurned; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // Consensus Tracking (entry_id -> user -> bool) + mapping(uint256 => mapping(address => bool)) public hasVoted; + + // The Burn Ward Tracking + mapping(uint256 => string) public burnReasons; + mapping(uint256 => address[]) public rejectorsList; + mapping(uint256 => uint256) public appealCount; + mapping(uint256 => mapping(address => bool)) public hasAppealed; + + // --- 3. BACKUP SYSTEM --- + struct DataSnapshot { + uint256 timestamp; + string dataType; + string ipfsCid; + string description; + } + + mapping(string => DataSnapshot[]) public backups; + + // --- 4. EVENTS --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event EntryRejected(uint256 indexed id, address indexed rejector, string reason); + event EntryBurned(uint256 indexed id, address indexed contributor, string reason); + event EntryAppealed(uint256 indexed id, address indexed appealer, bool success); + event ReputationMinted(address indexed researcher, string dialect, uint256 amount); + event RankUpgraded(address indexed researcher, string dialect, string newRole); + event BackupCreated(string indexed dataKey, string ipfsCid, uint256 timestamp); + + constructor() { + labAdmin = msg.sender; // The Python Backend Wallet + isAdmin[msg.sender] = true; + } + + // --- MODIFIERS --- + modifier onlyRelayer() { + require(msg.sender == labAdmin, "Only the Python Relayer can execute transactions"); + _; + } + + // --- CORE FUNCTIONS --- + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license, address _contributor) public onlyRelayer returns (uint256) { + entryCounter++; + + entries[entryCounter] = DialectEntry(entryCounter, _phrase, _dialect, _ipfsCid, _contributor, _license, 0, 0, false, false); + emit EntryProposed(entryCounter, _phrase, _contributor); + + if (!isRegistered[_contributor]) { + isRegistered[_contributor] = true; + } + + // Auto-register brand new React users as Initiates in this dialect if they have no role + if (bytes(userRole[_contributor][_dialect]).length == 0 && !isAdmin[_contributor]) { + userRole[_contributor][_dialect] = "Initiate"; + } + + return entryCounter; + } + + function verifyEntry(uint256 _id, address _verifier) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _verifier, "Cannot verify own entry"); + require(!hasVoted[_id][_verifier], "User already voted"); + + string memory role = userRole[_verifier][entry.dialect]; + bool isGod = isAdmin[_verifier]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can verify"); + + hasVoted[_id][_verifier] = true; + _mintReputation(_verifier, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyVerification(_id); + } else { + entry.verificationCount++; + if (entry.verificationCount >= 2) { + _applyVerification(_id); + } + } + } + + function _applyVerification(uint256 _id) internal { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, entries[_id].dialect, 50); // +50 XP to the original submitter + emit EntryVerified(_id, msg.sender); + } + + function rejectEntry(uint256 _id, address _rejector, string memory _reason) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _rejector, "Cannot reject own entry"); + require(!hasVoted[_id][_rejector], "User already voted"); + + string memory role = userRole[_rejector][entry.dialect]; + bool isGod = isAdmin[_rejector]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can reject"); + + hasVoted[_id][_rejector] = true; + rejectorsList[_id].push(_rejector); // Track for potential penalty + _mintReputation(_rejector, entry.dialect, 10); // +10 XP for doing the audit + + emit EntryRejected(_id, _rejector, _reason); + + if (isGod) { + _applyBurn(_id, _reason); + } else { + entry.rejectionCount++; + if (entry.rejectionCount >= 3) { + _applyBurn(_id, _reason); + } + } + } + + function _applyBurn(uint256 _id, string memory _reason) internal { + entries[_id].isBurned = true; + burnReasons[_id] = _reason; + + address badActor = entries[_id].contributor; + string memory dialect = entries[_id].dialect; + + // Burn -10 XP from the contributor + if (userXP[badActor][dialect] >= 10) { + userXP[badActor][dialect] -= 10; + } else { + userXP[badActor][dialect] = 0; + } + + _updateRank(badActor, dialect); + emit EntryBurned(_id, badActor, _reason); + } + + function appealEntry(uint256 _id, address _appealer) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(entry.isBurned, "Entry is not burned"); + require(!hasAppealed[_id][_appealer], "User already appealed"); + + string memory role = userRole[_appealer][entry.dialect]; + bool isGod = isAdmin[_appealer]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can appeal"); + + hasAppealed[_id][_appealer] = true; + appealCount[_id]++; + + // +10 XP for auditing the graveyard + _mintReputation(_appealer, entry.dialect, 10); + + if (isGod || appealCount[_id] >= 2) { + // Overturn the rejection! + entry.isBurned = false; + entry.isVerified = true; + + // Restore submitter's 50 XP + 10 XP penalty refund + _mintReputation(entry.contributor, entry.dialect, 60); + + // Penalize the original rejectors -15 XP each + address[] memory rejectors = rejectorsList[_id]; + for(uint i=0; i= 15) { + userXP[r][entry.dialect] -= 15; + } else { + userXP[r][entry.dialect] = 0; + } + _updateRank(r, entry.dialect); + } + + emit EntryAppealed(_id, _appealer, true); + } else { + emit EntryAppealed(_id, _appealer, false); + } + } + + function createBackup(string memory _dataKey, string memory _dataType, string memory _ipfsCid, string memory _description) public onlyRelayer { + DataSnapshot memory newSnap = DataSnapshot(block.timestamp, _dataType, _ipfsCid, _description); + backups[_dataKey].push(newSnap); + emit BackupCreated(_dataKey, _ipfsCid, block.timestamp); + } + + // --- INTERNAL REPUTATION & RANKING LOGIC --- + function _mintReputation(address _user, string memory _dialect, uint256 _amount) internal { + userXP[_user][_dialect] += _amount; + emit ReputationMinted(_user, _dialect, _amount); + _updateRank(_user, _dialect); + } + + function _updateRank(address _user, string memory _dialect) internal { + if (isAdmin[_user]) return; + + uint256 score = userXP[_user][_dialect]; + string memory newRole; + + if (score >= 1500) { newRole = "Oracle"; } + else if (score >= 800) { newRole = "Archivist"; } + else if (score >= 300) { newRole = "Linguist"; } + else if (score >= 100) { newRole = "Scout"; } + else { newRole = "Initiate"; } + + if (keccak256(abi.encodePacked(userRole[_user][_dialect])) != keccak256(abi.encodePacked(newRole))) { + userRole[_user][_dialect] = newRole; + emit RankUpgraded(_user, _dialect, newRole); + } + } + + // --- MIGRATION QUERIES --- + function batchMigrateXP(address[] memory _users, string[] memory _dialects, uint256[] memory _xps) public onlyRelayer { + require(_users.length == _dialects.length && _users.length == _xps.length, "Array lengths mismatch"); + for(uint i=0; i<_users.length; i++){ + userXP[_users[i]][_dialects[i]] += _xps[i]; + _updateRank(_users[i], _dialects[i]); + emit ReputationMinted(_users[i], _dialects[i], _xps[i]); + } + } + + // --- HELPER QUERIES --- + function getRole(address _user, string memory _dialect) public view returns (string memory) { + if (isAdmin[_user]) return "Admin"; + if (bytes(userRole[_user][_dialect]).length == 0) return "Initiate"; + return userRole[_user][_dialect]; + } + + function getXP(address _user, string memory _dialect) public view returns (uint256) { + return userXP[_user][_dialect]; + } +} diff --git a/src/PureBi_Jun11.sol b/src/PureBi_Jun11.sol new file mode 100644 index 0000000000000000000000000000000000000000..fe5151c82b3815350ebba5e9086a30902654b6c3 --- /dev/null +++ b/src/PureBi_Jun11.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureBi_Jun11 { + + // --- 0. BRANDING --- + string public constant name = "PureBilingual Versation June 11, 2026 Research Registry"; + string public constant symbol = "VERSATION"; + + // --- 1. IDENTITY & REPUTATION (PER DIALECT) --- + mapping(address => bool) public isRegistered; + // user -> dialect -> xp + mapping(address => mapping(string => uint256)) public userXP; + // user -> dialect -> role + mapping(address => mapping(string => string)) public userRole; + // Global admin checking + mapping(address => bool) public isAdmin; + + address public labAdmin; // The Gasless Relayer (Python Backend) + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; + string dialect; + string ipfsCid; + address contributor; + string licenseType; + uint256 verificationCount; + uint256 rejectionCount; + bool isVerified; + bool isBurned; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // Consensus Tracking (entry_id -> user -> bool) + mapping(uint256 => mapping(address => bool)) public hasVoted; + + // --- 3. BACKUP SYSTEM --- + struct DataSnapshot { + uint256 timestamp; + string dataType; + string ipfsCid; + string description; + } + + mapping(string => DataSnapshot[]) public backups; + + // --- 4. EVENTS --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event EntryRejected(uint256 indexed id, address indexed rejector); + event EntryBurned(uint256 indexed id, address indexed contributor); + event ReputationMinted(address indexed researcher, string dialect, uint256 amount); + event RankUpgraded(address indexed researcher, string dialect, string newRole); + event BackupCreated(string indexed dataKey, string ipfsCid, uint256 timestamp); + + constructor() { + labAdmin = msg.sender; // The Python Backend Wallet + isAdmin[msg.sender] = true; + } + + // --- MODIFIERS --- + modifier onlyRelayer() { + require(msg.sender == labAdmin, "Only the Python Relayer can execute transactions"); + _; + } + + // --- CORE FUNCTIONS --- + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license, address _contributor) public onlyRelayer returns (uint256) { + entryCounter++; + + entries[entryCounter] = DialectEntry(entryCounter, _phrase, _dialect, _ipfsCid, _contributor, _license, 0, 0, false, false); + emit EntryProposed(entryCounter, _phrase, _contributor); + + if (!isRegistered[_contributor]) { + isRegistered[_contributor] = true; + } + + // Auto-register brand new React users as Initiates in this dialect if they have no role + if (bytes(userRole[_contributor][_dialect]).length == 0 && !isAdmin[_contributor]) { + userRole[_contributor][_dialect] = "Initiate"; + } + + return entryCounter; + } + + function verifyEntry(uint256 _id, address _verifier) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _verifier, "Cannot verify own entry"); + require(!hasVoted[_id][_verifier], "User already voted"); + + string memory role = userRole[_verifier][entry.dialect]; + bool isGod = isAdmin[_verifier]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can verify"); + + hasVoted[_id][_verifier] = true; + _mintReputation(_verifier, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyVerification(_id); + } else { + entry.verificationCount++; + if (entry.verificationCount >= 3) { + _applyVerification(_id); + } + } + } + + function _applyVerification(uint256 _id) internal { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, entries[_id].dialect, 50); // +50 XP to the original submitter + emit EntryVerified(_id, msg.sender); + } + + function rejectEntry(uint256 _id, address _rejector) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _rejector, "Cannot reject own entry"); + require(!hasVoted[_id][_rejector], "User already voted"); + + string memory role = userRole[_rejector][entry.dialect]; + bool isGod = isAdmin[_rejector]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can reject"); + + hasVoted[_id][_rejector] = true; + _mintReputation(_rejector, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyBurn(_id); + } else { + entry.rejectionCount++; + if (entry.rejectionCount >= 3) { + _applyBurn(_id); + } + } + } + + function _applyBurn(uint256 _id) internal { + entries[_id].isBurned = true; + address badActor = entries[_id].contributor; + string memory dialect = entries[_id].dialect; + + // Burn -10 XP from the contributor + if (userXP[badActor][dialect] >= 10) { + userXP[badActor][dialect] -= 10; + } else { + userXP[badActor][dialect] = 0; + } + + _updateRank(badActor, dialect); + emit EntryBurned(_id, badActor); + } + + function createBackup(string memory _dataKey, string memory _dataType, string memory _ipfsCid, string memory _description) public onlyRelayer { + DataSnapshot memory newSnap = DataSnapshot(block.timestamp, _dataType, _ipfsCid, _description); + backups[_dataKey].push(newSnap); + emit BackupCreated(_dataKey, _ipfsCid, block.timestamp); + } + + // --- INTERNAL REPUTATION & RANKING LOGIC --- + function _mintReputation(address _user, string memory _dialect, uint256 _amount) internal { + userXP[_user][_dialect] += _amount; + emit ReputationMinted(_user, _dialect, _amount); + _updateRank(_user, _dialect); + } + + function _updateRank(address _user, string memory _dialect) internal { + if (isAdmin[_user]) return; + + uint256 score = userXP[_user][_dialect]; + string memory newRole; + + if (score >= 1500) { newRole = "Oracle"; } + else if (score >= 800) { newRole = "Archivist"; } + else if (score >= 300) { newRole = "Linguist"; } + else if (score >= 100) { newRole = "Scout"; } + else { newRole = "Initiate"; } + + if (keccak256(abi.encodePacked(userRole[_user][_dialect])) != keccak256(abi.encodePacked(newRole))) { + userRole[_user][_dialect] = newRole; + emit RankUpgraded(_user, _dialect, newRole); + } + } + + // --- HELPER QUERIES --- + function getRole(address _user, string memory _dialect) public view returns (string memory) { + if (isAdmin[_user]) return "Admin"; + if (bytes(userRole[_user][_dialect]).length == 0) return "Initiate"; + return userRole[_user][_dialect]; + } + + function getXP(address _user, string memory _dialect) public view returns (uint256) { + return userXP[_user][_dialect]; + } +} diff --git a/src/PureBi_Jun12.sol b/src/PureBi_Jun12.sol new file mode 100644 index 0000000000000000000000000000000000000000..255b5e18269c1c558f558d10b4e56df93c6c028f --- /dev/null +++ b/src/PureBi_Jun12.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureBi_Jun12 { + + // --- 0. BRANDING --- + string public constant name = "PureBilingual Versation June 2, 2026 Research Registry"; + string public constant symbol = "VERSATION"; + + // --- 1. IDENTITY & REPUTATION (PER DIALECT) --- + mapping(address => bool) public isRegistered; + // user -> dialect -> xp + mapping(address => mapping(string => uint256)) public userXP; + // user -> dialect -> role + mapping(address => mapping(string => string)) public userRole; + // Global admin checking + mapping(address => bool) public isAdmin; + + address public labAdmin; // The Gasless Relayer (Python Backend) + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; + string dialect; + string ipfsCid; + address contributor; + string licenseType; + uint256 verificationCount; + uint256 rejectionCount; + bool isVerified; + bool isBurned; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // Consensus Tracking (entry_id -> user -> bool) + mapping(uint256 => mapping(address => bool)) public hasVoted; + + // --- 3. BACKUP SYSTEM --- + struct DataSnapshot { + uint256 timestamp; + string dataType; + string ipfsCid; + string description; + } + + mapping(string => DataSnapshot[]) public backups; + + // --- 4. EVENTS --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event EntryRejected(uint256 indexed id, address indexed rejector); + event EntryBurned(uint256 indexed id, address indexed contributor); + event ReputationMinted(address indexed researcher, string dialect, uint256 amount); + event RankUpgraded(address indexed researcher, string dialect, string newRole); + event BackupCreated(string indexed dataKey, string ipfsCid, uint256 timestamp); + + constructor() { + labAdmin = msg.sender; // The Python Backend Wallet + isAdmin[msg.sender] = true; + } + + // --- MODIFIERS --- + modifier onlyRelayer() { + require(msg.sender == labAdmin, "Only the Python Relayer can execute transactions"); + _; + } + + // --- CORE FUNCTIONS --- + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license, address _contributor) public onlyRelayer returns (uint256) { + entryCounter++; + + entries[entryCounter] = DialectEntry(entryCounter, _phrase, _dialect, _ipfsCid, _contributor, _license, 0, 0, false, false); + emit EntryProposed(entryCounter, _phrase, _contributor); + + if (!isRegistered[_contributor]) { + isRegistered[_contributor] = true; + } + + // Auto-register brand new React users as Initiates in this dialect if they have no role + if (bytes(userRole[_contributor][_dialect]).length == 0 && !isAdmin[_contributor]) { + userRole[_contributor][_dialect] = "Initiate"; + } + + return entryCounter; + } + + function verifyEntry(uint256 _id, address _verifier) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _verifier, "Cannot verify own entry"); + require(!hasVoted[_id][_verifier], "User already voted"); + + string memory role = userRole[_verifier][entry.dialect]; + bool isGod = isAdmin[_verifier]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can verify"); + + hasVoted[_id][_verifier] = true; + _mintReputation(_verifier, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyVerification(_id); + } else { + entry.verificationCount++; + if (entry.verificationCount >= 2) { + _applyVerification(_id); + } + } + } + + function _applyVerification(uint256 _id) internal { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, entries[_id].dialect, 50); // +50 XP to the original submitter + emit EntryVerified(_id, msg.sender); + } + + function rejectEntry(uint256 _id, address _rejector) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _rejector, "Cannot reject own entry"); + require(!hasVoted[_id][_rejector], "User already voted"); + + string memory role = userRole[_rejector][entry.dialect]; + bool isGod = isAdmin[_rejector]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can reject"); + + hasVoted[_id][_rejector] = true; + _mintReputation(_rejector, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyBurn(_id); + } else { + entry.rejectionCount++; + if (entry.rejectionCount >= 3) { + _applyBurn(_id); + } + } + } + + function _applyBurn(uint256 _id) internal { + entries[_id].isBurned = true; + address badActor = entries[_id].contributor; + string memory dialect = entries[_id].dialect; + + // Burn -10 XP from the contributor + if (userXP[badActor][dialect] >= 10) { + userXP[badActor][dialect] -= 10; + } else { + userXP[badActor][dialect] = 0; + } + + _updateRank(badActor, dialect); + emit EntryBurned(_id, badActor); + } + + function createBackup(string memory _dataKey, string memory _dataType, string memory _ipfsCid, string memory _description) public onlyRelayer { + DataSnapshot memory newSnap = DataSnapshot(block.timestamp, _dataType, _ipfsCid, _description); + backups[_dataKey].push(newSnap); + emit BackupCreated(_dataKey, _ipfsCid, block.timestamp); + } + + // --- INTERNAL REPUTATION & RANKING LOGIC --- + function _mintReputation(address _user, string memory _dialect, uint256 _amount) internal { + userXP[_user][_dialect] += _amount; + emit ReputationMinted(_user, _dialect, _amount); + _updateRank(_user, _dialect); + } + + function _updateRank(address _user, string memory _dialect) internal { + if (isAdmin[_user]) return; + + uint256 score = userXP[_user][_dialect]; + string memory newRole; + + if (score >= 1500) { newRole = "Oracle"; } + else if (score >= 800) { newRole = "Archivist"; } + else if (score >= 300) { newRole = "Linguist"; } + else if (score >= 100) { newRole = "Scout"; } + else { newRole = "Initiate"; } + + if (keccak256(abi.encodePacked(userRole[_user][_dialect])) != keccak256(abi.encodePacked(newRole))) { + userRole[_user][_dialect] = newRole; + emit RankUpgraded(_user, _dialect, newRole); + } + } + + // --- MIGRATION QUERIES --- + function batchMigrateXP(address[] memory _users, string[] memory _dialects, uint256[] memory _xps) public onlyRelayer { + require(_users.length == _dialects.length && _users.length == _xps.length, "Array lengths mismatch"); + for(uint i=0; i<_users.length; i++){ + userXP[_users[i]][_dialects[i]] += _xps[i]; + _updateRank(_users[i], _dialects[i]); + emit ReputationMinted(_users[i], _dialects[i], _xps[i]); + } + } + + // --- HELPER QUERIES --- + function getRole(address _user, string memory _dialect) public view returns (string memory) { + if (isAdmin[_user]) return "Admin"; + if (bytes(userRole[_user][_dialect]).length == 0) return "Initiate"; + return userRole[_user][_dialect]; + } + + function getXP(address _user, string memory _dialect) public view returns (uint256) { + return userXP[_user][_dialect]; + } +} diff --git a/src/PureBi_Jun13.sol b/src/PureBi_Jun13.sol new file mode 100644 index 0000000000000000000000000000000000000000..b8616dadc620f7c2736d830632b5d972298c75d5 --- /dev/null +++ b/src/PureBi_Jun13.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureBi_Jun13 { + + // --- 0. BRANDING --- + string public constant name = "PureBilingual Versation June 13, 2026 Research Registry"; + string public constant symbol = "VERSATION"; + + // --- 1. IDENTITY & REPUTATION (PER DIALECT) --- + mapping(address => bool) public isRegistered; + // user -> dialect -> xp + mapping(address => mapping(string => uint256)) public userXP; + // user -> dialect -> role + mapping(address => mapping(string => string)) public userRole; + // Global admin checking + mapping(address => bool) public isAdmin; + + address public labAdmin; // The Gasless Relayer (Python Backend) + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; + string dialect; + string ipfsCid; + address contributor; + string licenseType; + uint256 verificationCount; + uint256 rejectionCount; + bool isVerified; + bool isBurned; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // Consensus Tracking (entry_id -> user -> bool) + mapping(uint256 => mapping(address => bool)) public hasVoted; + + // --- 3. BACKUP SYSTEM --- + struct DataSnapshot { + uint256 timestamp; + string dataType; + string ipfsCid; + string description; + } + + mapping(string => DataSnapshot[]) public backups; + + // --- 4. EVENTS --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event EntryRejected(uint256 indexed id, address indexed rejector); + event EntryBurned(uint256 indexed id, address indexed contributor); + event ReputationMinted(address indexed researcher, string dialect, uint256 amount); + event RankUpgraded(address indexed researcher, string dialect, string newRole); + event BackupCreated(string indexed dataKey, string ipfsCid, uint256 timestamp); + + constructor() { + labAdmin = msg.sender; // The Python Backend Wallet + isAdmin[msg.sender] = true; + } + + // --- MODIFIERS --- + modifier onlyRelayer() { + require(msg.sender == labAdmin, "Only the Python Relayer can execute transactions"); + _; + } + + // --- CORE FUNCTIONS --- + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license, address _contributor) public onlyRelayer returns (uint256) { + entryCounter++; + + entries[entryCounter] = DialectEntry(entryCounter, _phrase, _dialect, _ipfsCid, _contributor, _license, 0, 0, false, false); + emit EntryProposed(entryCounter, _phrase, _contributor); + + if (!isRegistered[_contributor]) { + isRegistered[_contributor] = true; + } + + // Auto-register brand new React users as Initiates in this dialect if they have no role + if (bytes(userRole[_contributor][_dialect]).length == 0 && !isAdmin[_contributor]) { + userRole[_contributor][_dialect] = "Initiate"; + } + + return entryCounter; + } + + function verifyEntry(uint256 _id, address _verifier) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _verifier, "Cannot verify own entry"); + require(!hasVoted[_id][_verifier], "User already voted"); + + string memory role = userRole[_verifier][entry.dialect]; + bool isGod = isAdmin[_verifier]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can verify"); + + hasVoted[_id][_verifier] = true; + _mintReputation(_verifier, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyVerification(_id); + } else { + entry.verificationCount++; + if (entry.verificationCount >= 2) { + _applyVerification(_id); + } + } + } + + function _applyVerification(uint256 _id) internal { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, entries[_id].dialect, 50); // +50 XP to the original submitter + emit EntryVerified(_id, msg.sender); + } + + function rejectEntry(uint256 _id, address _rejector) public onlyRelayer { + DialectEntry storage entry = entries[_id]; + require(!entry.isVerified && !entry.isBurned, "Entry already resolved"); + require(entry.contributor != _rejector, "Cannot reject own entry"); + require(!hasVoted[_id][_rejector], "User already voted"); + + string memory role = userRole[_rejector][entry.dialect]; + bool isGod = isAdmin[_rejector]; + bool isOracle = keccak256(bytes(role)) == keccak256(bytes("Oracle")); + + require(isGod || isOracle, "Only Admins or Oracles can reject"); + + hasVoted[_id][_rejector] = true; + _mintReputation(_rejector, entry.dialect, 10); // +10 XP for doing the audit + + if (isGod) { + _applyBurn(_id); + } else { + entry.rejectionCount++; + if (entry.rejectionCount >= 3) { + _applyBurn(_id); + } + } + } + + function _applyBurn(uint256 _id) internal { + entries[_id].isBurned = true; + address badActor = entries[_id].contributor; + string memory dialect = entries[_id].dialect; + + // Burn -10 XP from the contributor + if (userXP[badActor][dialect] >= 10) { + userXP[badActor][dialect] -= 10; + } else { + userXP[badActor][dialect] = 0; + } + + _updateRank(badActor, dialect); + emit EntryBurned(_id, badActor); + } + + function createBackup(string memory _dataKey, string memory _dataType, string memory _ipfsCid, string memory _description) public onlyRelayer { + DataSnapshot memory newSnap = DataSnapshot(block.timestamp, _dataType, _ipfsCid, _description); + backups[_dataKey].push(newSnap); + emit BackupCreated(_dataKey, _ipfsCid, block.timestamp); + } + + // --- INTERNAL REPUTATION & RANKING LOGIC --- + function _mintReputation(address _user, string memory _dialect, uint256 _amount) internal { + userXP[_user][_dialect] += _amount; + emit ReputationMinted(_user, _dialect, _amount); + _updateRank(_user, _dialect); + } + + function _updateRank(address _user, string memory _dialect) internal { + if (isAdmin[_user]) return; + + uint256 score = userXP[_user][_dialect]; + string memory newRole; + + if (score >= 1500) { newRole = "Oracle"; } + else if (score >= 800) { newRole = "Archivist"; } + else if (score >= 300) { newRole = "Linguist"; } + else if (score >= 100) { newRole = "Scout"; } + else { newRole = "Initiate"; } + + if (keccak256(abi.encodePacked(userRole[_user][_dialect])) != keccak256(abi.encodePacked(newRole))) { + userRole[_user][_dialect] = newRole; + emit RankUpgraded(_user, _dialect, newRole); + } + } + + // --- MIGRATION QUERIES --- + function batchMigrateXP(address[] memory _users, string[] memory _dialects, uint256[] memory _xps) public onlyRelayer { + require(_users.length == _dialects.length && _users.length == _xps.length, "Array lengths mismatch"); + for(uint i=0; i<_users.length; i++){ + userXP[_users[i]][_dialects[i]] += _xps[i]; + _updateRank(_users[i], _dialects[i]); + emit ReputationMinted(_users[i], _dialects[i], _xps[i]); + } + } + + // --- HELPER QUERIES --- + function getRole(address _user, string memory _dialect) public view returns (string memory) { + if (isAdmin[_user]) return "Admin"; + if (bytes(userRole[_user][_dialect]).length == 0) return "Initiate"; + return userRole[_user][_dialect]; + } + + function getXP(address _user, string memory _dialect) public view returns (uint256) { + return userXP[_user][_dialect]; + } +} diff --git a/src/PureBi_compiled.json b/src/PureBi_compiled.json new file mode 100644 index 0000000000000000000000000000000000000000..80fdb61ac1eefdfcb96bebfc6467edace73c8daf --- /dev/null +++ b/src/PureBi_compiled.json @@ -0,0 +1,752 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "dataKey", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "BackupCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "appealer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "name": "EntryAppealed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EntryBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "indexed": true, + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "EntryProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "rejector", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "EntryRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "EntryVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "researcher", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "dialect", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "newRole", + "type": "string" + } + ], + "name": "RankUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "researcher", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "dialect", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ReputationMinted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "appealCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_appealer", + "type": "address" + } + ], + "name": "appealEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "backups", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataType", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_users", + "type": "address[]" + }, + { + "internalType": "string[]", + "name": "_dialects", + "type": "string[]" + }, + { + "internalType": "uint256[]", + "name": "_xps", + "type": "uint256[]" + } + ], + "name": "batchMigrateXP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "burnReasons", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_dataKey", + "type": "string" + }, + { + "internalType": "string", + "name": "_dataType", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_description", + "type": "string" + } + ], + "name": "createBackup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "entries", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "internalType": "string", + "name": "licenseType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "verificationCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rejectionCount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isVerified", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBurned", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "entryCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "string", + "name": "_dialect", + "type": "string" + } + ], + "name": "getRole", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "string", + "name": "_dialect", + "type": "string" + } + ], + "name": "getXP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "hasAppealed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isRegistered", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "labAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "_dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_license", + "type": "string" + }, + { + "internalType": "address", + "name": "_contributor", + "type": "address" + } + ], + "name": "proposeEntry", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_rejector", + "type": "address" + }, + { + "internalType": "string", + "name": "_reason", + "type": "string" + } + ], + "name": "rejectEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rejectorsList", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "userRole", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "userXP", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_verifier", + "type": "address" + } + ], + "name": "verifyEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "608060405234801561001057600080fd5b5033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550614988806100b96000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636fecc578116100c357806398c654441161007c57806398c65444146103ea578063adeb94221461041a578063b30906d41461044a578063b6602c3a14610483578063c3c5a5471461049f578063e8a3c5a7146104cf5761014d565b80636fecc5781461030257806386c8ce7f1461031e5780638b9230a31461033c5780638f28660f1461036c578063945c12b81461039c57806395d89b41146103cc5761014d565b80632dfd9451116101155780632dfd94511461021c57806334feec731461024c578063414b5ef214610268578063438596321461029857806362da8313146102c85780636e12e1fd146102e65761014d565b806306fdde031461015257806308a0e3131461017057806312950c97146101a057806324d7806c146101bc578063284499fd146101ec575b600080fd5b61015a610502565b6040516101679190614298565b60405180910390f35b61018a60048036038101906101859190613b93565b61051e565b6040516101979190614481565b60405180910390f35b6101ba60048036038101906101b59190613ce7565b6109d4565b005b6101d660048036038101906101d191906139bc565b610f35565b6040516101e3919061427d565b60405180910390f35b610206600480360381019061020191906139e5565b610f55565b6040516102139190614481565b60405180910390f35b610236600480360381019061023191906139e5565b610f90565b6040516102439190614298565b60405180910390f35b61026660048036038101906102619190613d23565b611053565b005b610282600480360381019061027d9190613cbe565b61167a565b60405161028f9190614481565b60405180910390f35b6102b260048036038101906102ad9190613ce7565b611692565b6040516102bf919061427d565b60405180910390f35b6102d06116c1565b6040516102dd9190614481565b60405180910390f35b61030060048036038101906102fb9190613a39565b6116c7565b005b61031c60048036038101906103179190613ce7565b611a99565b005b6103266123cf565b6040516103339190614262565b60405180910390f35b61035660048036038101906103519190613ce7565b6123f5565b604051610363919061427d565b60405180910390f35b610386600480360381019061038191906139e5565b612424565b6040516103939190614481565b60405180910390f35b6103b660048036038101906103b191906139e5565b61248a565b6040516103c39190614298565b60405180910390f35b6103d46126b5565b6040516103e19190614298565b60405180910390f35b61040460048036038101906103ff9190613d8a565b6126ee565b6040516104119190614262565b60405180910390f35b610434600480360381019061042f9190613cbe565b61273c565b6040516104419190614298565b60405180910390f35b610464600480360381019061045f9190613cbe565b6127dc565b60405161047a9a999897969594939291906144f6565b60405180910390f35b61049d60048036038101906104989190613ad0565b612a8a565b005b6104b960048036038101906104b491906139bc565b612c40565b6040516104c6919061427d565b60405180910390f35b6104e960048036038101906104e49190613c6a565b612c60565b6040516104f9949392919061449c565b60405180910390f35b60405180606001604052806028815260200161492b6028913981565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a790614401565b60405180910390fd5b600560008154809291906105c390614815565b919050555060405180610140016040528060055481526020018781526020018681526020018581526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018481526020016000815260200160008152602001600015158152602001600015158152506006600060055481526020019081526020016000206000820151816000015560208201518160010190805190602001906106699291906136d4565b5060408201518160020190805190602001906106869291906136d4565b5060608201518160030190805190602001906106a39291906136d4565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050190805190602001906107079291906136d4565b5060c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff0219169083151502179055506101208201518160080160016101000a81548160ff0219169083151502179055509050508173ffffffffffffffffffffffffffffffffffffffff166005547f41bbb82aa0096a4ef6e73d180bcf005a06dae558a2bd374fefd8e9d3d116d693886040516107aa9190614298565b60405180910390a36000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661085a5760016000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020866040516108a99190614234565b908152602001604051809103902080546108c2906147e3565b905014801561091b5750600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156109c6576040518060400160405280600881526020017f496e697469617465000000000000000000000000000000000000000000000000815250600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020866040516109a39190614234565b908152602001604051809103902090805190602001906109c49291906136d4565b505b600554905095945050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5b90614401565b60405180910390fd5b60006006600084815260200190815260200160002090508060080160009054906101000a900460ff16158015610aa957508060080160019054906101000a900460ff16155b610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90614361565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7290614441565b60405180910390fd5b6007600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090614321565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082600201604051610c6b919061424b565b90815260200160405180910390208054610c84906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb0906147e3565b8015610cfd5780601f10610cd257610100808354040283529160200191610cfd565b820191906000526020600020905b815481529060010190602001808311610ce057829003601f168201915b505050505090506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060006040518060400160405280600681526020017f4f7261636c6500000000000000000000000000000000000000000000000000008152508051906020012083805190602001201490508180610da85750805b610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde906143a1565b60405180910390fd5b60016007600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ee885856002018054610e63906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8f906147e3565b8015610edc5780601f10610eb157610100808354040283529160200191610edc565b820191906000526020600020905b815481529060010190602001808311610ebf57829003601f168201915b5050505050600a612e5b565b8115610efc57610ef786612f2c565b610f2d565b836006016000815480929190610f1190614815565b91905055506002846006015410610f2c57610f2b86612f2c565b5b5b505050505050565b60036020528060005260406000206000915054906101000a900460ff1681565b600160205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600091509150505481565b600260205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600091509150508054610fd2906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe906147e3565b801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b505050505081565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614401565b60405180910390fd5b60006006600085815260200190815260200160002090508060080160009054906101000a900460ff1615801561112857508060080160019054906101000a900460ff16155b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614361565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614381565b60405180910390fd5b6007600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90614321565b60405180910390fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826002016040516112ea919061424b565b90815260200160405180910390208054611303906147e3565b80601f016020809104026020016040519081016040528092919081815260200182805461132f906147e3565b801561137c5780601f106113515761010080835404028352916020019161137c565b820191906000526020600020905b81548152906001019060200180831161135f57829003601f168201915b505050505090506000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060006040518060400160405280600681526020017f4f7261636c65000000000000000000000000000000000000000000000000000081525080519060200120838051906020012014905081806114275750805b611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d90614421565b60405180910390fd5b60016007600089815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060096000888152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506115db86856002018054611556906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611582906147e3565b80156115cf5780601f106115a4576101008083540402835291602001916115cf565b820191906000526020600020905b8154815290600101906020018083116115b257829003601f168201915b5050505050600a612e5b565b8573ffffffffffffffffffffffffffffffffffffffff16877fb1afc6ed6ca71004336b58c0e9e739a284c4cb503388fa76dd427e3d01e9a000876040516116229190614298565b60405180910390a3811561163f5761163a8786613082565b611671565b83600701600081548092919061165490614815565b919050555060038460070154106116705761166f8786613082565b5b5b50505050505050565b600a6020528060005260406000206000915090505481565b60076020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614401565b60405180910390fd5b81518351148015611769575080518351145b6117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f90614341565b60405180910390fd5b60005b8351811015611a93578181815181106117ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160016000868481518110611832577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208483815181106118ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040516118c29190614234565b908152602001604051809103902060008282546118df91906146cf565b92505081905550611970848281518110611922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110611963577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613353565b8381815181106119a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f2341c40037e380756373b1c69fa038becf66d4f6412fc98cf777cd51e2907bca848381518110611a21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110611a62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604051611a789291906142f1565b60405180910390a28080611a8b90614815565b9150506117ab565b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614401565b60405180910390fd5b60006006600084815260200190815260200160002090508060080160019054906101000a900460ff16611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906143c1565b60405180910390fd5b600b600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614461565b60405180910390fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082600201604051611c81919061424b565b90815260200160405180910390208054611c9a906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc6906147e3565b8015611d135780601f10611ce857610100808354040283529160200191611d13565b820191906000526020600020905b815481529060010190602001808311611cf657829003601f168201915b505050505090506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060006040518060400160405280600681526020017f4f7261636c6500000000000000000000000000000000000000000000000000008152508051906020012083805190602001201490508180611dbe5750805b611dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df4906143e1565b60405180910390fd5b6001600b600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600a60008781526020019081526020016000206000815480929190611e8a90614815565b9190505550611f2785856002018054611ea2906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611ece906147e3565b8015611f1b5780601f10611ef057610100808354040283529160200191611f1b565b820191906000526020600020905b815481529060010190602001808311611efe57829003601f168201915b5050505050600a612e5b565b8180611f4757506002600a60008881526020019081526020016000205410155b156123765760008460080160016101000a81548160ff02191690831515021790555060018460080160006101000a81548160ff0219169083151502179055506120428460040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856002018054611fbd906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe9906147e3565b80156120365780601f1061200b57610100808354040283529160200191612036565b820191906000526020600020905b81548152906001019060200180831161201957829003601f168201915b5050505050603c612e5b565b6000600960008881526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156120d757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161208d575b5050505050905060005b815181101561231f576000828281518110612125577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600f600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088600201604051612181919061424b565b9081526020016040518091039020541061221057600f600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020886002016040516121e7919061424b565b908152602001604051809103902060008282546122049190614725565b92505081905550612275565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088600201604051612262919061424b565b9081526020016040518091039020819055505b61230b81886002018054612288906147e3565b80601f01602080910402602001604051908101604052809291908181526020018280546122b4906147e3565b80156123015780601f106122d657610100808354040283529160200191612301565b820191906000526020600020905b8154815290600101906020018083116122e457829003601f168201915b5050505050613353565b50808061231790614815565b9150506120e1565b508573ffffffffffffffffffffffffffffffffffffffff16877f37db5ddfcb03227d73359644183917f3089b436c398a084d556460db71e8be2e6001604051612368919061427d565b60405180910390a3506123c7565b8473ffffffffffffffffffffffffffffffffffffffff16867f37db5ddfcb03227d73359644183917f3089b436c398a084d556460db71e8be2e60006040516123be919061427d565b60405180910390a35b505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040516124739190614234565b908152602001604051809103902054905092915050565b6060600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561251b576040518060400160405280600581526020017f41646d696e00000000000000000000000000000000000000000000000000000081525090506126af565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360405161256a9190614234565b90815260200160405180910390208054612583906147e3565b905014156125c8576040518060400160405280600881526020017f496e69746961746500000000000000000000000000000000000000000000000081525090506126af565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040516126159190614234565b9081526020016040518091039020805461262e906147e3565b80601f016020809104026020016040519081016040528092919081815260200182805461265a906147e3565b80156126a75780601f1061267c576101008083540402835291602001916126a7565b820191906000526020600020905b81548152906001019060200180831161268a57829003601f168201915b505050505090505b92915050565b6040518060400160405280601181526020017f505552452042492d564552534154494f4e00000000000000000000000000000081525081565b6009602052816000526040600020818154811061270a57600080fd5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052806000526040600020600091509050805461275b906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612787906147e3565b80156127d45780601f106127a9576101008083540402835291602001916127d4565b820191906000526020600020905b8154815290600101906020018083116127b757829003601f168201915b505050505081565b6006602052806000526040600020600091509050806000015490806001018054612805906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612831906147e3565b801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b505050505090806002018054612893906147e3565b80601f01602080910402602001604051908101604052809291908181526020018280546128bf906147e3565b801561290c5780601f106128e15761010080835404028352916020019161290c565b820191906000526020600020905b8154815290600101906020018083116128ef57829003601f168201915b505050505090806003018054612921906147e3565b80601f016020809104026020016040519081016040528092919081815260200182805461294d906147e3565b801561299a5780601f1061296f5761010080835404028352916020019161299a565b820191906000526020600020905b81548152906001019060200180831161297d57829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050180546129d5906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612a01906147e3565b8015612a4e5780601f10612a2357610100808354040283529160200191612a4e565b820191906000526020600020905b815481529060010190602001808311612a3157829003601f168201915b5050505050908060060154908060070154908060080160009054906101000a900460ff16908060080160019054906101000a900460ff1690508a565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190614401565b60405180910390fd5b60006040518060800160405280428152602001858152602001848152602001838152509050600c85604051612b4f9190614234565b9081526020016040518091039020819080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001019080519060200190612bad9291906136d4565b506040820151816002019080519060200190612bca9291906136d4565b506060820151816003019080519060200190612be79291906136d4565b50505084604051612bf89190614234565b60405180910390207f55e378dbc81cbf3764f2fdc9915435a0de49effbb859d048f04415a779e405518442604051612c319291906142f1565b60405180910390a25050505050565b60006020528060005260406000206000915054906101000a900460ff1681565b600c828051602081018201805184825260208301602085012081835280955050505050508181548110612c9257600080fd5b906000526020600020906004020160009150915050806000015490806001018054612cbc906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612ce8906147e3565b8015612d355780601f10612d0a57610100808354040283529160200191612d35565b820191906000526020600020905b815481529060010190602001808311612d1857829003601f168201915b505050505090806002018054612d4a906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612d76906147e3565b8015612dc35780601f10612d9857610100808354040283529160200191612dc3565b820191906000526020600020905b815481529060010190602001808311612da657829003601f168201915b505050505090806003018054612dd8906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e04906147e3565b8015612e515780601f10612e2657610100808354040283529160200191612e51565b820191906000526020600020905b815481529060010190602001808311612e3457829003601f168201915b5050505050905084565b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083604051612ea99190614234565b90815260200160405180910390206000828254612ec691906146cf565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167f2341c40037e380756373b1c69fa038becf66d4f6412fc98cf777cd51e2907bca8383604051612f159291906142f1565b60405180910390a2612f278383613353565b505050565b60016006600083815260200190815260200160002060080160006101000a81548160ff02191690831515021790555061303b6006600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008481526020019081526020016000206002018054612fb6906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612fe2906147e3565b801561302f5780601f106130045761010080835404028352916020019161302f565b820191906000526020600020905b81548152906001019060200180831161301257829003601f168201915b50505050506032612e5b565b3373ffffffffffffffffffffffffffffffffffffffff16817f82a82ea54aa0cfb8695810af1805d7f37f71a2683a57dc52567342b0a001f85260405160405180910390a350565b60016006600084815260200190815260200160002060080160016101000a81548160ff021916908315150217905550806008600084815260200190815260200160002090805190602001906130d89291906136d4565b5060006006600084815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600660008581526020019081526020016000206002018054613137906147e3565b80601f0160208091040260200160405190810160405280929190818152602001828054613163906147e3565b80156131b05780601f10613185576101008083540402835291602001916131b0565b820191906000526020600020905b81548152906001019060200180831161319357829003601f168201915b50505050509050600a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040516132069190614234565b9081526020016040518091039020541061329257600a600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040516132699190614234565b908152602001604051809103902060008282546132869190614725565b925050819055506132f4565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040516132e19190614234565b9081526020016040518091039020819055505b6132fe8282613353565b8173ffffffffffffffffffffffffffffffffffffffff16847f61672afa064adc53f9fb0e3d07cb1dc604355a97359bb4532531f970ae6f8b77856040516133459190614298565b60405180910390a350505050565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156133aa576136d0565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020826040516133f99190614234565b908152602001604051809103902054905060606105dc8210613452576040518060400160405280600681526020017f4f7261636c650000000000000000000000000000000000000000000000000000815250905061355f565b6103208210613498576040518060400160405280600981526020017f4172636869766973740000000000000000000000000000000000000000000000815250905061355e565b61012c82106134de576040518060400160405280600881526020017f4c696e6775697374000000000000000000000000000000000000000000000000815250905061355d565b60648210613523576040518060400160405280600581526020017f53636f7574000000000000000000000000000000000000000000000000000000815250905061355c565b6040518060400160405280600881526020017f496e69746961746500000000000000000000000000000000000000000000000081525090505b5b5b5b806040516020016135709190614234565b60405160208183030381529060405280519060200120600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020846040516135d39190614234565b90815260200160405180910390206040516020016135f1919061424b565b60405160208183030381529060405280519060200120146136cd5780600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208460405161365a9190614234565b9081526020016040518091039020908051906020019061367b9291906136d4565b508373ffffffffffffffffffffffffffffffffffffffff167fb556c81df903a7ca7d33d7f43033d4e947a1c524347a6f24ddd077ae1fdc7bb984836040516136c49291906142ba565b60405180910390a25b50505b5050565b8280546136e0906147e3565b90600052602060002090601f0160209004810192826137025760008555613749565b82601f1061371b57805160ff1916838001178555613749565b82800160010185558215613749579182015b8281111561374857825182559160200191906001019061372d565b5b509050613756919061375a565b5090565b5b8082111561377357600081600090555060010161375b565b5090565b600061378a613785846145df565b6145ae565b905080838252602082019050828560208602820111156137a957600080fd5b60005b858110156137d957816137bf88826138ea565b8452602084019350602083019250506001810190506137ac565b5050509392505050565b60006137f66137f18461460b565b6145ae565b9050808382526020820190508260005b85811015613836578135850161381c888261397d565b845260208401935060208301925050600181019050613806565b5050509392505050565b600061385361384e84614637565b6145ae565b9050808382526020820190508285602086028201111561387257600080fd5b60005b858110156138a2578161388888826139a7565b845260208401935060208301925050600181019050613875565b5050509392505050565b60006138bf6138ba84614663565b6145ae565b9050828152602081018484840111156138d757600080fd5b6138e28482856147a1565b509392505050565b6000813590506138f9816148fc565b92915050565b600082601f83011261391057600080fd5b8135613920848260208601613777565b91505092915050565b600082601f83011261393a57600080fd5b813561394a8482602086016137e3565b91505092915050565b600082601f83011261396457600080fd5b8135613974848260208601613840565b91505092915050565b600082601f83011261398e57600080fd5b813561399e8482602086016138ac565b91505092915050565b6000813590506139b681614913565b92915050565b6000602082840312156139ce57600080fd5b60006139dc848285016138ea565b91505092915050565b600080604083850312156139f857600080fd5b6000613a06858286016138ea565b925050602083013567ffffffffffffffff811115613a2357600080fd5b613a2f8582860161397d565b9150509250929050565b600080600060608486031215613a4e57600080fd5b600084013567ffffffffffffffff811115613a6857600080fd5b613a74868287016138ff565b935050602084013567ffffffffffffffff811115613a9157600080fd5b613a9d86828701613929565b925050604084013567ffffffffffffffff811115613aba57600080fd5b613ac686828701613953565b9150509250925092565b60008060008060808587031215613ae657600080fd5b600085013567ffffffffffffffff811115613b0057600080fd5b613b0c8782880161397d565b945050602085013567ffffffffffffffff811115613b2957600080fd5b613b358782880161397d565b935050604085013567ffffffffffffffff811115613b5257600080fd5b613b5e8782880161397d565b925050606085013567ffffffffffffffff811115613b7b57600080fd5b613b878782880161397d565b91505092959194509250565b600080600080600060a08688031215613bab57600080fd5b600086013567ffffffffffffffff811115613bc557600080fd5b613bd18882890161397d565b955050602086013567ffffffffffffffff811115613bee57600080fd5b613bfa8882890161397d565b945050604086013567ffffffffffffffff811115613c1757600080fd5b613c238882890161397d565b935050606086013567ffffffffffffffff811115613c4057600080fd5b613c4c8882890161397d565b9250506080613c5d888289016138ea565b9150509295509295909350565b60008060408385031215613c7d57600080fd5b600083013567ffffffffffffffff811115613c9757600080fd5b613ca38582860161397d565b9250506020613cb4858286016139a7565b9150509250929050565b600060208284031215613cd057600080fd5b6000613cde848285016139a7565b91505092915050565b60008060408385031215613cfa57600080fd5b6000613d08858286016139a7565b9250506020613d19858286016138ea565b9150509250929050565b600080600060608486031215613d3857600080fd5b6000613d46868287016139a7565b9350506020613d57868287016138ea565b925050604084013567ffffffffffffffff811115613d7457600080fd5b613d808682870161397d565b9150509250925092565b60008060408385031215613d9d57600080fd5b6000613dab858286016139a7565b9250506020613dbc858286016139a7565b9150509250929050565b613dcf81614759565b82525050565b613dde8161476b565b82525050565b6000613def826146a8565b613df981856146b3565b9350613e098185602086016147b0565b613e12816148eb565b840191505092915050565b6000613e28826146a8565b613e3281856146c4565b9350613e428185602086016147b0565b80840191505092915050565b60008154613e5b816147e3565b613e6581866146c4565b94506001821660008114613e805760018114613e9157613ec4565b60ff19831686528186019350613ec4565b613e9a85614693565b60005b83811015613ebc57815481890152600182019150602081019050613e9d565b838801955050505b50505092915050565b6000613eda6012836146b3565b91507f5573657220616c726561647920766f74656400000000000000000000000000006000830152602082019050919050565b6000613f1a6016836146b3565b91507f4172726179206c656e67746873206d69736d61746368000000000000000000006000830152602082019050919050565b6000613f5a6016836146b3565b91507f456e74727920616c7265616479207265736f6c766564000000000000000000006000830152602082019050919050565b6000613f9a6017836146b3565b91507f43616e6e6f742072656a656374206f776e20656e7472790000000000000000006000830152602082019050919050565b6000613fda6021836146b3565b91507f4f6e6c792041646d696e73206f72204f7261636c65732063616e20766572696660008301527f79000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140406013836146b3565b91507f456e747279206973206e6f74206275726e6564000000000000000000000000006000830152602082019050919050565b60006140806021836146b3565b91507f4f6e6c792041646d696e73206f72204f7261636c65732063616e20617070656160008301527f6c000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140e66030836146b3565b91507f4f6e6c792074686520507974686f6e2052656c617965722063616e206578656360008301527f757465207472616e73616374696f6e73000000000000000000000000000000006020830152604082019050919050565b600061414c6021836146b3565b91507f4f6e6c792041646d696e73206f72204f7261636c65732063616e2072656a656360008301527f74000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b26017836146b3565b91507f43616e6e6f7420766572696679206f776e20656e7472790000000000000000006000830152602082019050919050565b60006141f26015836146b3565b91507f5573657220616c72656164792061707065616c656400000000000000000000006000830152602082019050919050565b61422e81614797565b82525050565b60006142408284613e1d565b915081905092915050565b60006142578284613e4e565b915081905092915050565b60006020820190506142776000830184613dc6565b92915050565b60006020820190506142926000830184613dd5565b92915050565b600060208201905081810360008301526142b28184613de4565b905092915050565b600060408201905081810360008301526142d48185613de4565b905081810360208301526142e88184613de4565b90509392505050565b6000604082019050818103600083015261430b8185613de4565b905061431a6020830184614225565b9392505050565b6000602082019050818103600083015261433a81613ecd565b9050919050565b6000602082019050818103600083015261435a81613f0d565b9050919050565b6000602082019050818103600083015261437a81613f4d565b9050919050565b6000602082019050818103600083015261439a81613f8d565b9050919050565b600060208201905081810360008301526143ba81613fcd565b9050919050565b600060208201905081810360008301526143da81614033565b9050919050565b600060208201905081810360008301526143fa81614073565b9050919050565b6000602082019050818103600083015261441a816140d9565b9050919050565b6000602082019050818103600083015261443a8161413f565b9050919050565b6000602082019050818103600083015261445a816141a5565b9050919050565b6000602082019050818103600083015261447a816141e5565b9050919050565b60006020820190506144966000830184614225565b92915050565b60006080820190506144b16000830187614225565b81810360208301526144c38186613de4565b905081810360408301526144d78185613de4565b905081810360608301526144eb8184613de4565b905095945050505050565b60006101408201905061450c600083018d614225565b818103602083015261451e818c613de4565b90508181036040830152614532818b613de4565b90508181036060830152614546818a613de4565b90506145556080830189613dc6565b81810360a08301526145678188613de4565b905061457660c0830187614225565b61458360e0830186614225565b614591610100830185613dd5565b61459f610120830184613dd5565b9b9a5050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156145d5576145d46148bc565b5b8060405250919050565b600067ffffffffffffffff8211156145fa576145f96148bc565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614626576146256148bc565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614652576146516148bc565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561467e5761467d6148bc565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006146da82614797565b91506146e583614797565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561471a5761471961485e565b5b828201905092915050565b600061473082614797565b915061473b83614797565b92508282101561474e5761474d61485e565b5b828203905092915050565b600061476482614777565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156147ce5780820151818401526020810190506147b3565b838111156147dd576000848401525b50505050565b600060028204905060018216806147fb57607f821691505b6020821081141561480f5761480e61488d565b5b50919050565b600061482082614797565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148535761485261485e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61490581614759565b811461491057600080fd5b50565b61491c81614797565b811461492757600080fd5b5056fe5075726542696c696e6775616c566572736174696f6e205265736561726368205265676973747279a2646970667358221220debf9c1205b42326eb48d5e8f36e0ccd37bd9ac9edc1a1c22b07aad58b2f57b164736f6c63430008000033" +} \ No newline at end of file diff --git a/src/PureConvo.sol b/src/PureConvo.sol new file mode 100644 index 0000000000000000000000000000000000000000..583c7e252188e25dd8b26f9e91cc4751ecd18a90 --- /dev/null +++ b/src/PureConvo.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureConvo { + + // --- 0. BRANDING --- + string public constant name = "PureConvo Research Registry"; + string public constant symbol = "CONVO"; + + // --- 1. IDENTITY & REPUTATION --- + struct Researcher { + bool isRegistered; + uint256 reputationScore; + string role; // "Admin", "Native_Speaker", "Contributor" + } + + mapping(address => Researcher) public researchers; + address public labAdmin; + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; + string dialect; + string ipfsCid; + address contributor; + string licenseType; + uint256 verificationCount; + bool isVerified; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // --- 3. BACKUP SYSTEM --- + struct DataSnapshot { + uint256 timestamp; + string dataType; // "Database_CSV" or "Persona_JSON" + string ipfsCid; + string description; + address uploader; + } + + mapping(string => DataSnapshot[]) public backups; + + // --- 4. EVENTS (Consolidated) --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event ReputationMinted(address indexed researcher, uint256 amount); + event BackupCreated(string indexed dataKey, string ipfsCid, uint256 timestamp); + + constructor() { + labAdmin = msg.sender; + researchers[msg.sender] = Researcher(true, 100, "Admin"); + } + + // --- MODIFIERS --- + modifier onlyAdmin() { + require(msg.sender == labAdmin, "Only Lab Admin can do this"); + _; + } + + modifier onlyRegistered() { + require(researchers[msg.sender].isRegistered, "Must be registered researcher"); + _; + } + + // --- CORE FUNCTIONS --- + + function registerResearcher(address _user, string memory _role) public onlyAdmin { + researchers[_user] = Researcher(true, 10, _role); + } + + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license) public onlyRegistered { + entryCounter++; + // Clean one-line initialization + entries[entryCounter] = DialectEntry(entryCounter, _phrase, _dialect, _ipfsCid, msg.sender, _license, 0, false); + emit EntryProposed(entryCounter, _phrase, msg.sender); + } + + function verifyEntry(uint256 _id) public onlyRegistered { + require(entries[_id].contributor != msg.sender, "Cannot verify own entry"); + require(!entries[_id].isVerified, "Already verified"); + + entries[_id].verificationCount++; + + // Simple Consensus: If 2 peers verify, it becomes "Official" + if (entries[_id].verificationCount >= 2) { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, 50); + emit EntryVerified(_id, msg.sender); + } + + // Reward the verifier + _mintReputation(msg.sender, 10); + } + + function createBackup(string memory _dataKey, string memory _dataType, string memory _ipfsCid, string memory _description) public onlyRegistered { + DataSnapshot memory newSnap = DataSnapshot(block.timestamp, _dataType, _ipfsCid, _description, msg.sender); + backups[_dataKey].push(newSnap); + emit BackupCreated(_dataKey, _ipfsCid, block.timestamp); + } + + // --- HELPER & VIEW FUNCTIONS (Restored) --- + + // Essential for frontend to find the most recent backup without iterating + function getLatestBackup(string memory _dataKey) public view returns (string memory ipfsCid, uint256 timestamp) { + require(backups[_dataKey].length > 0, "No backups found"); + DataSnapshot memory snap = backups[_dataKey][backups[_dataKey].length - 1]; + return (snap.ipfsCid, snap.timestamp); + } + + // Optional but helpful for quick license checks + function getLicenseInfo(uint256 _id) public view returns (string memory license, address contributor) { + return (entries[_id].licenseType, entries[_id].contributor); + } + + // --- INTERNAL --- + function _mintReputation(address _user, uint256 _amount) internal { + researchers[_user].reputationScore += _amount; + emit ReputationMinted(_user, _amount); + } +} diff --git a/src/PureConvo_compiled.json b/src/PureConvo_compiled.json new file mode 100644 index 0000000000000000000000000000000000000000..8c17721d7fdc5fcbabeb6f996e55f2cfb639b0cd --- /dev/null +++ b/src/PureConvo_compiled.json @@ -0,0 +1,412 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "dataKey", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "BackupCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "indexed": true, + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "EntryProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "EntryVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "researcher", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ReputationMinted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "backups", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataType", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "address", + "name": "uploader", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_dataKey", + "type": "string" + }, + { + "internalType": "string", + "name": "_dataType", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_description", + "type": "string" + } + ], + "name": "createBackup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "entries", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "internalType": "string", + "name": "licenseType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "verificationCount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isVerified", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "entryCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_dataKey", + "type": "string" + } + ], + "name": "getLatestBackup", + "outputs": [ + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getLicenseInfo", + "outputs": [ + { + "internalType": "string", + "name": "license", + "type": "string" + }, + { + "internalType": "address", + "name": "contributor", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "labAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "_dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_license", + "type": "string" + } + ], + "name": "proposeEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "string", + "name": "_role", + "type": "string" + } + ], + "name": "registerResearcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "researchers", + "outputs": [ + { + "internalType": "bool", + "name": "isRegistered", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "reputationScore", + "type": "uint256" + }, + { + "internalType": "string", + "name": "role", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "verifyEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "60806040523480156200001157600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280600115158152602001606481526020016040518060400160405280600581526020017f41646d696e0000000000000000000000000000000000000000000000000000008152508152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020190805190602001906200012d92919062000137565b509050506200024c565b8280546200014590620001e7565b90600052602060002090601f016020900481019282620001695760008555620001b5565b82601f106200018457805160ff1916838001178555620001b5565b82800160010185558215620001b5579182015b82811115620001b457825182559160200191906001019062000197565b5b509050620001c49190620001c8565b5090565b5b80821115620001e3576000816000905550600101620001c9565b5090565b600060028204905060018216806200020057607f821691505b602082108114156200021757620002166200021d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6120b1806200025c6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c806395d89b411161008c578063d40f299a11610066578063d40f299a1461021e578063e8a3c5a71461023a578063efebb0441461026e578063f3c2cf651461028a576100cf565b806395d89b41146101ad578063b30906d4146101cb578063b6602c3a14610202576100cf565b806301bc237d146100d457806306fdde03146101065780633f633e651461012457806362da83131461014057806379a0f97b1461015e57806386c8ce7f1461018f575b600080fd5b6100ee60048036038101906100e99190611714565b6102bb565b6040516100fd93929190611b1b565b60405180910390f35b61010e61037a565b60405161011b9190611b59565b60405180910390f35b61013e600480360381019061013991906117d2565b6103b3565b005b61014861060d565b6040516101559190611c7b565b60405180910390f35b61017860048036038101906101739190611791565b610613565b604051610186929190611bab565b60405180910390f35b610197610944565b6040516101a49190611b00565b60405180910390f35b6101b561096a565b6040516101c29190611b59565b60405180910390f35b6101e560048036038101906101e091906118e9565b6109a3565b6040516101f9989796959493929190611cfe565b60405180910390f35b61021c600480360381019061021791906117d2565b610c38565b005b6102386004803603810190610233919061173d565b610e4f565b005b610254600480360381019061024f9190611895565b610f8a565b604051610265959493929190611c96565b60405180910390f35b610288600480360381019061028391906118e9565b6111ab565b005b6102a4600480360381019061029f91906118e9565b61144f565b6040516102b2929190611b7b565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020180546102f790611f34565b80601f016020809104026020016040519081016040528092919081815260200182805461032390611f34565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905083565b6040518060400160405280601b81526020017f50757265436f6e766f205265736561726368205265676973747279000000000081525081565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043890611c1b565b60405180910390fd5b6002600081548092919061045490611f66565b919050555060405180610100016040528060025481526020018581526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200160008152602001600015158152506003600060025481526020019081526020016000206000820151816000015560208201518160010190805190602001906104ea9291906115df565b5060408201518160020190805190602001906105079291906115df565b5060608201518160030190805190602001906105249291906115df565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050190805190602001906105889291906115df565b5060c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166002547f41bbb82aa0096a4ef6e73d180bcf005a06dae558a2bd374fefd8e9d3d116d693866040516105ff9190611b59565b60405180910390a350505050565b60025481565b60606000806004846040516106289190611ae9565b9081526020016040518091039020805490501161067a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067190611c3b565b60405180910390fd5b600060048460405161068c9190611ae9565b908152602001604051809103902060016004866040516106ac9190611ae9565b9081526020016040518091039020805490506106c89190611e76565b815481106106ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600502016040518060a00160405290816000820154815260200160018201805461073290611f34565b80601f016020809104026020016040519081016040528092919081815260200182805461075e90611f34565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b505050505081526020016002820180546107c490611f34565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090611f34565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050815260200160038201805461085690611f34565b80601f016020809104026020016040519081016040528092919081815260200182805461088290611f34565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050806040015181600001519250925050915091565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600581526020017f434f4e564f00000000000000000000000000000000000000000000000000000081525081565b60036020528060005260406000206000915090508060000154908060010180546109cc90611f34565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890611f34565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b505050505090806002018054610a5a90611f34565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8690611f34565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b505050505090806003018054610ae890611f34565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1490611f34565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806005018054610b9c90611f34565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc890611f34565b8015610c155780601f10610bea57610100808354040283529160200191610c15565b820191906000526020600020905b815481529060010190602001808311610bf857829003601f168201915b5050505050908060060154908060070160009054906101000a900460ff16905088565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90611c1b565b60405180910390fd5b60006040518060a001604052804281526020018581526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff168152509050600485604051610d179190611ae9565b9081526020016040518091039020819080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001556020820151816001019080519060200190610d759291906115df565b506040820151816002019080519060200190610d929291906115df565b506060820151816003019080519060200190610daf9291906115df565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505084604051610e079190611ae9565b60405180910390207f55e378dbc81cbf3764f2fdc9915435a0de49effbb859d048f04415a779e405518442604051610e40929190611bab565b60405180910390a25050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690611bfb565b60405180910390fd5b6040518060600160405280600115158152602001600a8152602001828152506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002019080519060200190610f829291906115df565b509050505050565b6004828051602081018201805184825260208301602085012081835280955050505050508181548110610fbc57600080fd5b906000526020600020906005020160009150915050806000015490806001018054610fe690611f34565b80601f016020809104026020016040519081016040528092919081815260200182805461101290611f34565b801561105f5780601f106110345761010080835404028352916020019161105f565b820191906000526020600020905b81548152906001019060200180831161104257829003601f168201915b50505050509080600201805461107490611f34565b80601f01602080910402602001604051908101604052809291908181526020018280546110a090611f34565b80156110ed5780601f106110c2576101008083540402835291602001916110ed565b820191906000526020600020905b8154815290600101906020018083116110d057829003601f168201915b50505050509080600301805461110290611f34565b80601f016020809104026020016040519081016040528092919081815260200182805461112e90611f34565b801561117b5780601f106111505761010080835404028352916020019161117b565b820191906000526020600020905b81548152906001019060200180831161115e57829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123090611c1b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d590611c5b565b60405180910390fd5b6003600082815260200190815260200160002060070160009054906101000a900460ff1615611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133990611bdb565b60405180910390fd5b60036000828152602001908152602001600020600601600081548092919061136990611f66565b919050555060026003600083815260200190815260200160002060060154106114415760016003600083815260200190815260200160002060070160006101000a81548160ff0219169083151502179055506113fc6003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032611535565b3373ffffffffffffffffffffffffffffffffffffffff16817f82a82ea54aa0cfb8695810af1805d7f37f71a2683a57dc52567342b0a001f85260405160405180910390a35b61144c33600a611535565b50565b60606000600360008481526020019081526020016000206005016003600085815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168180546114ac90611f34565b80601f01602080910402602001604051908101604052809291908181526020018280546114d890611f34565b80156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b5050505050915091509150915091565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008282546115869190611e20565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f42bcf4689d0211adce4e556ee455319d34e671e8b8a762034e146461fb1be82d826040516115d39190611c7b565b60405180910390a25050565b8280546115eb90611f34565b90600052602060002090601f01602090048101928261160d5760008555611654565b82601f1061162657805160ff1916838001178555611654565b82800160010185558215611654579182015b82811115611653578251825591602001919060010190611638565b5b5090506116619190611665565b5090565b5b8082111561167e576000816000905550600101611666565b5090565b600061169561169084611dc9565b611d98565b9050828152602081018484840111156116ad57600080fd5b6116b8848285611ef2565b509392505050565b6000813590506116cf8161204d565b92915050565b600082601f8301126116e657600080fd5b81356116f6848260208601611682565b91505092915050565b60008135905061170e81612064565b92915050565b60006020828403121561172657600080fd5b6000611734848285016116c0565b91505092915050565b6000806040838503121561175057600080fd5b600061175e858286016116c0565b925050602083013567ffffffffffffffff81111561177b57600080fd5b611787858286016116d5565b9150509250929050565b6000602082840312156117a357600080fd5b600082013567ffffffffffffffff8111156117bd57600080fd5b6117c9848285016116d5565b91505092915050565b600080600080608085870312156117e857600080fd5b600085013567ffffffffffffffff81111561180257600080fd5b61180e878288016116d5565b945050602085013567ffffffffffffffff81111561182b57600080fd5b611837878288016116d5565b935050604085013567ffffffffffffffff81111561185457600080fd5b611860878288016116d5565b925050606085013567ffffffffffffffff81111561187d57600080fd5b611889878288016116d5565b91505092959194509250565b600080604083850312156118a857600080fd5b600083013567ffffffffffffffff8111156118c257600080fd5b6118ce858286016116d5565b92505060206118df858286016116ff565b9150509250929050565b6000602082840312156118fb57600080fd5b6000611909848285016116ff565b91505092915050565b61191b81611eaa565b82525050565b61192a81611ebc565b82525050565b600061193b82611df9565b6119458185611e04565b9350611955818560208601611f01565b61195e8161203c565b840191505092915050565b600061197482611df9565b61197e8185611e15565b935061198e818560208601611f01565b80840191505092915050565b60006119a7601083611e04565b91507f416c7265616479207665726966696564000000000000000000000000000000006000830152602082019050919050565b60006119e7601a83611e04565b91507f4f6e6c79204c61622041646d696e2063616e20646f20746869730000000000006000830152602082019050919050565b6000611a27601d83611e04565b91507f4d757374206265207265676973746572656420726573656172636865720000006000830152602082019050919050565b6000611a67601083611e04565b91507f4e6f206261636b75707320666f756e64000000000000000000000000000000006000830152602082019050919050565b6000611aa7601783611e04565b91507f43616e6e6f7420766572696679206f776e20656e7472790000000000000000006000830152602082019050919050565b611ae381611ee8565b82525050565b6000611af58284611969565b915081905092915050565b6000602082019050611b156000830184611912565b92915050565b6000606082019050611b306000830186611921565b611b3d6020830185611ada565b8181036040830152611b4f8184611930565b9050949350505050565b60006020820190508181036000830152611b738184611930565b905092915050565b60006040820190508181036000830152611b958185611930565b9050611ba46020830184611912565b9392505050565b60006040820190508181036000830152611bc58185611930565b9050611bd46020830184611ada565b9392505050565b60006020820190508181036000830152611bf48161199a565b9050919050565b60006020820190508181036000830152611c14816119da565b9050919050565b60006020820190508181036000830152611c3481611a1a565b9050919050565b60006020820190508181036000830152611c5481611a5a565b9050919050565b60006020820190508181036000830152611c7481611a9a565b9050919050565b6000602082019050611c906000830184611ada565b92915050565b600060a082019050611cab6000830188611ada565b8181036020830152611cbd8187611930565b90508181036040830152611cd18186611930565b90508181036060830152611ce58185611930565b9050611cf46080830184611912565b9695505050505050565b600061010082019050611d14600083018b611ada565b8181036020830152611d26818a611930565b90508181036040830152611d3a8189611930565b90508181036060830152611d4e8188611930565b9050611d5d6080830187611912565b81810360a0830152611d6f8186611930565b9050611d7e60c0830185611ada565b611d8b60e0830184611921565b9998505050505050505050565b6000604051905081810181811067ffffffffffffffff82111715611dbf57611dbe61200d565b5b8060405250919050565b600067ffffffffffffffff821115611de457611de361200d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611e2b82611ee8565b9150611e3683611ee8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611e6b57611e6a611faf565b5b828201905092915050565b6000611e8182611ee8565b9150611e8c83611ee8565b925082821015611e9f57611e9e611faf565b5b828203905092915050565b6000611eb582611ec8565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015611f1f578082015181840152602081019050611f04565b83811115611f2e576000848401525b50505050565b60006002820490506001821680611f4c57607f821691505b60208210811415611f6057611f5f611fde565b5b50919050565b6000611f7182611ee8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611fa457611fa3611faf565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61205681611eaa565b811461206157600080fd5b50565b61206d81611ee8565b811461207857600080fd5b5056fea26469706673582212204ec68177ad4b3e8a6d9f86044f5afe1e98cf5d3f6d467e278ddffb8174fe9d6b64736f6c63430008000033" +} \ No newline at end of file diff --git a/src/PureIUUY.sol b/src/PureIUUY.sol new file mode 100644 index 0000000000000000000000000000000000000000..d9c0240334f8d90d92bddfceb465482894503b94 --- /dev/null +++ b/src/PureIUUY.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureIUUY { + + // --- 1. IDENTITY & REPUTATION --- + struct Researcher { + bool isRegistered; + uint256 reputationScore; + string role; // "Admin", "Native_Speaker", "Contributor" + } + + mapping(address => Researcher) public researchers; + address public labAdmin; + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; // e.g., "How far?" + string dialect; // e.g., "Nigerian Pidgin" + string ipfsCid; // Link to audio/metadata + address contributor; + string licenseType; // e.g., "CC-BY-4.0", "Research-Only" + uint256 verificationCount; + bool isVerified; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // --- EVENTS (For your Python Script to listen to) --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event ReputationMinted(address indexed researcher, uint256 amount); + + constructor() { + labAdmin = msg.sender; + researchers[msg.sender] = Researcher(true, 100, "Admin"); // Initial Admin + } + + // --- MODIFIERS (Governance Guardrails) --- + modifier onlyAdmin() { + require(msg.sender == labAdmin, "Only Lab Admin can do this"); + _; + } + + modifier onlyRegistered() { + require(researchers[msg.sender].isRegistered, "Must be registered researcher"); + _; + } + + // --- FUNCTIONS --- + + // Identity Management (Onboarding) + function registerResearcher(address _user, string memory _role) public onlyAdmin { + researchers[_user] = Researcher(true, 10, _role); // Start with 10 Rep + } + + // Level 1: The Registry (Logic Layer) + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license) public onlyRegistered { + entryCounter++; + entries[entryCounter] = DialectEntry( + entryCounter, + _phrase, + _dialect, + _ipfsCid, + msg.sender, + _license, + 0, + false + ); + emit EntryProposed(entryCounter, _phrase, msg.sender); + } + + // Level 3: Consensus & Governance (Voting) + function verifyEntry(uint256 _id) public onlyRegistered { + require(entries[_id].contributor != msg.sender, "Cannot verify own entry"); + require(!entries[_id].isVerified, "Already verified"); + + entries[_id].verificationCount++; + + // Simple Consensus: If 2 peers verify, it becomes "Official" + if (entries[_id].verificationCount >= 2) { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, 50); // Reward the creator + emit EntryVerified(_id, msg.sender); + } + + // Reward the verifier slightly for doing the work + _mintReputation(msg.sender, 10); + } + + // Level 3: Incentive Mechanism (Reputation) + function _mintReputation(address _user, uint256 _amount) internal { + researchers[_user].reputationScore += _amount; + emit ReputationMinted(_user, _amount); + } + + // Level 4: Transparent Usage + function getLicenseInfo(uint256 _id) public view returns (string memory, address) { + return (entries[_id].licenseType, entries[_id].contributor); + } +} diff --git a/src/PureIUUY_old_compiled.json b/src/PureIUUY_old_compiled.json new file mode 100644 index 0000000000000000000000000000000000000000..732509a5b3d92708c8ffc4a24a6122061044dd47 --- /dev/null +++ b/src/PureIUUY_old_compiled.json @@ -0,0 +1,265 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "indexed": true, + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "EntryProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "EntryVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "researcher", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ReputationMinted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "entries", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "internalType": "string", + "name": "licenseType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "verificationCount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isVerified", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "entryCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getLicenseInfo", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "labAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "_dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_license", + "type": "string" + } + ], + "name": "proposeEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "string", + "name": "_role", + "type": "string" + } + ], + "name": "registerResearcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "researchers", + "outputs": [ + { + "internalType": "bool", + "name": "isRegistered", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "reputationScore", + "type": "uint256" + }, + { + "internalType": "string", + "name": "role", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "verifyEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "60806040523480156200001157600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280600115158152602001606481526020016040518060400160405280600581526020017f41646d696e0000000000000000000000000000000000000000000000000000008152508152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020190805190602001906200012d92919062000137565b509050506200024c565b8280546200014590620001e7565b90600052602060002090601f016020900481019282620001695760008555620001b5565b82601f106200018457805160ff1916838001178555620001b5565b82800160010185558215620001b5579182015b82811115620001b457825182559160200191906001019062000197565b5b509050620001c49190620001c8565b5090565b5b80821115620001e3576000816000905550600101620001c9565b5090565b600060028204905060018216806200020057607f821691505b602082108114156200021757620002166200021d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6115be806200025c6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063b30906d41161005b578063b30906d414610117578063d40f299a1461014e578063efebb0441461016a578063f3c2cf651461018657610088565b806301bc237d1461008d5780633f633e65146100bf57806362da8313146100db57806386c8ce7f146100f9575b600080fd5b6100a760048036038101906100a29190610e35565b6101b7565b6040516100b69392919061111f565b60405180910390f35b6100d960048036038101906100d49190610eb2565b610276565b005b6100e36104d0565b6040516100f0919061122f565b60405180910390f35b6101016104d6565b60405161010e9190611104565b60405180910390f35b610131600480360381019061012c9190610f75565b6104fc565b60405161014598979695949392919061124a565b60405180910390f35b61016860048036038101906101639190610e5e565b610791565b005b610184600480360381019061017f9190610f75565b6108cc565b005b6101a0600480360381019061019b9190610f75565b610b70565b6040516101ae92919061117f565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020180546101f390611441565b80601f016020809104026020016040519081016040528092919081815260200182805461021f90611441565b801561026c5780601f106102415761010080835404028352916020019161026c565b820191906000526020600020905b81548152906001019060200180831161024f57829003601f168201915b5050505050905083565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fb906111ef565b60405180910390fd5b6002600081548092919061031790611473565b919050555060405180610100016040528060025481526020018581526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200160008152602001600015158152506003600060025481526020019081526020016000206000820151816000015560208201518160010190805190602001906103ad929190610d00565b5060408201518160020190805190602001906103ca929190610d00565b5060608201518160030190805190602001906103e7929190610d00565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a082015181600501908051906020019061044b929190610d00565b5060c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166002547f41bbb82aa0096a4ef6e73d180bcf005a06dae558a2bd374fefd8e9d3d116d693866040516104c2919061115d565b60405180910390a350505050565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360205280600052604060002060009150905080600001549080600101805461052590611441565b80601f016020809104026020016040519081016040528092919081815260200182805461055190611441565b801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b5050505050908060020180546105b390611441565b80601f01602080910402602001604051908101604052809291908181526020018280546105df90611441565b801561062c5780601f106106015761010080835404028352916020019161062c565b820191906000526020600020905b81548152906001019060200180831161060f57829003601f168201915b50505050509080600301805461064190611441565b80601f016020809104026020016040519081016040528092919081815260200182805461066d90611441565b80156106ba5780601f1061068f576101008083540402835291602001916106ba565b820191906000526020600020905b81548152906001019060200180831161069d57829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050180546106f590611441565b80601f016020809104026020016040519081016040528092919081815260200182805461072190611441565b801561076e5780601f106107435761010080835404028352916020019161076e565b820191906000526020600020905b81548152906001019060200180831161075157829003601f168201915b5050505050908060060154908060070160009054906101000a900460ff16905088565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610821576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610818906111cf565b60405180910390fd5b6040518060600160405280600115158152602001600a8152602001828152506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020190805190602001906108c4929190610d00565b509050505050565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1661095a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610951906111ef565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f69061120f565b60405180910390fd5b6003600082815260200190815260200160002060070160009054906101000a900460ff1615610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a906111af565b60405180910390fd5b600360008281526020019081526020016000206006016000815480929190610a8a90611473565b91905055506002600360008381526020019081526020016000206006015410610b625760016003600083815260200190815260200160002060070160006101000a81548160ff021916908315150217905550610b1d6003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032610c56565b3373ffffffffffffffffffffffffffffffffffffffff16817f82a82ea54aa0cfb8695810af1805d7f37f71a2683a57dc52567342b0a001f85260405160405180910390a35b610b6d33600a610c56565b50565b60606000600360008481526020019081526020016000206005016003600085815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16818054610bcd90611441565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf990611441565b8015610c465780601f10610c1b57610100808354040283529160200191610c46565b820191906000526020600020905b815481529060010190602001808311610c2957829003601f168201915b5050505050915091509150915091565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254610ca79190611361565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f42bcf4689d0211adce4e556ee455319d34e671e8b8a762034e146461fb1be82d82604051610cf4919061122f565b60405180910390a25050565b828054610d0c90611441565b90600052602060002090601f016020900481019282610d2e5760008555610d75565b82601f10610d4757805160ff1916838001178555610d75565b82800160010185558215610d75579182015b82811115610d74578251825591602001919060010190610d59565b5b509050610d829190610d86565b5090565b5b80821115610d9f576000816000905550600101610d87565b5090565b6000610db6610db184611315565b6112e4565b905082815260208101848484011115610dce57600080fd5b610dd98482856113ff565b509392505050565b600081359050610df08161155a565b92915050565b600082601f830112610e0757600080fd5b8135610e17848260208601610da3565b91505092915050565b600081359050610e2f81611571565b92915050565b600060208284031215610e4757600080fd5b6000610e5584828501610de1565b91505092915050565b60008060408385031215610e7157600080fd5b6000610e7f85828601610de1565b925050602083013567ffffffffffffffff811115610e9c57600080fd5b610ea885828601610df6565b9150509250929050565b60008060008060808587031215610ec857600080fd5b600085013567ffffffffffffffff811115610ee257600080fd5b610eee87828801610df6565b945050602085013567ffffffffffffffff811115610f0b57600080fd5b610f1787828801610df6565b935050604085013567ffffffffffffffff811115610f3457600080fd5b610f4087828801610df6565b925050606085013567ffffffffffffffff811115610f5d57600080fd5b610f6987828801610df6565b91505092959194509250565b600060208284031215610f8757600080fd5b6000610f9584828501610e20565b91505092915050565b610fa7816113b7565b82525050565b610fb6816113c9565b82525050565b6000610fc782611345565b610fd18185611350565b9350610fe181856020860161140e565b610fea81611549565b840191505092915050565b6000611002601083611350565b91507f416c7265616479207665726966696564000000000000000000000000000000006000830152602082019050919050565b6000611042601a83611350565b91507f4f6e6c79204c61622041646d696e2063616e20646f20746869730000000000006000830152602082019050919050565b6000611082601d83611350565b91507f4d757374206265207265676973746572656420726573656172636865720000006000830152602082019050919050565b60006110c2601783611350565b91507f43616e6e6f7420766572696679206f776e20656e7472790000000000000000006000830152602082019050919050565b6110fe816113f5565b82525050565b60006020820190506111196000830184610f9e565b92915050565b60006060820190506111346000830186610fad565b61114160208301856110f5565b81810360408301526111538184610fbc565b9050949350505050565b600060208201905081810360008301526111778184610fbc565b905092915050565b600060408201905081810360008301526111998185610fbc565b90506111a86020830184610f9e565b9392505050565b600060208201905081810360008301526111c881610ff5565b9050919050565b600060208201905081810360008301526111e881611035565b9050919050565b6000602082019050818103600083015261120881611075565b9050919050565b60006020820190508181036000830152611228816110b5565b9050919050565b600060208201905061124460008301846110f5565b92915050565b600061010082019050611260600083018b6110f5565b8181036020830152611272818a610fbc565b905081810360408301526112868189610fbc565b9050818103606083015261129a8188610fbc565b90506112a96080830187610f9e565b81810360a08301526112bb8186610fbc565b90506112ca60c08301856110f5565b6112d760e0830184610fad565b9998505050505050505050565b6000604051905081810181811067ffffffffffffffff8211171561130b5761130a61151a565b5b8060405250919050565b600067ffffffffffffffff8211156113305761132f61151a565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061136c826113f5565b9150611377836113f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113ac576113ab6114bc565b5b828201905092915050565b60006113c2826113d5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561142c578082015181840152602081019050611411565b8381111561143b576000848401525b50505050565b6000600282049050600182168061145957607f821691505b6020821081141561146d5761146c6114eb565b5b50919050565b600061147e826113f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156114b1576114b06114bc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b611563816113b7565b811461156e57600080fd5b50565b61157a816113f5565b811461158557600080fd5b5056fea2646970667358221220bc04262e0b3f59e1d74064235b000c35489c2b80ff2cc669aed5ac4572a7085b64736f6c63430008000033" +} \ No newline at end of file diff --git a/src/PureVersation.sol b/src/PureVersation.sol new file mode 100644 index 0000000000000000000000000000000000000000..e714663c90b006fddb870532e0c0bbb476d1a33e --- /dev/null +++ b/src/PureVersation.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract PureVersation { + + // --- 0. BRANDING --- + string public constant name = "PureVersation Research Registry"; + string public constant symbol = "VERSATION"; + + // --- 1. IDENTITY & REPUTATION --- + struct Researcher { + bool isRegistered; + uint256 reputationScore; + string role; // Dynamic: "Initiate", "Scout", "Linguist", "Archivist", "Oracle", or "Admin" + } + + mapping(address => Researcher) public researchers; + address public labAdmin; + + // --- 2. REGISTRY & LICENSING --- + struct DialectEntry { + uint256 id; + string phrase; + string dialect; + string ipfsCid; + address contributor; + string licenseType; + uint256 verificationCount; + bool isVerified; + } + + uint256 public entryCounter; + mapping(uint256 => DialectEntry) public entries; + + // --- 3. BACKUP SYSTEM --- + struct DataSnapshot { + uint256 timestamp; + string dataType; // "Database_CSV" or "Persona_JSON" + string ipfsCid; + string description; + address uploader; + } + + mapping(string => DataSnapshot[]) public backups; + + // ๐ŸŸข NEW MAPPINGS FOR SECURITY + mapping(uint256 => mapping(address => bool)) public hasVerified; + mapping(uint256 => mapping(address => bool)) public hasRejected; + mapping(uint256 => uint256) public rejectionCounts; + + // --- 4. EVENTS --- + event EntryProposed(uint256 indexed id, string phrase, address indexed proposer); + event EntryVerified(uint256 indexed id, address indexed verifier); + event EntryRejected(uint256 indexed id, address indexed rejector); // ๐ŸŸข NEW EVENT + event ReputationMinted(address indexed researcher, uint256 amount); + event RankUpgraded(address indexed researcher, string newRole); + event BackupCreated(string indexed dataKey, string ipfsCid, uint256 timestamp); + + constructor() { + labAdmin = msg.sender; + researchers[msg.sender] = Researcher(true, 100, "Admin"); + } + + // --- MODIFIERS --- + modifier onlyAdmin() { + require(msg.sender == labAdmin, "Only Lab Admin can do this"); + _; + } + + modifier onlyRegistered() { + require(researchers[msg.sender].isRegistered, "Must be registered researcher"); + _; + } + + // --- CORE FUNCTIONS --- + + function registerResearcher(address _user, string memory _initialRole) public onlyAdmin { + researchers[_user] = Researcher(true, 10, _initialRole); + _updateRank(_user); + } + + function proposeEntry(string memory _phrase, string memory _dialect, string memory _ipfsCid, string memory _license, address _contributor) public onlyRegistered { + entryCounter++; + entries[entryCounter] = DialectEntry(entryCounter, _phrase, _dialect, _ipfsCid, _contributor, _license, 0, false); + emit EntryProposed(entryCounter, _phrase, _contributor); + + if (!researchers[_contributor].isRegistered) { + researchers[_contributor] = Researcher(true, 0, "Initiate"); + } + } + + function verifyEntry(uint256 _id) public onlyRegistered { + require(entries[_id].contributor != msg.sender, "Cannot verify own entry"); + require(!entries[_id].isVerified, "Already verified"); + + if (msg.sender == labAdmin) { + // Admin can verify instantly + _applyVerification(_id); + } else { + // Peer consensus + require(!hasVerified[_id][msg.sender], "Already verified by you"); + hasVerified[_id][msg.sender] = true; + entries[_id].verificationCount++; + + if (entries[_id].verificationCount >= 2) { + _applyVerification(_id); + } + } + + // Reward the verifier + _mintReputation(msg.sender, 10); + } + + // ๐ŸŸข Helper for verification + function _applyVerification(uint256 _id) internal { + entries[_id].isVerified = true; + _mintReputation(entries[_id].contributor, 50); + emit EntryVerified(_id, msg.sender); + } + + // ๐ŸŸข FIX 2: Admin or Peer consensus rejection + function rejectEntry(uint256 _id) public onlyRegistered { + require(!entries[_id].isVerified, "Cannot reject an already verified entry"); + + if (msg.sender == labAdmin) { + // Admin can reject instantly + _applyRejection(_id); + } else { + // Peer consensus (3 out of 5 typical) + require(!hasRejected[_id][msg.sender], "Already rejected by you"); + hasRejected[_id][msg.sender] = true; + rejectionCounts[_id]++; + + if (rejectionCounts[_id] >= 3) { + _applyRejection(_id); + } + } + } + + // ๐ŸŸข Helper for rejection + function _applyRejection(uint256 _id) internal { + address badActor = entries[_id].contributor; + _burnReputation(badActor, 10); + emit EntryRejected(_id, msg.sender); + } + + function createBackup(string memory _dataKey, string memory _dataType, string memory _ipfsCid, string memory _description) public onlyRegistered { + DataSnapshot memory newSnap = DataSnapshot(block.timestamp, _dataType, _ipfsCid, _description, msg.sender); + backups[_dataKey].push(newSnap); + emit BackupCreated(_dataKey, _ipfsCid, block.timestamp); + } + + // --- HELPER & VIEW FUNCTIONS --- + + function getLatestBackup(string memory _dataKey) public view returns (string memory ipfsCid, uint256 timestamp) { + require(backups[_dataKey].length > 0, "No backups found"); + DataSnapshot memory snap = backups[_dataKey][backups[_dataKey].length - 1]; + return (snap.ipfsCid, snap.timestamp); + } + + function getLicenseInfo(uint256 _id) public view returns (string memory license, address contributor) { + return (entries[_id].licenseType, entries[_id].contributor); + } + + // --- INTERNAL REPUTATION & RANKING LOGIC --- + + function _mintReputation(address _user, uint256 _amount) internal { + researchers[_user].reputationScore += _amount; + emit ReputationMinted(_user, _amount); + _updateRank(_user); + } + + function _burnReputation(address _user, uint256 _amount) internal { + if (researchers[_user].reputationScore >= _amount) { + researchers[_user].reputationScore -= _amount; + } else { + researchers[_user].reputationScore = 0; + } + _updateRank(_user); + } + + function _updateRank(address _user) internal { + Researcher storage r = researchers[_user]; + + if (keccak256(abi.encodePacked(r.role)) == keccak256(abi.encodePacked("Admin"))) { + return; + } + + uint256 score = r.reputationScore; + string memory newRole; + + if (score >= 1500) { + newRole = "Oracle"; + } else if (score >= 800) { + newRole = "Archivist"; + } else if (score >= 300) { + newRole = "Linguist"; + } else if (score >= 100) { + newRole = "Scout"; + } else { + newRole = "Initiate"; + } + + if (keccak256(abi.encodePacked(r.role)) != keccak256(abi.encodePacked(newRole))) { + r.role = newRole; + emit RankUpgraded(_user, newRole); + } + } +} diff --git a/src/PureVersation_compiled.json b/src/PureVersation_compiled.json new file mode 100644 index 0000000000000000000000000000000000000000..a53aad4ea3984c3fe9d764f330b6babbb785f91b --- /dev/null +++ b/src/PureVersation_compiled.json @@ -0,0 +1,535 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "dataKey", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "BackupCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "indexed": true, + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "EntryProposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "rejector", + "type": "address" + } + ], + "name": "EntryRejected", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "verifier", + "type": "address" + } + ], + "name": "EntryVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "researcher", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "newRole", + "type": "string" + } + ], + "name": "RankUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "researcher", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ReputationMinted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "backups", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataType", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "address", + "name": "uploader", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_dataKey", + "type": "string" + }, + { + "internalType": "string", + "name": "_dataType", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_description", + "type": "string" + } + ], + "name": "createBackup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "entries", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "string", + "name": "phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "address", + "name": "contributor", + "type": "address" + }, + { + "internalType": "string", + "name": "licenseType", + "type": "string" + }, + { + "internalType": "uint256", + "name": "verificationCount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isVerified", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "entryCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_dataKey", + "type": "string" + } + ], + "name": "getLatestBackup", + "outputs": [ + { + "internalType": "string", + "name": "ipfsCid", + "type": "string" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "getLicenseInfo", + "outputs": [ + { + "internalType": "string", + "name": "license", + "type": "string" + }, + { + "internalType": "address", + "name": "contributor", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "hasRejected", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "hasVerified", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "labAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_phrase", + "type": "string" + }, + { + "internalType": "string", + "name": "_dialect", + "type": "string" + }, + { + "internalType": "string", + "name": "_ipfsCid", + "type": "string" + }, + { + "internalType": "string", + "name": "_license", + "type": "string" + }, + { + "internalType": "address", + "name": "_contributor", + "type": "address" + } + ], + "name": "proposeEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "string", + "name": "_initialRole", + "type": "string" + } + ], + "name": "registerResearcher", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "rejectEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rejectionCounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "researchers", + "outputs": [ + { + "internalType": "bool", + "name": "isRegistered", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "reputationScore", + "type": "uint256" + }, + { + "internalType": "string", + "name": "role", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "verifyEntry", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "60806040523480156200001157600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280600115158152602001606481526020016040518060400160405280600581526020017f41646d696e0000000000000000000000000000000000000000000000000000008152508152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020190805190602001906200012d92919062000137565b509050506200024c565b8280546200014590620001e7565b90600052602060002090601f016020900481019282620001695760008555620001b5565b82601f106200018457805160ff1916838001178555620001b5565b82800160010185558215620001b5579182015b82811115620001b457825182559160200191906001019062000197565b5b509050620001c49190620001c8565b5090565b5b80821115620001e3576000816000905550600101620001c9565b5090565b600060028204905060018216806200020057607f821691505b602082108114156200021757620002166200021d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612f35806200025c6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638c06062c116100a2578063d17007b511610071578063d17007b5146102d6578063d40f299a14610306578063e8a3c5a714610322578063efebb04414610356578063f3c2cf65146103725761010b565b80638c06062c1461024957806395d89b4114610265578063b30906d414610283578063b6602c3a146102ba5761010b565b806356563e4a116100de57806356563e4a146101ac57806362da8313146101dc57806379a0f97b146101fa57806386c8ce7f1461022b5761010b565b806301bc237d1461011057806306fdde031461014257806308a0e3131461016057806320fb56291461017c575b600080fd5b61012a60048036038101906101259190612224565b6103a3565b6040516101399392919061292a565b60405180910390f35b61014a610462565b6040516101579190612968565b60405180910390f35b61017a600480360381019061017591906123a5565b61049b565b005b610196600480360381019061019191906124f9565b610826565b6040516101a3919061290f565b60405180910390f35b6101c660048036038101906101c191906124f9565b610855565b6040516101d3919061290f565b60405180910390f35b6101e4610884565b6040516101f19190612aea565b60405180910390f35b610214600480360381019061020f91906122a1565b61088a565b6040516102229291906129ba565b60405180910390f35b610233610bbb565b60405161024091906128f4565b60405180910390f35b610263600480360381019061025e91906124d0565b610be1565b005b61026d610e90565b60405161027a9190612968565b60405180910390f35b61029d600480360381019061029891906124d0565b610ec9565b6040516102b1989796959493929190612b6d565b60405180910390f35b6102d460048036038101906102cf91906122e2565b61115e565b005b6102f060048036038101906102eb91906124d0565b611375565b6040516102fd9190612aea565b60405180910390f35b610320600480360381019061031b919061224d565b61138d565b005b61033c6004803603810190610337919061247c565b6114d1565b60405161034d959493929190612b05565b60405180910390f35b610370600480360381019061036b91906124d0565b6116f2565b005b61038c600480360381019061038791906124d0565b611a57565b60405161039a92919061298a565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020180546103df90612db8565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90612db8565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905083565b6040518060400160405280601f81526020017f50757265566572736174696f6e2052657365617263682052656769737472790081525081565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052090612a6a565b60405180910390fd5b6002600081548092919061053c90612dea565b919050555060405180610100016040528060025481526020018681526020018581526020018481526020018273ffffffffffffffffffffffffffffffffffffffff16815260200183815260200160008152602001600015158152506003600060025481526020019081526020016000206000820151816000015560208201518160010190805190602001906105d29291906120ef565b5060408201518160020190805190602001906105ef9291906120ef565b50606082015181600301908051906020019061060c9291906120ef565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050190805190602001906106709291906120ef565b5060c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050508073ffffffffffffffffffffffffffffffffffffffff166002547f41bbb82aa0096a4ef6e73d180bcf005a06dae558a2bd374fefd8e9d3d116d693876040516106e79190612968565b60405180910390a36000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1661081f576040518060600160405280600115158152602001600081526020016040518060400160405280600881526020017f496e6974696174650000000000000000000000000000000000000000000000008152508152506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160010155604082015181600201908051906020019061081a9291906120ef565b509050505b5050505050565b60066020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60025481565b606060008060048460405161089f91906128b1565b908152602001604051809103902080549050116108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e890612a8a565b60405180910390fd5b600060048460405161090391906128b1565b9081526020016040518091039020600160048660405161092391906128b1565b90815260200160405180910390208054905061093f9190612cfa565b81548110610976577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820180546109a990612db8565b80601f01602080910402602001604051908101604052809291908181526020018280546109d590612db8565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b50505050508152602001600282018054610a3b90612db8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6790612db8565b8015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b50505050508152602001600382018054610acd90612db8565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990612db8565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050806040015181600001519250925050915091565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690612a6a565b60405180910390fd5b6003600082815260200190815260200160002060070160009054906101000a900460ff1615610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906129ea565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610d3757610d3281611b3d565b610e8d565b6006600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90612aaa565b60405180910390fd5b60016006600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600760008281526020019081526020016000206000815480929190610e6290612dea565b91905055506003600760008381526020019081526020016000205410610e8c57610e8b81611b3d565b5b5b50565b6040518060400160405280600981526020017f564552534154494f4e000000000000000000000000000000000000000000000081525081565b6003602052806000526040600020600091509050806000015490806001018054610ef290612db8565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1e90612db8565b8015610f6b5780601f10610f4057610100808354040283529160200191610f6b565b820191906000526020600020905b815481529060010190602001808311610f4e57829003601f168201915b505050505090806002018054610f8090612db8565b80601f0160208091040260200160405190810160405280929190818152602001828054610fac90612db8565b8015610ff95780601f10610fce57610100808354040283529160200191610ff9565b820191906000526020600020905b815481529060010190602001808311610fdc57829003601f168201915b50505050509080600301805461100e90612db8565b80601f016020809104026020016040519081016040528092919081815260200182805461103a90612db8565b80156110875780601f1061105c57610100808354040283529160200191611087565b820191906000526020600020905b81548152906001019060200180831161106a57829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050180546110c290612db8565b80601f01602080910402602001604051908101604052809291908181526020018280546110ee90612db8565b801561113b5780601f106111105761010080835404028352916020019161113b565b820191906000526020600020905b81548152906001019060200180831161111e57829003601f168201915b5050505050908060060154908060070160009054906101000a900460ff16905088565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390612a6a565b60405180910390fd5b60006040518060a001604052804281526020018581526020018481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815250905060048560405161123d91906128b1565b908152602001604051809103902081908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000155602082015181600101908051906020019061129b9291906120ef565b5060408201518160020190805190602001906112b89291906120ef565b5060608201518160030190805190602001906112d59291906120ef565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508460405161132d91906128b1565b60405180910390207f55e378dbc81cbf3764f2fdc9915435a0de49effbb859d048f04415a779e4055184426040516113669291906129ba565b60405180910390a25050505050565b60076020528060005260406000206000915090505481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490612a2a565b60405180910390fd5b6040518060600160405280600115158152602001600a8152602001828152506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020190805190602001906114c09291906120ef565b509050506114cd82611bcb565b5050565b600482805160208101820180518482526020830160208501208183528095505050505050818154811061150357600080fd5b90600052602060002090600502016000915091505080600001549080600101805461152d90612db8565b80601f016020809104026020016040519081016040528092919081815260200182805461155990612db8565b80156115a65780601f1061157b576101008083540402835291602001916115a6565b820191906000526020600020905b81548152906001019060200180831161158957829003601f168201915b5050505050908060020180546115bb90612db8565b80601f01602080910402602001604051908101604052809291908181526020018280546115e790612db8565b80156116345780601f1061160957610100808354040283529160200191611634565b820191906000526020600020905b81548152906001019060200180831161161757829003601f168201915b50505050509080600301805461164990612db8565b80601f016020809104026020016040519081016040528092919081815260200182805461167590612db8565b80156116c25780601f10611697576101008083540402835291602001916116c2565b820191906000526020600020905b8154815290600101906020018083116116a557829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790612a6a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90612aca565b60405180910390fd5b6003600082815260200190815260200160002060070160009054906101000a900460ff1615611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090612a0a565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156118ed576118e881611e8b565b611a49565b6005600082815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290612a4a565b60405180910390fd5b60016005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600360008281526020019081526020016000206006016000815480929190611a1b90612dea565b91905055506002600360008381526020019081526020016000206006015410611a4857611a4781611e8b565b5b5b611a5433600a611f42565b50565b60606000600360008481526020019081526020016000206005016003600085815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16818054611ab490612db8565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae090612db8565b8015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b5050505050915091509150915091565b60006003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611b8381600a611ff5565b3373ffffffffffffffffffffffffffffffffffffffff16827f3eacba1ffefb355646272b609f3eba7aa492e7f0eae1d9a94d019a2bbcca4b8160405160405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050604051602001611c1c906128df565b6040516020818303038152906040528051906020012081600201604051602001611c4691906128c8565b604051602081830303815290604052805190602001201415611c685750611e88565b60008160010154905060606105dc8210611cb9576040518060400160405280600681526020017f4f7261636c6500000000000000000000000000000000000000000000000000008152509050611dc6565b6103208210611cff576040518060400160405280600981526020017f41726368697669737400000000000000000000000000000000000000000000008152509050611dc5565b61012c8210611d45576040518060400160405280600881526020017f4c696e67756973740000000000000000000000000000000000000000000000008152509050611dc4565b60648210611d8a576040518060400160405280600581526020017f53636f75740000000000000000000000000000000000000000000000000000008152509050611dc3565b6040518060400160405280600881526020017f496e69746961746500000000000000000000000000000000000000000000000081525090505b5b5b5b80604051602001611dd791906128b1565b6040516020818303038152906040528051906020012083600201604051602001611e0191906128c8565b6040516020818303038152906040528051906020012014611e845780836002019080519060200190611e349291906120ef565b508373ffffffffffffffffffffffffffffffffffffffff167f38b44ef000ae19b1706917d3ee6c5625716848370f1af5a83e5e6e40484696a482604051611e7b9190612968565b60405180910390a25b5050505b50565b60016003600083815260200190815260200160002060070160006101000a81548160ff021916908315150217905550611efb6003600083815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032611f42565b3373ffffffffffffffffffffffffffffffffffffffff16817f82a82ea54aa0cfb8695810af1805d7f37f71a2683a57dc52567342b0a001f85260405160405180910390a350565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254611f939190612ca4565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167f42bcf4689d0211adce4e556ee455319d34e671e8b8a762034e146461fb1be82d82604051611fe09190612aea565b60405180910390a2611ff182611bcb565b5050565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541061209a57806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082825461208e9190612cfa565b925050819055506120e2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b6120eb82611bcb565b5050565b8280546120fb90612db8565b90600052602060002090601f01602090048101928261211d5760008555612164565b82601f1061213657805160ff1916838001178555612164565b82800160010185558215612164579182015b82811115612163578251825591602001919060010190612148565b5b5090506121719190612175565b5090565b5b8082111561218e576000816000905550600101612176565b5090565b60006121a56121a084612c38565b612c07565b9050828152602081018484840111156121bd57600080fd5b6121c8848285612d76565b509392505050565b6000813590506121df81612ed1565b92915050565b600082601f8301126121f657600080fd5b8135612206848260208601612192565b91505092915050565b60008135905061221e81612ee8565b92915050565b60006020828403121561223657600080fd5b6000612244848285016121d0565b91505092915050565b6000806040838503121561226057600080fd5b600061226e858286016121d0565b925050602083013567ffffffffffffffff81111561228b57600080fd5b612297858286016121e5565b9150509250929050565b6000602082840312156122b357600080fd5b600082013567ffffffffffffffff8111156122cd57600080fd5b6122d9848285016121e5565b91505092915050565b600080600080608085870312156122f857600080fd5b600085013567ffffffffffffffff81111561231257600080fd5b61231e878288016121e5565b945050602085013567ffffffffffffffff81111561233b57600080fd5b612347878288016121e5565b935050604085013567ffffffffffffffff81111561236457600080fd5b612370878288016121e5565b925050606085013567ffffffffffffffff81111561238d57600080fd5b612399878288016121e5565b91505092959194509250565b600080600080600060a086880312156123bd57600080fd5b600086013567ffffffffffffffff8111156123d757600080fd5b6123e3888289016121e5565b955050602086013567ffffffffffffffff81111561240057600080fd5b61240c888289016121e5565b945050604086013567ffffffffffffffff81111561242957600080fd5b612435888289016121e5565b935050606086013567ffffffffffffffff81111561245257600080fd5b61245e888289016121e5565b925050608061246f888289016121d0565b9150509295509295909350565b6000806040838503121561248f57600080fd5b600083013567ffffffffffffffff8111156124a957600080fd5b6124b5858286016121e5565b92505060206124c68582860161220f565b9150509250929050565b6000602082840312156124e257600080fd5b60006124f08482850161220f565b91505092915050565b6000806040838503121561250c57600080fd5b600061251a8582860161220f565b925050602061252b858286016121d0565b9150509250929050565b61253e81612d2e565b82525050565b61254d81612d40565b82525050565b600061255e82612c7d565b6125688185612c88565b9350612578818560208601612d85565b61258181612ec0565b840191505092915050565b600061259782612c7d565b6125a18185612c99565b93506125b1818560208601612d85565b80840191505092915050565b600081546125ca81612db8565b6125d48186612c99565b945060018216600081146125ef576001811461260057612633565b60ff19831686528186019350612633565b61260985612c68565b60005b8381101561262b5781548189015260018201915060208101905061260c565b838801955050505b50505092915050565b6000612649602783612c88565b91507f43616e6e6f742072656a65637420616e20616c7265616479207665726966696560008301527f6420656e747279000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126af601083612c88565b91507f416c7265616479207665726966696564000000000000000000000000000000006000830152602082019050919050565b60006126ef601a83612c88565b91507f4f6e6c79204c61622041646d696e2063616e20646f20746869730000000000006000830152602082019050919050565b600061272f600583612c99565b91507f41646d696e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061276f601783612c88565b91507f416c726561647920766572696669656420627920796f750000000000000000006000830152602082019050919050565b60006127af601d83612c88565b91507f4d757374206265207265676973746572656420726573656172636865720000006000830152602082019050919050565b60006127ef601083612c88565b91507f4e6f206261636b75707320666f756e64000000000000000000000000000000006000830152602082019050919050565b600061282f601783612c88565b91507f416c72656164792072656a656374656420627920796f750000000000000000006000830152602082019050919050565b600061286f601783612c88565b91507f43616e6e6f7420766572696679206f776e20656e7472790000000000000000006000830152602082019050919050565b6128ab81612d6c565b82525050565b60006128bd828461258c565b915081905092915050565b60006128d482846125bd565b915081905092915050565b60006128ea82612722565b9150819050919050565b60006020820190506129096000830184612535565b92915050565b60006020820190506129246000830184612544565b92915050565b600060608201905061293f6000830186612544565b61294c60208301856128a2565b818103604083015261295e8184612553565b9050949350505050565b600060208201905081810360008301526129828184612553565b905092915050565b600060408201905081810360008301526129a48185612553565b90506129b36020830184612535565b9392505050565b600060408201905081810360008301526129d48185612553565b90506129e360208301846128a2565b9392505050565b60006020820190508181036000830152612a038161263c565b9050919050565b60006020820190508181036000830152612a23816126a2565b9050919050565b60006020820190508181036000830152612a43816126e2565b9050919050565b60006020820190508181036000830152612a6381612762565b9050919050565b60006020820190508181036000830152612a83816127a2565b9050919050565b60006020820190508181036000830152612aa3816127e2565b9050919050565b60006020820190508181036000830152612ac381612822565b9050919050565b60006020820190508181036000830152612ae381612862565b9050919050565b6000602082019050612aff60008301846128a2565b92915050565b600060a082019050612b1a60008301886128a2565b8181036020830152612b2c8187612553565b90508181036040830152612b408186612553565b90508181036060830152612b548185612553565b9050612b636080830184612535565b9695505050505050565b600061010082019050612b83600083018b6128a2565b8181036020830152612b95818a612553565b90508181036040830152612ba98189612553565b90508181036060830152612bbd8188612553565b9050612bcc6080830187612535565b81810360a0830152612bde8186612553565b9050612bed60c08301856128a2565b612bfa60e0830184612544565b9998505050505050505050565b6000604051905081810181811067ffffffffffffffff82111715612c2e57612c2d612e91565b5b8060405250919050565b600067ffffffffffffffff821115612c5357612c52612e91565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000612caf82612d6c565b9150612cba83612d6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cef57612cee612e33565b5b828201905092915050565b6000612d0582612d6c565b9150612d1083612d6c565b925082821015612d2357612d22612e33565b5b828203905092915050565b6000612d3982612d4c565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612da3578082015181840152602081019050612d88565b83811115612db2576000848401525b50505050565b60006002820490506001821680612dd057607f821691505b60208210811415612de457612de3612e62565b5b50919050565b6000612df582612d6c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e2857612e27612e33565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b612eda81612d2e565b8114612ee557600080fd5b50565b612ef181612d6c565b8114612efc57600080fd5b5056fea26469706673582212207aabd3bff3ed7bcf5b68e253bb08c3fc682d85f50187aa15729a5fa85b5a096364736f6c63430008000033" +} \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5682551942856607395b566d7bf3f1cf7de9275f --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,15 @@ +import os +import tempfile +from pydub import AudioSegment +from pydub.generators import Sine + +def create_warning_beep(): + """Generates a warning sound file for the UI.""" + try: + beep = Sine(1000).to_audio_segment(duration=500).apply_gain(5) + path = os.path.join(tempfile.gettempdir(), "warning_beep.wav") + beep.export(path, format="wav") + return path + except Exception as e: + print(f"โš ๏ธ Could not create warning beep: {e}") + return None \ No newline at end of file diff --git a/src/acoustic_agent.py b/src/acoustic_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..6b8c15e3e2db5558a15df06f85c500d070d99dd9 --- /dev/null +++ b/src/acoustic_agent.py @@ -0,0 +1,66 @@ +""" +๐ŸŽต Agent 5 (Acoustics) - PureVersation Linguistic Pipeline +------------------------------------------------- +This agent converts transcribed text and dialect metadata into +International Phonetic Alphabet (IPA) representations and +analyzes regional intonation patterns. +""" + +import json + +class AgentAcoustic: + def __init__(self, llm_manager): + self.llm_manager = llm_manager + print("๐ŸŽต Agent 5 (Acoustic) Online: Phonetic Analysis Engine Ready.") + + def generate_phonetic_profile(self, text, dialect): + """ + Uses the AI engine to generate an IPA representation and intonation rules + for the given text based on the specific dialect. + """ + if not self.llm_manager: + return json.dumps({ + "ipa": "/unavailable/", + "intonation": "LLM Manager not connected. Cannot perform acoustic analysis." + }) + + prompt = f""" + You are an expert socio-linguist and phonetician. + The user has spoken the following text in the following dialect/language: + Text: "{text}" + Dialect: "{dialect}" + + Please provide the following: + 1. "ipa": The most accurate International Phonetic Alphabet (IPA) transcription of how this exact phrase would be pronounced in this specific dialect. + 2. "intonation": A brief, 1-2 sentence description of the stress, rhythm, and intonation patterns typical for this phrase in this dialect. + + Output ONLY valid JSON in this exact format, with no markdown formatting or backticks: + {{ + "ipa": "/hษ™หˆloสŠ/", + "intonation": "Stress falls on the second syllable with a rising pitch at the end." + }} + """ + + try: + # ๐ŸŸข FIX 1: Use the safe, isolated async wrapper to prevent UI freezing + response_obj = self._safe_generate(prompt) + + # ๐ŸŸข FIX 2: GroqManager returns an object, so we must extract '.text' + response_text = response_obj.text if hasattr(response_obj, 'text') else str(response_obj) + + # Clean response + clean_res = response.replace("```json", "").replace("```", "").strip() + + # Verify it's valid JSON + parsed = json.loads(clean_res) + return json.dumps({ + "ipa": parsed.get("ipa", "Unknown"), + "intonation": parsed.get("intonation", "Unknown") + }) + + except Exception as e: + print(f"๐ŸŽต Acoustic Agent Error: {e}") + return json.dumps({ + "ipa": f"/error parsing {dialect} phonetics/", + "intonation": "Error occurred during generation." + }) diff --git a/src/asr_language.py b/src/asr_language.py new file mode 100644 index 0000000000000000000000000000000000000000..c6c80108f7505ae8134842662d19797f02a9da10 --- /dev/null +++ b/src/asr_language.py @@ -0,0 +1,180 @@ +import json +import re +import unicodedata + + +SUPPORTED_ASR_CODES = { + "af", "am", "ar", "as", "az", "ba", "be", "bg", "bn", "bo", "br", "bs", + "ca", "cs", "cy", "da", "de", "el", "en", "es", "et", "eu", "fa", "fi", + "fo", "fr", "gl", "gu", "ha", "haw", "he", "hi", "hr", "ht", "hu", "hy", + "id", "is", "it", "ja", "jw", "ka", "kk", "km", "kn", "ko", "la", "lb", + "ln", "lo", "lt", "lv", "mg", "mi", "mk", "ml", "mn", "mr", "ms", "mt", + "my", "ne", "nl", "nn", "no", "oc", "pa", "pl", "ps", "pt", "ro", "ru", + "sa", "sd", "si", "sk", "sl", "sn", "so", "sq", "sr", "su", "sv", "sw", + "ta", "te", "tg", "th", "tk", "tl", "tr", "tt", "uk", "ur", "uz", "vi", + "yi", "yo", "zh", +} + +LANGUAGE_TO_ASR_CODE = { + "afrikaans": "af", + "amharic": "am", + "arabic": "ar", + "egyptian arabic": "ar", + "bengali": "bn", + "bangla": "bn", + "bulgarian": "bg", + "cantonese": "zh", + "chinese": "zh", + "creole": "en", + "english": "en", + "filipino": "tl", + "french": "fr", + "german": "de", + "greek": "el", + "hausa": "ha", + "hindi": "hi", + "igbo": "ig", + "indonesian": "id", + "italian": "it", + "japanese": "ja", + "korean": "ko", + "malay": "ms", + "malaysian": "ms", + "mandarin": "zh", + "persian": "fa", + "farsi": "fa", + "portuguese": "pt", + "russian": "ru", + "spanish": "es", + "tagalog": "tl", + "tamil": "ta", + "telugu": "te", + "thai": "th", + "turkish": "tr", + "ukrainian": "uk", + "urdu": "ur", + "vietnamese": "vi", + "yoruba": "yo", +} + +DIALECT_TO_LANGUAGE = { + "aave": "English", + "african american vernacular english": "English", + "american english": "English", + "british english": "English", + "chinese english": "English", + "filipino english": "English", + "ghanaian pidgin english": "English", + "indian english": "English", + "indonesian english": "English", + "jamaican patois": "English", + "korean english": "English", + "malaysian english": "English", + "naija pidgin": "English", + "nigerian english": "English", + "nigerian pidgin english": "English", + "pakistani english": "English", + "singaporean english": "English", + "spanish creole": "English", + "standard": "English", + "standard english": "English", + "egyptian arabic": "Arabic", + "cretan greek": "Greek", + "kano": "Hausa", + "kano hausa": "Hausa", + "katsina": "Hausa", + "sokoto": "Hausa", + "zaria": "Hausa", + "chungcheong satoori": "Korean", + "gangwon satoori": "Korean", + "gyeongsang satoori": "Korean", + "jeju dialect": "Korean", + "jeju korean": "Korean", + "jeju satoori": "Korean", + "jeolla satoori": "Korean", + "seoul dialect": "Korean", + "asusu igbo": "Igbo", + "igbo kolo": "Igbo", + "izugbe": "Igbo", + "onicha": "Igbo", +} + + +def _normalize(value): + text = str(value or "").strip() + decomposed = unicodedata.normalize("NFKD", text) + asciiish = "".join(ch for ch in decomposed if not unicodedata.combining(ch)) + return re.sub(r"[^a-z0-9]+", " ", asciiish.lower()).strip() + + +_LANGUAGE_LOOKUP = {_normalize(k): v for k, v in LANGUAGE_TO_ASR_CODE.items()} +_DIALECT_LOOKUP = {_normalize(k): v for k, v in DIALECT_TO_LANGUAGE.items()} + + +def parse_asr_hint(hint): + if hint is None: + return "", "" + + if isinstance(hint, (list, tuple)): + language = str(hint[0] if len(hint) > 0 else "").strip() + dialect = str(hint[1] if len(hint) > 1 else "").strip() + return language, dialect + + text = str(hint).strip() + if not text: + return "", "" + + if text.startswith("{"): + try: + data = json.loads(text) + language = data.get("language") or data.get("source_language") or data.get("sourceLang") or "" + dialect = data.get("dialect") or data.get("source_dialect") or data.get("sourceDialect") or "" + return str(language).strip(), str(dialect).strip() + except Exception: + pass + + if "|||" in text: + language, dialect = (text.split("|||", 1) + [""])[:2] + return language.strip(), dialect.strip() + + return "", text + + +def infer_language_from_dialect(dialect): + norm = _normalize(dialect) + if not norm: + return "" + if norm in _DIALECT_LOOKUP: + return _DIALECT_LOOKUP[norm] + if any(token in norm for token in ("hausa", "kano", "sokoto", "zaria", "katsina")): + return "Hausa" + if any(token in norm for token in ("korean", "satoori", "saturi", "seoul", "jeju", "jeolla", "gyeongsang", "chungcheong", "gangwon")): + return "Korean" + if any(token in norm for token in ("arabic", "egyptian", "levantine", "gulf")): + return "Arabic" + if any(token in norm for token in ("igbo", "onicha", "izugbe", "asusu")): + return "Igbo" + if any(token in norm for token in ("english", "pidgin", "patois", "aave", "creole")): + return "English" + return "" + + +def resolve_asr_language_code(language_or_hint="", dialect=""): + parsed_language, parsed_dialect = parse_asr_hint(language_or_hint) + source_language = parsed_language or "" + source_dialect = parsed_dialect or str(dialect or "").strip() + + if not source_language: + source_language = infer_language_from_dialect(source_dialect) + + norm_language = _normalize(source_language) + asr_code = None + if norm_language in SUPPORTED_ASR_CODES: + asr_code = norm_language + else: + asr_code = _LANGUAGE_LOOKUP.get(norm_language) + + if asr_code not in SUPPORTED_ASR_CODES: + asr_code = None + + return asr_code, source_language, source_dialect diff --git a/src/brain_agent.py b/src/brain_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..f16c6800b169561e5eee8eae45e3b0ed5e0592aa --- /dev/null +++ b/src/brain_agent.py @@ -0,0 +1,445 @@ +""" +๐Ÿง  Agent 2 (Interpretation) - Gemini 2.0 EDITION +------------------------------------------------- +This version of the AgentBrain handles all deep sociolinguistic logic, +prompt engineering, and dataset searching. +""" + +import os +import glob +import pandas as pd +import json +import re +import concurrent.futures +from rapidfuzz import process, fuzz +from src.dialect_rules import nigerian_variety_instruction +from src.rag_manager import SociolinguisticRAG + +class AgentInterpretation: + def __init__(self, config, gemini_manager_instance=None): + self.config = config + self.gemini_manager = gemini_manager_instance + self.gemini_manager_instance = gemini_manager_instance # Kept for your backward compatibility + self.lab_profile = {} + self.active_profiles_list = [] + + # ๐ŸŸข 1. Initialize RAG Engines (The Token Saver) + self.profiles_dir = os.path.join(self.config.BASE_DIR, "lab_profiles") + self.rag_engines = {} + self._initialize_rag_databases() + + # ๐ŸŸข 2. Restore your Concurrency and Background Tasks + import concurrent.futures # Ensure this is imported at the top of the file + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=10) + print("๐Ÿง  Agent 2 (Interpretation) Online: Persistent Pool & RAG Engines Ready.") + + # ๐ŸŸข 3. Restore your background knowledge refresh (if it relies on updating CSVs) + self.refresh_knowledge_base() + + def _safe_generate(self, prompt): + """ + Safely runs the async Groq generation inside a synchronous thread + by creating an isolated event loop. This prevents Gradio UI freezing. + """ + import asyncio + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + # We await the async generate_fast method inside this isolated loop + return loop.run_until_complete(self.gemini_manager.generate_fast(prompt)) + finally: + loop.close() + + def _initialize_rag_databases(self): + """Loads all heavy JSON personas into lightweight RAM vectors on startup.""" + if not os.path.exists(self.profiles_dir): + return + + for filename in os.listdir(self.profiles_dir): + if filename.endswith("Persona.json"): + dialect_name = filename.replace(" Persona.json", "") + filepath = os.path.join(self.profiles_dir, filename) + + try: + with open(filepath, "r", encoding="utf-8") as f: + data = json.load(f) + + # ๐ŸŸข Flatten the heavy JSON into a list of simple string rules + rules = [] + if "lexicon" in data: + for word, meaning in data["lexicon"].items(): + rules.append(f"Lexicon: '{word}' means {meaning}.") + if "pragmatics" in data: + for rule in data["pragmatics"]: + rules.append(f"Pragmatics: {rule}") + if "syntax" in data: + for rule in data["syntax"]: + rules.append(f"Syntax: {rule}") + + # Initialize RAG for this specific dialect + rag = SociolinguisticRAG() + rag.load_persona_rules(dialect_name, rules) + self.rag_engines[dialect_name] = rag + + except Exception as e: + print(f"โš ๏ธ Failed to load RAG for {filename}: {e}") + + def get_available_profiles(self): + files = glob.glob(os.path.join(self.config.PROFILES_DIR, "*.json")) + return [os.path.basename(f) for f in files] + + def load_profile_by_name(self, filename): + path = os.path.join(self.config.PROFILES_DIR, filename) + try: + with open(path, 'r', encoding='utf-8') as f: + self.lab_profile = json.load(f) + return self.lab_profile + except: + self.lab_profile = {} + return {} + + def save_specific_profile(self, filename, json_str): + if not filename.endswith(".json"): filename += ".json" + path = os.path.join(self.config.PROFILES_DIR, filename) + try: + with open(path, "w", encoding="utf-8") as f: json.dump(json.loads(json_str), f, indent=2) + return "โœ… Saved locally (HF Sync pending)" + except Exception as e: return f"โŒ Error: {e}" + + def get_current_profile_text(self): + return json.dumps(getattr(self, "lab_profile", {}) or {}, indent=2) + + def load_all_profiles_simultaneously(self): + files = glob.glob(os.path.join(self.config.PROFILES_DIR, "*.json")) + loaded_count = 0 + names = [] + self.active_profiles_list = [] + + for f_path in files: + try: + with open(f_path, 'r', encoding='utf-8') as f: + data = json.load(f) + self.active_profiles_list.append(data) + names.append(data.get("lab_name", os.path.basename(f_path))) + loaded_count += 1 + except: pass + return f"โœ… Loaded {loaded_count} profiles simultaneously: {', '.join(names)}" + + def refresh_knowledge_base(self): + all_files = glob.glob(os.path.join(self.config.DATASET_DIR, "**", "*.csv"), recursive=True) + df_list = [] + for filename in all_files: + try: + temp_df = pd.read_csv(filename, encoding='utf-8-sig', on_bad_lines='skip', low_memory=True) + temp_df = temp_df[['Utterance', 'Clarification', 'Dialect']] + df_list.append(temp_df) + except: pass + if df_list: + self.df = pd.concat(df_list, ignore_index=True) + self.lookup_list = self.df["Utterance"].tolist() + else: + self.lookup_list = [] + + def normalize_keys(self, data_list): + cleaned_list = [] + for item in data_list: + new_item = { + "Dialect": item.get("Dialect") or item.get("dialect", "Unknown"), + "Clarification": item.get("Clarification") or item.get("clarification", "---"), + "Tone": item.get("Tone") or item.get("tone", "---"), + "Context": item.get("Context") or item.get("context", "---"), + "Pragmatic Analysis": item.get("Pragmatic Analysis") or item.get("pragmatics", "---"), + "Source": item.get("Source", "โœจ AI Generated") + } + cleaned_list.append(new_item) + return cleaned_list + + # ========================================== + # MODULAR LOGIC (MOVED FROM UX_AGENT) + # ========================================== + + def generate_conversation_starter(self, topic_str): + """Generates the mission prompt for the React Games.""" + if not self.gemini_manager: + if "You are Echo" in topic_str: return json.dumps({"text": "Haha, I hear you! What else is going on?"}) + return json.dumps({"text": f"Let's talk about {topic_str}. What comes to mind?"}) + + try: + if "You are Echo" in topic_str: + prompt = f""" + {topic_str} + + CRITICAL ROLEPLAY INSTRUCTIONS FOR THIS TURN: + 1. You are Echo, a human peer and friend. + 2. NEVER break character. NEVER say you are an AI, a computer program, or a language model. + 3. Play along naturally. If they ask for favors or money (e.g., begging/joking), play along like a real person. + 4. Keep your response to ONE short, highly conversational sentence. Do not be overly formal. + 5. On login, you will switch the user's English dialect. + """ + else: + prompt = f"Generate a very short, engaging, single-sentence conversation starter or question about: {topic_str}." + + response = self._safe_generate(prompt) + #response = self.gemini_manager.client.models.generate_content( + #model='gemini-2.0-flash', + #contents=prompt + #) + clean_text = response.text.replace("```json", "").replace("```", "").strip() + return json.dumps({"text": clean_text}) + except Exception as e: + print(f"โš ๏ธ Mission Gen Error: {e}") + if "You are Echo" in topic_str: return json.dumps({"text": "Haha, I hear you! What else is going on?"}) + return json.dumps({"text": f"Let's talk about {topic_str}. What comes to mind?"}) + + def search_local_dataset(self, text): + """Tier 1: Returns a single local match only if it is nearly identical.""" + try: + if self.df.empty: return None + + utterances = self.df["Utterance"].astype(str).tolist() + match = process.extractOne(text, utterances, scorer=fuzz.WRatio) + + if match and match[1] >= 90: + row = self.df[self.df["Utterance"] == match[0]].iloc[0] + + def clean_val(val, default=""): + return default if pd.isna(val) else str(val) + + return { + "Source": "๐Ÿ—„๏ธ Local Dataset", + "Speaker": "User", + "dialect": clean_val(row.get("Dialect"), "Unknown"), + "clarification": clean_val(row.get("Clarification")), + "tone": clean_val(row.get("Tone_Category"), "Neutral / Conversational"), + "context": clean_val(row.get("Linguistic_Context")), + "pragmatics": clean_val(row.get("Pragmatic_Analysis"), "Verified via local Regex") + } + except Exception as e: + print(f"Dataset Search Error: {e}") + return None + + def search_personas(self, text): + """Tier 2: Checks the currently loaded JSON persona for jargon.""" + try: + profiles = [] + current_profile = getattr(self, "lab_profile", None) + if current_profile: + profiles.append(current_profile) + profiles.extend(getattr(self, "active_profiles_list", []) or []) + if not profiles: + return None + + text_lower = text.lower() + + for profile in profiles: + jargon_dict = ( + profile.get("jargons") + or profile.get("jargon") + or profile.get("lexicon") + or {} + ) + if not isinstance(jargon_dict, dict): + continue + + for slang, meaning in jargon_dict.items(): + if re.search(r'\b' + re.escape(slang.lower()) + r'\b', text_lower): + rules = profile.get("pragmatic_rules") or profile.get("pragmatics") or [] + rule = rules[0] if isinstance(rules, list) and rules else "" + return { + "Source": "๐ŸŽญ Persona Injection", + "Speaker": "User", + "dialect": profile.get("dialect_name") or profile.get("dialect") or profile.get("lab_name", "Unknown Persona"), + "clarification": f"Contains slang '{slang}' -> {meaning}", + "tone": "Casual / Slang", + "context": profile.get("cultural_context", "Inferred from active Persona"), + "pragmatics": f"Rule triggered: {rule}" + } + except Exception as e: + print(f"Persona Search Error: {e}") + return None + + # ========================================== + # DEEP GENERATIVE AI LOGIC + # ========================================== + + def analyze_dialect_single(self, text, language_code): + """Generates a high-confidence, culturally nuanced interpretation from AI.""" + print(f" -> ๐Ÿง  Preparing Sociolinguistic Prompt for: {language_code}") + + # ๐ŸŸข 1. RAG RETRIEVAL: Get the specific rules for this dialect + relevant_rules = "General dialect rules apply." + if language_code in self.rag_engines: + relevant_rules = self.rag_engines[language_code].retrieve_context(text, k=3) + print(f" -> ๐ŸŽฏ RAG Context Retrieved:\n{relevant_rules}") + dialect_boundary = nigerian_variety_instruction(language_code, language_code) + + # ๐ŸŸข 2. OPTIMIZED PROMPT: Combine RAG context with your strict academic instructions + prompt = f"""Analyze the following utterance: '{text}' +Language/Dialect Context: {language_code} + +CRITICAL CONTEXT (Apply ONLY these retrieved sociolinguistic rules to your analysis): +{relevant_rules} +{dialect_boundary} + +CRITICAL SOCIOLINGUISTIC INSTRUCTIONS: +1. DIRECT MEANING: Provide the interpretation directly. Do not start with "This means..." or "The user is saying...". +2. PRESERVE CULTURAL NUANCE: Capture the exact social intent (e.g., humor, banter, sarcasm, respect, solidarity). Do not sterilize the translation into robotic, literal Standard English. Preserve the 'flavor' of the interaction. +3. LINGUISTIC EQUALITY: Treat this as a valid, deeply rule-governed language system. +4. FORBIDDEN WORDS: You must NEVER use "incorrect", "broken", "grammar error", "non-standard", or "learner". +5. SCRIPT FIDELITY: Use the target language's native writing system. Korean, Jeju, and Satoori outputs must use Hangul only, not romanization and not Chinese or Japanese characters. Arabic outputs must use Arabic script. Igbo outputs must keep proper Igbo letters and tone/dot marks such as แป‹, แปฅ, แป, แน…, แบน, รก, and ร  where natural. +6. LANGUAGE CONSISTENCY: Once a language or dialect is established, strictly maintain translations in that dialect. Do not randomly switch to another language mid-conversation. + +Return ONLY a valid JSON object with exactly these keys. Do not use markdown formatting blocks: +{{ + "dialect": "{language_code}", + "clarification": "[Direct Meaning, capturing the original intent]", + "tone": "[e.g., Playful Banter, Respectful, Sarcastic, Urgent, Casual]", + "context": "[The typical cultural or situational setting for this phrase]", + "pragmatics": "[The underlying social function, e.g., 'Establishing solidarity', 'Softening a request', 'Playful teasing']" +}}""" + + # ๐ŸŸข 3. API CALL & ERROR HANDLING (Kept exactly as it was) + try: + print(" -> ๐Ÿง  Awaiting API Response...") + response = self._safe_generate(prompt) + + print(" -> ๐Ÿง  Parsing JSON Response...") + + clean_text = response.text.replace("```json", "").replace("```", "").strip() + import re + match = re.search(r'\{.*\}', clean_text, re.DOTALL) + if match: + import json + res = json.loads(match.group(0)) + res["Source"] = "๐Ÿง  Groq AI Engine (Cultural Context)" + return res + except Exception as e: + import traceback + print("\n๐Ÿšจ CRITICAL GEMINI ERROR ๐Ÿšจ") + traceback.print_exc() + return {"Source": "๐Ÿง  AI Engine Error", "dialect": language_code, "clarification": f"AI Gen Failed: {e}", "tone": "Neutral", "context": "", "pragmatics": ""} + + print(" -> โŒ AI returned invalid format.") + return {"Source": "๐Ÿง  AI Engine Error", "dialect": language_code, "clarification": "AI format failed", "tone": "Neutral", "context": "", "pragmatics": ""} + + def generate_unknown_analysis(self, text): + if not self.gemini_manager: return [] + all_jargon_keys = [] + for p in self.active_profiles_list: + all_jargon_keys.extend(list(p.get("jargon", {}).keys())) + + prompt = f""" + Analyze utterance: "{text}" + Context/Jargon Keys: {list(set(all_jargon_keys))[:50]} + Task: Provide 3 distinct interpretations (Casual, Formal, or Cultural). + CRITICAL INSTRUCTION: Treat the input as valid, meaningful Dialectal English. Do NOT label it as "incorrect". + Output Strictly JSON: [ {{ "Dialect": "General", "Clarification": "...", "Tone": "...", "Context": "...", "Pragmatics": "..." }} ] + """ + try: + response = self._safe_generate(prompt) + + clean_text = re.sub(r"```json|```", "", response.text).strip() + data = json.loads(clean_text) + return self.normalize_keys(data) + except: + return [{"Dialect": "Unknown", "Clarification": "Analysis Failed", "Tone": "---", "Context": "---", "Pragmatic Analysis": "Error"}] + + def adapt_with_ai(self, full_text, db_row): + if not self.gemini_manager: return db_row["Clarification"], db_row["Pragmatic_Analysis"] + prompt = f""" + Ref Term: "{db_row['Utterance']}" = "{db_row['Clarification']}" + User said: "{full_text}" + Task: Adapt meaning to full sentence. Treat as valid dialect. + Output JSON: {{ "clarification": "...", "pragmatics": "..." }} + """ + try: + response = self._safe_generate(prompt) + + clean_json = re.search(r"\{.*\}", response.text, re.DOTALL) + if clean_json: + data = json.loads(clean_json.group(0)) + return data.get("clarification", db_row["Clarification"]), data.get("pragmatics", "AI Adapted Analysis") + except: pass + return db_row["Clarification"], db_row["Pragmatic_Analysis"] + + def detect_and_analyze(self, text, threshold=60): + clean_text = text.lower().strip() + seen_indices = set() + immediate_results = [] + partial_candidates = [] + + if not self.df.empty: + for index, row in self.df.iterrows(): + match_type = None + try: + regex = str(row.get("Syntax_Pattern", "")) + if len(regex) > 2 and re.search(regex, clean_text, re.IGNORECASE): + match_type = "Regex_Match" + except: pass + + if not match_type: + db_str = str(row["Utterance"]).strip().lower() + if len(db_str) > 3 and db_str in clean_text: + match_type = "Exact_Substring" + + if match_type: + seen_indices.add(index) + immediate_results.append({ + "Source": f"๐Ÿ’Ž Database ({match_type})", "Dialect": row["Dialect"], + "Clarification": row["Clarification"], "Tone": row.get("Tone_Category", "---"), + "Context": row.get("Linguistic_Context", "---"), "Pragmatic Analysis": row.get("Pragmatic_Analysis", "---") + }) + + if not self.lookup_list: self.lookup_list = [] + matches = process.extract(clean_text, self.lookup_list, scorer=fuzz.token_set_ratio, limit=5) + + for match_str, score, index in matches: + if score >= threshold and index not in seen_indices and index < len(self.df): + seen_indices.add(index) + row = self.df.iloc[index] + partial_candidates.append({"row": row, "match_len": score, "type": f"Fuzzy ({score}%)"}) + + for profile in self.active_profiles_list: + jargon_dict = profile.get("jargon", {}) + for term, definition in jargon_dict.items(): + if term.lower() in clean_text: + immediate_results.append({ + "Source": f"๐Ÿ“œ Profile Rule ({term})", "Dialect": profile.get("lab_name", "Profile"), + "Clarification": definition, "Tone": "Detected Jargon", + "Context": f"Found in {profile.get('lab_name')} Profile", "Pragmatic Analysis": "Direct Profile Match" + }) + + final_results = list(immediate_results) + partial_candidates.sort(key=lambda x: x["match_len"], reverse=True) + top_candidates = partial_candidates[:3] + + fallback_future = self.executor.submit(self.generate_unknown_analysis, text) + db_futures = {} + for cand in top_candidates: + f = self.executor.submit(self.adapt_with_ai, text, cand["row"]) + db_futures[f] = cand + + done, not_done = concurrent.futures.wait(list(db_futures.keys()) + [fallback_future], timeout=4.5, return_when=concurrent.futures.ALL_COMPLETED) + + for f in db_futures: + if f in done: + try: + clar, prag = f.result() + cand = db_futures[f] + final_results.append({ + "Source": f"๐Ÿ’Ž DB + AI ({cand['type']})", "Dialect": cand["row"]["Dialect"], + "Clarification": clar, "Tone": cand["row"].get("Tone_Category", "---"), + "Context": cand["row"].get("Linguistic_Context", "---"), "Pragmatic Analysis": prag + }) + except: pass + + if len(final_results) < 3 and fallback_future in done: + try: + res = self.normalize_keys(fallback_future.result()) + final_results += res + except: pass + + if not final_results: + final_results.append({"Source": "โš ๏ธ AI Timeout", "Dialect": "---", "Clarification": "System Busy", "Tone": "---", "Context": "---", "Pragmatic Analysis": "---"}) + + return final_results[:3] diff --git a/src/brain_agent_gpt4.py b/src/brain_agent_gpt4.py new file mode 100644 index 0000000000000000000000000000000000000000..45f08ffaa4dbb955ef34437e5210ec87eeb5885a --- /dev/null +++ b/src/brain_agent_gpt4.py @@ -0,0 +1,319 @@ +""" +๐Ÿง  Agent 2 (Interpretation) - GPT-4 EDITION +------------------------------------------------- +This version of the AgentBrain is specifically designed to work with OpenAI's GPT-4. +It replaces Google Gemini dependencies with OpenAI API calls. + +Requirements: +- An 'openai_manager_instance' must be passed during initialization. +- This manager is expected to hold an initialized 'client' (AsyncOpenAI or OpenAI). +""" + +import os +import glob +import pandas as pd +import json +import re +import concurrent.futures +from rapidfuzz import process, fuzz + +class AgentInterpretation: + def __init__(self, config, openai_manager_instance=None): + self.config = config + self.df = pd.DataFrame() + self.lookup_list = [] + self.openai_manager = openai_manager_instance # Renamed from gemini_manager + self.lab_profile = {} + self.active_profiles_list = [] + + # Load default + self.load_profile_by_name("NSL Lab Trainer.json") + + self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=10) + print("๐Ÿง  Agent 2 (Interpretation - GPT-4) Online: Persistent Pool Ready.") + self.refresh_knowledge_base() + + # ------------------------------------------------------------------------ + # HELPER: GPT-4 API Call Wrapper + # ------------------------------------------------------------------------ + def _call_gpt4(self, system_prompt, user_prompt, model="gpt-4"): + """ + Internal helper to standardize GPT-4 calls. + Assumes self.openai_manager has a valid .client (OpenAI client). + """ + if not self.openai_manager or not hasattr(self.openai_manager, 'client'): + return None + + try: + response = self.openai_manager.client.chat.completions.create( + model=model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ], + temperature=0.7 + ) + return response.choices[0].message.content + except Exception as e: + print(f"โŒ GPT-4 Error: {e}") + return None + + # ------------------------------------------------------------------------ + # CORE PROFILE & DATA METHODS + # ------------------------------------------------------------------------ + + def get_available_profiles(self): + files = glob.glob(os.path.join(self.config.PROFILES_DIR, "*.json")) + return [os.path.basename(f) for f in files] + + def load_profile_by_name(self, filename): + path = os.path.join(self.config.PROFILES_DIR, filename) + try: + with open(path, 'r', encoding='utf-8') as f: + self.lab_profile = json.load(f) + return self.lab_profile + except: + self.lab_profile = {} + return {} + + def save_specific_profile(self, filename, json_str): + if not filename.endswith(".json"): filename += ".json" + path = os.path.join(self.config.PROFILES_DIR, filename) + try: + with open(path, "w", encoding="utf-8") as f: json.dump(json.loads(json_str), f, indent=2) + return "โœ… Saved locally (HF Sync pending)" + except Exception as e: return f"โŒ Error: {e}" + + def get_current_profile_text(self): + return json.dumps(getattr(self, "lab_profile", {}) or {}, indent=2) + + def load_all_profiles_simultaneously(self): + files = glob.glob(os.path.join(self.config.PROFILES_DIR, "*.json")) + loaded_count = 0 + names = [] + self.active_profiles_list = [] + + for f_path in files: + try: + with open(f_path, 'r', encoding='utf-8') as f: + data = json.load(f) + self.active_profiles_list.append(data) + names.append(data.get("lab_name", os.path.basename(f_path))) + loaded_count += 1 + except: pass + return f"โœ… Loaded {loaded_count} profiles simultaneously: {', '.join(names)}" + + def refresh_knowledge_base(self): + all_files = glob.glob(os.path.join(self.config.DATASET_DIR, "**", "*.csv"), recursive=True) + df_list = [] + for filename in all_files: + try: + temp_df = pd.read_csv(filename, encoding='utf-8-sig', on_bad_lines='skip') + temp_df["Dialect"] = os.path.basename(filename).replace(".csv", "") + df_list.append(temp_df) + except: pass + if df_list: + self.df = pd.concat(df_list, ignore_index=True) + self.lookup_list = self.df["Utterance"].tolist() + else: + self.lookup_list = [] + + def normalize_keys(self, data_list): + cleaned_list = [] + for item in data_list: + new_item = { + "Dialect": item.get("Dialect") or item.get("dialect", "Unknown"), + "Clarification": item.get("Clarification") or item.get("clarification", "---"), + "Tone": item.get("Tone") or item.get("tone", "---"), + "Context": item.get("Context") or item.get("context", "---"), + "Pragmatic Analysis": item.get("Pragmatic Analysis") or item.get("pragmatics", "---"), + "Source": item.get("Source", "โœจ GPT-4 Generated") + } + cleaned_list.append(new_item) + return cleaned_list + + # ------------------------------------------------------------------------ + # AI GENERATION METHODS (GPT-4) + # ------------------------------------------------------------------------ + + def generate_mission(self, context="General"): + """ + Generates a random, realistic scenario based on the context using GPT-4. + """ + system_prompt = "You are an expert scenario generator for linguistic roleplay." + user_prompt = f""" + Generate a short, realistic roleplay scenario for a user to speak a dialect phrase. + + Constraints: + 1. Context: {context} + 2. Target Audience: Speakers of non-standard English dialects (e.g., Nigerian, Indian). + 3. Length: 1 sentence. + 4. Goal: Provoke a natural reaction (complaint, greeting, warning, negotiation). + 5. Output Format: JSON with keys 'text' and 'emoji'. + + Examples: + - Context: Traffic -> {{"text": "A bus driver cut you off. Yell at him.", "emoji": "๐ŸšŒ"}} + - Context: Market -> {{"text": "The fish is too expensive. Ask for a discount.", "emoji": "๐ŸŸ"}} + """ + + try: + response_text = self._call_gpt4(system_prompt, user_prompt) + if not response_text: raise Exception("No response from GPT") + + # Clean up JSON (OpenAI sometimes adds markdown) + clean_json = response_text.replace("```json", "").replace("```", "").strip() + return json.loads(clean_json) + except: + return {"text": "Describe your morning routine.", "emoji": "โ˜€๏ธ"} + + def generate_unknown_analysis(self, text): + if not self.openai_manager: return [] + all_jargon_keys = [] + for p in self.active_profiles_list: + all_jargon_keys.extend(list(p.get("jargon", {}).keys())) + + system_prompt = "You are an expert linguist specializing in Global English Dialects and Pragmatics." + user_prompt = f""" + Analyze utterance: "{text}" + Context/Jargon Keys Available: {list(set(all_jargon_keys))[:50]} + + Task: Provide 3 distinct interpretations (Casual, Formal, or Cultural). + CRITICAL INSTRUCTION: Treat the input as valid, meaningful Dialectal English. Do NOT label it as "incorrect". + + Output Strictly JSON array: [ {{ "Dialect": "General", "Clarification": "...", "Tone": "...", "Context": "...", "Pragmatics": "..." }} ] + """ + try: + response_text = self._call_gpt4(system_prompt, user_prompt) # Uses standard GPT-4 + clean_text = re.sub(r"```json|```", "", response_text).strip() + data = json.loads(clean_text) + return self.normalize_keys(data) + except: + return [{"Dialect": "Unknown", "Clarification": "Analysis Failed", "Tone": "---", "Context": "---", "Pragmatic Analysis": "Error"}] + + def adapt_with_ai(self, full_text, db_row): + if not self.openai_manager: return db_row["Clarification"], db_row["Pragmatic_Analysis"] + + system_prompt = "You are a dialect adaptation engine." + user_prompt = f""" + Ref Term: "{db_row['Utterance']}" = "{db_row['Clarification']}" + User said: "{full_text}" + Task: Adapt meaning to full sentence. Treat as valid dialect. + Output JSON: {{ "clarification": "...", "pragmatics": "..." }} + """ + try: + # Using GPT-4o-mini or GPT-3.5-turbo here if speed is needed, otherwise default to GPT-4 + response_text = self._call_gpt4(system_prompt, user_prompt, model="gpt-4") + clean_json = re.search(r"\{.*\}", response_text, re.DOTALL) + if clean_json: + data = json.loads(clean_json.group(0)) + return data.get("clarification", db_row["Clarification"]), data.get("pragmatics", "AI Adapted Analysis") + except: pass + return db_row["Clarification"], db_row["Pragmatic_Analysis"] + + def detect_and_analyze(self, text, threshold=60): + clean_text = text.lower().strip() + seen_indices = set() + immediate_results = [] + partial_candidates = [] + + # 1. Regex & Exact Match + if not self.df.empty: + for index, row in self.df.iterrows(): + match_type = None + try: + regex = str(row.get("Syntax_Pattern", "")) + if len(regex) > 2 and re.search(regex, clean_text, re.IGNORECASE): + match_type = "Regex_Match" + except: pass + + if not match_type: + db_str = str(row["Utterance"]).strip().lower() + if len(db_str) > 3 and db_str in clean_text: + match_type = "Exact_Substring" + + if match_type: + seen_indices.add(index) + immediate_results.append({ + "Source": f"๐Ÿ’Ž Database ({match_type})", "Dialect": row["Dialect"], + "Clarification": row["Clarification"], "Tone": row.get("Tone_Category", "---"), + "Context": row.get("Linguistic_Context", "---"), "Pragmatic Analysis": row.get("Pragmatic_Analysis", "---") + }) + + # 2. Fuzzy Matching + if not self.lookup_list: self.lookup_list = [] + matches = process.extract(clean_text, self.lookup_list, scorer=fuzz.token_set_ratio, limit=5) + + for match_str, score, index in matches: + if score >= threshold and index not in seen_indices and index < len(self.df): + seen_indices.add(index) + row = self.df.iloc[index] + partial_candidates.append({"row": row, "match_len": score, "type": f"Fuzzy ({score}%)"}) + + # 3. Profile Jargon Matching + for profile in self.active_profiles_list: + jargon_dict = profile.get("jargon", {}) + for term, definition in jargon_dict.items(): + if term.lower() in clean_text: + immediate_results.append({ + "Source": f"๐Ÿ“œ Profile Rule ({term})", "Dialect": profile.get("lab_name", "Profile"), + "Clarification": definition, "Tone": "Detected Jargon", + "Context": f"Found in {profile.get('lab_name')} Profile", "Pragmatic Analysis": "Direct Profile Match" + }) + + final_results = list(immediate_results) + partial_candidates.sort(key=lambda x: x["match_len"], reverse=True) + top_candidates = partial_candidates[:3] + + # 4. Concurrent AI Analysis (GPT-4) + fallback_future = self.executor.submit(self.generate_unknown_analysis, text) + db_futures = {} + for cand in top_candidates: + f = self.executor.submit(self.adapt_with_ai, text, cand["row"]) + db_futures[f] = cand + + done, not_done = concurrent.futures.wait(list(db_futures.keys()) + [fallback_future], timeout=5.5, return_when=concurrent.futures.ALL_COMPLETED) + + for f in db_futures: + if f in done: + try: + clar, prag = f.result() + cand = db_futures[f] + final_results.append({ + "Source": f"๐Ÿ’Ž DB + AI ({cand['type']})", "Dialect": cand["row"]["Dialect"], + "Clarification": clar, "Tone": cand["row"].get("Tone_Category", "---"), + "Context": cand["row"].get("Linguistic_Context", "---"), "Pragmatic Analysis": prag + }) + except: pass + + if len(final_results) < 3 and fallback_future in done: + try: + res = self.normalize_keys(fallback_future.result()) + final_results += res + except: pass + + if not final_results: + final_results.append({"Source": "โš ๏ธ AI Timeout", "Dialect": "---", "Clarification": "System Busy", "Tone": "---", "Context": "---", "Pragmatic Analysis": "---"}) + + return final_results[:3] + + def get_rich_suggestions(self, text, dialect): + if not self.openai_manager: return [] + system_prompt = "You are a linguistics assistant." + user_prompt = f"""interpret "{text}" ({dialect}). Output 3 JSON options: [{{ "clarification": "", "tone": "", "context": "", "pragmatics": "" }}]""" + try: + response_text = self._call_gpt4(system_prompt, user_prompt) + return json.loads(re.sub(r"```json|```", "", response_text).strip()) + except: return [] + + def generate_syntax_pattern(self, utterance): + safe = r"\b" + re.escape(utterance.lower()) + r"\b" + if not self.openai_manager: return safe + try: + response_text = self._call_gpt4( + "You are a regex expert.", + f"Create a python Regex for: '{utterance}'. Return ONLY regex string. No code blocks." + ) + pat = response_text.strip().replace("`", "") + re.compile(pat) + return pat + except: return safe diff --git a/src/bridge_agent.py b/src/bridge_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..27f99d55d851fbaaa1f3e8e626f3bf169bfd7745 --- /dev/null +++ b/src/bridge_agent.py @@ -0,0 +1,119 @@ +import gradio as gr +import json +import os +import shutil +import pandas as pd +from src.asr_language import resolve_asr_language_code + +class AgentBridge: # ๐ŸŸข Ensure this says AgentBridge, not BridgeAgent + def __init__(self, input_agent, brain_agent, trust_agent): + print("๐ŸŒ‰ Bridge Agent (React API) Online.") + self.input = input_agent + self.brain = brain_agent + self.trust = trust_agent + + # --- 1. REPUTATION CHECK --- + def api_check_reputation(self, user_key): + """Matches React 'run_login' expectations.""" + if not user_key: + return [None, "Unknown", "No key provided", False, 0, "Novice", 0, "Error"] + + # Simulated DB fetch + current_xp = 150 + role = "Novice" + can_validate = False + display_addr = f"{user_key[:6]}...{user_key[-4:]}" + + return [ + user_key, # 0: Key + display_addr, # 1: Address + "Welcome back", # 2: Message + can_validate, # 3: Is Validator? + current_xp, # 4: XP + role, # 5: Role + 12, # 6: Rank + "Keep playing to unlock validation!" # 7: Motivation + ] + + # --- 2. SUBMISSION LOGIC (The Nexus) --- + def api_submit_entry(self, transcribed, dialect, customD, clarification, tone, context, pragmatics, + sourceTag, clar_source, userKey, blob, confirm): + """ + Proxies the React submission to the UX Agent's logic. + """ + # Ensure Brain has the UX link (injected in main.py) + if hasattr(self.brain, 'ux'): + return self.brain.ux.check_and_submit_logic( + transcribed, dialect, customD, clarification, tone, context, pragmatics, + sourceTag, clar_source, userKey, blob, confirm + ) + return "โŒ Error: UX Backend not linked.", None, None + + # --- 3. GET DIALECTS --- + def api_get_dialects(self): + """Returns list of available dialects for the dropdown.""" + try: + # Fetch from CSV files in dataset dir + dataset_dir = self.brain.config.DATASET_DIR + if os.path.exists(dataset_dir): + files = [f.replace(".csv", "") for f in os.listdir(dataset_dir) if f.endswith(".csv")] + return files if files else ["American English", "Korean English", "Nigerian English"] + return ["American English", "Korean English", "Nigerian English"] + except: + return ["American English", "Korean English", "Nigerian English"] + + # --- 4. GENERATE MISSION --- + def api_generate_mission(self, context): + """Generates a daily prompt.""" + if self.brain: + return self.brain.generate_mission(context) + return {"text": "Describe your morning routine.", "emoji": "โ˜€๏ธ"} + + # --- 5. TRANSCRIBE CHECK --- + def api_transcribe_check(self, audio_path, dialect): + """Fast transcription for 'The Listener' game verification.""" + if not audio_path: return "No Audio" + try: + asr_code, _, _ = resolve_asr_language_code(dialect) + result = self.input.transcribe(audio_path, language=asr_code) + return result[0]['text'] + except Exception as e: + return f"Error: {e}" + + # --- LAUNCHER --- + def launch(self): + with gr.Blocks() as api: + # Inputs matching App.js calls + in_txt = gr.Textbox(label="Text Input") + in_aud = gr.Audio(type="filepath", label="Audio Input") + + # Outputs + out_json = gr.JSON() + out_txt = gr.Textbox() + out_aud = gr.Audio() + + # 1. Login / Reputation + gr.Button("API Rep").click( + self.api_check_reputation, + inputs=[in_txt], + outputs=[out_json], + api_name="run_login" + ) + + # 2. Submit Entry (12 Args) + # [orig, d_drop, d_new, clar, tone, context, prag, GAME_SOURCE, CLAR_SOURCE, user_key] + [Audio, Checkbox] + sub_args = [gr.Textbox() for _ in range(10)] + [gr.Audio(type="filepath"), gr.Checkbox()] + + gr.Button("API Submit").click( + self.api_submit_entry, + inputs=sub_args, + outputs=[gr.Textbox(), gr.Textbox(), gr.Audio()], + api_name="check_and_submit_logic" + ) + + # 3. Helpers + gr.Button("API List").click(self.api_get_dialects, inputs=[], outputs=[out_json], api_name="get_dialects") + gr.Button("API Mission").click(self.api_generate_mission, inputs=[in_txt], outputs=[out_json], api_name="generate_mission") + gr.Button("API Transcribe").click(self.api_transcribe_check, inputs=[in_aud, in_txt], outputs=[out_txt], api_name="transcribe_check") + + return api diff --git a/src/dialect_rules.py b/src/dialect_rules.py new file mode 100644 index 0000000000000000000000000000000000000000..e650a1c04e7720f256ab4edf471fdd694bb60d1e --- /dev/null +++ b/src/dialect_rules.py @@ -0,0 +1,92 @@ +import re + + +PIDGIN_MARKER_PATTERN = re.compile( + r"\b(wetin|dey|una|abi|sabi|chop|waka|pikin|dem|wey|na)\b" + r"|make we|no dey|no be|e go|i no|you no", + re.IGNORECASE, +) + +STANDARD_ENGLISH_PATTERN = re.compile( + r"\b(what|why|where|when|how|please|because|cannot|can't|don't|doesn't|should|would|could|will|are|is|am|have|has)\b", + re.IGNORECASE, +) + + +def _normalize_label(label): + return str(label or "").strip().lower() + + +def is_nigerian_pidgin_label(label): + value = _normalize_label(label) + return "naija" in value or ("nigerian" in value and "pidgin" in value) + + +def is_nigerian_english_label(label): + value = _normalize_label(label) + return "nigerian english" in value and not is_nigerian_pidgin_label(value) + + +def nigerian_variety_instruction(source_dialect="", target_dialect=""): + source_is_relevant = is_nigerian_pidgin_label(source_dialect) or is_nigerian_english_label(source_dialect) + target_is_relevant = is_nigerian_pidgin_label(target_dialect) or is_nigerian_english_label(target_dialect) + if not source_is_relevant and not target_is_relevant: + return "" + + return ( + "NIGERIAN VARIETY BOUNDARY:\n" + "- Nigerian English and Nigerian Pidgin English / Naija Pidgin are separate varieties, not interchangeable labels.\n" + "- Nigerian English is a recognized World English variety. Use Nigerian English lexical, pragmatic, and cultural flavor while keeping English grammar; do not use core Naija Pidgin grammar markers such as 'wetin', 'dey', 'una', 'abi', 'na', 'abeg', or 'make we' unless the source is quoting them.\n" + "- Nigerian Pidgin English / Naija Pidgin is an English-lexifier pidgin/creole continuum. Use Naija Pidgin grammar and discourse markers naturally; do not normalize it into Nigerian English or Standard English.\n" + "- If the target is Nigerian English, avoid Naija Pidgin grammar. If the target is Nigerian Pidgin English, do not output polished Nigerian English." + ) + + +def nigerian_variety_retry_reason(translated, target_dialect): + text = str(translated or "").strip() + if not text: + return "" + + if is_nigerian_english_label(target_dialect) and PIDGIN_MARKER_PATTERN.search(text): + return "Target is Nigerian English, but the output contains Naija Pidgin markers." + + word_count = len(re.findall(r"[A-Za-z']+", text)) + if ( + is_nigerian_pidgin_label(target_dialect) + and word_count >= 4 + and not PIDGIN_MARKER_PATTERN.search(text) + and STANDARD_ENGLISH_PATTERN.search(text) + ): + return "Target is Nigerian Pidgin English, but the output looks like Nigerian/Standard English without Naija Pidgin grammar." + + return "" + + +def nigerian_variety_retry_prompt(text, source_dialect, target_dialect, translated, reason): + return f""" +The previous output crossed a Nigerian variety boundary. +Reason: {reason} + +Source variety: {source_dialect} +Target variety: {target_dialect} +Source utterance: "{text}" +Previous output: "{translated}" + +Rewrite the output ONLY in the requested target variety. +{nigerian_variety_instruction(source_dialect, target_dialect)} +""" + + +def hausa_variety_instruction(source_dialect="", target_dialect=""): + labels = f"{source_dialect} {target_dialect}".lower() + if not any(token in labels for token in ("hausa", "kano", "katsina", "sokoto", "zaria")): + return "" + + return ( + "HAUSA LEXICAL AND HONORIFIC GUARDRAIL:\n" + "- Preserve Hausa honorific gender and social role carefully.\n" + "- 'malama' or 'mallama' means ma'am, madam, or female teacher; never translate it as sir, friend, bro, or guy.\n" + "- 'malam' means sir, male teacher, or learned man; do not confuse it with 'malama'.\n" + "- 'ina kwana?' is a morning greeting close to 'good morning' or 'how did you wake/sleep?'; keep the greeting natural for the target dialect.\n" + "- When translating into English or Nigerian English, prefer respectful forms such as 'Good morning, ma'am' when the source says 'ina kwana, malama?'." + ) diff --git a/src/dynamic_compiler.py b/src/dynamic_compiler.py new file mode 100644 index 0000000000000000000000000000000000000000..4d459f611ead05b33ccf84e38e25e76de5a22683 --- /dev/null +++ b/src/dynamic_compiler.py @@ -0,0 +1,83 @@ +import os +import json +import solcx + +def compile_contract(sol_file_path, contract_name="PureVersation"): + """ + Compiles a Solidity smart contract using py-solc-x. + Returns the ABI and Bytecode. + Caches the result to a JSON file to speed up subsequent loads. + """ + # Define cache file next to the sol file + cache_file = sol_file_path.replace('.sol', '_compiled.json') + + # Optional: If you want to force recompile on every run, remove the cache check + if os.path.exists(cache_file): + try: + with open(cache_file, 'r', encoding='utf-8') as f: + data = json.load(f) + print(f"Loaded compiled contract from cache: {cache_file}") + return data["abi"], data["bytecode"] + except Exception as e: + print(f"Failed to load cached compiled contract: {e}. Recompiling...") + + print(f"Dynamically compiling {sol_file_path} ...") + + # 1. Install or load solc version 0.8.0 + solc_version = "0.8.0" + try: + solcx.install_solc(solc_version) + solcx.set_solc_version(solc_version) + except Exception as e: + print(f"Failed to install/set solc compiler: {e}") + # If running in a restricted environment where binary download fails, + # it will throw an exception here. + raise e + + # 2. Compile the .sol file + try: + compiled_sol = solcx.compile_files( + [sol_file_path], + output_values=["abi", "bin"], + solc_version=solc_version + ) + + # 3. Extract ABI and Bytecode + # The key in compiled_sol looks like: ':' + contract_key = f"{sol_file_path}:{contract_name}" + if contract_key not in compiled_sol: + # Fallback if path separators cause mismatch + for key in compiled_sol.keys(): + if key.endswith(f":{contract_name}"): + contract_key = key + break + + contract_interface = compiled_sol[contract_key] + abi = contract_interface['abi'] + bytecode = contract_interface['bin'] + + # 4. Save to cache + with open(cache_file, 'w', encoding='utf-8') as f: + json.dump({"abi": abi, "bytecode": bytecode}, f, indent=4) + + print(f"Compilation successful! Saved to {cache_file}") + return abi, bytecode + + except Exception as e: + print(f"Compilation failed: {e}") + raise e + +# Provide a quick fetcher that integrates with config +def get_contract_interface(sol_filename="PureBi.sol", contract_name="PureBi"): + base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + sol_path = os.path.join(base_dir, "src", sol_filename) + return compile_contract(sol_path, contract_name) + +if __name__ == "__main__": + # Test the compiler when run standalone + print("Testing Dynamic Compiler...") + try: + abi, bin_code = get_contract_interface("PureBi.sol", "PureBi") + print(f"Success! ABI length: {len(abi)} methods, Bytecode length: {len(bin_code)} chars") + except Exception as e: + print(e) diff --git a/src/input_agent.py b/src/input_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..1000121e3c2dd642bfe7f03941e525a4c46506ee --- /dev/null +++ b/src/input_agent.py @@ -0,0 +1,369 @@ +import whisper +import os +import torch +import warnings +import gc # Garbage Collector for memory management +import tempfile +import re +import time +from pydub import AudioSegment # ๐ŸŸข NEW: Add pydub + +# Suppress FP16 warnings on CPU +warnings.filterwarnings("ignore", message="FP16 is not supported on CPU; using FP32 instead") + +class AgentInput: + TURBO_MODEL_ID = "openai/whisper-large-v3-turbo" + DISTIL_MODEL_ID = "distil-whisper/distil-large-v3" + MMS_MODEL_ID = "facebook/mms-1b-all" + QWEN_ASR_MODEL_ID = "Qwen/Qwen3-ASR-1.7B" + + def __init__(self, device="cpu"): + print(f"๐Ÿ‘‚ Agent 1 (Input) Online: Preparing Whisper on {device}...") + self.device = device + self.loaded_models = {} + self.loaded_pipelines = {} + self.turbo_disabled = False + self.turbo_slow_threshold_s = float(os.environ.get("ASR_TURBO_SLOW_THRESHOLD_S", "18")) + + # USE 'tiny' FOR CLOUD TO PREVENT EXIT CODE 137 (OOM) + # Use 'base' only if you are running on a machine with 16GB+ RAM + self.model_name = "tiny" + + try: + # Load the model and immediately collect garbage to free RAM + self.model = whisper.load_model(self.model_name, device=device) + self.loaded_models[self.model_name] = self.model + gc.collect() + print(f"โœ… Whisper '{self.model_name}' model loaded. RAM optimized.") + except Exception as e: + print(f"โš ๏ธ Load failed: {e}. Attempting emergency load...") + # Emergency fallback to tiny if not already tried + self.model = whisper.load_model("tiny", device=device) + self.loaded_models["tiny"] = self.model + self.model_name = "tiny" + + def _audio_duration_s(self, audio_path): + try: + return float(AudioSegment.from_file(audio_path).duration_seconds) + except Exception: + return None + + def _hint_text(self, language=None, dialect_hint=""): + return f"{language or ''} {dialect_hint or ''}".strip().lower() + + def _is_zero_gpu_available(self): + return torch.cuda.is_available() + + def _is_underrepresented_language(self, language=None, dialect_hint=""): + hint = self._hint_text(language, dialect_hint) + common_tokens = { + "english", " en", "en ", "korean", " ko", "ko ", "arabic", " ar", "ar ", + "chinese", "mandarin", "cantonese", " zh", "zh ", "french", " fr", "fr ", + "spanish", " es", "es ", "german", "deutsch", " de", "de ", "italian", + " it", "it ", "portuguese", " pt", "pt ", "hindi", " hi", "hi ", + "japanese", " ja", "ja ", "russian", " ru", "ru " + } + if any(token in f" {hint} " for token in common_tokens): + return False + return bool(hint) + + def _expected_script(self, language=None, dialect_hint=""): + lang = str(language or "").strip().lower() + padded_lang = f" {lang} " + if lang in {"en", "eng", "fr", "fra", "es", "spa", "de", "deu", "it", "ita", "pt", "por", "pcm"}: + return "latin" + if lang in {"ko", "kor"}: + return "hangul" + if lang in {"ar", "ara", "ur", "urd", "fa", "fas", "prs", "ps", "pus"}: + return "arabic" + if lang in {"zh", "cmn", "yue", "zho"}: + return "cjk" + if lang in {"ja", "jpn"}: + return "japanese" + if lang in {"hi", "hin", "mr", "mar", "ne", "nep"}: + return "devanagari" + if lang in {"th", "tha"}: + return "thai" + + hint = self._hint_text(language, dialect_hint) + padded_hint = f" {hint} " + if any(token in padded_hint for token in ["korean", "hangul", "satoori", "jeju", "gyeongsang", "chungcheong", "jeolla", "busan", " ko "]): + return "hangul" + if any(token in padded_hint for token in ["arabic", "urdu", "persian", "farsi", "dari", "pashto", " ar "]): + return "arabic" + if any(token in padded_hint for token in ["chinese", "mandarin", "cantonese", "yue", " zh "]): + return "cjk" + if any(token in padded_hint for token in ["japanese", " ja "]): + return "japanese" + if any(token in padded_hint for token in ["hindi", "marathi", "nepali", " hi "]): + return "devanagari" + if "thai" in padded_hint: + return "thai" + if any(token in padded_hint for token in ["english", "french", "spanish", "german", "italian", "portuguese", "pidgin", "patois", " en ", " fr ", " es "]): + return "latin" + if any(token in padded_lang for token in [" en ", " eng ", " fr ", " fra ", " es ", " spa "]): + return "latin" + return None + + def _looks_wrong_script(self, text, language=None, dialect_hint=""): + text = str(text or "").strip() + if not text: + return True + script = self._expected_script(language, dialect_hint) + if not script: + return False + patterns = { + "hangul": r"[\uac00-\ud7a3]", + "arabic": r"[\u0600-\u06ff]", + "cjk": r"[\u3400-\u9fff]", + "japanese": r"[\u3040-\u30ff\u3400-\u9fff]", + "devanagari": r"[\u0900-\u097f]", + "thai": r"[\u0e00-\u0e7f]", + "latin": r"[A-Za-z]", + } + expected_hits = len(re.findall(patterns[script], text)) + if script == "latin": + other_hits = len(re.findall(r"[\u0600-\u06ff\u0900-\u097f\u0e00-\u0e7f\u3040-\u30ff\u3400-\u9fff\uac00-\ud7a3]", text)) + return expected_hits == 0 or other_hits > expected_hits + return expected_hits == 0 + + def _mms_language_code(self, language=None, dialect_hint=""): + hint = self._hint_text(language, dialect_hint) + mappings = [ + (["nigerian pidgin", "pidgin"], "pcm"), + (["english", " en "], "eng"), + (["korean", " ko "], "kor"), + (["arabic", " ar "], "ara"), + (["mandarin", "chinese", " zh "], "cmn"), + (["cantonese", "yue"], "yue"), + (["french", " fr "], "fra"), + (["spanish", " es "], "spa"), + (["german", "deutsch", " de "], "deu"), + (["italian", " it "], "ita"), + (["portuguese", " pt "], "por"), + (["hindi", " hi "], "hin"), + (["japanese", " ja "], "jpn"), + (["russian", " ru "], "rus"), + (["thai"], "tha"), + (["vietnamese"], "vie"), + (["swahili"], "swh"), + (["yoruba"], "yor"), + (["igbo"], "ibo"), + (["hausa"], "hau"), + ] + padded = f" {hint} " + for tokens, code in mappings: + if any(token in padded for token in tokens): + return code + return "eng" + + def _normalize_manual_route(self, model_choice): + choice = str(model_choice or "auto").strip().lower() + aliases = { + "tiny": {"engine": "whisper", "model": "tiny", "label": "Whisper tiny.en (Edge fastest)"}, + "whisper tiny": {"engine": "whisper", "model": "tiny", "label": "Whisper tiny.en (Edge fastest)"}, + "base": {"engine": "whisper", "model": "base", "label": "Whisper base (Edge balanced)"}, + "whisper base": {"engine": "whisper", "model": "base", "label": "Whisper base (Edge balanced)"}, + "small": {"engine": "whisper", "model": "small", "label": "Whisper small (Fallback)"}, + "whisper-small": {"engine": "whisper", "model": "small", "label": "Whisper small (Fallback)"}, + "whisper small": {"engine": "whisper", "model": "small", "label": "Whisper small (Fallback)"}, + "turbo": {"engine": "hf-whisper", "model": self.TURBO_MODEL_ID, "label": "Whisper large-v3 turbo (HF Pro)"}, + "large-v3-turbo": {"engine": "hf-whisper", "model": self.TURBO_MODEL_ID, "label": "Whisper large-v3 turbo (HF Pro)"}, + "whisper-large-v3-turbo": {"engine": "hf-whisper", "model": self.TURBO_MODEL_ID, "label": "Whisper large-v3 turbo (HF Pro)"}, + self.TURBO_MODEL_ID: {"engine": "hf-whisper", "model": self.TURBO_MODEL_ID, "label": "Whisper large-v3 turbo (HF Pro)"}, + "distil": {"engine": "hf-whisper", "model": self.DISTIL_MODEL_ID, "label": "Distil-Whisper (English fast)"}, + "distil-large-v3": {"engine": "hf-whisper", "model": self.DISTIL_MODEL_ID, "label": "Distil-Whisper (English fast)"}, + self.DISTIL_MODEL_ID: {"engine": "hf-whisper", "model": self.DISTIL_MODEL_ID, "label": "Distil-Whisper (English fast)"}, + "qwen": {"engine": "hf-whisper", "model": self.QWEN_ASR_MODEL_ID, "label": "Qwen3-ASR 1.7B (Multilingual)"}, + "qwen3-asr": {"engine": "hf-whisper", "model": self.QWEN_ASR_MODEL_ID, "label": "Qwen3-ASR 1.7B (Multilingual)"}, + "qwen/qwen3-asr-1.7b": {"engine": "hf-whisper", "model": self.QWEN_ASR_MODEL_ID, "label": "Qwen3-ASR 1.7B (Multilingual)"}, + self.QWEN_ASR_MODEL_ID.lower(): {"engine": "hf-whisper", "model": self.QWEN_ASR_MODEL_ID, "label": "Qwen3-ASR 1.7B (Multilingual)"}, + "mms": {"engine": "mms", "model": self.MMS_MODEL_ID, "label": "MMS 1B (Low-resource)"}, + self.MMS_MODEL_ID: {"engine": "mms", "model": self.MMS_MODEL_ID, "label": "MMS 1B (Low-resource)"}, + } + return aliases.get(choice) + + def _auto_routes(self, language=None, dialect_hint="", audio_path=None): + base = {"engine": "whisper", "model": "base", "label": "Whisper base (Edge balanced)"} + tiny = {"engine": "whisper", "model": "tiny", "label": "Whisper tiny.en (Edge fastest)"} + small = {"engine": "whisper", "model": "small", "label": "Whisper small (Fallback)"} + mms = {"engine": "mms", "model": self.MMS_MODEL_ID, "label": "MMS 1B (Low-resource)"} + turbo = {"engine": "hf-whisper", "model": self.TURBO_MODEL_ID, "label": "Whisper large-v3 turbo (HF Pro)"} + + duration_s = self._audio_duration_s(audio_path) if audio_path else None + if self._is_zero_gpu_available() and not self.turbo_disabled and not (duration_s and duration_s > 18): + return [turbo, base, tiny] + if self._expected_script(language, dialect_hint) == "latin": + return [base, tiny] + if self._is_underrepresented_language(language, dialect_hint): + return [base, mms, small] + return [small] + + def resolve_model_name(self, model_choice="auto", language=None, dialect_hint="", audio_path=None): + manual = self._normalize_manual_route(model_choice) + if manual: + return manual["model"] + return self._auto_routes(language=language, dialect_hint=dialect_hint, audio_path=audio_path)[0]["model"] + + def _get_model(self, model_name): + model_name = model_name if model_name in {"tiny", "base", "small"} else "small" + if model_name in self.loaded_models: + self.model_name = model_name + self.model = self.loaded_models[model_name] + return self.model + + try: + print(f"๐Ÿ”„ Loading Whisper '{model_name}' on demand...") + self.loaded_models[model_name] = whisper.load_model(model_name, device=self.device) + self.model_name = model_name + self.model = self.loaded_models[model_name] + gc.collect() + return self.model + except Exception as e: + print(f"โš ๏ธ Whisper '{model_name}' unavailable ({e}); falling back to tiny.") + self.model_name = "tiny" + self.model = self.loaded_models.get("tiny") or whisper.load_model("tiny", device=self.device) + self.loaded_models["tiny"] = self.model + gc.collect() + return self.model + + def _get_hf_pipeline(self, model_id): + if model_id in self.loaded_pipelines: + return self.loaded_pipelines[model_id] + try: + from transformers import pipeline + device_index = 0 if torch.cuda.is_available() else -1 + kwargs = {"model": model_id, "device": device_index} + if torch.cuda.is_available(): + kwargs["torch_dtype"] = torch.float16 + print(f"๐Ÿ”„ Loading ASR pipeline '{model_id}'...") + self.loaded_pipelines[model_id] = pipeline("automatic-speech-recognition", **kwargs) + gc.collect() + return self.loaded_pipelines[model_id] + except Exception as e: + raise RuntimeError(f"ASR pipeline '{model_id}' unavailable: {e}") from e + + def _get_mms_pipeline(self, language=None, dialect_hint=""): + lang_code = self._mms_language_code(language, dialect_hint) + cache_key = f"{self.MMS_MODEL_ID}:{lang_code}" + if cache_key in self.loaded_pipelines: + return self.loaded_pipelines[cache_key] + try: + from transformers import AutoProcessor, Wav2Vec2ForCTC, pipeline + device_index = 0 if torch.cuda.is_available() else -1 + processor = AutoProcessor.from_pretrained(self.MMS_MODEL_ID) + model = Wav2Vec2ForCTC.from_pretrained(self.MMS_MODEL_ID) + try: + processor.tokenizer.set_target_lang(lang_code) + model.load_adapter(lang_code) + except Exception as e: + print(f"โš ๏ธ MMS adapter '{lang_code}' unavailable ({e}); trying English adapter.") + lang_code = "eng" + processor.tokenizer.set_target_lang(lang_code) + model.load_adapter(lang_code) + cache_key = f"{self.MMS_MODEL_ID}:{lang_code}" + if torch.cuda.is_available(): + model = model.to("cuda") + self.loaded_pipelines[cache_key] = pipeline( + "automatic-speech-recognition", + model=model, + tokenizer=processor.tokenizer, + feature_extractor=processor.feature_extractor, + device=device_index, + ) + gc.collect() + return self.loaded_pipelines[cache_key] + except Exception as e: + raise RuntimeError(f"MMS ASR unavailable: {e}") from e + + def _transcribe_with_route(self, route, clean_path, language=None, dialect_hint=""): + start = time.perf_counter() + if route["engine"] == "whisper": + model = self._get_model(route["model"]) + result = model.transcribe(clean_path, language=language, fp16=False) + elif route["engine"] == "mms": + pipe = self._get_mms_pipeline(language, dialect_hint) + result = pipe(clean_path) + else: + pipe = self._get_hf_pipeline(route["model"]) + generate_kwargs = {"task": "transcribe"} + if language: + generate_kwargs["language"] = language + result = pipe(clean_path, generate_kwargs=generate_kwargs) + + elapsed_s = time.perf_counter() - start + if isinstance(result, dict): + text = str(result.get("text", "")).strip() + else: + text = str(result or "").strip() + if route["model"] == self.TURBO_MODEL_ID and elapsed_s > self.turbo_slow_threshold_s: + self.turbo_disabled = True + print(f"โš ๏ธ Turbo route was slow ({elapsed_s:.2f}s); future Auto calls will use Whisper small.") + return text, elapsed_s + + # ๐ŸŸข NEW HELPER: Sanitizes corrupted browser audio + def _sanitize_audio(self, audio_path): + try: + # Try to load it regardless of format + audio = AudioSegment.from_file(audio_path) + # Export it to a clean, standard WAV in a temp file + temp_path = os.path.join(tempfile.gettempdir(), f"clean_audio_{os.path.basename(audio_path)}.wav") + audio.export(temp_path, format="wav") + return temp_path + except Exception as e: + print(f"โš ๏ธ Audio Sanitization Warning: {e}") + return audio_path # Fallback to original if pydub fails + + def _should_sanitize_audio(self, sanitize_audio=True): + if isinstance(sanitize_audio, str): + return sanitize_audio.strip().lower() not in {"off", "false", "0", "no", "raw", "none"} + return bool(sanitize_audio) + + def transcribe(self, audio_path, language=None, model_choice="auto", dialect_hint="", sanitize_audio=True): + if not audio_path: + return [{"text": "", "speaker": "SYSTEM"}] + + try: + clean_path = self._sanitize_audio(audio_path) if self._should_sanitize_audio(sanitize_audio) else audio_path + manual_route = self._normalize_manual_route(model_choice) + routes = [manual_route] if manual_route else self._auto_routes(language=language, dialect_hint=dialect_hint, audio_path=clean_path) + if manual_route and manual_route["engine"] != "whisper": + routes.append({"engine": "whisper", "model": "small", "label": "Whisper small (Fallback)"}) + + transcription_text = "" + used_label = "Unknown" + tried_mms = any(route["engine"] == "mms" for route in routes) + for route in routes: + try: + text, elapsed_s = self._transcribe_with_route(route, clean_path, language=language, dialect_hint=dialect_hint) + used_label = route["label"] + print(f"๐ŸŽ™๏ธ Speech model route: requested={model_choice or 'auto'} resolved={used_label} time={elapsed_s:.2f}s") + transcription_text = text + if not manual_route and route["model"] == self.TURBO_MODEL_ID and elapsed_s > self.turbo_slow_threshold_s: + transcription_text = "" + continue + if not manual_route and route["engine"] != "mms" and self._looks_wrong_script(text, language, dialect_hint) and not tried_mms: + tried_mms = True + mms_route = {"engine": "mms", "model": self.MMS_MODEL_ID, "label": "MMS 1B (Low-resource)"} + print("๐Ÿ” ASR output looked off-script/empty; retrying with MMS 1B.") + mms_text, mms_elapsed = self._transcribe_with_route(mms_route, clean_path, language=language, dialect_hint=dialect_hint) + if mms_text: + transcription_text = mms_text + used_label = mms_route["label"] + print(f"๐ŸŽ™๏ธ Speech model route: retry resolved={used_label} time={mms_elapsed:.2f}s") + if transcription_text: + break + except Exception as route_error: + print(f"โš ๏ธ ASR route '{route['label']}' failed: {route_error}") + continue + + gc.collect() # Force memory release + + # Clean up temp file + if clean_path != audio_path and os.path.exists(clean_path): + os.remove(clean_path) + + return [{"text": transcription_text, "speaker": "Speaker 1", "model": used_label}] + except Exception as e: + print(f"โŒ Transcription Error: {e}") + return [{"text": "", "speaker": "ERROR"}] diff --git a/src/managers.py b/src/managers.py new file mode 100644 index 0000000000000000000000000000000000000000..799418dc102cd38bca82aa745428186c97744a23 --- /dev/null +++ b/src/managers.py @@ -0,0 +1,156 @@ +import os +import asyncio +import threading +import json +from threading import Lock +from huggingface_hub import HfApi, hf_hub_download +from google import genai +from groq import Groq + +from groq import AsyncGroq + +# ... (Keep your existing GeminiManager and HFManager code) ... + +class GroqManager: + def __init__(self, api_key): + self.api_key = api_key + # We do NOT initialize the Groq client globally here anymore! + self.client_available = True if self.api_key else False + + # Using Llama 3.3 70B for better translation quality + self.model_flash = "llama-3.3-70b-versatile" + self.last_used_model = "Idle" + + if self.client_available: + print(f"โšก Groq Manager Connected: Standardized on {self.model_flash}") + + # 2. Convert to an ASYNC function + async def generate_fast(self, prompt): + if not self.client_available: + raise Exception("Groq API Key not found.") + + self.last_used_model = "Llama 3.3 70B (Groq)" + + # 3. INITIALIZE THE CLIENT LOCALLY WITHIN AN ASYNC CONTEXT MANAGER + # This binds the client to the specific thread's event loop and auto-closes it. + async with AsyncGroq(api_key=self.api_key) as client: + chat_completion = await client.chat.completions.create( + messages=[ + { + "role": "user", + "content": prompt, + } + ], + model=self.model_flash, + ) + + # Create a mock response object so AgentInterpretation doesn't break + class GroqResponse: + def __init__(self, text): + self.text = text + + return GroqResponse(chat_completion.choices[0].message.content) + + # 4. Convert this to async as well since it calls generate_fast + async def generate_smart(self, prompt): + # We route both to the fast model for now to bypass rate limits entirely + return await self.generate_fast(prompt) + + def get_status_string(self): + return f"โšก {self.last_used_model}" + +class GeminiManager: + def __init__(self, api_key): + self.api_key = api_key + self.client = genai.Client(api_key=self.api_key) if self.api_key else None + self.model_flash = "gemini-2.0-flash" + self.last_used_model = "Idle" + + if self.client: + print(f"๐Ÿง  Gemini Manager Connected: Standardized on {self.model_flash}") + + def generate_fast(self, prompt): + if not self.client: raise Exception("Google API Key not found.") + self.last_used_model = "Gemini 2.0 Flash" + return self.client.models.generate_content(model=self.model_flash, contents=prompt) + + def generate_smart(self, prompt): + return self.generate_fast(prompt) + + def get_status_string(self): + return f"โšก {self.last_used_model}" + +class HFManager: + def __init__(self, config): + self.config = config + self.api = HfApi(token=self.config.HF_TOKEN) + self.lock = Lock() + + def pull_datasets(self): + print("โฌ‡๏ธ Pulling datasets & profiles...") + try: + files = self.api.list_repo_files(repo_id=self.config.HF_REPO_ID, repo_type="dataset") + for f in files: + target_dir = self.config.PROFILES_DIR if f.endswith(".json") else self.config.DATASET_DIR + if f.endswith(".csv") or f.endswith(".json") or f.endswith(".jsonl"): + hf_hub_download( + repo_id=self.config.HF_REPO_ID, + filename=f, + repo_type="dataset", + local_dir=target_dir, + token=self.config.HF_TOKEN + ) + except Exception as e: + print(f"โŒ HF Pull Error: {e}") + self.seed_initial_data() + + def seed_initial_data(self): + p_path = os.path.join(self.config.PROFILES_DIR, "NSL Lab Trainer.json") + if not os.path.exists(p_path): + with open(p_path, 'w') as f: json.dump({"lab_name": "NSL", "jargon": {}, "pragmatic_rules": []}, f) + + def push_update(self, filepath, commit_msg="Update"): + def _upload_task(): + import asyncio + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + # Determine the relative path in the repo based on where it lives locally + rel_path = os.path.relpath(filepath, self.config.DATASET_DIR) + if rel_path.startswith(".."): + # Fallback to base name if outside DATASET_DIR (e.g. PROFILES_DIR) + rel_path = os.path.relpath(filepath, self.config.PROFILES_DIR) + if rel_path.startswith(".."): + rel_path = os.path.basename(filepath) + + path_in_repo = rel_path.replace('\\', '/') # Ensure forward slashes for HF + + self.api.upload_file( + path_or_fileobj=filepath, + path_in_repo=path_in_repo, + repo_id=self.config.HF_REPO_ID, + repo_type="dataset", + commit_message=commit_msg + ) + print(f"โœ… Background Sync Complete: {path_in_repo}") + except Exception as e: + print(f"โŒ HF Push Error: {e}") + finally: + loop.close() + + threading.Thread(target=_upload_task, daemon=True).start() + def upload_audio_sample(self, audio_path, dialect): + clean_dialect = dialect.strip() + filename = os.path.basename(audio_path) + hf_path = f"audio/{clean_dialect}/{filename}" + try: + self.api.upload_file( + path_or_fileobj=audio_path, + path_in_repo=hf_path, + repo_id=self.config.HF_REPO_ID, + repo_type="dataset", + commit_message=f"Add audio sample for {clean_dialect}" + ) + return hf_path + except Exception as e: + return None diff --git a/src/prepare_training_data.py b/src/prepare_training_data.py new file mode 100644 index 0000000000000000000000000000000000000000..9a8a0239e31b53a98c0c621d187c54d48926ad17 --- /dev/null +++ b/src/prepare_training_data.py @@ -0,0 +1,73 @@ +import pandas as pd +import glob +import os + +# โš™๏ธ CONFIGURATION +DATASET_DIR = "/app/iuuy_datasets" # Where your dialect CSVs live +OUTPUT_FILE = "train.csv" # The file AutoTrain needs +MIN_LENGTH = 3 # Filter out tiny, meaningless utterances + +def create_instruction_prompt(row): + """ + Converts a raw data row into a rich training example for the LLM. + Format: Alpaca-Style Instruction + """ + dialect = str(row.get('Dialect', 'Unknown Dialect')).strip() + utterance = str(row.get('Utterance', '')).strip() + clarification = str(row.get('Clarification', '')).strip() + context = str(row.get('Linguistic_Context', 'General conversation')).strip() + tone = str(row.get('Tone_Category', 'Neutral')).strip() + + # ๐ŸŸข Skip bad data (empty rows) + if len(utterance) < MIN_LENGTH or len(clarification) < MIN_LENGTH: + return None + + # ๐Ÿ“ The Prompt Template + # This teaches the model: Given a Dialect + Context + Utterance -> Provide Meaning + Tone. + text = f"""### Instruction: +You are an expert sociolinguist specializing in {dialect}. +Analyze the following utterance found in a {context} setting. +Provide the Standard English interpretation and the emotional tone. + +### Input: +{utterance} + +### Response: +Meaning: {clarification} +Tone: {tone} +""" + return text + +def main(): + print(f"๐Ÿ“‚ Scanning {DATASET_DIR} for research data...") + + all_files = glob.glob(os.path.join(DATASET_DIR, "**", "*.csv"), recursive=True) + training_data = [] + + for filename in all_files: + try: + df = pd.read_csv(filename) + print(f" - Processing {os.path.basename(filename)} ({len(df)} rows)...") + + # Apply the template to every row + for _, row in df.iterrows(): + prompt = create_instruction_prompt(row) + if prompt: + training_data.append(prompt) + + except Exception as e: + print(f" โš ๏ธ Error reading {filename}: {e}") + + # ๐ŸŸข Create the final Training DataFrame + train_df = pd.DataFrame(training_data, columns=["text"]) + + # Save to root (so AutoTrain can find it easily) + train_df.to_csv(OUTPUT_FILE, index=False) + + print("\nโœ… SUCCESS!") + print(f"๐Ÿ“Š compiled {len(train_df)} training examples.") + print(f"๐Ÿ’พ Saved to: {os.path.abspath(OUTPUT_FILE)}") + print("๐Ÿš€ You can now run 'autotrain llm' using this file.") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/rag_manager.py b/src/rag_manager.py new file mode 100644 index 0000000000000000000000000000000000000000..d62fd9b26b311b41523755de5eb481719c3de6d6 --- /dev/null +++ b/src/rag_manager.py @@ -0,0 +1,83 @@ +# src/rag_manager.py +from sentence_transformers import SentenceTransformer +import faiss +import numpy as np + +class SociolinguisticRAG: + def __init__(self): + print("๐Ÿง  Initializing Local Embedding Model (all-MiniLM-L6-v2)...") + # Downloads tiny ~80MB model to your server once + self.encoder = SentenceTransformer('all-MiniLM-L6-v2') + self.embedding_dim = self.encoder.get_sentence_embedding_dimension() + + # Initialize an empty in-memory FAISS index (L2 distance / Cosine Similarity) + self.index = faiss.IndexFlatL2(self.embedding_dim) + self.chunks = [] + + def load_persona_rules(self, dialect_name: str, rules_list: list): + """ + Vectorizes and loads a list of sociolinguistic rules into RAM. + rules_list should be a list of strings (e.g., ["Rule 1...", "Rule 2..."]) + """ + if not rules_list: + return + + print(f"๐Ÿ“š Vectorizing {len(rules_list)} rules for {dialect_name}...") + + # Store text chunks + self.chunks = rules_list + + # Convert text rules to mathematical vectors + embeddings = self.encoder.encode(self.chunks) + + # FAISS requires float32 numpy arrays + embeddings = np.array(embeddings).astype('float32') + + # Add to the in-memory database + self.index.add(embeddings) + print(f"โœ… {dialect_name} successfully vectorized and indexed in RAM.") + + def retrieve_context(self, user_transcription: str, k=3) -> str: + """ + Takes the Whisper output and finds the top 'k' most relevant cultural rules. + """ + if not self.chunks: + return "No specific rules loaded for this dialect." + + # 1. Convert user's spoken sentence into a vector + query_vector = self.encoder.encode([user_transcription]) + query_vector = np.array(query_vector).astype('float32') + + # 2. Search FAISS for the closest mathematical matches + distances, indices = self.index.search(query_vector, k) + + # 3. Retrieve the actual text for those rules (with safety check) + retrieved_rules = [self.chunks[i] for i in indices[0] if i < len(self.chunks)] + + # 4. Format them into a neat string for Gemini + context_string = "\n".join([f"- {rule}" for rule in retrieved_rules]) + return context_string + + +# ========================================== +# EXAMPLE USAGE / LOCAL TESTING +# ========================================== +if __name__ == "__main__": + # 1. Your raw JSON data broken into a Python list + nigerian_pidgin_rules = [ + "Lexicon: 'Wahala' means trouble or problem.", + "Lexicon: 'How far' is a greeting meaning 'How are you' or 'What's going on'.", + "Pragmatics: Repeating a word (e.g., 'now now') emphasizes extreme urgency.", + "Syntax: Pluralization is often done by adding 'dem' after a noun." + ] + + # 2. Initialize and load (Happens on App Startup) + rag = SociolinguisticRAG() + rag.load_persona_rules("Nigerian Pidgin", nigerian_pidgin_rules) + + # 3. Retrieve (Happens when the user speaks) + whisper_text = "What's going on now?" + print(f"\n๐Ÿ—ฃ๏ธ User said: {whisper_text}") + + relevant_context = rag.retrieve_context(whisper_text, k=2) + print(f"๐ŸŽฏ Retrieved Context for Gemini:\n{relevant_context}") \ No newline at end of file diff --git a/src/simulate_interactions.py b/src/simulate_interactions.py new file mode 100644 index 0000000000000000000000000000000000000000..a82db5815415f542a0d1fda0e25d7d681e79608c --- /dev/null +++ b/src/simulate_interactions.py @@ -0,0 +1,110 @@ +import random +import os +import sys +import json +import csv +from huggingface_hub import hf_hub_download, HfApi + +# Force UTF-8 for console output (Windows fix) +sys.stdout.reconfigure(encoding='utf-8') + +# Add backend directory to sys.path so imports work +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from config import AppConfig + +def main(): + repo_id = "toecm/PureChain_Dataset" + filename = "pending_tx_queue.json" + queue = [] + + from huggingface_hub import get_token + hf_token = getattr(AppConfig, 'HF_TOKEN', None) or get_token() + if not hf_token: + print("โŒ Missing HF_TOKEN in config and Hugging Face CLI.") + return + + print("โ˜๏ธ Downloading existing pending_tx_queue.json from Hugging Face...") + try: + downloaded_path = hf_hub_download( + repo_id=repo_id, + repo_type="dataset", + filename=filename, + token=hf_token + ) + with open(downloaded_path, "r", encoding='utf-8') as f: + queue = json.load(f) + print(f"โœ… Downloaded existing queue with {len(queue)} items.") + except Exception as e: + print(f"โ„น๏ธ Could not download existing queue (it may not exist). Starting fresh. ({e})") + queue = [] + + korean_dialects = [ + "Gyeongsangdo Satoori", + "Jeju Satoori", + "Gangwon Satoori", + "Chungcheong Satoori", + "Seoul Satoori", + "Jeolla Satoori", + ] + + print("๐ŸŽฒ Generating 60 Koreanโ†”Korean interactions...") + for i in range(60): + d1 = random.choice(korean_dialects) + d2 = random.choice(korean_dialects) + payload = { + "original": f"Simulated utterance from {d1} to {d2}", + "dialect": d2, + "Data_Origin": f"Simulation: {d1}", + "user": "System Auto-Simulation" + } + queue.append(payload) + + print("๐ŸŽฒ Generating 30 interactions for each Korean Satoori with American English...") + for dialect in korean_dialects: + for i in range(30): + payload = { + "original": f"Simulated utterance from {dialect} to American English", + "dialect": "American English", + "Data_Origin": f"Simulation: {dialect}", + "user": "System Auto-Simulation" + } + queue.append(payload) + + print(f"โœ… Generated simulations. Total queue size: {len(queue)}") + + local_path = "pending_tx_queue.json" + with open(local_path, "w", encoding="utf-8") as f: + json.dump(queue, f, indent=2, ensure_ascii=False) + + # Write CSV version for pending approvals + csv_path = "pending_approvals.csv" + with open(csv_path, "w", newline="", encoding="utf-8") as csvfile: + fieldnames = ["original", "dialect", "Data_Origin", "user"] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + for item in queue: + writer.writerow({k: item.get(k, "") for k in fieldnames}) + + print("โ˜๏ธ Uploading updated queue back to Hugging Face...") + api = HfApi(token=hf_token) + # Upload JSON queue + api.upload_file( + path_or_fileobj=local_path, + path_in_repo=filename, + repo_id=repo_id, + repo_type="dataset", + commit_message="๐Ÿค– Auto-queued 240 simulated interactions (JSON)" + ) + # Upload CSV approvals + api.upload_file( + path_or_fileobj=csv_path, + path_in_repo="pending_approvals.csv", + repo_id=repo_id, + repo_type="dataset", + commit_message="๐Ÿค– Auto-queued 240 simulated interactions (CSV)" + ) + print("โœ… Successfully uploaded JSON and CSV! The UI should see the new pending items shortly.") + +if __name__ == "__main__": + main() diff --git a/src/trust_agent.py b/src/trust_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..239b8ac3f16244e6e6224d94463018d54bb6031f --- /dev/null +++ b/src/trust_agent.py @@ -0,0 +1,815 @@ +import os +import requests +import json +import threading +import pandas as pd +import csv +import time +import re +import asyncio +from threading import Lock +from web3 import Web3 +try: + from web3.middleware import ExtraDataToPOAMiddleware as geth_poa_middleware +except ImportError: + from web3.middleware import geth_poa_middleware + +# Hardcoded ABI removed! Loaded dynamically via config.py / dynamic_compiler.py +class AgentTrust: + def __init__(self, config): + self.config = config + self.lock = Lock() + self.active_tasks = 0 + self.hf_manager_ref = None + self.last_latency = 0.0 + self.queue_file = "/app/pending_tx_queue.json" + self.HISTORY_FILE = "/app/minted_history.csv" + + # 1. Hugging Face Queue Recovery + try: + from huggingface_hub import hf_hub_download + print("โ˜๏ธ Checking Hugging Face for existing pending transaction queue...") + downloaded_path = hf_hub_download( + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + filename="pending_tx_queue.json", + token=getattr(self.config, 'HF_TOKEN', None) + ) + with open(downloaded_path, "r") as src, open(self.queue_file, "w") as dst: + dst.write(src.read()) + print("โœ… Successfully recovered pending queue from Hugging Face!") + except Exception as e: + print("โ„น๏ธ No existing queue found on Hugging Face. Starting fresh.") + + # 2. ๐ŸŸข WEB3 & WALLET INITIALIZATION (The Missing Piece) + self.w3 = None + self.account = None + + if self.config.PRIVATE_KEY and self.config.PURECHAIN_RPC_URL: + try: + # Connect to your Korean Node (Port 8548) + self.w3 = Web3(Web3.HTTPProvider(self.config.PURECHAIN_RPC_URL)) + + # Inject POA middleware (Required for Geth/Private Chains) + self.w3.middleware_onion.inject(geth_poa_middleware, layer=0) + + if self.w3.is_connected(): + self.account = self.w3.eth.account.from_key(self.config.PRIVATE_KEY) + print(f"๐Ÿ”— Web3 Connected! Wallet: {self.account.address}") + + # ๐ŸŸข DYNAMIC AUTO-DEPLOY LOGIC + if not self.config.PURECHAIN_CONTRACT_ADDRESS or self.config.PURECHAIN_CONTRACT_ADDRESS == "YOUR_CONTRACT_ADDRESS_HERE": + print("โš ๏ธ No valid contract address found in config/env. Auto-deploying a new instance...") + try: + from src.dynamic_compiler import get_contract_interface + abi, bytecode = get_contract_interface() + + Contract = self.w3.eth.contract(abi=abi, bytecode=bytecode) + tx = Contract.constructor().build_transaction({ + 'from': self.account.address, + 'nonce': self.w3.eth.get_transaction_count(self.account.address), + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': getattr(self.config, 'PURECHAIN_ID', 900520900520) + }) + signed_tx = self.w3.eth.account.sign_transaction(tx, self.config.PRIVATE_KEY) + tx_hash = self.w3.eth.send_raw_transaction(signed_tx.raw_transaction) + print("โณ Deploying contract... waiting for receipt.") + tx_receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash) + + new_address = tx_receipt.contractAddress + print(f"๐ŸŽ‰ CONTRACT DEPLOYED DYNAMICALLY AT: {new_address}") + + # Set it in memory for this session + self.config.PURECHAIN_CONTRACT_ADDRESS = new_address + os.environ["PURECHAIN_CONTRACT_ADDRESS"] = new_address + # Also inject into config object dynamically + self.config.CONTRACT_ABI = abi + except Exception as de: + print(f"โŒ Auto-deploy failed: {de}") + else: + print(f"โš ๏ธ Failed to connect to node at {self.config.PURECHAIN_RPC_URL}") + except Exception as e: + print(f"โŒ Web3 Init Error: {e}") + + print("๐Ÿ›ก๏ธ Agent 4 (Trust) Online: Async Saving & Retry Queue Enabled.") + + # ๐ŸŸข START BACKGROUND RETRY LOOP + threading.Thread(target=self._retry_queue_loop, daemon=True).start() + + # --- THE DEAD LETTER QUEUE LOGIC --- + def add_to_queue(self, data_dict): + with self.lock: + queue = [] + if os.path.exists(self.queue_file): + try: + with open(self.queue_file, "r") as f: + queue = json.load(f) + except: pass + queue.append(data_dict) + with open(self.queue_file, "w") as f: + json.dump(queue, f, indent=2) + + def _retry_queue_loop(self): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + try: + while True: + time.sleep(60) # Check the queue every 60 seconds + if not os.path.exists(self.queue_file): continue + + with self.lock: + try: + with open(self.queue_file, "r") as f: + queue = json.load(f) + except: queue = [] + + if not queue: continue + + # Check if node is back online + if not self.w3 or not self.w3.is_connected(): + continue + + total_queued = len(queue) + print(f"๐Ÿ”„ Node Online! Attempting to mint {total_queued} queued transactions...") + + remaining_queue = [] + success_count = 0 # Track successes + + for data in queue: + result = self.stamp_on_chain(data, from_loop=True) # Removed from_queue=True as it's not in the signature + if result: + success_count += 1 + else: + remaining_queue.append(data) + + # --- NOTIFICATION LOGIC --- + if success_count > 0: + print(f"\n๐Ÿ”” [TRUST AGENT ALERT] Successfully cleared {success_count}/{total_queued} backlog transactions.") + + try: + if getattr(self.config, 'HF_TOKEN', None): + from huggingface_hub import HfApi + api = HfApi(token=self.config.HF_TOKEN) + repo_id = getattr(self.config, 'HF_REPO_ID', "toecm/IEDID") + history_file = getattr(self, 'HISTORY_FILE', "/app/minted_history.csv") + if os.path.exists(history_file): + api.upload_file( + path_or_fileobj=history_file, + path_in_repo="minted_history.csv", + repo_id=repo_id, + repo_type="dataset", + commit_message=f"โ›“๏ธ Batch logged {success_count} pending transactions" + ) + except Exception as e: + print(f"Batch history upload error: {e}") + + if not remaining_queue: + print("โœ… ALL PENDING TRANSACTIONS MINTED. Queue is now empty.\n") + else: + print(f"โš ๏ธ {len(remaining_queue)} transactions failed again and remain in queue.\n") + + # Update the queue file with whatever is left + with self.lock: + with open(self.queue_file, "w") as f: + json.dump(remaining_queue, f, indent=2) + finally: + loop.close() + + def get_unique_origins(self): + try: + # 1. Define the history file path inside the function + history_file = "/app/minted_history.csv" + if not os.path.exists(history_file): + return [] + + # 2. Read the history and get unique values from Data_Origin + df = pd.read_csv(history_file) + if "Data_Origin" in df.columns: + return sorted(df["Data_Origin"].dropna().unique().tolist()) + return [] + except Exception as e: + print(f"Error fetching unique origins: {e}") + return [] + + # --- IPFS HELPERS --- + def upload_file_to_pinata(self, filepath): + url = "https://api.pinata.cloud/pinning/pinFileToIPFS" + headers = {"Authorization": f"Bearer {self.config.PINATA_JWT}"} + try: + with open(filepath, 'rb') as f: + files = {'file': f} + response = requests.post(url, headers=headers, files=files) + return response.json().get('IpfsHash') + except Exception as e: + return None + + def log_to_ipfs(self, data): + if not self.config.PINATA_JWT: return "Local-Log-Only" + headers = {"Authorization": f"Bearer {self.config.PINATA_JWT}"} + try: + res = requests.post("https://api.pinata.cloud/pinning/pinJSONToIPFS", headers=headers, json=data) + return res.json().get("IpfsHash", "Error") + except: return "IPFS_Fail" + + # --- CORE BLOCKCHAIN LOGIC --- + def stamp_on_chain(self, payload, from_loop=False): + """ + Hashes the validated sociolinguistic data and mints it to the Purechain ledger + using the PureVersation contract's proposeEntry function. + """ + import json + import hashlib + import os + from web3 import Web3 + try: + from web3.middleware import ExtraDataToPOAMiddleware as geth_poa_middleware + except ImportError: + from web3.middleware import geth_poa_middleware + + print("\n" + "="*40) + print("โ›“๏ธ INITIATING PURECHAIN MINTING SEQUENCE") + + try: + # 1. Load Environment Variables (Updated to match your secrets) + rpc_url = os.environ.get("PURECHAIN_RPC_URL") + private_key = os.environ.get("PRIVATE_KEY") + contract_address = os.environ.get("PURECHAIN_CONTRACT_ADDRESS") + + if not all([rpc_url, private_key, contract_address]): + print("โš ๏ธ Purechain skipped: Missing RPC_URL, PRIVATE_KEY, or PURECHAIN_CONTRACT_ADDRESS.") + return False + + # 2. Establish Network Connection + w3 = Web3(Web3.HTTPProvider(rpc_url)) + w3.middleware_onion.inject(geth_poa_middleware, layer=0) # PoA compatibility + + if not w3.is_connected(): + print("๐Ÿ”ด Purechain connection failed. Network may be offline.") + return False + + account = w3.eth.account.from_key(private_key) + wallet_address = account.address + print(f"โœ… Authenticated as Operator: {wallet_address}") + + # 3. Cryptographic Hashing of the Data + # We hash the full JSON payload to use as our "IPFS CID" / Data Hash proof + payload_str = json.dumps(payload, sort_keys=True) + data_hash = hashlib.sha256(payload_str.encode('utf-8')).hexdigest() + print(f"๐Ÿ”’ Payload SHA-256 Proof: {data_hash}") + + # 4. Load the Smart Contract using your config.py ABI + # Ensure your config is imported/available in trust_agent.py + contract = w3.eth.contract(address=contract_address, abi=self.config.CONTRACT_ABI) + + # 5. Extract values for the proposeEntry parameters + # function proposeEntry(string _phrase, string _dialect, string _ipfsCid, string _license) + phrase = payload.get("original", "Unknown Utterance") + dialect = payload.get("dialect", "Unknown Dialect") + license_type = "CC-BY-4.0 (Open Research)" # Academic open data license + + # ๐ŸŸข FIX: Web3 Checksumming and Length Validation + raw_operator = str(payload.get("user", wallet_address)).strip().lower() + + # Ensure it is exactly 42 characters and starts with 0x + if raw_operator.startswith("0x") and len(raw_operator) == 42: + try: + # Web3 strictly requires addresses to be checksummed (mixed upper/lower case hex) + final_operator_id = w3.to_checksum_address(raw_operator) + except Exception: + final_operator_id = w3.to_checksum_address(wallet_address) + else: + # If the React ID is missing or broken, fallback to the Lab Admin + final_operator_id = w3.to_checksum_address(wallet_address) + + # 6. Build the Transaction + nonce = w3.eth.get_transaction_count(wallet_address) + + # ๐ŸŸข UPDATED: Pass the finalized, checksummed address + tx = contract.functions.proposeEntry( + phrase, + dialect, + data_hash, + license_type, + final_operator_id + ).build_transaction({ + 'chainId': w3.eth.chain_id, + 'gas': 2000000, + 'gasPrice': 0, + 'nonce': nonce, + }) + + # 7. Sign and Broadcast + signed_tx = w3.eth.account.sign_transaction(tx, private_key) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + hex_hash = w3.to_hex(tx_hash) + + print(f"๐Ÿš€ Transaction Broadcasted! TX Hash: {hex_hash}") + + # 8. Wait for Confirmation + receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120) + + if receipt.status == 1: + print(f"๐Ÿ’Ž SUCCESS: Entry '{phrase[:15]}...' irreversibly minted in Block {receipt.blockNumber}") + + entry_id = None + try: + events = contract.events.EntryProposed().process_receipt(receipt) + if events: + entry_id = events[0]['args']['id'] + print(f"๐Ÿ“Œ On-Chain Entry ID: {entry_id}") + except Exception as e: + print(f"โš ๏ธ Failed to parse event for ID: {e}") + + # OPTIONAL: Save the receipt to your Gradio Transaction History tab + if hasattr(self, '_log_transaction_history'): + self._log_transaction_history(payload, hex_hash, receipt.blockNumber, from_loop=from_loop) + return entry_id or True + else: + print("โš ๏ธ Transaction reverted by the EVM. (Check if wallet is registered)") + return False + + except Exception as e: + import traceback + print(f"\nโŒ SMART CONTRACT ERROR โŒ\n{e}") + traceback.print_exc() + return False + finally: + print("="*40 + "\n") + + def log_mint_to_history(self, utterance, dialect, tx_hash, block_num, cid): + history_file = "/app/minted_history.csv" + new_entry = { + "Timestamp": pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S'), + "Utterance": utterance, "Dialect": dialect, "Data_Origin": "Lab UI", # Match UI columns + "Block": block_num, "Speed": f"{self.last_latency}s", "TX Hash": tx_hash, "IPFS CID": cid + } + df = pd.DataFrame([new_entry]) + + with self.lock: + # 1. Save Locally + if not os.path.exists(history_file): + df.to_csv(history_file, index=False) + else: + df.to_csv(history_file, mode='a', header=False, index=False) + + # 2. โ˜๏ธ Push the History File to Hugging Face + try: + hf_token = os.environ.get("HF_TOKEN") + repo_id = getattr(self.config, "HF_REPO_ID", "toecm/IEDID") # Fallback to your main dataset + if hf_token: + from huggingface_hub import HfApi + api = HfApi(token=hf_token) + print("โ˜๏ธ Syncing minted_history.csv to Hugging Face...") + api.upload_file( + path_or_fileobj=history_file, + path_in_repo="minted_history.csv", + repo_id=repo_id, + repo_type="dataset", + commit_message="๐Ÿ“œ Blockchain TX History Updated" + ) + except Exception as e: + print(f"โš ๏ธ Failed to sync history to HF: {e}") + + def get_filtered_history(self, start_date=None, end_date=None): + """Safely reads and filters the PureChain minted history for the Gradio UI.""" + import pandas as pd + import os + + history_file = getattr(self, 'HISTORY_FILE', "/app/minted_history.csv") + + # The columns your Gradio UI expects + expected_cols = ["Timestamp", "Utterance", "Dialect", "Data_Origin", "Data_Approved", "Block", "Speed", "TX Hash", "IPFS CID"] + + # 1. Safe File Check + if not os.path.exists(history_file): + return pd.DataFrame(columns=expected_cols) + + try: + df = pd.read_csv(history_file) + + # 2. Add missing columns safely (in case of old CSV formats) + for col in expected_cols: + if col not in df.columns: + df[col] = "Unknown" if col == "Data_Origin" else "" + + if df.empty: + return df + + # 3. Safe Date Parsing (Ignore errors, just keep data if dates are weird) + df["Timestamp_Parsed"] = pd.to_datetime(df["Timestamp"], errors='coerce') + + # Apply Start Date + if start_date and str(start_date).strip(): + try: + start_dt = pd.to_datetime(start_date) + df = df[df["Timestamp_Parsed"] >= start_dt] + except Exception as e: + print(f"Start date filter error: {e}") + + # Apply End Date (Add 23:59:59 to include the whole end day) + if end_date and str(end_date).strip(): + try: + end_dt = pd.to_datetime(end_date).replace(hour=23, minute=59, second=59) + df = df[df["Timestamp_Parsed"] <= end_dt] + except Exception as e: + print(f"End date filter error: {e}") + + # 4. Clean up and reverse order (Newest first!) + df = df.drop(columns=["Timestamp_Parsed"]) + + # Return the reversed dataframe so you don't have to scroll down + return df.iloc[::-1].reset_index(drop=True) + + except Exception as e: + import traceback + print(f"โŒ Error reading history: {e}") + traceback.print_exc() + return pd.DataFrame(columns=expected_cols) + # --- SINGLE ENTRY SAVING --- + def check_if_exists(self, utterance, dialect, brain_agent, clarification="", tone=""): + if brain_agent.df.empty: return False + + clean_text = str(utterance).strip().lower() + clean_dialect = str(dialect).strip() + clean_clar = str(clarification).strip().lower() + + match = brain_agent.df[ + (brain_agent.df["Utterance"].astype(str).str.strip().str.lower() == clean_text) & + (brain_agent.df["Dialect"].astype(str).str.strip() == clean_dialect) & + (brain_agent.df["Clarification"].astype(str).str.strip().str.lower() == clean_clar) + ] + return not match.empty + + def process_feedback(self, action, original_text, dialect, clarification, tone, context, brain_agent, audio_path=None, pragmatics=""): + timestamp = pd.Timestamp.now().isoformat() + feedback_data = { + "original": original_text, "dialect": dialect, "clarification": clarification, + "tone": tone, "linguistic_context": context, "pragmatics": pragmatics, "action": action, "timestamp": timestamp + } + + def _background_save_task(): + loop = asyncio.new_event_loop() # Create new loop + asyncio.set_event_loop(loop) # Set as active loop + + self.active_tasks += 1 + try: + # ๐ŸŸข Generate Acoustic Profile dynamically before saving + acoustic_profile = "{}" + if getattr(self, "acoustic_agent", None): + acoustic_profile = self.acoustic_agent.generate_phonetic_profile(original_text, dialect) + + feedback_data["acoustic_profile"] = acoustic_profile + + self.stamp_on_chain(feedback_data) + if action in ["Suggest Update", "Accept", "Force Overwrite"]: + syntax = r"\b" + re.escape(original_text.lower()) + r"\b" + self.update_dataset_csv(dialect, original_text, clarification, tone, context, syntax, audio_path, pragmatics, acoustic_profile=acoustic_profile) + if brain_agent: brain_agent.refresh_knowledge_base() + except Exception as e: print(f"โŒ Background Task Error: {e}") + finally: + self.active_tasks -= 1 + loop.close() # Cleanly close the loop + + threading.Thread(target=_background_save_task, daemon=True).start() + return "โœ… Request Queued!" + + def update_dataset_csv(self, dialect, utterance, clarification, tone, context, syntax, audio_path=None, pragmatics="", sourceTag="Web", clar_source="User", userKey="", acoustic_profile="{}", language=None, review_metadata=None): + import csv + import pandas as pd + + # Safely convert to string to avoid numpy.float64 NaN errors + dialect_str = "" if pd.isna(dialect) else str(dialect) + clean_dialect = dialect_str.strip().title() + if "Pidgin" in clean_dialect and not clean_dialect.endswith("English") and not clean_dialect.endswith("Dialect"): + clean_dialect += " English" + + def get_language(name): + name_lower = name.lower() + if 'patois' in name_lower or 'pidgin' in name_lower or 'creole' in name_lower: + return 'Creole' + if 'english' in name_lower or 'american' in name_lower or 'british' in name_lower or 'south african' in name_lower: + return 'English' + if 'korean' in name_lower: + return 'Korean' + if 'igbo' in name_lower: + return 'Asusu Igbo' + if 'tagalog' in name_lower or 'filipino' in name_lower: + return 'Filipino' + if 'indonesian' in name_lower: + return 'Indonesian' + return 'Other' + + if language is not None and not pd.isna(language) and str(language).strip(): + lang = str(language).strip().title() + else: + lang = get_language(clean_dialect) + + filepath = os.path.join(self.config.DATASET_DIR, lang, "data", f"{clean_dialect}.csv") + os.makedirs(os.path.dirname(filepath), exist_ok=True) + + # ๐ŸŸข COLUMN FIX: Hardcode both columns to prevent schema crashes + review_metadata = review_metadata if isinstance(review_metadata, dict) else {} + review_cols = [ + "Queue_ID", "Interaction_ID", "Supersedes_Interaction_ID", "App_Source", + "Source_Input_Mode", "Machine_Transcript_Initial", "User_Transcript_Final", + "Transcript_Edit_Distance", "ASR_Model", "Audio_Sanitation", "Audio_Retained", + "Machine_Translation_Initial", "User_Translation_Final", + "Translation_Edit_Distance", "AI_Model", "Translation_Route", + "Consent_Confirmed", "Consent_Version", "Source_Language", + "Source_Dialect", "Target_Language", "Target_Dialect", + "Review_Submitted_At", "Review_Status" + ] + expected_cols = [ + "Utterance", "Dialect", "Clarification", "Tone_Category", + "Linguistic_Context", "Syntax_Pattern", "Pragmatic_Analysis", + "Acoustic_Profile", "file_name", "audio_file_name", "Data_Origin", + "Clarification_Source", "User", *review_cols + ] + + with self.lock: + if not os.path.exists(filepath): + df = pd.DataFrame(columns=expected_cols) + else: + try: + df = pd.read_csv(filepath, encoding='utf-8-sig', on_bad_lines='skip') + except: + df = pd.DataFrame(columns=expected_cols) + + for col in expected_cols: + if col not in df.columns: + df[col] = "" + + # ๐ŸŸข AUDIO FIX: Map to the standard 'file_name' column + final_audio = "" + if isinstance(audio_path, str) and os.path.exists(audio_path): + audio_filename = os.path.basename(audio_path) + final_audio = f"audio/{audio_filename}" + + row_data = { + "Utterance": utterance, "Dialect": clean_dialect, "Clarification": clarification, + "Tone_Category": tone, "Linguistic_Context": context, "Pragmatic_Analysis": pragmatics, + "Syntax_Pattern": syntax, + "Acoustic_Profile": acoustic_profile, + "file_name": final_audio, # โฌ…๏ธ Valid Audio Path goes here + "audio_file_name": "", # โฌ…๏ธ Blank to prevent confusion + "Data_Origin": sourceTag, # โฌ…๏ธ Will now say "Game: X" or "Gradio App" + "Clarification_Source": clar_source, + "User": userKey, + **{column: review_metadata.get(column, "") for column in review_cols} + } + + new_row = pd.DataFrame([{k: row_data.get(k, "") for k in expected_cols}]) + final_df = pd.concat([df, new_row], ignore_index=True) + final_df.to_csv(filepath, index=False, quoting=csv.QUOTE_ALL) + + # ========================================== + # โ˜๏ธ 4. HUGGING FACE CLOUD SYNC + # ========================================== + try: + hf_token = os.environ.get("HF_TOKEN") + repo_id = getattr(self.config, "HF_REPO_ID", "toecm/IEDID") + + if hf_token: + from huggingface_hub import HfApi + api = HfApi(token=hf_token) + + if isinstance(audio_path, str) and os.path.exists(audio_path): + print(f"โ˜๏ธ Syncing Audio to HF: {final_audio}") + api.upload_file( + path_or_fileobj=audio_path, + path_in_repo=final_audio, + repo_id=repo_id, + repo_type="dataset", + commit_message=f"๐ŸŽ™๏ธ Added new audio sample for {clean_dialect}" + ) + + if os.path.exists(filepath): + # Preserve subdirectory structure (e.g., Creole/data/Nigerian Pidgin English.csv) + relative_path = os.path.relpath(filepath, self.config.DATASET_DIR).replace(os.sep, '/') + print(f"โ˜๏ธ Syncing CSV to HF: {relative_path}") + api.upload_file( + path_or_fileobj=filepath, + path_in_repo=relative_path, + repo_id=repo_id, + repo_type="dataset", + commit_message=f"๐Ÿ“ Auto-update {clean_dialect} sociolinguistic data" + ) + except Exception as e: + print(f"โš ๏ธ Hugging Face Sync Error: {e}") + + def add_to_graveyard(self, dialect, utterance, clarification, tone, context, syntax, audio_path=None, pragmatics="", sourceTag="Web", clar_source="User", userKey="", reason="Admin Override", rejector="Unknown", chain_id=""): + import csv + graveyard_path = os.path.join(self.config.DATASET_DIR, "..", "rejected_graveyard.csv") + + expected_cols = ["Chain_ID", "Utterance", "Dialect", "Clarification", "Tone_Category", "Linguistic_Context", "Syntax_Pattern", "Pragmatic_Analysis", "audio_file_name", "Data_Origin", "Clarification_Source", "User", "Rejection_Reason", "Rejector"] + + with self.lock: + if not os.path.exists(graveyard_path): + df = pd.DataFrame(columns=expected_cols) + else: + try: + df = pd.read_csv(graveyard_path, encoding='utf-8-sig', on_bad_lines='skip') + except: + df = pd.DataFrame(columns=expected_cols) + + for col in expected_cols: + if col not in df.columns: + df[col] = "" + + new_data = { + "Chain_ID": str(chain_id).strip(), + "Utterance": str(utterance).strip(), + "Dialect": str(dialect).strip(), + "Clarification": str(clarification).strip(), + "Tone_Category": str(tone).strip(), + "Linguistic_Context": str(context).strip(), + "Syntax_Pattern": str(syntax).strip(), + "Pragmatic_Analysis": str(pragmatics).strip(), + "audio_file_name": os.path.basename(audio_path) if isinstance(audio_path, str) and str(audio_path) != "nan" else "", + "Data_Origin": str(sourceTag).strip(), + "Clarification_Source": str(clar_source).strip(), + "User": str(userKey).strip(), + "Rejection_Reason": str(reason).strip(), + "Rejector": str(rejector).strip() + } + + df = pd.concat([df, pd.DataFrame([new_data])], ignore_index=True) + df.to_csv(graveyard_path, index=False, encoding='utf-8-sig', quoting=csv.QUOTE_ALL) + # ========================================== + try: + hf_token = os.environ.get("HF_TOKEN") + # Fallback to your hardcoded ID if the config is missing it + repo_id = getattr(self.config, "HF_REPO_ID", "toecm/IEDID") + + if hf_token: + from huggingface_hub import HfApi + api = HfApi(token=hf_token) + + # ๐ŸŽต Upload the Audio File + if isinstance(audio_path, str) and os.path.exists(audio_path): + final_audio = f"rejected_audio/{os.path.basename(audio_path)}" + print(f"โ˜๏ธ Syncing Audio to HF: {final_audio}") + api.upload_file( + path_or_fileobj=audio_path, + path_in_repo=final_audio, + repo_id=repo_id, + repo_type="dataset", + commit_message=f"๐ŸŽ™๏ธ Moved audio to graveyard for {dialect}" + ) + + # ๐Ÿ“ Upload the CSV file + if os.path.exists(graveyard_path): + csv_filename = os.path.basename(graveyard_path) + print(f"โ˜๏ธ Syncing CSV to HF: {csv_filename}") + api.upload_file( + path_or_fileobj=graveyard_path, + path_in_repo=csv_filename, + repo_id=repo_id, + repo_type="dataset", + commit_message=f"๐Ÿ“ Auto-update rejected graveyard data" + ) + except Exception as e: + print(f"โš ๏ธ Hugging Face Sync Error: {e}") + # Optional Fallback: Use the old manager if the direct API fails + if getattr(self, "hf_manager_ref", None): + self.hf_manager_ref.push_update(filepath, f"Update: {utterance}") + + return True + + # ========================================== + # PURECHAIN HISTORY TAB + # ========================================== + def _log_transaction_history(self, payload, tx_hash, block_num, from_loop=False): + import pandas as pd + import os + from datetime import datetime + from huggingface_hub import HfApi + + history_file = getattr(self, 'HISTORY_FILE', "/app/minted_history.csv") + new_row = { + "Timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "Utterance": payload.get("original", ""), + "Dialect": payload.get("dialect", ""), + "Data_Origin": payload.get("Data_Origin", "Unknown Origin"), + "Data_Approved": f"Lab Approved: {self.account.address[:6]}...{self.account.address[-4:]}" if self.account else "Lab Approved", + "Block": block_num, + "TX Hash": tx_hash + } + try: + if os.path.exists(history_file): + df = pd.read_csv(history_file) + else: + df = pd.DataFrame(columns=new_row.keys()) + df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True) + df.to_csv(history_file, index=False) + + # ๐ŸŸข FIX: Upload history back to Hugging Face so it survives restarts + if self.config.HF_TOKEN and not from_loop: + api = HfApi(token=self.config.HF_TOKEN) + repo_id = getattr(self.config, 'HF_REPO_ID', "toecm/IEDID") + api.upload_file( + path_or_fileobj=history_file, + path_in_repo="minted_history.csv", + repo_id=repo_id, + repo_type="dataset", + commit_message="โ›“๏ธ Logged PureChain transaction history" + ) + except Exception as e: + print(f"History log error: {e}") + + + + # ========================================== + # SYSTEM BACKUP & DEPLOY + # ========================================== + def create_system_backup(self, filename, note): + """Uploads a file to IPFS and logs it permanently to PureChain.""" + if not self.w3 or not self.account: + return "โŒ Node offline. Cannot create immutable backup." + + # Search for the file in your working directories + filepath = os.path.join(self.config.DATASET_DIR, filename) + if not os.path.exists(filepath): + filepath = os.path.join(self.config.PROFILES_DIR, filename) + + if not os.path.exists(filepath): + return f"โŒ File '{filename}' not found in datasets or profiles." + + try: + # 1. Upload to IPFS + cid = self.upload_file_to_pinata(filepath) + if not cid: return "โŒ Failed to pin file to IPFS." + + # 2. Mint Backup to PureChain + contract = self.w3.eth.contract(address=self.config.PURECHAIN_CONTRACT_ADDRESS, abi=self.config.CONTRACT_ABI) + nonce = self.w3.eth.get_transaction_count(self.account.address, 'pending') + + # Using your contract's createBackup(string _key, string _type, string _cid, string _desc) + file_ext = filename.split(".")[-1].upper() + tx = contract.functions.createBackup( + filename, file_ext, cid, note + ).build_transaction({ + 'from': self.account.address, + 'nonce': nonce, + 'gas': 2000000, + 'gasPrice': 0, # ZERO GAS! + 'chainId': self.config.PURECHAIN_ID + }) + + signed_tx = self.w3.eth.account.sign_transaction(tx, private_key=self.config.PRIVATE_KEY) + tx_hash = self.w3.eth.send_raw_transaction(signed_tx.raw_transaction) + self.w3.eth.wait_for_transaction_receipt(tx_hash) + + return f"โœ… Immutable Backup Created!\nCID: {cid}\nTX: {self.w3.to_hex(tx_hash)}" + + except Exception as e: + return f"โŒ Blockchain Backup Error: {e}" + + def force_deploy_contract(self, bytecode): + """Forces a raw bytecode deployment to PureChain with Zero Gas.""" + if not self.w3 or not self.account: + return "โŒ Node offline. Cannot deploy." + + if not bytecode or not bytecode.startswith("0x"): + return "โŒ Invalid bytecode. Must start with '0x'." + + try: + nonce = self.w3.eth.get_transaction_count(self.account.address, 'pending') + + # Raw deployment transaction + tx = { + 'from': self.account.address, + 'data': bytecode, + 'nonce': nonce, + 'gas': 4000000, # Higher gas limit for deployments + 'gasPrice': 0, # ZERO GAS + 'chainId': self.config.PURECHAIN_ID + } + + signed_tx = self.w3.eth.account.sign_transaction(tx, self.config.PRIVATE_KEY) + tx_hash = self.w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash) + + return f"โœ… Contract Deployed Successfully!\nAddress: {receipt.contractAddress}" + + except Exception as e: + return f"โŒ Deployment Failed: {e}" + + def rebuild_history_from_chain(self): + """Ultimate Failsafe: Reconstructs the CSV directly from the PureChain Ledger.""" + print("๐ŸŒ [TRUST AGENT] Rebuilding history from PureChain...") + if not self.w3 or not self.w3.is_connected(): + print("โŒ Cannot rebuild: Node offline.") + return False + + try: + contract = self.w3.eth.contract( + address=self.config.PURECHAIN_CONTRACT_ADDRESS, + abi=self.config.CONTRACT_ABI + ) + # Make sure your except block aligns perfectly with your try block! + except Exception as e: + print(f"โš ๏ธ Web3 Contract Error: {e}") + contract = None diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..5682551942856607395b566d7bf3f1cf7de9275f --- /dev/null +++ b/src/utils.py @@ -0,0 +1,15 @@ +import os +import tempfile +from pydub import AudioSegment +from pydub.generators import Sine + +def create_warning_beep(): + """Generates a warning sound file for the UI.""" + try: + beep = Sine(1000).to_audio_segment(duration=500).apply_gain(5) + path = os.path.join(tempfile.gettempdir(), "warning_beep.wav") + beep.export(path, format="wav") + return path + except Exception as e: + print(f"โš ๏ธ Could not create warning beep: {e}") + return None \ No newline at end of file diff --git a/src/ux_agent.py b/src/ux_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..4112052de41c9bfee3d4dd9a37e8eba7356fad7c --- /dev/null +++ b/src/ux_agent.py @@ -0,0 +1,2530 @@ +""" +๐ŸŽจ Agent UX (Interface & API Gateway) +------------------------------------------------- +This agent acts as the central controller and router. It manages the Gradio +Lab Admin dashboard, provides headless API endpoints for the React frontend games, +and seamlessly orchestrates data flow between the users, the Brain, and the Trust agents. +""" +import os +import time +import uuid +import glob +import hmac +import inspect +import json +import re +import shutil +import threading +import traceback +from datetime import datetime + +import gradio as gr +import pandas as pd +from config import AppConfig +from huggingface_hub import HfApi, hf_hub_download +try: + import spaces +except Exception: + spaces = None + +from src import prepare_training_data # ๐ŸŸข Import your new script +from src.dialect_rules import ( + hausa_variety_instruction, + nigerian_variety_instruction, + nigerian_variety_retry_prompt, + nigerian_variety_retry_reason, +) +from src.asr_language import resolve_asr_language_code + +def zero_gpu_optional(duration=60): + def decorator(fn): + if spaces is not None and hasattr(spaces, "GPU"): + return spaces.GPU(duration=duration)(fn) + return fn + return decorator + +# ========================================== +# โ˜๏ธ CLOUD SYNC CHECK +# ========================================== +def check_cloud_sync_status(): + """Checks Hugging Face for the last commit time and returns a HUD status string.""" + try: + # Use a token when present, but do not mark public read-only sync as offline + # just because the runtime lacks a write token. + hf_token = AppConfig.HF_TOKEN + + api = HfApi(token=hf_token) if hf_token else HfApi() + repo_id = "toecm/IEDID" + + commits = api.list_repo_commits(repo_id=repo_id, repo_type="dataset") + if commits: + last_sync = commits[0].created_at.strftime("%H:%M") + return f"๐ŸŸข CLOUD SYNCED (Last: {last_sync})" + return "๐ŸŸก CLOUD REACHABLE (REPO EMPTY)" + except Exception as e: + print(f"Sync check error: {e}") + return "๐Ÿ”ด SYNC OFFLINE" + +class AgentUX: + def __init__(self, input_agent, brain_agent, trust_agent): + print("\n" + "="*40) + print("๐Ÿ•ต๏ธโ€โ™‚๏ธ UX AGENT: SECRETS AUDIT") + pk = os.environ.get("PRIVATE_KEY") + rpc = os.environ.get("PURECHAIN_RPC_URL") + + print(f"๐Ÿ”‘ PRIVATE_KEY : {'โœ… LOADED' if pk else 'โŒ MISSING'}") + print(f"๐ŸŒ RPC_URL : {rpc if rpc else 'โŒ MISSING'}") + print(f"๐Ÿง  GEMINI_KEY : {'โœ… LOADED' if os.environ.get('GOOGLE_API_KEY') else 'โŒ MISSING'}") + print(f"โ˜๏ธ HF_TOKEN : {'โœ… LOADED' if os.environ.get('HF_TOKEN') else 'โŒ MISSING'}") + print(f"๐Ÿ›ก๏ธ REVIEW_KEY : {'โœ… LOADED' if (os.environ.get('PURE_REVIEW_KEY') or os.environ.get('PURE_ADMIN_KEY') or os.environ.get('ADMIN_PASSCODE')) else 'โŒ MISSING - review/admin mutations disabled'}") + print("="*40 + "\n") + + self.input = input_agent + self.brain = brain_agent + self.trust = trust_agent + self.TONES = ["Neutral / Conversational", "Casual / Slang", "Formal / Professional", "Proverb / Idiom"] + self.PENDING_FILE = "/app/pending_approvals.csv" + self.last_audio_path = None + self.last_pending_count = 0 + + # ๐ŸŸข NEW: Matchmaking & Live Room Memory + self.waiting_pool = [] # List of operators looking for a match + self.active_matches = {} # Maps Operator ID -> Room Code + self.live_rooms = {} # Stores the actual chat logs per room + + self.alert_sound = None + + print("๐ŸŽจ Agent UX Online: PhD Research Hub Ready.") + self.sync_pending_queue(direction="down") + + def get_quota_status(self): + if hasattr(self.brain, 'check_quota'): return self.brain.check_quota() + if hasattr(self.brain.gemini_manager, 'get_status_string'): return self.brain.gemini_manager.get_status_string() + return "Active" + + def _resolve_ai_model_label(self): + manager = getattr(getattr(self, "brain", None), "gemini_manager", None) + model = getattr(manager, "model_flash", None) or getattr(manager, "last_used_model", None) + if model: + return str(model) + if os.environ.get("QWEN_MODEL_NAME"): + return os.environ.get("QWEN_MODEL_NAME") + if os.environ.get("GROQ_API_KEY"): + return "llama-3.3-70b-versatile" + return "Dataset/Persona/Fallback" + + def _resolve_asr_model_label(self): + model_name = getattr(getattr(self, "input", None), "model_name", None) + return f"Whisper {model_name}" if model_name else "Whisper tiny" + + def get_blockchain_health(self): + try: + if hasattr(self.trust, 'w3') and self.trust.w3 and self.trust.w3.is_connected(): + return "
๐ŸŸข PureChain Network: ONLINE & SYNCED
" + except Exception: + pass + return "
๐Ÿ”ด PureChain Network: OFFLINE / DISCONNECTED
" + + def check_background_status(self): + tasks = self.trust.active_tasks + current_time = datetime.now().strftime('%H:%M:%S') + if tasks > 0: + return f"๐Ÿ”„ Processing {tasks} background task(s)... | {current_time}" + return f"โœ… System Active (Ready) | {current_time}" + + def _review_key(self): + return (os.environ.get("PURE_REVIEW_KEY") or os.environ.get("PURE_ADMIN_KEY") or os.environ.get("ADMIN_PASSCODE") or "").strip() + + def _review_scope(self, review_key): + provided = str(review_key or "").strip() + if not provided: + return None + for env_name in ["PURE_REVIEW_KEY", "PURE_ADMIN_KEY", "ADMIN_PASSCODE"]: + expected = os.environ.get(env_name, "").strip() + if expected and hmac.compare_digest(provided, expected): + return {"kind": "full", "label": "Full admin"} + scoped = [ + ("PURE_ADMIN_KEY_CH", "Chinese pending reviewer", ["chinese"], ["mandarin", "cantonese", "hakka", "gan", "jin", "wu", "yue", "min", "xiang", "gan chinese", "jin chinese", "mandarin chinese", "yue chinese", "hakka chinese", "wu chinese", "xiang chinese", "min nan chinese", "min dong chinese", "min bei chinese", "standard mandarin", "beijing dialect", "taiwanese mandarin", "singaporean mandarin", "guangzhou cantonese", "hong kong cantonese", "macau cantonese", "nanchang", "ji'an", "jian", "jian'ou", "yichun", "zhangjiakou-hohhot", "lรผliang", "luliang", "bingzhou", "fuzhou", "hainanese", "hokkien", "teochew", "hailu", "meixian", "sixian", "shanghainese", "suzhounese", "wenzhounese", "loushao", "chenxรผ", "chenxu", "changyi"]), + ("PURE_ADMIN_KEY_KO", "Korean pending reviewer", ["korean"], ["satoori", "jeju", "gyeongsang", "jeolla", "chungcheong", "gangwon", "hamgyong", "pyongan", "hwanghae"]), + ] + for env_name, label, language_terms, dialect_terms in scoped: + expected = os.environ.get(env_name, "").strip() + if expected and hmac.compare_digest(provided, expected): + return { + "kind": "scoped", + "label": label, + "language_terms": language_terms, + "dialect_terms": dialect_terms, + } + return None + + def _is_review_authorized(self, review_key): + return self._review_scope(review_key) is not None + + def _is_full_admin_authorized(self, review_key): + scope = self._review_scope(review_key) + return bool(scope and scope.get("kind") == "full") + + def _scope_allows_language_dialect(self, scope, language="", dialect="", *extra_texts): + if not scope: + return False + if scope.get("kind") == "full": + return True + language_text = str(language or "").lower() + dialect_text = str(dialect or "").lower() + extra_text = " ".join(str(value or "").lower() for value in extra_texts) + combined = f"{language_text} {dialect_text} {extra_text}" + if any(self._scope_term_matches(combined, term) for term in scope.get("language_terms", [])): + return True + if any(self._scope_term_matches(combined, term) for term in scope.get("dialect_terms", [])): + return True + return False + + def _scope_term_matches(self, text, term): + text = str(text or "").lower() + term = str(term or "").lower() + if not term: + return False + if len(term) <= 3: + import re + return re.search(r"(? {final_list}") + print("="*40 + "\n") + + return json.dumps(final_list) + + except Exception as e: + print(f"๐Ÿšจ CRITICAL API ERROR: {e}") + return json.dumps(["American English", "British English", "+ Add New Dialect"]) + + def api_get_language_hierarchy(self): + print("\n" + "="*40) + print("๐Ÿ“ก REACT API WAKEUP: Requesting Language Hierarchy...") + + hierarchy = {} + ignore_list = ["minted_history", "system_feedback", "pending_approvals", "train", "dataset_export", "rejected_graveyard", "eeqs_events"] + + try: + dataset_dir = getattr(self.brain.config, 'DATASET_DIR', "/app/IEDID") + print(f"๐Ÿ“‚ Scanning directory for hierarchy: {dataset_dir}") + + if os.path.exists(dataset_dir): + files = glob.glob(os.path.join(dataset_dir, "**", "*.csv"), recursive=True) + for f in files: + name = os.path.basename(f).replace(".csv", "") + if name in ignore_list: + continue + + parent_dir = os.path.dirname(f) + grandparent_dir = os.path.dirname(parent_dir) + if os.path.basename(parent_dir) == "data": + language = os.path.basename(grandparent_dir) + else: + language = os.path.basename(parent_dir) + + if language == os.path.basename(dataset_dir): + language = "Other" + + if language not in hierarchy: + hierarchy[language] = set() + hierarchy[language].add(name) + else: + print(f"โš ๏ธ Directory {dataset_dir} does not exist!") + + final_hierarchy = {} + for lang, dialects in hierarchy.items(): + final_hierarchy[lang] = sorted(list(dialects)) + ["+ Add New Dialect"] + + if not final_hierarchy: + final_hierarchy = {"English": ["American English", "British English", "+ Add New Dialect"]} + + print(f"โœ… SUCCESS: Sending Hierarchy to React") + print("="*40 + "\n") + + return json.dumps(final_hierarchy) + + except Exception as e: + print(f"๐Ÿšจ CRITICAL API ERROR: {e}") + return json.dumps({"English": ["American English", "British English", "+ Add New Dialect"]}) + + def api_generate_mission(self, topic): + topic_str = str(topic).strip("['\"]") + if hasattr(self.brain, 'generate_conversation_starter'): + return self.brain.generate_conversation_starter(topic_str) + return json.dumps({"text": f"Let's talk about {topic_str}."}) + + def api_transcribe(self, audio_path, dialect): + return self.api_transcribe_with_model(audio_path, dialect, "auto", "on") + + @zero_gpu_optional(duration=60) + def api_transcribe_with_model(self, audio_path, dialect, speech_model="auto", audio_sanitation="on"): + if not audio_path: return "" + try: + if hasattr(self.input, 'transcribe'): + asr_code, source_language, source_dialect = resolve_asr_language_code(dialect) + speech_model_choice = str(speech_model or "auto").strip() or "auto" + sanitation_choice = str(audio_sanitation or "on").strip().lower() or "on" + print(f"๐ŸŽง ASR hint resolved: language={source_language or 'auto'} dialect={source_dialect or 'auto'} code={asr_code or 'auto'} speech_model={speech_model_choice} clean_audio={sanitation_choice}") + res = self.input.transcribe( + audio_path, + language=asr_code, + model_choice=speech_model_choice, + dialect_hint=f"{source_language or ''} {source_dialect or ''} {dialect or ''}", + sanitize_audio=sanitation_choice + ) + return res[0]['text'] if isinstance(res, list) else str(res) + except Exception as e: + return f"Transcription error: {str(e)}" + return "" + + def api_clarify(self, text, dialect): + try: + if hasattr(self.brain, 'analyze_dialect_single'): + res = self.brain.analyze_dialect_single(text, dialect) + clarification = res.get("clarification", text) + return json.dumps({"clarification": clarification}) + except: pass + return json.dumps({"clarification": text}) + + def _ai_model_hint(self, ai_model): + choice = str(ai_model or "auto").strip().lower() + hints = { + "auto": "Use the system's smart default model for this language and task.", + "llama": "Prefer the Llama/Groq route when available.", + "qwen": "Prefer the Qwen route when available, especially for multilingual and non-Latin-script handling.", + "nemotron": "Prefer the free OpenRouter Nemotron route when available, especially for reasoning and ambiguity handling.", + "gpt-oss": "Prefer the free OpenRouter GPT-OSS route for general multilingual text work.", + "lfm": "Prefer the free OpenRouter LFM tiny route when speed is more important than depth.", + "openrouter-free": "Prefer OpenRouter's free auto route as a cost-free fallback.", + "deepseek": "Prefer the paid DeepSeek route when configured, especially for careful reasoning and ambiguity handling.", + "gemini": "Prefer the Gemini route when available.", + } + return hints.get(choice, hints["auto"]) + + def api_clarify_with_model(self, text, dialect, ai_model="auto"): + if not text: + return json.dumps({"clarification": ""}) + if str(ai_model or "auto").strip().lower() == "auto": + return self.api_clarify(text, dialect) + try: + if hasattr(self.brain, "_safe_generate"): + prompt = f""" + {self._ai_model_hint(ai_model)} + Explain the meaning of this utterance for PureHumCom data review. + Dialect/language: {dialect} + Utterance: "{text}" + Return only concise JSON with a clarification field. + """ + raw = self.brain._safe_generate(prompt) + cleaned = self._clean_peer_translation(raw) + try: + parsed = json.loads(cleaned) + clarification = parsed.get("clarification") or parsed.get("text") or parsed.get("Meaning") or cleaned + except Exception: + clarification = cleaned + return json.dumps({"clarification": clarification or text}) + except Exception as e: + print(f"Selector-aware clarify Error: {e}") + return self.api_clarify(text, dialect) + + def _target_script_rule(self, dialect): + d = (dialect or "").lower() + rules = [ + (("korean", "seoul", "satoori", "jeju", "gyeongsang", "chungcheong", "jeolla", "busan"), "Hangul", r"[\uac00-\ud7af\u1100-\u11ff\u3130-\u318f]", "Write natural Korean Hangul syllables only. Do not use romanization, Chinese characters, Japanese kana, or punctuation-only placeholders."), + (("arabic", "urdu", "uyghur", "persian", "farsi", "dari", "pashto", "shahmukhi"), "Arabic", r"[\u0600-\u06ff]", "Use Arabic-script characters appropriate for the target language or dialect."), + (("greek", "cretan"), "Greek", r"[\u0370-\u03ff]", "Use Greek script characters."), + (("chinese", "mandarin", "cantonese", "yue", "wu ", "xiang"), "Han", r"[\u4e00-\u9fff]", "Use Chinese Han characters where natural for the target variety."), + (("japanese", "kansai"), "Japanese", r"[\u3040-\u30ff\u4e00-\u9fff]", "Use Japanese kana/kanji, not romanization."), + (("thai",), "Thai", r"[\u0e00-\u0e7f]", "Use Thai script."), + (("russian", "ukrainian", "bulgarian", "serbian", "cyrillic"), "Cyrillic", r"[\u0400-\u04ff]", "Use Cyrillic script."), + (("hindi", "marathi", "nepali", "sanskrit"), "Devanagari", r"[\u0900-\u097f]", "Use Devanagari script."), + (("bengali", "bangla"), "Bengali", r"[\u0980-\u09ff]", "Use Bengali script."), + (("tamil",), "Tamil", r"[\u0b80-\u0bff]", "Use Tamil script."), + (("telugu",), "Telugu", r"[\u0c00-\u0c7f]", "Use Telugu script."), + ] + for tokens, name, pattern, instruction in rules: + if any(token in d for token in tokens): + return {"name": name, "pattern": pattern, "instruction": instruction} + return None + + def _clean_peer_translation(self, response): + raw_text = getattr(response, "text", response) + cleaned = str(raw_text or "").replace("```json", "").replace("```", "").strip() + try: + parsed = json.loads(cleaned) + if isinstance(parsed, dict): + cleaned = parsed.get("translation") or parsed.get("text") or parsed.get("translated_text") or cleaned + except Exception: + pass + for prefix in ("Translation:", "Translated text:", "Output:"): + if cleaned.lower().startswith(prefix.lower()): + cleaned = cleaned[len(prefix):].strip() + return cleaned.strip().strip('"').strip("'").strip() + + def _translation_has_required_script(self, translated, target_dialect): + if not translated or re.fullmatch(r"[\s\W_]+", translated, flags=re.UNICODE): + return False + rule = self._target_script_rule(target_dialect) + if not rule: + return True + return bool(re.search(rule["pattern"], translated)) + + def _fallback_script_translation(self, text, target_dialect): + rule = self._target_script_rule(target_dialect) + if not rule: + return "" + + d = (target_dialect or "").lower() + lower_text = str(text or "").lower() + + if rule["name"] == "Hangul": + if "echo" in lower_text or "ai mock peer" in lower_text: + if "gyeongsang" in d or "busan" in d: + return "์•ˆ๋…•ํ•˜์ด์†Œ! ๋‚˜๋Š” ์—์ฝ”๋ผ์˜ˆ. ๋‹ˆ AI ๋Œ€ํ™” ์ƒ๋Œ€๋ผ์˜ˆ. ๊ฒฝ์ƒ๋„ ์‚ฌํˆฌ๋ฆฌ๋กœ ์–˜๊ธฐํ• ๋ผ๋ผ์˜ˆ. ๊ฐ™์ด ์–˜๊ธฐํ•ด๋ณด์ž…์‹œ๋”!" + if "jeju" in d: + return "์•ˆ๋…•ํ—ˆ์šฐ๊ฝˆ! ๋‚˜๋Š” ์—์ฝ”์šฐ๋‹ค. ๋„ค AI ๋Œ€ํ™” ์ƒ๋Œ€์šฐ๋‹ค. ์ œ์ฃผ ์‚ฌํˆฌ๋ฆฌ๋กœ ๋งํ•ด๋ณด์ฟ ๋‹ค. ๊ฐ™์ด ์ด์•ผ๊ธฐํ•ด๋ด…์„œ!" + if "chungcheong" in d: + return "์•ˆ๋…•ํ•˜์„ธ์œ ! ๋‚˜๋Š” ์—์ฝ”์—ฌ์œ . ๋„ค AI ๋Œ€ํ™” ์ƒ๋Œ€์—ฌ์œ . ์ถฉ์ฒญ๋„ ์‚ฌํˆฌ๋ฆฌ๋กœ ์–˜๊ธฐํ• ๊ฒŒ์œ . ๊ฐ™์ด ์–˜๊ธฐํ•ด๋ด์œ !" + if "jeolla" in d: + return "์•ˆ๋…•ํ—ˆ์š”! ๋‚˜๋Š” ์—์ฝ”์—ฌ๋ผ. ๋„ค AI ๋Œ€ํ™” ์ƒ๋Œ€์—ฌ๋ผ. ์ „๋ผ๋„ ์‚ฌํˆฌ๋ฆฌ๋กœ ๋งํ• ๋ž‘๊ป˜ ๊ฐ™์ด ์–˜๊ธฐํ•ด๋ณด์ž์ž‰!" + if "seoul" in d: + return "์•ˆ๋…•! ๋‚˜๋Š” ์—์ฝ”์•ผ. ๋„ค AI ๋ชจ์˜ ๋Œ€ํ™” ์ƒ๋Œ€์•ผ. ์„œ์šธ๋ง๋กœ ์ด์•ผ๊ธฐํ• ๊ฒŒ. ๊ฐ™์ด ์–˜๊ธฐํ•˜์ž!" + return "์•ˆ๋…•ํ•˜์„ธ์š”! ์ €๋Š” ์—์ฝ”์˜ˆ์š”. ๋‹น์‹ ์˜ AI ๋ชจ์˜ ๋Œ€ํ™” ์ƒ๋Œ€์ž…๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด๋กœ ์ด์•ผ๊ธฐํ• ๊ฒŒ์š”. ํ•จ๊ป˜ ๋Œ€ํ™”ํ•ด์š”!" + + common_phrases = [ + (("no wahala", "no problem", "it's okay", "it is okay"), "๊ดœ์ฐฎ์•„์š”."), + (("i dey alright", "i am alright", "i'm alright", "i am fine"), "์ €๋Š” ๊ดœ์ฐฎ์•„์š”."), + (("you still dey", "are you still there", "you still there"), "์•„์ง ๊ฑฐ๊ธฐ ์žˆ์–ด์š”?"), + (("sleep", "slept"), "๋ฒŒ์จ ์žค์–ด์š”?"), + (("what happened", "wetin dey happen"), "๋ฌด์Šจ ์ผ์ด์—์š”?"), + ] + for needles, phrase in common_phrases: + if any(needle in lower_text for needle in needles): + return phrase + return "๋‹ค์‹œ ํ•œ ๋ฒˆ ๋งํ•ด ์ฃผ์„ธ์š”." + + fallback_by_script = { + "Arabic": "ู…ู† ูุถู„ูƒ ุฃุนุฏ ุฅุฑุณุงู„ ุงู„ุฑุณุงู„ุฉ.", + "Greek": "ฮ ฮฑฯฮฑฮบฮฑฮปฯŽ ฯƒฯ„ฮตฮฏฮปฯ„ฮต ฮพฮฑฮฝฮฌ ฯ„ฮฟ ฮผฮฎฮฝฯ…ฮผฮฑ.", + "Han": "่ฏทๅ†่ฏดไธ€้ใ€‚", + "Japanese": "ใ‚‚ใ†ไธ€ๅบฆ่จ€ใฃใฆใใ ใ•ใ„ใ€‚", + "Thai": "เธเธฃเธธเธ“เธฒเธžเธนเธ”เธญเธตเธเธ„เธฃเธฑเน‰เธ‡", + "Cyrillic": "ะŸะพะฒั‚ะพั€ะธั‚ะต, ะฟะพะถะฐะปัƒะนัั‚ะฐ.", + "Devanagari": "เค•เฅƒเคชเคฏเคพ เคซเคฟเคฐ เคธเฅ‡ เค•เคนเฅ‡เค‚เฅค", + "Bengali": "เฆ…เฆจเงเฆ—เงเฆฐเฆน เฆ•เฆฐเง‡ เฆ†เฆฌเฆพเฆฐ เฆฌเฆฒเงเฆจเฅค", + "Tamil": "เฎฎเฏ€เฎฃเฏเฎŸเฏเฎฎเฏ เฎšเฏŠเฎฒเฏเฎฒเฏเฎ™เฏเฎ•เฎณเฏ.", + "Telugu": "เฐฆเฐฏเฐšเฑ‡เฐธเฐฟ เฐฎเฐณเฑเฐฒเฑ€ เฐšเฑ†เฐชเฑเฐชเฐ‚เฐกเฐฟ.", + } + return fallback_by_script.get(rule["name"], "") + + def _request_peer_translation(self, prompt): + if hasattr(self.brain, '_safe_generate'): + try: + return self.brain._safe_generate(prompt) + except Exception as e: + print(f"Peer Translation safe-generate Error: {e}") + + manager = getattr(self.brain, "gemini_manager", None) + client = getattr(manager, "client", None) + if client and hasattr(client, "models"): + return client.models.generate_content(model='gemini-2.0-flash', contents=prompt) + if manager and hasattr(manager, "generate_fast") and not inspect.iscoroutinefunction(manager.generate_fast): + try: + return manager.generate_fast(prompt) + except Exception as e: + print(f"Peer Translation manager Error: {e}") + return None + + def api_translate_peer(self, text, source_dialect, target_dialect, ai_model="auto"): + """Translates an utterance directly from one dialect to another.""" + if not text: return "" + script_rule = self._target_script_rule(target_dialect) + script_instruction = script_rule["instruction"] if script_rule else "Use the target language or dialect's normal writing system. For Igbo, keep proper Igbo letters and tone/dot marks such as แป‹, แปฅ, แป, แน…, แบน, รก, and ร  where natural." + variety_instruction = "\n".join(filter(None, [ + nigerian_variety_instruction(source_dialect, target_dialect), + hausa_variety_instruction(source_dialect, target_dialect), + ])) + + prompt = f""" + MODEL ROUTING PREFERENCE: {self._ai_model_hint(ai_model)} + You are a careful translation engine for PureHumCom. + Translate the following utterance from {source_dialect} to {target_dialect}. + Utterance: "{text}" + + CRITICAL INSTRUCTIONS: + 1. Output ONLY the translated text. No conversational filler. + 2. Preserve the cultural pragmatics and emotional tone. + 3. Do not explain the translation, just provide the direct equivalent in {target_dialect}. + 4. SCRIPT FIDELITY: {script_instruction} + 5. LANGUAGE CONSISTENCY: Once a language or dialect is established, strictly maintain translations in that dialect. Do not randomly switch to another language mid-conversation. + 6. Never answer with punctuation-only text or romanization when a native script is required. + 7. {variety_instruction} + """ + try: + translated = self._clean_peer_translation(self._request_peer_translation(prompt)) + boundary_reason = nigerian_variety_retry_reason(translated, target_dialect) + if self._translation_has_required_script(translated, target_dialect) and not boundary_reason: + return translated + + if boundary_reason: + retry_prompt = nigerian_variety_retry_prompt( + text, source_dialect, target_dialect, translated, boundary_reason + ) + retry = self._clean_peer_translation(self._request_peer_translation(retry_prompt)) + if self._translation_has_required_script(retry, target_dialect) and not nigerian_variety_retry_reason(retry, target_dialect): + return retry + + if script_rule: + retry_prompt = f""" + Your previous output failed the script requirement for {target_dialect}. + Previous invalid output: "{translated}" + + Rewrite this utterance from {source_dialect} to {target_dialect}. + Utterance: "{text}" + + Output ONLY the corrected translation. + Required script: {script_rule["instruction"]} + """ + retry = self._clean_peer_translation(self._request_peer_translation(retry_prompt)) + if self._translation_has_required_script(retry, target_dialect): + return retry + + fallback = self._fallback_script_translation(text, target_dialect) + if fallback: + return fallback + + return translated or text + except Exception as e: + print(f"Peer Translation Error: {e}") + return self._fallback_script_translation(text, target_dialect) or text + + # ========================================== + # DIALECT RELAY (MATCHMAKING & CHAT) + # ========================================== + def api_join_queue(self, operator_id, dialect, target_partner_id=""): + import uuid, json, time + # Clean up any old ghost matches + if operator_id in self.active_matches: + del self.active_matches[operator_id] + + # 1. Check if a specific target partner is requested and available + partner = None + if target_partner_id: + for p in self.waiting_pool: + if p['operator_id'] == target_partner_id: + partner = p + break + + # If targeting someone and they exist, or just picking someone (if we wanted auto) + if partner: + # 2. Match found! Create a room. + self.waiting_pool.remove(partner) + room_id = f"FREQ-{uuid.uuid4().hex[:6].upper()}" + + self.active_matches[operator_id] = {"room_id": room_id, "partner_dialect": partner['dialect']} + self.active_matches[partner['operator_id']] = {"room_id": room_id, "partner_dialect": dialect} + self.live_rooms[room_id] = [] + + return json.dumps({"status": "matched", "room_id": room_id, "partner_dialect": partner['dialect']}) + else: + # 3. Add self to pool to wait. + self.waiting_pool = [p for p in self.waiting_pool if p['operator_id'] != operator_id] # Prevent duplicates + self.waiting_pool.append({"operator_id": operator_id, "dialect": dialect, "time": time.time()}) + return json.dumps({"status": "waiting"}) + + def api_get_lobby(self): + import json + # Return only dialect and masked operator ID for privacy/display + lobby_data = [{"id": p["operator_id"], "dialect": p["dialect"]} for p in self.waiting_pool] + return json.dumps(lobby_data) + + def api_check_match(self, operator_id): + import json + if operator_id in self.active_matches: + match = self.active_matches[operator_id] + # Consume the match so it cannot be re-used on a second poll (prevents ghost room reconnection) + del self.active_matches[operator_id] + return json.dumps({"status": "matched", "room_id": match["room_id"], "partner_dialect": match["partner_dialect"]}) + return json.dumps({"status": "waiting"}) + + def api_leave_queue(self, operator_id): + import json + self.waiting_pool = [p for p in self.waiting_pool if p['operator_id'] != operator_id] + if operator_id in self.active_matches: + del self.active_matches[operator_id] + return json.dumps({"status": "left"}) + + def api_remote_eval_and_send(self, room_code, sender_id, text, source_dialect, target_dialect, meaning_to_send=""): + import json, os, re, uuid, threading + import pandas as pd + + if not text: return json.dumps({"status": "error", "msg": "Empty text"}) + + standard_meaning = meaning_to_send.strip() if meaning_to_send and meaning_to_send.strip() else text + + # 1. Forward Lookup (Understand Source - used for dataset clarity if meaning wasn't provided) + if not meaning_to_send or not meaning_to_send.strip(): + eval_result = self.brain.search_local_dataset(text) + if not eval_result: eval_result = self.brain.search_personas(text) + if eval_result: + standard_meaning = eval_result.get("clarification", text) + + # ๐ŸŸข THE DATA COLLECTION HOOK (Silent Background Saving) + clarification_to_save = standard_meaning + try: + threading.Thread( + target=self.check_and_submit_logic, + args=(text, source_dialect, "", clarification_to_save, "Conversational", "Relay Peer-to-Peer Chat", "Automated Relay Extraction", "Game: Relay Pair", "AI Relay Bouncer", sender_id, None, False), + daemon=True + ).start() + except Exception as save_err: + print(f"Data Hook Error: {save_err}") + + target_translation = standard_meaning + target_label = target_dialect or "Standard English" + if target_dialect and target_dialect != "Standard English": + try: + target_translation = self.api_translate_peer(standard_meaning, "Standard English", target_dialect) + except Exception as translate_err: + print(f"Relay target translation failed: {translate_err}") + + # 4. Route to Room + if room_code not in self.live_rooms: self.live_rooms[room_code] = [] + msg = {"sender": sender_id, "original": text, "translation": target_translation, "dialect": source_dialect, "target_dialect": target_label, "standard_meaning": standard_meaning, "id": str(uuid.uuid4())[:8]} + self.live_rooms[room_code].append(msg) + return json.dumps({"status": "success", "message": msg}) + + def api_remote_poll(self, room_code, last_index): + import json + try: + idx = int(float(last_index or 0)) + except Exception: + idx = 0 + return json.dumps(self.live_rooms.get(room_code, [])[idx:]) + + def api_get_user_xp(self, operator_id, dialect): + import json, os + try: + w3 = self.trust.w3 + contract_addr = os.environ.get("PURECHAIN_CONTRACT_ADDRESS", getattr(self.trust.config, 'PURECHAIN_CONTRACT_ADDRESS', None)) + if not contract_addr or not w3: return json.dumps({"xp": 0}) + + raw_operator = str(operator_id).strip().lower() + try: + final_operator_id = w3.to_checksum_address(raw_operator) + except: + return json.dumps({"xp": 0}) + + contract = w3.eth.contract(address=contract_addr, abi=self.trust.config.CONTRACT_ABI) + xp = contract.functions.getXP(final_operator_id, dialect).call() + return json.dumps({"xp": xp}) + except Exception as e: + print(f"XP Fetch Error: {e}") + return json.dumps({"xp": 0}) + + def api_get_oracle_task(self, operator_id, dialect, review_key=""): + import json, pandas as pd, os + scope = self._review_scope(review_key) + if not scope: + return self._review_unauthorized_json() + if not self._scope_allows_language_dialect(scope, "", dialect): + return self._review_unauthorized_json() + if not os.path.exists(self.PENDING_FILE): return json.dumps({"status": "empty"}) + try: + df = pd.read_csv(self.PENDING_FILE) + df = self._infer_pending_languages(df) + if "Dialect" not in df.columns or "Chain_ID" not in df.columns: return json.dumps({"status": "empty"}) + target_df = df[(df["Dialect"] == dialect) & (df["Chain_ID"].notna()) & (df["Chain_ID"] != "")] + target_df = self._filter_dataframe_by_review_scope(target_df, scope) + for idx, row in target_df.iterrows(): + approvers = str(row.get("Approvers", "")).split(",") + if operator_id not in approvers and row.get("User", "") != operator_id: + return json.dumps({ + "status": "success", + "row_id": int(idx), + "chain_id": str(row["Chain_ID"]), + "phrase": row.get("Utterance", ""), + "clarification": row.get("Clarification", ""), + "audio": row.get("Audio", "") + }) + return json.dumps({"status": "empty"}) + except Exception as e: + print(f"Get Oracle Task Error: {e}") + return json.dumps({"status": "empty"}) + + def api_submit_oracle_review(self, row_id, chain_id, operator_id, dialect, is_approve, reason="Oracle Peer Review Failed", review_key=""): + import json, pandas as pd, os, threading + if not self._is_review_authorized(review_key) and self._is_review_authorized(reason): + review_key, reason = reason, "Oracle Peer Review Failed" + scope = self._review_scope(review_key) + if not scope: + return self._review_unauthorized_json() + try: + df = pd.read_csv(self.PENDING_FILE) + df = self._infer_pending_languages(df) + if int(row_id) not in df.index: return json.dumps({"status": "error"}) + if not self._pending_row_allowed_by_scope(df.loc[int(row_id)], scope): + return self._review_unauthorized_json() + + approvers = str(df.at[int(row_id), "Approvers"]).split(",") + approvers.append(operator_id) + df.at[int(row_id), "Approvers"] = ",".join(filter(None, approvers)) + df.to_csv(self.PENDING_FILE, index=False) + self.sync_pending_queue(direction="up") + + def run_chain_verify(): + try: + w3 = self.trust.w3 + contract_addr = os.environ.get("PURECHAIN_CONTRACT_ADDRESS", getattr(self.trust.config, 'PURECHAIN_CONTRACT_ADDRESS', None)) + contract = w3.eth.contract(address=contract_addr, abi=self.trust.config.CONTRACT_ABI) + final_operator = w3.to_checksum_address(operator_id) + nonce = w3.eth.get_transaction_count(self.trust.account.address) + + approve_bool = str(is_approve).lower() == "true" + if approve_bool: + tx = contract.functions.verifyEntry(int(chain_id), final_operator).build_transaction({ + 'chainId': getattr(self.trust.config, 'PURECHAIN_ID', 900520900520), + 'gas': 2000000, 'gasPrice': 0, 'nonce': nonce + }) + else: + tx = contract.functions.rejectEntry(int(chain_id), final_operator, reason).build_transaction({ + 'chainId': getattr(self.trust.config, 'PURECHAIN_ID', 900520900520), + 'gas': 2000000, 'gasPrice': 0, 'nonce': nonce + }) + + signed_tx = w3.eth.account.sign_transaction(tx, self.trust.config.PRIVATE_KEY) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + + if approve_bool: + events = contract.events.EntryVerified().process_receipt(receipt) + if events: + print("๐ŸŽ‰ Oracle consensus reached (2 approvals). Moving to IEDID!") + row = df.loc[int(row_id)] + self.trust.update_dataset_csv( + dialect=row["Dialect"], utterance=row["Utterance"], clarification=row["Clarification"], + tone=row["Tone"], context=row.get("Context", ""), syntax="", audio_path=row.get("Audio", ""), + pragmatics=row.get("Pragmatic_Analysis", ""), sourceTag="Game (Verified)", clar_source="User", + userKey=row.get("User", "") + ) + else: + row = df.loc[int(row_id)] + self.trust.add_to_graveyard( + dialect=row.get("Dialect", ""), utterance=row.get("Utterance", ""), clarification=row.get("Clarification", ""), + tone=row.get("Tone", ""), context=row.get("Context", ""), syntax="", audio_path=row.get("Audio", ""), + pragmatics=row.get("Pragmatic_Analysis", ""), sourceTag="Game (Rejected)", clar_source="User", + userKey=row.get("User", ""), reason=reason, rejector=operator_id, chain_id=chain_id + ) + print("๐Ÿ”ฅ Oracle rejected entry. Added to Burn Ward.") + except Exception as e: + print(f"Blockchain verify error: {e}") + + threading.Thread(target=run_chain_verify, daemon=True).start() + return json.dumps({"status": "success"}) + except Exception as e: + print(f"Submit Oracle Error: {e}") + return json.dumps({"status": "error"}) + + def api_get_graveyard_task(self, operator_id, dialect, review_key=""): + import json, pandas as pd, os + scope = self._review_scope(review_key) + if not scope: + return self._review_unauthorized_json() + if not self._scope_allows_language_dialect(scope, "", dialect): + return self._review_unauthorized_json() + graveyard_path = os.path.join(self.trust.config.DATASET_DIR, "..", "rejected_graveyard.csv") + if not os.path.exists(graveyard_path): return json.dumps({"status": "empty"}) + try: + df = pd.read_csv(graveyard_path, encoding='utf-8-sig', on_bad_lines='skip') + if "Dialect" not in df.columns or "Chain_ID" not in df.columns: return json.dumps({"status": "empty"}) + target_df = df[(df["Dialect"] == dialect) & (df["Chain_ID"].notna()) & (df["Chain_ID"] != "")] + for idx, row in target_df.iterrows(): + if str(row.get("User", "")) != operator_id: + return json.dumps({ + "status": "success", + "row_id": int(idx), + "chain_id": str(row["Chain_ID"]), + "phrase": str(row.get("Utterance", "")), + "clarification": str(row.get("Clarification", "")), + "audio": str(row.get("audio_file_name", "")), + "reason": str(row.get("Rejection_Reason", "Unknown")), + "rejector": str(row.get("Rejector", "Unknown")) + }) + return json.dumps({"status": "empty"}) + except Exception as e: + print(f"Get Graveyard Task Error: {e}") + return json.dumps({"status": "empty"}) + + def api_submit_appeal(self, chain_id, operator_id, dialect, review_key=""): + import json, os, threading, pandas as pd + scope = self._review_scope(review_key) + if not scope: + return self._review_unauthorized_json() + if not self._scope_allows_language_dialect(scope, "", dialect): + return self._review_unauthorized_json() + try: + graveyard_path = os.path.join(self.trust.config.DATASET_DIR, "..", "rejected_graveyard.csv") + if os.path.exists(graveyard_path): + try: + df = pd.read_csv(graveyard_path, encoding='utf-8-sig', on_bad_lines='skip') + df['Chain_ID'] = df['Chain_ID'].astype(str) + df = df[df["Chain_ID"] != str(chain_id)] + df.to_csv(graveyard_path, index=False, encoding='utf-8-sig') + except Exception as e: + print(f"Graveyard update error: {e}") + + def run_chain_appeal(): + try: + w3 = self.trust.w3 + contract_addr = os.environ.get("PURECHAIN_CONTRACT_ADDRESS", getattr(self.trust.config, 'PURECHAIN_CONTRACT_ADDRESS', None)) + contract = w3.eth.contract(address=contract_addr, abi=self.trust.config.CONTRACT_ABI) + final_operator = w3.to_checksum_address(operator_id) + nonce = w3.eth.get_transaction_count(self.trust.account.address) + + tx = contract.functions.appealEntry(int(chain_id), final_operator).build_transaction({ + 'chainId': getattr(self.trust.config, 'PURECHAIN_ID', 900520900520), + 'gas': 2000000, 'gasPrice': 0, 'nonce': nonce + }) + + signed_tx = w3.eth.account.sign_transaction(tx, self.trust.config.PRIVATE_KEY) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + w3.eth.wait_for_transaction_receipt(tx_hash) + print(f"โš–๏ธ Appeal filed for Chain ID: {chain_id} by {final_operator}") + except Exception as e: + print(f"Blockchain appeal error: {e}") + + threading.Thread(target=run_chain_appeal, daemon=True).start() + return json.dumps({"status": "success"}) + except Exception as e: + print(f"Submit Appeal Error: {e}") + return json.dumps({"status": "error"}) + + def api_get_room_messages(self, room_code, last_index): + idx = int(last_index) + return json.dumps(self.live_rooms[room_code][idx:]) + # ========================================== + # SOCIOLINGUISTIC PIPELINE + # ========================================== + def automated_pipeline(self, audio_path, language_code, request: gr.Request = None): + client_ip = request.headers.get("x-forwarded-for") or request.client.host if request else "Unknown_IP" + source_tag = f"Lab_Admin_{client_ip}" + + print(f"๐Ÿš€ PIPELINE TRIGGERED by {source_tag}") + headers = ["Source", "Speaker", "Utterance", "Dialect", "Clarification", "Tone", "Context", "Pragmatic Analysis"] + empty_df = pd.DataFrame(columns=headers) + + if not audio_path: + yield empty_df, "Waiting for input...", self.get_quota_status(), "", None, "Neutral / Conversational", "", "" + return + + print("\n" + "="*40) + print(f"๐Ÿš€ PIPELINE TRIGGERED for {language_code}!") + print(f"Audio Path: {audio_path}") + + self.last_audio_path = audio_path + status_log = "๐ŸŽง Transcribing Audio...\n" + + try: + print("โณ STEP 1: Calling Whisper Transcription...") + if hasattr(self.input, 'transcribe'): + asr_code, _, _ = resolve_asr_language_code(language_code) + transcription_result = self.input.transcribe(audio_path, language=asr_code) + print(f"โœ… Whisper Result: {transcription_result}") + + if isinstance(transcription_result, list) and len(transcription_result) > 0: + transcribed_text = transcription_result[0].get('text', str(transcription_result)) + else: + transcribed_text = str(transcription_result) + else: + transcribed_text = "Audio Received." + + status_log += f"๐Ÿ—ฃ๏ธ Heard: '{transcribed_text}'\n\n" + + print(f"โณ STEP 2: Checking Local Dataset...") + status_log += "๐Ÿ—„๏ธ Checking Local Dataset (Fast Match)...\n" + final_result = self.brain.search_local_dataset(transcribed_text) + + if not final_result: + print("โณ STEP 3: Checking Persona...") + status_log += "โŒ No local match. ๐ŸŽญ Checking Persona Context...\n" + final_result = self.brain.search_personas(transcribed_text) + + if not final_result: + print("โณ STEP 4: Sending to Gemini API...") + status_log += "โŒ No persona hit. ๐Ÿง  Generating AI interpretation...\n" + if hasattr(self.brain, 'analyze_dialect_single'): + final_result = self.brain.analyze_dialect_single(transcribed_text, language_code) + print(f"โœ… Gemini Result: {final_result}") + else: + raise Exception("analyze_dialect_single missing from brain_agent.") + + status_log += f"\nโœ… Analysis Complete via {final_result.get('Source', 'Unknown')}." + + def safe_str(val, default=""): + return default if pd.isna(val) or val is None else str(val) + + df_data = [[ + safe_str(final_result.get("Source", "Unknown")), + source_tag, + safe_str(transcribed_text), + safe_str(final_result.get("dialect", "")), + safe_str(final_result.get("clarification", "")), + safe_str(final_result.get("tone", "")), + safe_str(final_result.get("context", "")), + safe_str(final_result.get("pragmatics", "")) + ]] + df = pd.DataFrame(df_data, columns=headers) + + print("โœ… PIPELINE COMPLETED SUCCESSFULLY.") + print("="*40 + "\n") + + yield ( + df, safe_str(status_log), self.get_quota_status(), safe_str(transcribed_text), + safe_str(final_result.get("dialect")), safe_str(final_result.get("clarification")), + safe_str(final_result.get("tone", "Neutral / Conversational")), + safe_str(final_result.get("context")), safe_str(final_result.get("pragmatics")) + ) + return + + except Exception as e: + print("\n๐Ÿšจ CRITICAL PIPELINE ERROR ๐Ÿšจ") + traceback.print_exc() + print("="*40 + "\n") + status_log += f"\nโŒ System Error: {e}\n" + yield empty_df, status_log, self.get_quota_status(), "", None, "Neutral / Conversational", "", "" + return + + # ========================================== + # RESEARCH DATA SUBMISSION + # ========================================== + def check_and_submit_logic( + self, transcribed, dialect, customD, clarification, tone, context, pragmatics, + sourceTag="Web", clar_source="User", userKey="", blob=None, confirm=False, + language="", request: gr.Request = None + ): + print("\n" + "="*40) + print(f"๐Ÿ“ฅ API HIT: /check_and_submit_logic") + print(f" Source: {sourceTag}") + print(f" Text: '{transcribed}'") + print(f" Dialect: {dialect}") + print("="*40) + + clean_key = str(userKey).strip() + if not clean_key.startswith("0x"): + clean_key = "0x" + uuid.uuid4().hex + uuid.uuid4().hex[:8] + + final_user = clean_key + + if sourceTag == "Web" or sourceTag == "": + final_origin = "Gradio Admin UI" + else: + final_origin = sourceTag + + if not transcribed or not clarification: + return "โš ๏ธ Cannot submit empty analysis.", gr.update(visible=False) + + final_d = customD if (dialect == "+ Add New Dialect" and customD) else dialect + if not final_d or final_d == "+ Add New Dialect": + return "โš ๏ธ Select a dialect first.", gr.update(visible=False) + + voice_privacy = self._voice_privacy_metadata(final_origin, pragmatics, context, clar_source) + voice_acoustic_profile = json.dumps({"voice_privacy": voice_privacy}, ensure_ascii=False) + + permanent_audio_path = "" + if voice_privacy.get("raw_audio_uploaded") and blob is not None: + actual_path = None + if isinstance(blob, str): actual_path = blob + elif isinstance(blob, dict) and 'path' in blob: actual_path = blob['path'] + elif hasattr(blob, 'name'): actual_path = blob.name + + if actual_path and os.path.exists(actual_path): + save_dir = os.path.join(self.brain.config.DATASET_DIR, "audio") + os.makedirs(save_dir, exist_ok=True) + unique_name = f"rec_{int(time.time())}_{uuid.uuid4().hex[:6]}.wav" + permanent_audio_path = os.path.join(save_dir, unique_name) + + shutil.copy(actual_path, permanent_audio_path) + print(f"โœ… Audio securely extracted to: {permanent_audio_path}") + else: + print(f"โš ๏ธ Audio skipped! Blob invalid: {blob}") + elif voice_privacy.get("raw_audio_uploaded") and self.last_audio_path: + permanent_audio_path = self.last_audio_path + elif blob is not None or self.last_audio_path: + print("๐Ÿ”’ Voice privacy active: raw audio was not persisted; transcript-only metadata will be stored.") + + is_game_submission = ("Game" in final_origin) + + if not is_game_submission: + success = self.trust.update_dataset_csv( + final_d, transcribed, clarification, tone, context, "", + permanent_audio_path, pragmatics, final_origin, clar_source, final_user, + acoustic_profile=voice_acoustic_profile, language=language + ) + + if success: + payload = { "original": transcribed, "dialect": final_d, "clarification": clarification, "tone": tone, "user": final_user } + threading.Thread(target=self.trust.stamp_on_chain, args=(payload,), daemon=True).start() + + return f"๐Ÿš€ Approved and Minted to {final_d}", gr.update(visible=False) + + else: + new_entry = { + "User": final_user, + "Data_Origin": final_origin, + "Utterance": transcribed, + "Dialect": final_d, + "Clarification": clarification, + "Clarification_Source": clar_source, + "Tone": tone, + "Context": context, + "Pragmatic_Analysis": pragmatics, + "Acoustic_Profile": voice_acoustic_profile, + "Audio": permanent_audio_path, + "Timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "Chain_ID": "", + "Approvers": "", + "Language": language, + "Voice_Privacy_Mode": voice_privacy.get("voice_privacy_mode", "transcript_only"), + "Voice_Audio_Consent": str(bool(voice_privacy.get("voice_audio_consent", False))), + "Raw_Audio_Uploaded": str(bool(voice_privacy.get("raw_audio_uploaded", False))), + } + + # Start a thread to stamp on chain and then save to CSV + def process_game_submission(): + payload = { "original": transcribed, "dialect": final_d, "clarification": clarification, "tone": tone, "user": final_user } + entry_id = self.trust.stamp_on_chain(payload) + if str(entry_id).isdigit(): + new_entry["Chain_ID"] = str(entry_id) + + try: + if os.path.exists(self.PENDING_FILE): + df = pd.read_csv(self.PENDING_FILE) + else: + df = pd.DataFrame(columns=new_entry.keys()) + + df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True) + df.to_csv(self.PENDING_FILE, index=False) + self.sync_pending_queue(direction="up") + + if permanent_audio_path and os.path.exists(permanent_audio_path): + try: + api = HfApi(token=os.environ.get("HF_TOKEN")) + api.upload_file( + path_or_fileobj=permanent_audio_path, + path_in_repo=f"pending_audio/{os.path.basename(permanent_audio_path)}", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message=f"๐ŸŽ™๏ธ Staging pending audio from {final_origin}" + ) + except Exception as e: + print(f"โš ๏ธ Failed to stage audio: {e}") + + except Exception as e: + print(f"Failed to save game submission: {e}") + + threading.Thread(target=process_game_submission, daemon=True).start() + + return "๐Ÿ“ฅ Submitted for Peer Review (XP pending approval)", gr.update(visible=False) + + def force_overwrite_logic(self, *args): + return self.check_and_submit_logic(*args, confirm=True) + + def admin_check_and_submit_logic(self, *args): + review_key = args[-1] if args else "" + if not self._is_full_admin_authorized(review_key): + return self._full_admin_required_message(), gr.update(visible=False) + return self.check_and_submit_logic(*args[:-1]) + + def admin_force_overwrite_logic(self, *args): + review_key = args[-1] if args else "" + if not self._is_full_admin_authorized(review_key): + return self._full_admin_required_message(), gr.update(visible=False) + return self.check_and_submit_logic(*args[:-1], confirm=True) + + # ========================================== + # FEEDBACK & AUDIT HELPERS + # ========================================== + def handle_feedback_submission(self, op_id, text, img_blob): + """Catches secure feedback from React games and logs it with images.""" + feedback_file = "/app/system_feedback.csv" + image_path = "" + + print("\n" + "="*40) + print("๐Ÿ›ก๏ธ SECURE FEEDBACK RECEIVED") + print(f"Operator: {op_id}") + + # 1. Process Image if attached + if img_blob is not None: + actual_path = None + if isinstance(img_blob, str): actual_path = img_blob + elif hasattr(img_blob, 'name'): actual_path = img_blob.name + + if actual_path and os.path.exists(actual_path): + unique_name = f"bug_img_{int(time.time())}.png" + image_path = os.path.join("/app", unique_name) + shutil.copy(actual_path, image_path) + + try: + api = HfApi(token=os.environ.get("HF_TOKEN")) + api.upload_file( + path_or_fileobj=image_path, + path_in_repo=f"feedback_images/{unique_name}", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message="๐Ÿ“ธ New Bug Report Image" + ) + except Exception as e: + print(f"Image upload failed: {e}") + + # 2. Log to CSV + new_row = { + "Timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "Operator_ID": op_id, + "Feedback_Text": text, + "Image_Reference": image_path + } + try: + if os.path.exists(feedback_file): + df = pd.read_csv(feedback_file) + else: + df = pd.DataFrame(columns=new_row.keys()) + df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True) + df.to_csv(feedback_file, index=False) + + try: + api = HfApi(token=os.environ.get("HF_TOKEN")) + api.upload_file( + path_or_fileobj=feedback_file, + path_in_repo="system_feedback.csv", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message="๐Ÿ“ Updated System Feedback Log" + ) + except: pass + + except Exception as e: + print(f"Feedback save error: {e}") + + return "Success" + + def get_feedback_dataframe(self, review_key=""): + if not self._is_full_admin_authorized(review_key): + return self._review_empty_feedback_dataframe() + feedback_file = "/app/system_feedback.csv" + hf_token = os.environ.get("HF_TOKEN") + repo_id = "toecm/PureChain_Dataset" + + if hf_token: + try: + downloaded = hf_hub_download(repo_id=repo_id, filename="system_feedback.csv", repo_type="dataset", token=hf_token) + shutil.copy(downloaded, feedback_file) + except Exception as e: + pass + + if os.path.exists(feedback_file): + try: + df = pd.read_csv(feedback_file) + for col in ["Timestamp", "Operator_ID", "Feedback_Text", "Image_Reference"]: + if col not in df.columns: df[col] = "" + return df.sort_values(by="Timestamp", ascending=False) + except: + pass + + return self._review_empty_feedback_dataframe() + + def _eeqs_local_file(self): + base_dir = "/app" if os.path.isdir("/app") else os.getcwd() + return os.path.join(base_dir, "eeqs_events.csv") + + def _empty_eeqs_dashboard(self): + return pd.DataFrame(columns=[ + "Game", "AI_Model", "ASR_Model", "Source_Language", "Source_Dialect", + "Target_Language", "Target_Dialect", "Interaction_Type", "Event_Count", + "Mean_EEQ", "Last_EEQ", "Last_Seen" + ]) + + def _load_eeqs_events(self): + eeqs_file = self._eeqs_local_file() + hf_token = os.environ.get("HF_TOKEN") + repo_id = "toecm/PureChain_Dataset" + + if hf_token: + try: + downloaded = hf_hub_download( + repo_id=repo_id, + filename="eeqs_events.csv", + repo_type="dataset", + token=hf_token + ) + shutil.copy(downloaded, eeqs_file) + except Exception: + pass + + if os.path.exists(eeqs_file): + try: + return pd.read_csv(eeqs_file) + except Exception: + pass + return pd.DataFrame() + + def handle_eeqs_submission(self, op_id, payload_json): + """Stores user-synced Passive EEQ-s events for the global dashboard.""" + eeqs_file = self._eeqs_local_file() + hf_token = os.environ.get("HF_TOKEN") + repo_id = "toecm/PureChain_Dataset" + + try: + payload = json.loads(payload_json or "{}") + events = payload.get("events", []) + if not isinstance(events, list) or not events: + return "No EEQ-s events received." + + rows = [] + sync_ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + for event in events: + if not isinstance(event, dict): + continue + items = event.get("items") if isinstance(event.get("items"), dict) else {} + row = { + "Sync_Timestamp": sync_ts, + "Timestamp": event.get("timestamp", ""), + "Operator_ID": op_id or "Anonymous", + "App": payload.get("app") or event.get("app", ""), + "Host": payload.get("host") or event.get("host", ""), + "AI_Model": event.get("aiModel") or payload.get("ai_model") or self._resolve_ai_model_label(), + "ASR_Model": event.get("asrModel") or payload.get("asr_model") or self._resolve_asr_model_label(), + "Event_ID": event.get("id", ""), + "Game": event.get("game", ""), + "Interaction_Type": event.get("interaction", ""), + "Source_Language": event.get("sourceLanguage", ""), + "Source_Dialect": event.get("sourceDialect", ""), + "Target_Language": event.get("targetLanguage", ""), + "Target_Dialect": event.get("targetDialect", ""), + "Index": event.get("index", ""), + "Accepted": event.get("accepted", ""), + "Error": event.get("error", ""), + "Regenerated": event.get("regenerated", ""), + "Explained": event.get("explained", ""), + "Played_Audio": event.get("playedAudio", ""), + "Sent": event.get("sent", ""), + "Transcript_Edit_Ratio": event.get("transcriptEditRatio", ""), + "Meaning_Edit_Ratio": event.get("meaningEditRatio", ""), + "Translation_Edit_Ratio": event.get("translationEditRatio", ""), + } + for key, value in items.items(): + row[key] = value + rows.append(row) + + if not rows: + return "No valid EEQ-s events received." + + existing = self._load_eeqs_events() + new_df = pd.DataFrame(rows) + df = pd.concat([existing, new_df], ignore_index=True) + if "Event_ID" in df.columns: + df = df.drop_duplicates(subset=["Event_ID"], keep="last") + + df.to_csv(eeqs_file, index=False) + + if hf_token: + api = HfApi(token=hf_token) + api.upload_file( + path_or_fileobj=eeqs_file, + path_in_repo="eeqs_events.csv", + repo_id=repo_id, + repo_type="dataset", + commit_message="Update Passive EEQ-s dashboard events" + ) + return f"EEQ-s synced: {len(rows)} events saved to global dashboard." + + return f"EEQ-s saved locally on backend: {len(rows)} events. HF_TOKEN is not configured." + except Exception as e: + print(f"EEQ-s save error: {e}") + return f"EEQ-s sync error: {e}" + + def get_eeqs_dashboard_dataframe(self, review_key=""): + if not self._is_full_admin_authorized(review_key): + return self._empty_eeqs_dashboard() + df = self._load_eeqs_events() + if df.empty: + return self._empty_eeqs_dashboard() + + required = [ + "Game", "AI_Model", "ASR_Model", "Source_Language", "Source_Dialect", + "Target_Language", "Target_Dialect", "Interaction_Type", "Index", "Timestamp" + ] + for col in required: + if col not in df.columns: + df[col] = "" + + df["Index"] = pd.to_numeric(df["Index"], errors="coerce") + df = df.dropna(subset=["Index"]) + if df.empty: + return self._empty_eeqs_dashboard() + + group_cols = [ + "Game", "AI_Model", "ASR_Model", "Source_Language", "Source_Dialect", + "Target_Language", "Target_Dialect", "Interaction_Type" + ] + grouped = df.groupby(group_cols, dropna=False).agg( + Event_Count=("Index", "count"), + Mean_EEQ=("Index", "mean"), + Last_EEQ=("Index", "last"), + Last_Seen=("Timestamp", "last") + ).reset_index() + grouped["Mean_EEQ"] = grouped["Mean_EEQ"].round(1) + grouped["Last_EEQ"] = grouped["Last_EEQ"].round(1) + return grouped.sort_values(by=["Event_Count", "Mean_EEQ"], ascending=[False, False]) + + def get_pending_dataframe(self, language_filter="All", dialect_filter="All", review_key=""): + cols = [ + "User", "Data_Origin", "Utterance", "Language", "Dialect", + "Clarification", "Clarification_Source", "Tone", "Audio", "Timestamp", + "App_Source", "Source_Language", "Source_Dialect", "Source_Input_Mode", + "Machine_Transcript_Initial", "User_Transcript_Final", + "Transcript_Edit_Distance", "Machine_Translation_Initial", + "User_Translation_Final", "Translation_Edit_Distance", "ASR_Model", + "AI_Model", "Audio_Sanitation", "Consent_Confirmed", "Queue_ID" + ] + scope = self._review_scope(review_key) + if not scope: + return pd.DataFrame(columns=cols) + if os.path.exists(self.PENDING_FILE): + df = pd.read_csv(self.PENDING_FILE) + for c in cols: + if c not in df.columns: df[c] = "" + + df = self._infer_pending_languages(df) + df = self._filter_dataframe_by_review_scope(df, scope) + + if language_filter and language_filter != "All": + df = df[df["Language"] == language_filter] + if dialect_filter and dialect_filter != "All": + df = df[df["Dialect"] == dialect_filter] + return df[cols] + return pd.DataFrame(columns=cols) + + def sync_pending_queue(self, direction="up"): + hf_token = os.environ.get("HF_TOKEN") + repo_id = "toecm/PureChain_Dataset" + + if not hf_token: + print("โš ๏ธ Skipping Pending Sync: No HF_TOKEN found.") + return + + api = HfApi(token=hf_token) + + if direction == "up": + if os.path.exists(self.PENDING_FILE): + try: + api.upload_file( + path_or_fileobj=self.PENDING_FILE, + path_in_repo="pending_approvals.csv", + repo_id=repo_id, + repo_type="dataset", + commit_message="๐Ÿ”„ Auto-sync: Updated pending approvals queue" + ) + print("โ˜๏ธ Pending queue backed up to PureChain_Dataset.") + except Exception as e: + print(f"โš ๏ธ Failed to upload pending queue: {e}") + + elif direction == "down": + try: + downloaded_path = hf_hub_download( + repo_id=repo_id, + filename="pending_approvals.csv", + repo_type="dataset", + token=hf_token + ) + shutil.copy(downloaded_path, self.PENDING_FILE) + print("โ˜๏ธ Pending queue CSV restored from PureChain_Dataset.") + + df = pd.read_csv(self.PENDING_FILE) + for audio_path in df['Audio'].dropna(): + if audio_path and not os.path.exists(audio_path): + try: + audio_filename = os.path.basename(audio_path) + print(f"โ˜๏ธ Recovering missing audio: {audio_filename}...") + audio_dl = hf_hub_download( + repo_id=repo_id, + filename=f"pending_audio/{audio_filename}", + repo_type="dataset", + token=hf_token + ) + os.makedirs(os.path.dirname(audio_path), exist_ok=True) + shutil.copy(audio_dl, audio_path) + except Exception as dl_err: + print(f"โš ๏ธ Could not recover {audio_filename}: {dl_err}") + + except Exception as e: + print("โ„น๏ธ No remote pending queue found. Starting fresh.") + + def get_pending_label(self): + if os.path.exists(self.PENDING_FILE): + count = len(pd.read_csv(self.PENDING_FILE)) + if count > 0: + return f"๐Ÿ‘ฎ Pending ({count})", count + return "๐Ÿ‘ฎ Pending", 0 + + def monitor_pending_state(self): + label, count = self.get_pending_label() + if count > self.last_pending_count and self.alert_sound: + sound = gr.update(value=self.alert_sound, autoplay=True) + else: + sound = gr.skip() + self.last_pending_count = count + return f"### {label} - Review Submissions from React Games", sound + + def admin_approve_pending(self, timestamp, orig_utt, edited_utt, edited_lang, edited_dialect, edited_clar, edited_tone, trimmed_audio_path, review_key=""): + scope = self._review_scope(review_key) + if not scope: + return self._review_unauthorized_message() + try: + df = pd.read_csv(self.PENDING_FILE) + df = self._infer_pending_languages(df) + match = df[(df["Timestamp"] == timestamp) & (df["Utterance"] == orig_utt)] + if len(match) == 0: + return "โŒ Approval failed: Entry not found in pending database." + + index_in_csv = match.index[0] + row = df.loc[index_in_csv] + if not self._pending_row_allowed_by_scope(row, scope): + return self._review_unauthorized_message() + + # ๐ŸŸข Use the edited text instead of the original row data + final_utt = edited_utt if edited_utt else row["Utterance"] + final_lang = edited_lang if edited_lang else row.get("Language", "") + final_dialect = edited_dialect if edited_dialect else row["Dialect"] + if not self._scope_allows_language_dialect(scope, final_lang, final_dialect): + return "โŒ Approval blocked: this passcode cannot approve that language/dialect." + final_clar = edited_clar if edited_clar else row["Clarification"] + final_tone = edited_tone if edited_tone else row["Tone"] + + final_audio = trimmed_audio_path if isinstance(trimmed_audio_path, str) and os.path.exists(trimmed_audio_path) else row.get("Audio", "") + review_metadata = { + column: self._clean_cell(row.get(column, "")) + for column in [ + "Queue_ID", "Interaction_ID", "Supersedes_Interaction_ID", + "App_Source", "Source_Input_Mode", "Machine_Transcript_Initial", + "User_Transcript_Final", "Transcript_Edit_Distance", + "ASR_Model", "Audio_Sanitation", "Audio_Retained", + "Machine_Translation_Initial", + "User_Translation_Final", "Translation_Edit_Distance", + "AI_Model", "Translation_Route", "Consent_Confirmed", + "Consent_Version", "Source_Language", "Source_Dialect", + "Target_Language", "Target_Dialect", "Review_Submitted_At" + ] + } + review_metadata["Review_Status"] = "Approved" + + self.trust.update_dataset_csv( + final_dialect, final_utt, final_clar, final_tone, + row.get("Context", ""), "", final_audio, row.get("Pragmatic_Analysis", ""), + row.get("Data_Origin", ""), "Admin Edit", row.get("User", ""), + language=final_lang, review_metadata=review_metadata + ) + + payload = { + "original": final_utt, + "dialect": final_dialect, + "clarification": final_clar, + "tone": final_tone, + "user": str(row.get("User", "")), + "Data_Origin": str(row.get("Data_Origin", "")) + } + threading.Thread(target=self.trust.stamp_on_chain, args=(payload,), daemon=True).start() + + df.drop(index_in_csv).to_csv(self.PENDING_FILE, index=False) + self.sync_pending_queue(direction="up") + + audio_to_delete = row.get("Audio") + if audio_to_delete and str(audio_to_delete) != "nan": + try: + api = HfApi(token=os.environ.get("HF_TOKEN")) + api.delete_file( + path_in_repo=f"pending_audio/{os.path.basename(audio_to_delete)}", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message="๐Ÿ—‘๏ธ Cleaned up processed pending audio" + ) + except Exception as e: + pass + + return f"โœ… Approved & Minted: {final_utt[:20]}..." + except Exception as e: + return f"โŒ Approval failed: {e}" + + def admin_reject_pending(self, timestamp, orig_utt, reject_reason, custom_reason, review_key=""): + scope = self._review_scope(review_key) + if not scope: + return self._review_unauthorized_message() + try: + df = pd.read_csv(self.PENDING_FILE) + df = self._infer_pending_languages(df) + match = df[(df["Timestamp"] == timestamp) & (df["Utterance"] == orig_utt)] + if len(match) == 0: + return "โŒ Rejection failed: Entry not found." + + index_in_csv = match.index[0] + row = df.loc[index_in_csv] + if not self._pending_row_allowed_by_scope(row, scope): + return self._review_unauthorized_message() + + final_reason = custom_reason if reject_reason == "Other" else reject_reason + if not final_reason: + final_reason = "Admin Override" + + # If it has a Chain_ID, it was proposed. Reject it on-chain! + chain_id = str(row.get("Chain_ID", "")) + + # Log to Graveyard + self.trust.add_to_graveyard( + dialect=row.get("Dialect", ""), + utterance=row.get("Utterance", ""), + clarification=row.get("Clarification", ""), + tone=row.get("Tone", ""), + context=row.get("Context", ""), + syntax="", + audio_path=row.get("Audio", ""), + pragmatics=row.get("Pragmatic_Analysis", ""), + sourceTag=row.get("Data_Origin", "Pending"), + clar_source="Lab Admin", + userKey=row.get("User", ""), + reason=final_reason, + rejector="Admin", + chain_id=chain_id + ) + if chain_id.isdigit(): + try: + w3 = self.trust.w3 + contract_addr = os.environ.get("PURECHAIN_CONTRACT_ADDRESS", getattr(self.trust.config, 'PURECHAIN_CONTRACT_ADDRESS', None)) + contract = w3.eth.contract(address=contract_addr, abi=self.trust.config.CONTRACT_ABI) + nonce = w3.eth.get_transaction_count(self.trust.account.address) + tx = contract.functions.rejectEntry(int(chain_id), self.trust.account.address, final_reason).build_transaction({ + 'chainId': getattr(self.trust.config, 'PURECHAIN_ID', 900520900520), + 'gas': 2000000, 'gasPrice': 0, 'nonce': nonce + }) + signed_tx = w3.eth.account.sign_transaction(tx, self.trust.config.PRIVATE_KEY) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + w3.eth.wait_for_transaction_receipt(tx_hash) + print(f"๐Ÿ”ฅ On-chain burn applied for {chain_id} with reason: {final_reason}") + except Exception as e: + print(f"Failed to burn on-chain: {e}") + + df.drop(index_in_csv).to_csv(self.PENDING_FILE, index=False) + self.sync_pending_queue(direction="up") + + audio_to_delete = row.get("Audio") + if audio_to_delete and str(audio_to_delete) != "nan": + try: + api = HfApi(token=os.environ.get("HF_TOKEN")) + if os.path.exists(audio_to_delete): + api.upload_file( + path_or_fileobj=audio_to_delete, # Local file + path_in_repo=f"rejected_audio/{os.path.basename(audio_to_delete)}", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message=f"๐Ÿšซ Moved rejected audio: {final_reason}" + ) + api.delete_file( + path_in_repo=f"pending_audio/{os.path.basename(audio_to_delete)}", + repo_id="toecm/PureChain_Dataset", + repo_type="dataset", + commit_message="๐Ÿ—‘๏ธ Cleaned up rejected pending audio" + ) + except Exception as e: + print(f"HF Audio Move Error: {e}") + + return f"๐Ÿ—‘๏ธ Entry Rejected ({final_reason}) & Moved to Burn Ward." + except Exception as e: + return f"โŒ Rejection Error: {e}" + + def admin_clear_all_pending(self, review_key=""): + if not self._is_full_admin_authorized(review_key): + return self._full_admin_required_message() + try: + if os.path.exists(self.PENDING_FILE): + os.remove(self.PENDING_FILE) + self.sync_pending_queue(direction="up") + return "๐Ÿงน All pending entries swept!" + except Exception as e: return f"โŒ Clear failed: {e}" + + def export_analysis_to_csv(self, df, review_key=""): + if not self._is_full_admin_authorized(review_key): + return None + if df is None or not hasattr(df, 'columns') or df.empty: + return None + path = "/app/sociolinguistic_export.csv" + df.to_csv(path, index=False, encoding='utf-8-sig') + return path + + def api_generate_training_data(self, review_key=""): + if not self._is_full_admin_authorized(review_key): + return self._full_admin_required_message() + try: + prepare_training_data.main() + return f"โœ… Success! 'train.csv' created." + except Exception as e: + return f"โŒ Error generating data: {e}" + + def api_get_full_dataset_zip(self, review_key=""): + if not self._is_full_admin_authorized(review_key): + return None + try: + shutil.make_archive("/app/dataset_export", 'zip', self.brain.config.DATASET_DIR) + return "/app/dataset_export.zip" + except Exception as e: + return f"Error zipping: {e}" + + def auto_regenerate_analysis(self, text, clar, tone, ctx, prag, new_dialect): + show_new = (new_dialect == "+ Add New Dialect") + # Guard: don't fire heavy AI calls if there is no utterance text (e.g. tab-switching with empty field) + if not text or not text.strip() or show_new or not new_dialect: + return clar, tone, ctx, prag, gr.update(visible=show_new) + + print(f"๐Ÿ”„ UI Trigger: Re-analyzing '{text}' for dialect: {new_dialect}") + + try: + if hasattr(self.brain, 'analyze_dialect_single'): + res = self.brain.analyze_dialect_single(text, new_dialect) + return ( + res.get("clarification", clar), + res.get("tone", tone), + res.get("context", ctx), + res.get("pragmatics", prag), + gr.update(visible=show_new) + ) + except Exception as e: + print(f"Auto-regenerate error: {e}") + + return clar, tone, ctx, prag, gr.update(visible=show_new) + + def lab_analyze_and_mint(self, text, dialect, force_ai, userKey, review_key="", request: gr.Request = None): + if not self._is_full_admin_authorized(review_key): + return {"error": "unauthorized"}, self._full_admin_required_message() + status_log = f"๐Ÿš€ LAB PIPELINE TRIGGERED for '{text}'\n" + final_result = None + + if not text or not dialect: + return {"error": "Missing input"}, "โš ๏ธ Please provide text and select a dialect." + + if not force_ai: + status_log += "๐Ÿ—„๏ธ Checking Local Dataset...\n" + final_result = self.brain.search_local_dataset(text) + if final_result: + status_log += "โœ… Found in Local Dataset.\n" + else: + status_log += "๐ŸŽญ Checking Persona Context...\n" + final_result = self.brain.search_personas(text) + else: + status_log += "๐Ÿš€ Force AI Enabled: Bypassing local lookups...\n" + + if not final_result: + status_log += "๐Ÿง  Generating AI interpretation...\n" + if hasattr(self.brain, 'analyze_dialect_single'): + final_result = self.brain.analyze_dialect_single(text, dialect) + status_log += "โœ… AI Engine Analysis Complete.\n" + else: + return {"error": "Missing AI function"}, status_log + "โŒ Error." + + clarification = final_result.get("clarification", "") + tone = final_result.get("tone", "Neutral") + context = final_result.get("context", "") + pragmatics = final_result.get("pragmatics", "") + + client_ip = request.headers.get("x-forwarded-for") or request.client.host if request else "Unknown_IP" + source_tag = f"Lab_Admin_{client_ip}" + + success = self.trust.update_dataset_csv( + dialect=dialect, utterance=text, clarification=clarification, + tone=tone, context=context, syntax="", audio_path=None, + pragmatics=pragmatics, sourceTag=source_tag, + clar_source=final_result.get("Source", "AI"), userKey=userKey + ) + + if success: + status_log += "\n๐Ÿ’Ž SUCCESS: Entry saved to CSV and synced to HF Cloud!" + + payload = { + "original": text, + "dialect": dialect, + "clarification": clarification, + "tone": tone, + "user": userKey + } + + threading.Thread(target=self.trust.stamp_on_chain, args=(payload,), daemon=True).start() + status_log += "\nโ›“๏ธ PureChain minting triggered in background." + else: + status_log += "\nโš ๏ธ ERROR: Database save failed." + + return final_result, status_log + + # ========================================== + # THE RESEARCH UI + # ========================================== + def create_ui(self): + def generate_admin_op_id(): + return "0x" + uuid.uuid4().hex + uuid.uuid4().hex[:8] + + custom_css = """ + .gradio-container { max-width: 95% !important; } + table { width: 100% !important; table-layout: auto !important; } + td { white-space: normal !important; word-wrap: break-word !important; } + """ + import json + hierarchy_str = self.api_get_language_hierarchy() + language_hierarchy_dict = json.loads(hierarchy_str) + language_choices = ["All"] + sorted(list(language_hierarchy_dict.keys())) + all_dialects = [] + for d_list in language_hierarchy_dict.values(): + all_dialects.extend([d for d in d_list if d != "+ Add New Dialect"]) + dropdown_choices = sorted(list(set(all_dialects))) + + available_profiles = self.brain.get_available_profiles() if hasattr(self.brain, 'get_available_profiles') else [] + + backup_files = [] + if hasattr(self.brain, 'config'): + if os.path.exists(self.brain.config.DATASET_DIR): + backup_files.extend([os.path.basename(f) for f in glob.glob(os.path.join(self.brain.config.DATASET_DIR, "**", "*.csv"), recursive=True)]) + if os.path.exists(self.brain.config.PROFILES_DIR): + backup_files.extend([os.path.basename(f) for f in glob.glob(os.path.join(self.brain.config.PROFILES_DIR, "*.json"))]) + backup_files = sorted(list(set(backup_files))) if backup_files else ["No files found"] + + with gr.Blocks(theme=gr.themes.Default(primary_hue=gr.themes.colors.red, secondary_hue=gr.themes.colors.orange)) as ui: + gr.Markdown("## ๐ŸŒ PACYCx: Decentralized Multi-Dialect Mediator (Lab View)") + + ui_source_tag = gr.Textbox(visible=False, value="Web") + ui_clar_source = gr.Textbox(visible=False, value="Lab Admin") + ui_operator_id = gr.Textbox(visible=False, value=generate_admin_op_id) + + api_audio_blob = gr.Audio(visible=False, type="filepath") + api_confirm = gr.State(False) + + admin_review_key = gr.Textbox( + label="Reviewer/Admin passcode", + type="password", + placeholder="Required for backend dashboard tabs and privileged actions" + ) + + with gr.Tabs(): + with gr.Tab("๐ŸŽ™๏ธ Live Field Analysis", visible=False): + health_display = gr.HTML(self.get_blockchain_health()) + + with gr.Row(): + with gr.Column(scale=1): + audio_in = gr.Audio(label="Step 1: Speak/Upload", sources=["microphone", "upload"], type="filepath") + lang_sel = gr.Dropdown(["en", "yo", "ig", "ko", "ha"], value="en", label="Language Context") + btn_run = gr.Button("Analyze Audio ๐Ÿ”„", variant="primary") + quota_box = gr.Textbox(label="๐Ÿ“Š API Quota", value=self.get_quota_status(), interactive=False) + + with gr.Row(variant="compact"): + background_status_display = gr.Textbox(label="Status", value="Checking...", interactive=False, show_label=False) + + with gr.Column(scale=5): + log_box = gr.Textbox(label="Linguistic Analysis Log", interactive=False) + gr.Markdown("### ๐Ÿฅ‡ AI Interpretation Baseline") + results_table = gr.Dataframe( + headers=["Source", "Speaker", "Utterance", "Dialect", "Clarification", "Tone", "Context", "Pragmatic Analysis"], + interactive=True, + wrap=False, + row_count=(1, "dynamic") + ) + with gr.Row(): + export_btn = gr.Button("๐Ÿ“ฅ Download Analysis CSV", variant="secondary") + export_file = gr.File(label="Export Result", visible=False) + + gr.Markdown("### โœ๏ธ Active Sociolinguistic Feedback Loop (Edit & Approve)") + with gr.Row(): + with gr.Column(scale=1): + orig_text = gr.Textbox(visible=True, label="Utterance (Transcribed)") + dialect_sel = gr.Dropdown(choices=dropdown_choices, label="Assigned Dialect", interactive=True, allow_custom_value=True) + new_dialect = gr.Textbox(label="Enter New Dialect Name", visible=False, interactive=True) + with gr.Column(): + clar_text = gr.Textbox(label="Final Clarification", interactive=True, lines=2) + tone_sel = gr.Dropdown(choices=self.TONES, value="Neutral / Conversational", label="Pragmatic Tone", interactive=True, allow_custom_value=True) + ctx_area = gr.TextArea(label="Linguistic Context", interactive=True, lines=1) + prag_area = gr.TextArea(label="Pragmatic Analysis ([Force], [Deixis], [Register])", interactive=True, lines=1) + + with gr.Row(): + btn_save = gr.Button("๐Ÿ’พ Validate & Save", variant="primary") + btn_over = gr.Button("โš ๏ธ Confirm Overwrite", variant="stop", visible=False) + feedback_msg = gr.Markdown() + + gr.Markdown("### ๐Ÿ“ฅ PhD Data Export & Training") + with gr.Row(): + export_data_btn = gr.Button("๐Ÿ“ฆ Generate Full Dataset ZIP", variant="secondary") + train_btn = gr.Button("๐Ÿง  Generate AutoTrain CSV", variant="primary") + export_zip_file = gr.File(label="Download") + train_status = gr.Textbox(label="Training Data Status", lines=1) + + with gr.Tab("๐Ÿงช THE LAB (Force AI)", visible=False): + gr.Markdown("### ๐Ÿ”ฌ Test text inputs directly and force AI generation") + with gr.Row(): + with gr.Column(): + lab_input = gr.Textbox(label="Test Phrase (Text Only)") + lab_dialect = gr.Dropdown(choices=dropdown_choices, label="Target Dialect") + force_ai_toggle = gr.Checkbox(label="Force Live AI (Skip Local Cache)", value=False) + lab_user_key = gr.Textbox(label="Admin User Key", value="Admin_001") + lab_btn = gr.Button("RUN ANALYSIS & MINT", variant="primary") + + with gr.Column(): + lab_output = gr.JSON(label="Analysis Result") + lab_log = gr.Textbox(label="System Logs", lines=10) + + lab_btn.click( + fn=self.lab_analyze_and_mint, + inputs=[lab_input, lab_dialect, force_ai_toggle, lab_user_key, admin_review_key], + outputs=[lab_output, lab_log] + ) + + with gr.Tab("โš™๏ธ Persona Management", visible=False): + with gr.Row(): + load_all_btn = gr.Button("๐Ÿ“‚ Load ALL Profiles", variant="secondary") + profile_selector = gr.Dropdown(choices=available_profiles, label="Select Profile", allow_custom_value=True) + profile_filename = gr.Textbox(label="Filename") + load_profile_btn = gr.Button("๐Ÿ“ฅ Load Selected Profile", variant="primary") # ๐ŸŸข NEW + profile_editor = gr.Textbox(label="Profile Content (JSON)", lines=20) # ๐ŸŸข CHANGED TO TEXTBOX + save_profile_btn = gr.Button("๐Ÿ’พ Save Profile modifications", variant="primary") + profile_status = gr.Textbox(label="System Response", interactive=False) + + def change_profile(val, review_key): + if not self._is_full_admin_authorized(review_key): + return "", "" + if not val: return "", "" + return json.dumps(self.brain.load_profile_by_name(val), indent=2), val + + def save_and_refresh_profile(filename, content, review_key): + if not self._is_full_admin_authorized(review_key): + return self._review_unauthorized_message(), gr.update() + msg = self.brain.save_specific_profile(filename, content) + return msg, gr.update(choices=self.brain.get_available_profiles(), value=filename) + + def load_all_profiles_with_key(review_key): + if not self._is_full_admin_authorized(review_key): + return self._review_unauthorized_message(), "" + self.brain.load_all_profiles_simultaneously() + return "Profiles loaded.", self.brain.get_current_profile_text() + + # ๐ŸŸข Changed to click instead of auto-change + load_profile_btn.click(change_profile, inputs=[profile_selector, admin_review_key], outputs=[profile_editor, profile_filename]) + save_profile_btn.click(save_and_refresh_profile, inputs=[profile_filename, profile_editor, admin_review_key], outputs=[profile_status, profile_selector]) + + if hasattr(self.brain, 'load_all_profiles_simultaneously'): + load_all_btn.click(load_all_profiles_with_key, inputs=[admin_review_key], outputs=[profile_status, profile_editor]) + + + with gr.Tab("๐Ÿ‘ฎ Pending Audit/Approvals", visible=False): + pending_header = gr.Markdown("### ๐Ÿ‘ฎ Pending (0) - Review Submissions from React Games") + gr.Markdown("Use the global reviewer/admin passcode field above before refreshing or changing audit data.") + with gr.Row(): + with gr.Column(scale=3): + with gr.Row(): + filter_language = gr.Dropdown(choices=language_choices, value="All", label="Filter by Language") + filter_dialect = gr.Dropdown(choices=["All"] + dropdown_choices, value="All", label="Filter by Dialect") + pending_df = gr.Dataframe(headers=[ + "User", "Data_Origin", "Utterance", "Language", "Dialect", + "Clarification", "Clarification_Source", "Tone", "Audio", "Timestamp", + "App_Source", "Source_Language", "Source_Dialect", "Source_Input_Mode", + "Machine_Transcript_Initial", "User_Transcript_Final", + "Transcript_Edit_Distance", "Machine_Translation_Initial", + "User_Translation_Final", "Translation_Edit_Distance", "ASR_Model", + "AI_Model", "Audio_Sanitation", "Consent_Confirmed", "Queue_ID" + ], interactive=False, wrap=False, row_count=(1, "dynamic")) + with gr.Column(scale=1): + gr.Markdown("#### ๐ŸŽง Audio Auditor") + btn_refresh = gr.Button("๐Ÿ”„ Refresh List") + pending_audio_player = gr.Audio(label="Trim or Preview Audio", type="filepath", interactive=True) + audit_log = gr.Textbox(label="Audit Status", interactive=False) + + # ๐ŸŸข NEW: Editable Textboxes for Admin Corrections + gr.Markdown("#### โœ๏ธ Edit Selected Entry Before Minting") + with gr.Row(): + pending_timestamp = gr.Textbox(label="Timestamp ID", interactive=False) + pending_orig_utt = gr.Textbox(visible=False) + edit_utt = gr.Textbox(label="Utterance", interactive=True) + edit_lang = gr.Textbox(label="Language", interactive=True) + edit_dialect = gr.Textbox(label="Dialect", interactive=True) + edit_clar = gr.Textbox(label="Clarification / Meaning", interactive=True) + edit_tone = gr.Textbox(label="Tone", interactive=True) + + with gr.Row(): + reject_reason_dropdown = gr.Dropdown(["Spam", "Audio Quality", "Dialect Mismatch", "Other"], label="Rejection Reason", value="Audio Quality") + reject_reason_text = gr.Textbox(label="Custom Reason (if Other)", visible=False) + + def toggle_reason(val): + return gr.update(visible=(val == "Other")) + reject_reason_dropdown.change(toggle_reason, inputs=[reject_reason_dropdown], outputs=[reject_reason_text]) + + with gr.Row(): + btn_appr_p = gr.Button("โœ… Approve & Mint (With Edits)", variant="primary") + btn_rejt_p = gr.Button("๐Ÿ—‘๏ธ Reject entry", variant="stop") + btn_clear_pending = gr.Button("Sweep All Pending", variant="secondary") + + with gr.Tab("โ›“๏ธ PureChain History"): + gr.Markdown("### ๐Ÿ“œ Immutable Transaction Log & Audit Reports") + + with gr.Row(): + legacy_checkboxes = gr.CheckboxGroup( + choices=["PureIUUY", "PureConvo", "PureVersation", "PureBi (Jun 11)", "PureBi (Jun 12)", "PureBi (Jun 13)", "PureBi"], + label="Fetch Legacy Blockchain Data", + value=["PureBi"] + ) + + with gr.Row(): + start_date = gr.DateTime(label="Start Date", type="string") + end_date = gr.DateTime(label="End Date", type="string") + btn_filter = gr.Button("๐Ÿ” Filter & Refresh", variant="primary") + gr.HTML("๐ŸŒ Open PureChain Explorer") + + history_df = gr.Dataframe( + headers=["Timestamp", "Utterance", "Dialect", "Data_Origin", "Data_Approved", "Block", "TX Hash"], + interactive=False, + wrap=False, + row_count=(5, "dynamic") + ) + + with gr.Row(): + export_report_btn = gr.Button("๐Ÿ“ฅ Generate CSV Report", variant="secondary") + report_file = gr.File(label="Download Audit Report") + explorer_link = gr.Markdown("Select a row to generate Explorer Link") + + def run_filter(s, e, selected_contracts, review_key): + if not self._is_full_admin_authorized(review_key): + return self._review_empty_history_dataframe() + if selected_contracts: + try: + import recover_chain + recover_chain.main(selected_contracts) + except Exception as exc: + print(f"Recovery failed: {exc}") + + df = self.trust.get_filtered_history(s, e) + display_cols = ["Timestamp", "Utterance", "Dialect", "Data_Origin", "Data_Approved", "Block", "TX Hash"] + available = [c for c in display_cols if c in df.columns] + + # Truncate TX Hash for UI only + if "TX Hash" in available: + df["TX Hash"] = df["TX Hash"].apply(lambda x: str(x)[:15] + "..." if len(str(x)) > 15 else x) + + return df[available] + + def generate_report(s, e, review_key): + if not self._is_full_admin_authorized(review_key): + return None + df = self.trust.get_filtered_history(s, e) + report_path = "/app/purechain_audit_report.csv" + export_cols = ["Timestamp", "Utterance", "Dialect", "Clarification", "Data_Origin", "Data_Approved", "Block", "TX Hash"] + available_cols = [c for c in export_cols if c in df.columns] + df[available_cols].to_csv(report_path, index=False, encoding='utf-8-sig') + return report_path + + def make_explorer_link(evt: gr.SelectData, df): + try: + tx_hash = df.iloc[evt.index[0]]["TX Hash"] + return f"๐Ÿ” **[View Transaction on Explorer](http://3.34.161.207:3000/tx/{tx_hash})**" + except: return "Select a valid row" + + btn_filter.click(run_filter, [start_date, end_date, legacy_checkboxes, admin_review_key], [history_df]) + export_report_btn.click(generate_report, inputs=[start_date, end_date, admin_review_key], outputs=[report_file]).then(run_filter, [start_date, end_date, legacy_checkboxes, admin_review_key], [history_df]) + history_df.select(make_explorer_link, [history_df], [explorer_link]) + + with gr.Tab("๐Ÿ’พ System Backups", visible=False): + with gr.Row(): + backup_target = gr.Dropdown(choices=backup_files, label="Select File") + backup_desc = gr.Textbox(label="Backup Note", value="Routine check") + backup_btn = gr.Button("๐Ÿš€ Create Immutable Backup", variant="primary") + + recover_btn = gr.Button("๐Ÿ”„ Recover Data from Blockchain", variant="secondary") + backup_log = gr.Textbox(label="Backup Status", interactive=False) + + gr.Markdown("---") + + with gr.Row(): + bytecode_input = gr.Textbox(label="Paste Contract Bytecode", lines=3) + deploy_btn = gr.Button("๐Ÿš€ Force Deploy (Zero Gas)", variant="stop") + deployment_output = gr.Textbox(label="Deployment Result", interactive=False) + + def force_deploy_with_key(bytecode, review_key): + if not self._is_full_admin_authorized(review_key): + return self._review_unauthorized_message() + return self.trust.force_deploy_contract(bytecode) + + deploy_btn.click( + fn=force_deploy_with_key, + inputs=[bytecode_input, admin_review_key], + outputs=[deployment_output] + ) + + # --- NEW TAB: REJECTED ENTRIES AUDIT --- + with gr.Tab("๐Ÿšซ Rejected Entries Audit", visible=False): + gr.Markdown("### ๐Ÿชฆ The Burn Ward (Rejected & Burned Data)") + + with gr.Row(): + btn_refresh_graveyard = gr.Button("๐Ÿ”„ Refresh Graveyard", variant="primary") + + graveyard_df = gr.Dataframe( + headers=["Timestamp", "Utterance", "Dialect", "Rejection_Reason", "Rejector"], + interactive=False, + wrap=False, + row_count=(5, "dynamic") + ) + + def refresh_graveyard(review_key): + import os + import pandas as pd + if not self._is_full_admin_authorized(review_key): + return pd.DataFrame(columns=["Timestamp", "Utterance", "Dialect", "Rejection_Reason", "Rejector"]) + path = os.path.join(self.trust.config.DATASET_DIR, "..", "rejected_graveyard.csv") + if os.path.exists(path): + df = pd.read_csv(path) + cols = ["Timestamp", "Utterance", "Dialect", "Rejection_Reason", "Rejector"] + return df[[c for c in cols if c in df.columns]] + return pd.DataFrame() + + btn_refresh_graveyard.click(refresh_graveyard, inputs=[admin_review_key], outputs=[graveyard_df]) + + # --- TAB 6: BUG REPORTS & FEEDBACK --- + with gr.Tab("๐Ÿ› Bug Reports & Feedback", visible=False): + gr.Markdown("### ๐Ÿ›ก๏ธ Secure System Feedback Log") + + with gr.Row(): + with gr.Column(scale=3): + btn_refresh_fb = gr.Button("๐Ÿ”„ Refresh Feedback List", variant="secondary") + feedback_df = gr.Dataframe( + headers=["Timestamp", "Operator_ID", "Feedback_Text", "Image_Reference"], + interactive=False, + wrap=False, + row_count=(5, "dynamic") + ) + with gr.Column(scale=1): + gr.Markdown("#### ๐Ÿ“ธ Attached Screenshot") + feedback_image = gr.Image(label="Click a row to view screenshot", interactive=False) + + # --- TAB 7: PASSIVE EEQ-S DASHBOARD --- + with gr.Tab("๐Ÿ“Š EEQ-s Dashboard"): + gr.Markdown("### Passive EEQ-s Interaction Index") + gr.Markdown("Aggregated only from users who press **Sync Global Dashboard** in the game UI.") + btn_refresh_eeqs = gr.Button("๐Ÿ”„ Refresh EEQ-s Dashboard", variant="secondary") + eeqs_df = gr.Dataframe( + headers=[ + "Game", "AI_Model", "ASR_Model", "Source_Language", "Source_Dialect", + "Target_Language", "Target_Dialect", "Interaction_Type", "Event_Count", + "Mean_EEQ", "Last_EEQ", "Last_Seen" + ], + interactive=False, + wrap=False, + row_count=(8, "dynamic") + ) + + # ========================================== + # EVENT BINDINGS + # ========================================== + + export_data_btn.click(self.api_get_full_dataset_zip, inputs=[admin_review_key], outputs=[export_zip_file]) + train_btn.click(self.api_generate_training_data, inputs=[admin_review_key], outputs=[train_status]) + + def admin_automated_pipeline(audio_path, lang, review_key): + if not self._is_full_admin_authorized(review_key): + return ( + pd.DataFrame(), + self._review_unauthorized_message(), + self.get_quota_status(), + "", + None, + "", + "Neutral / Conversational", + "", + "" + ) + return self.automated_pipeline(audio_path, lang, None) + + btn_run.click( + admin_automated_pipeline, + [audio_in, lang_sel, admin_review_key], + [results_table, log_box, quota_box, orig_text, dialect_sel, clar_text, tone_sel, ctx_area, prag_area] + ) + + audio_in.stop_recording( + admin_automated_pipeline, + [audio_in, lang_sel, admin_review_key], + [results_table, log_box, quota_box, orig_text, dialect_sel, clar_text, tone_sel, ctx_area, prag_area] + ) + + audio_in.upload( + admin_automated_pipeline, + [audio_in, lang_sel, admin_review_key], + [results_table, log_box, quota_box, orig_text, dialect_sel, clar_text, tone_sel, ctx_area, prag_area] + ) + + def handle_selection(evt: gr.SelectData, df): + if df is None or not hasattr(df, 'columns') or len(df) == 0: + return "", "", "", "Neutral / Conversational", "", "" + try: + row = df.iloc[evt.index[0]] + d = row["Dialect"] if row["Dialect"] in dropdown_choices else None + return row["Utterance"], d, row["Clarification"], row["Tone"], row.get("Context", ""), row.get("Pragmatic Analysis", "") + except: return "", "", "", "Neutral / Conversational", "", "" + + results_table.select(handle_selection, [results_table], [orig_text, dialect_sel, clar_text, tone_sel, ctx_area, prag_area]) + export_btn.click(self.export_analysis_to_csv, [results_table, admin_review_key], [export_file]).then(lambda: gr.update(visible=True), None, [export_file]) + + btn_save.click( + fn=self.admin_check_and_submit_logic, + inputs=[ + orig_text, dialect_sel, new_dialect, clar_text, tone_sel, ctx_area, prag_area, + ui_source_tag, # 8. sourceTag ("Web") + ui_clar_source, # 9. clar_source ("Lab Admin") + ui_operator_id, # 10. userKey (Generated ID) + audio_in, # 11. blob + admin_review_key + ], + outputs=[feedback_msg, btn_over] + ) + + btn_over.click( + fn=self.admin_force_overwrite_logic, + inputs=[ + orig_text, dialect_sel, new_dialect, clar_text, tone_sel, ctx_area, prag_area, + ui_source_tag, # 8. sourceTag + ui_clar_source, # 9. clar_source + ui_operator_id, # 10. userKey + audio_in, # 11. blob + admin_review_key + ], + outputs=[feedback_msg, btn_over] + ) + + + # Audit / Pending + def select_pending_row(evt: gr.SelectData, df): + try: + idx = evt.index[0] + row = df.iloc[idx] + audio_path = row.get("Audio") + timestamp = str(row.get("Timestamp", "")) + utt = str(row.get("Utterance", "")) + clar = str(row.get("Clarification", "")) + tone = str(row.get("Tone", "")) + dialect = str(row.get("Dialect", "")) + lang = str(row.get("Language", "")) + return audio_path, timestamp, utt, utt, lang, dialect, clar, tone + except: + return None, "", "", "", "", "", "", "" + + def update_dialects(lang): + if lang == "All": + return gr.update(choices=["All"] + dropdown_choices, value="All") + elif lang in language_hierarchy_dict: + new_choices = [d for d in language_hierarchy_dict[lang] if d != "+ Add New Dialect"] + return gr.update(choices=["All"] + new_choices, value="All") + return gr.update(choices=["All"], value="All") + + filter_language.change(update_dialects, inputs=[filter_language], outputs=[filter_dialect]).then( + self.get_pending_dataframe, inputs=[filter_language, filter_dialect, admin_review_key], outputs=[pending_df] + ) + + filter_dialect.change(self.get_pending_dataframe, inputs=[filter_language, filter_dialect, admin_review_key], outputs=[pending_df]) + btn_refresh.click(self.get_pending_dataframe, inputs=[filter_language, filter_dialect, admin_review_key], outputs=[pending_df]) + pending_df.select(select_pending_row, [pending_df], [pending_audio_player, pending_timestamp, pending_orig_utt, edit_utt, edit_lang, edit_dialect, edit_clar, edit_tone]) + + btn_appr_p.click(self.admin_approve_pending, inputs=[pending_timestamp, pending_orig_utt, edit_utt, edit_lang, edit_dialect, edit_clar, edit_tone, pending_audio_player, admin_review_key], outputs=[audit_log]).then(self.get_pending_dataframe, inputs=[filter_language, filter_dialect, admin_review_key], outputs=[pending_df]) + btn_rejt_p.click(self.admin_reject_pending, inputs=[pending_timestamp, pending_orig_utt, reject_reason_dropdown, reject_reason_text, admin_review_key], outputs=[audit_log]).then(self.get_pending_dataframe, inputs=[filter_language, filter_dialect, admin_review_key], outputs=[pending_df]) + btn_clear_pending.click(self.admin_clear_all_pending, inputs=[admin_review_key], outputs=[audit_log]).then(self.get_pending_dataframe, inputs=[filter_language, filter_dialect, admin_review_key], outputs=[pending_df]) + + def trigger_recovery(review_key): + if not self._is_full_admin_authorized(review_key): + return self._review_unauthorized_message() + try: + import recover_chain # Left local specifically to prevent circular dependency at startup + result_message = recover_chain.main() + return result_message + except Exception as e: + return f"โŒ Recovery Error: {e}" + + recover_btn.click(trigger_recovery, inputs=[admin_review_key], outputs=[backup_log]) + + # --- Feedback Tab Events --- + def show_feedback_image(evt: gr.SelectData, df): + try: + img_path = str(df.iloc[evt.index[0]].get("Image_Reference", "")) + if img_path == "nan" or not img_path: + return None + + if not os.path.exists(img_path) and os.environ.get("HF_TOKEN"): + img_name = os.path.basename(img_path) + try: + dl_img = hf_hub_download( + repo_id="toecm/PureChain_Dataset", + filename=f"feedback_images/{img_name}", + repo_type="dataset", + token=os.environ.get("HF_TOKEN") + ) + os.makedirs(os.path.dirname(img_path), exist_ok=True) + shutil.copy(dl_img, img_path) + except: + pass + + return img_path if os.path.exists(img_path) else None + except: + return None + + btn_refresh_fb.click(self.get_feedback_dataframe, inputs=[admin_review_key], outputs=[feedback_df]) + feedback_df.select(show_feedback_image, [feedback_df], [feedback_image]) + btn_refresh_eeqs.click(self.get_eeqs_dashboard_dataframe, inputs=[admin_review_key], outputs=[eeqs_df]) + + # โฌ‡๏ธ COMPREHENSIVE API BRIDGE FOR REACT FRONTEND โฌ‡๏ธ + gr.Markdown("---") + gr.Markdown("### ๐Ÿ“ก API Gateway (Headless endpoints for React)") + + with gr.Row(visible=False): + api_sync_out = gr.Textbox() + api_btn_sync = gr.Button() + api_btn_sync.click(fn=check_cloud_sync_status, inputs=[], outputs=[api_sync_out], api_name="check_cloud_sync") + + + # ๐ŸŸข FIX: Added an invisible input box to satisfy the JS client routing + api_btn_dialects = gr.Button() + api_dialects_out = gr.Textbox() + api_btn_dialects.click(fn=self.api_get_dialects, inputs=[], outputs=[api_dialects_out], api_name="api_get_dialects") + + api_btn_hierarchy = gr.Button() + api_hierarchy_out = gr.Textbox() + api_btn_hierarchy.click(fn=self.api_get_language_hierarchy, inputs=[], outputs=[api_hierarchy_out], api_name="api_get_language_hierarchy") + + api_btn_mission = gr.Button() + api_topic_in = gr.Textbox() + api_mission_out = gr.Textbox() + api_btn_mission.click(fn=self.api_generate_mission, inputs=[api_topic_in], outputs=[api_mission_out], api_name="generate_mission") + + api_btn_transcribe = gr.Button() + api_audio_in = gr.File() + api_dialect_in = gr.Textbox() + api_transcribe_out = gr.Textbox() + api_btn_transcribe.click(fn=self.api_transcribe, inputs=[api_audio_in, api_dialect_in], outputs=[api_transcribe_out], api_name="transcribe_check") + + api_btn_transcribe_v2 = gr.Button() + api_speech_model_in = gr.Textbox(value="auto") + api_audio_sanitation_in = gr.Textbox(value="on") + api_btn_transcribe_v2.click( + fn=self.api_transcribe_with_model, + inputs=[api_audio_in, api_dialect_in, api_speech_model_in, api_audio_sanitation_in], + outputs=[api_transcribe_out], + api_name="transcribe_check_v2" + ) + + api_btn_clarify = gr.Button() + api_text_in = gr.Textbox() + api_clarify_out = gr.Textbox() + api_btn_clarify.click(fn=self.api_clarify, inputs=[api_text_in, api_dialect_in], outputs=[api_clarify_out], api_name="generate_clarifications") + api_ai_model_in = gr.Textbox(value="auto") + api_btn_clarify_v2 = gr.Button() + api_btn_clarify_v2.click( + fn=self.api_clarify_with_model, + inputs=[api_text_in, api_dialect_in, api_ai_model_in], + outputs=[api_clarify_out], + api_name="generate_clarifications_v2" + ) + + api_btn_submit = gr.Button() + api_custom_d = gr.Textbox() + api_tone = gr.Textbox() + api_context = gr.Textbox() + api_pragmatics = gr.Textbox() + api_source_tag = gr.Textbox(visible=False, value="Web") + api_clar_source = gr.Textbox(visible=False, value="AI") + api_user_key = gr.Textbox(visible=False, value="") + api_confirm = gr.State(False) + + # ๐ŸŸข NEW: Peer-to-Peer Translation Endpoint + api_btn_translate = gr.Button() + api_translate_text_in = gr.Textbox() + api_translate_source_in = gr.Textbox() + api_translate_target_in = gr.Textbox() + api_translate_out = gr.Textbox() + api_btn_translate.click( + fn=self.api_translate_peer, + inputs=[api_translate_text_in, api_translate_source_in, api_translate_target_in], + outputs=[api_translate_out], + api_name="translate_peer" + ) + api_btn_translate_v2 = gr.Button() + api_btn_translate_v2.click( + fn=self.api_translate_peer, + inputs=[api_translate_text_in, api_translate_source_in, api_translate_target_in, api_ai_model_in], + outputs=[api_translate_out], + api_name="translate_peer_v2" + ) + + # ๐ŸŸข NEW: Dialect Relay Endpoints + api_btn_join = gr.Button() + api_q_op = gr.Textbox() + api_q_dialect = gr.Textbox() + api_q_target = gr.Textbox() + api_q_out = gr.Textbox() + api_btn_join.click(fn=self.api_join_queue, inputs=[api_q_op, api_q_dialect, api_q_target], outputs=[api_q_out], api_name="join_queue") + + api_btn_lobby = gr.Button() + api_btn_lobby.click(fn=self.api_get_lobby, inputs=[], outputs=[api_q_out], api_name="get_lobby") + + api_btn_check = gr.Button() + api_c_out = gr.Textbox() + api_btn_check.click(fn=self.api_check_match, inputs=[api_q_op], outputs=[api_c_out], api_name="check_match") + + api_btn_leave = gr.Button() + api_btn_leave.click(fn=self.api_leave_queue, inputs=[api_q_op], outputs=[api_c_out], api_name="leave_queue") + + api_btn_relay_send = gr.Button() + api_relay_room = gr.Textbox() + api_relay_text = gr.Textbox() + api_relay_target = gr.Textbox() + api_relay_meaning = gr.Textbox() + api_relay_out = gr.Textbox() + api_btn_relay_send.click(fn=self.api_remote_eval_and_send, inputs=[api_relay_room, api_q_op, api_relay_text, api_q_dialect, api_relay_target, api_relay_meaning], outputs=[api_relay_out], api_name="relay_send") + api_btn_relay_poll = gr.Button() + api_poll_idx = gr.Number() + api_btn_relay_poll.click(fn=self.api_remote_poll, inputs=[api_relay_room, api_poll_idx], outputs=[api_c_out], api_name="relay_poll") + + # 7. Secure Feedback Endpoint + # 8. Oracle XP and Task Endpoints + api_xp_op = gr.Textbox() + api_xp_dia = gr.Textbox() + api_review_key = gr.Textbox() + api_xp_out = gr.Textbox() + api_btn_xp = gr.Button() + api_btn_xp.click(fn=self.api_get_user_xp, inputs=[api_xp_op, api_xp_dia], outputs=[api_xp_out], api_name="get_xp") + + api_btn_task = gr.Button() + api_btn_task.click(fn=self.api_get_oracle_task, inputs=[api_xp_op, api_xp_dia, api_review_key], outputs=[api_xp_out], api_name="get_oracle_task") + + api_btn_review = gr.Button() + api_rev_row = gr.Textbox() + api_rev_chain = gr.Textbox() + api_rev_appr = gr.Textbox() + api_rev_reason = gr.Textbox() + api_btn_review.click(fn=self.api_submit_oracle_review, inputs=[api_rev_row, api_rev_chain, api_xp_op, api_xp_dia, api_rev_appr, api_rev_reason, api_review_key], outputs=[api_xp_out], api_name="submit_oracle_review") + + api_btn_appeal = gr.Button() + api_btn_appeal.click(fn=self.api_submit_appeal, inputs=[api_rev_chain, api_xp_op, api_xp_dia, api_review_key], outputs=[api_xp_out], api_name="submit_appeal") + + api_fb_btn = gr.Button() + api_fb_op = gr.Textbox() + api_fb_text = gr.Textbox() + api_fb_img = gr.File() + api_fb_out = gr.Textbox() + api_fb_btn.click( + fn=self.handle_feedback_submission, + inputs=[api_fb_op, api_fb_text, api_fb_img], + outputs=[api_fb_out], + api_name="submit_feedback" + ) + + api_eeqs_btn = gr.Button() + api_eeqs_op = gr.Textbox() + api_eeqs_payload = gr.Textbox() + api_eeqs_out = gr.Textbox() + api_eeqs_btn.click( + fn=self.handle_eeqs_submission, + inputs=[api_eeqs_op, api_eeqs_payload], + outputs=[api_eeqs_out], + api_name="submit_eeqs" + ) + + # 8. Oracle XP and Task Endpoints + api_btn_get_xp = gr.Button() + api_xp_op = gr.Textbox() + api_xp_dialect = gr.Textbox() + api_review_key_v2 = gr.Textbox() + api_xp_out = gr.Textbox() + api_btn_get_xp.click(fn=self.api_get_user_xp, inputs=[api_xp_op, api_xp_dialect], outputs=[api_xp_out], api_name="get_user_xp") + + api_btn_get_oracle = gr.Button() + api_btn_get_oracle.click(fn=self.api_get_oracle_task, inputs=[api_xp_op, api_xp_dialect, api_review_key_v2], outputs=[api_xp_out], api_name="get_oracle_task") + + api_btn_get_graveyard = gr.Button() + api_btn_get_graveyard.click(fn=self.api_get_graveyard_task, inputs=[api_xp_op, api_xp_dialect, api_review_key_v2], outputs=[api_xp_out], api_name="get_graveyard_task") + + api_btn_sub_oracle = gr.Button() + api_sub_row = gr.Textbox() + api_sub_chain = gr.Textbox() + api_sub_approve = gr.Textbox() + api_btn_sub_oracle.click(fn=self.api_submit_oracle_review, inputs=[api_sub_row, api_sub_chain, api_xp_op, api_xp_dialect, api_sub_approve, api_review_key_v2], outputs=[api_xp_out], api_name="submit_oracle_review") + + api_btn_appeal = gr.Button() + api_btn_appeal.click(fn=self.api_submit_appeal, inputs=[api_sub_chain, api_xp_op, api_xp_dialect, api_review_key_v2], outputs=[api_xp_out], api_name="submit_appeal") + + api_language_in = gr.Textbox() + api_btn_submit.click( + fn=self.check_and_submit_logic, + inputs=[ + api_text_in, # 1. transcribed + api_dialect_in, # 2. dialect + api_custom_d, # 3. customD + api_clarify_out, # 4. clarification + api_tone, # 5. tone + api_context, # 6. context + api_pragmatics, # 7. pragmatics + api_source_tag, # 8. sourceTag + api_clar_source, # 9. clar_source + api_user_key, # 10. userKey + api_audio_in, # 11. blob (audio) + api_confirm, # 12. confirm + api_language_in # 13. language + ], + outputs=[feedback_msg, btn_over], + api_name="check_and_submit_logic" + ) + # โฌ†๏ธ END OF API BRIDGE โฌ†๏ธ + + return ui diff --git a/src/watcher_agent.py b/src/watcher_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..6dadf6a50c9e438454b2952ba79e6fb5d5702b05 --- /dev/null +++ b/src/watcher_agent.py @@ -0,0 +1,87 @@ +import time +import threading +from huggingface_hub import HfApi + +# ๐ŸŸข Safe Import for AutoTrain +try: + from autotrain.api import AutoTrainClient + from datasets import load_dataset + AUTOTRAIN_AVAILABLE = True +except ImportError: + print("โš ๏ธ AutoTrain not installed. Watcher Agent will sleep.") + AUTOTRAIN_AVAILABLE = False + +class AgentWatcher: + def __init__(self, config): + print("๐Ÿ•ต๏ธโ€โ™‚๏ธ Watcher Agent (AutoTrain) Online.") + self.config = config + self.hf_token = config.HF_TOKEN + self.dataset_id = config.DATASET_ID + self.threshold = 1000 # Trigger training after this many rows + self.check_interval = 3600 # Check every 1 hour + self._stop_event = threading.Event() + + def trigger_autotrain(self, data_count): + """Launches the training job via AutoTrain API.""" + try: + print(f"๐Ÿš€ [WATCHER] Triggering AutoTrain for {data_count} items...") + client = AutoTrainClient(hf_token=self.hf_token) + + # Create a unique project name based on time + project_name = f"pure-versation-finetune-{int(time.time())}" + + # Create and start project (Speech Recognition task) + client.create_project(project_name, task="speech-recognition") + + print(f"๐Ÿ”ฅ [WATCHER] Training job '{project_name}' started successfully!") + return True + except Exception as e: + print(f"โŒ [WATCHER] AutoTrain Trigger Failed: {e}") + return False + + def check_dataset_status(self): + """Checks the dataset count.""" + print("๐Ÿ” [WATCHER] Checking Pure Chain dataset size...") + + if not self.hf_token: + print("โš ๏ธ [WATCHER] No HF_TOKEN found. Skipping check.") + return + + try: + # Load dataset in Streaming mode (Fast & Lightweight) + ds = load_dataset(self.dataset_id, split="train", streaming=True, token=self.hf_token) + + count = 0 + for _ in ds: + count += 1 + # Safety break to avoid long reads + if count > self.threshold + 500: + break + + print(f"โœ… [WATCHER] Found {count} rows (Threshold: {self.threshold}).") + + if count >= self.threshold: + self.trigger_autotrain(count) + else: + print(f"๐Ÿ’ค [WATCHER] Not enough data yet ({count}/{self.threshold}).") + + except Exception as e: + print(f"โŒ [WATCHER] Error checking dataset: {e}") + + def _loop(self): + """The background loop.""" + while not self._stop_event.is_set(): + if AUTOTRAIN_AVAILABLE: + try: + self.check_dataset_status() + except Exception as e: + print(f"โŒ [WATCHER] Loop Error: {e}") + + # Sleep for interval (default 1 hour) + time.sleep(self.check_interval) + + def start(self): + """Starts the background thread.""" + thread = threading.Thread(target=self._loop, daemon=True) + thread.start() + print("๐Ÿ•ต๏ธโ€โ™‚๏ธ Watcher Agent background thread started.") \ No newline at end of file diff --git a/synthetic_slm_dataset.jsonl b/synthetic_slm_dataset.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test_appeals_workflow.py b/test_appeals_workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..6c39c2ce5ee6cb8422170b49da2dc2d2e40b7a49 --- /dev/null +++ b/test_appeals_workflow.py @@ -0,0 +1,129 @@ +import os +import sys +import json +import time +from web3 import Web3 + +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +from config import AppConfig +from src.trust_agent import AgentTrust +from src.ux_agent import AgentUX + +def run_test(): + trust = AgentTrust(AppConfig) + ux = AgentUX(None, None, trust) + + print("====================================") + print("Testing the Burn Ward / Appeals Workflow...") + print("====================================") + + # 1. Setup Test Actors + operator_id = trust.w3.eth.account.create().address + submitter_id = trust.w3.eth.account.create().address + appeal_operator = trust.w3.eth.account.create().address + dialect = "Test Dialect Appeal Flow" + + contract = trust.w3.eth.contract(address=AppConfig.PURECHAIN_CONTRACT_ADDRESS, abi=AppConfig.CONTRACT_ABI) + + # Grant Oracle Status + print(f"๐Ÿ”ฎ Granting Oracle status to {appeal_operator}...") + nonce = trust.w3.eth.get_transaction_count(trust.account.address) + tx = contract.functions.batchMigrateXP( + [appeal_operator], [dialect], [1500] + ).build_transaction({ + 'from': trust.account.address, + 'nonce': nonce, + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': AppConfig.CHAIN_ID + }) + signed_tx = trust.w3.eth.account.sign_transaction(tx, private_key=AppConfig.PRIVATE_KEY) + tx_hash = trust.w3.eth.send_raw_transaction(signed_tx.raw_transaction) + trust.w3.eth.wait_for_transaction_receipt(tx_hash) + + # 2. Propose Entry On-Chain + print("๐Ÿ“ Proposing Entry...") + nonce = trust.w3.eth.get_transaction_count(trust.account.address) + tx = contract.functions.proposeEntry( + "Test Utterance for Appeal", dialect, "ipfs://test_appeal", "CC-BY", submitter_id + ).build_transaction({ + 'from': trust.account.address, + 'nonce': nonce, + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': AppConfig.CHAIN_ID + }) + signed_tx = trust.w3.eth.account.sign_transaction(tx, private_key=AppConfig.PRIVATE_KEY) + tx_hash = trust.w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = trust.w3.eth.wait_for_transaction_receipt(tx_hash) + + logs = contract.events.EntryProposed().process_receipt(receipt) + entry_id = logs[0]['args']['id'] + print(f"โœ… Proposed Entry ID: {entry_id}") + + # 3. Reject the Entry 3 Times + print("๐Ÿšซ Rejecting entry on-chain (3 times) to set status to Rejected...") + for i in range(3): + rejector = trust.w3.eth.account.create().address + # Grant XP to rejector + tx = contract.functions.batchMigrateXP([rejector], [dialect], [1500]).build_transaction({'from': trust.account.address, 'nonce': trust.w3.eth.get_transaction_count(trust.account.address), 'gas': 3000000, 'gasPrice': 0, 'chainId': AppConfig.CHAIN_ID}) + tx_hash = trust.w3.eth.send_raw_transaction(trust.w3.eth.account.sign_transaction(tx, private_key=AppConfig.PRIVATE_KEY).raw_transaction) + trust.w3.eth.wait_for_transaction_receipt(tx_hash) + + # Reject + tx = contract.functions.rejectEntry(entry_id, rejector, "Test Rejection").build_transaction({'from': trust.account.address, 'nonce': trust.w3.eth.get_transaction_count(trust.account.address), 'gas': 3000000, 'gasPrice': 0, 'chainId': AppConfig.CHAIN_ID}) + tx_hash = trust.w3.eth.send_raw_transaction(trust.w3.eth.account.sign_transaction(tx, private_key=AppConfig.PRIVATE_KEY).raw_transaction) + trust.w3.eth.wait_for_transaction_receipt(tx_hash) + print("โœ… Entry rejected on-chain.") + + # 4. Log to Graveyard CSV + print("๐Ÿ”ฅ Logging to Graveyard CSV...") + trust.add_to_graveyard( + dialect=dialect, + utterance="Test Utterance for Appeal", + clarification="Test Clarification", + tone="Casual / Slang", + context="N/A", + syntax="", + audio_path="test_audio.wav", + pragmatics="", + sourceTag="Pending", + clar_source="User", + userKey=submitter_id, + reason="Dialect Mismatch", + rejector=operator_id, + chain_id=str(entry_id) + ) + print("โœ… Entry added to Graveyard CSV.") + + # 5. Fetch Graveyard Task via API + print("๐Ÿ“ฅ Fetching Graveyard Task for Appeal...") + res = ux.api_get_graveyard_task(appeal_operator, dialect) + task_data = json.loads(res) + print(f" Task Fetched: {task_data}") + + if task_data.get("status") == "success": + fetched_chain_id = task_data["chain_id"] + + # 6. File Appeal via API + print(f"โš–๏ธ Filing Appeal for Chain ID {fetched_chain_id} via API...") + appeal_res = ux.api_submit_appeal(fetched_chain_id, appeal_operator, dialect) + print(f" Appeal API Initial Result: {appeal_res}") + + # Wait for the async thread to finish the on-chain transaction + print("โณ Waiting for on-chain appeal transaction to complete...") + time.sleep(5) + + # 7. Verify Graveyard is empty + res2 = ux.api_get_graveyard_task(appeal_operator, dialect) + task_data2 = json.loads(res2) + print(f"โœ… Graveyard Fetch After Appeal: {task_data2}") + if task_data2.get("status") == "empty": + print("๐ŸŽ‰ SUCCESS! Entry was successfully appealed and removed from the Graveyard.") + else: + print("โŒ FAILURE! Entry still exists in the Graveyard.") + else: + print("โŒ Failed to fetch task.") + +if __name__ == "__main__": + run_test() diff --git a/test_verification.py b/test_verification.py new file mode 100644 index 0000000000000000000000000000000000000000..2c0ae5066acacc9dca023b0fdbf0b6053d9b1f28 --- /dev/null +++ b/test_verification.py @@ -0,0 +1,128 @@ +import os +import sys +from web3 import Web3 +try: + from web3.middleware import ExtraDataToPOAMiddleware as geth_poa_middleware +except ImportError: + from web3.middleware import geth_poa_middleware +import uuid + +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +from config import AppConfig +from src.dynamic_compiler import compile_contract + +def run_test(): + w3 = Web3(Web3.HTTPProvider(AppConfig.PURECHAIN_RPC_URL)) + w3.middleware_onion.inject(geth_poa_middleware, layer=0) + + if not w3.is_connected(): + print("โŒ Cannot connect to PureChain.") + return + + contract_address = AppConfig.PURECHAIN_CONTRACT_ADDRESS + if not contract_address: + print("โŒ PURECHAIN_CONTRACT_ADDRESS missing. Deploy the contract first.") + return + + sol_file = os.path.join(AppConfig.BASE_DIR, "src", "PureBi.sol") + abi, _ = compile_contract(sol_file) + contract = w3.eth.contract(address=contract_address, abi=abi) + + relayer_key = AppConfig.PRIVATE_KEY + if not relayer_key: + print("โŒ Relayer PRIVATE_KEY missing.") + return + + account = w3.eth.account.from_key(relayer_key) + print(f"๐Ÿ”‘ Relayer Address: {account.address}") + + # 1. Simulate a new submitter + submitter = w3.eth.account.create() + print(f"๐Ÿ‘ค Submitter Address: {submitter.address}") + dialect = "Test Dialect" + + # Check initial XP + initial_xp = contract.functions.getXP(submitter.address, dialect).call() + print(f"โ„น๏ธ Initial XP for Submitter: {initial_xp}") + + # 2. Propose Entry + print("๐Ÿ“ Proposing entry...") + nonce = w3.eth.get_transaction_count(account.address) + tx = contract.functions.proposeEntry( + "Hello World", dialect, "ipfs://test", "CC-BY", submitter.address + ).build_transaction({ + 'from': account.address, + 'nonce': nonce, + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': AppConfig.CHAIN_ID + }) + signed_tx = w3.eth.account.sign_transaction(tx, private_key=relayer_key) + tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction) + receipt = w3.eth.wait_for_transaction_receipt(tx_hash) + + # Extract entry ID + logs = contract.events.EntryProposed().process_receipt(receipt) + if not logs: + print("โŒ EntryProposed event not found.") + return + entry_id = logs[0]['args']['id'] + print(f"โœ… Entry proposed with ID: {entry_id}") + + # 3. Verify entry with Oracles + oracle1 = w3.eth.account.create() + oracle2 = w3.eth.account.create() + + # Pre-mint Oracle role (1500 XP) + print("๐Ÿ”ฎ Granting Oracle status to verifiers...") + tx = contract.functions.batchMigrateXP( + [oracle1.address, oracle2.address], + [dialect, dialect], + [1500, 1500] + ).build_transaction({ + 'from': account.address, + 'nonce': w3.eth.get_transaction_count(account.address), + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': AppConfig.CHAIN_ID + }) + tx_hash = w3.eth.send_raw_transaction(w3.eth.account.sign_transaction(tx, private_key=relayer_key).raw_transaction) + w3.eth.wait_for_transaction_receipt(tx_hash) + + # Verify 1 + print(f"๐Ÿ” Oracle 1 ({oracle1.address}) verifying...") + tx = contract.functions.verifyEntry(entry_id, oracle1.address).build_transaction({ + 'from': account.address, + 'nonce': w3.eth.get_transaction_count(account.address), + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': AppConfig.CHAIN_ID + }) + tx_hash = w3.eth.send_raw_transaction(w3.eth.account.sign_transaction(tx, private_key=relayer_key).raw_transaction) + w3.eth.wait_for_transaction_receipt(tx_hash) + + # Check XP (should still be 0 since threshold is 2) + mid_xp = contract.functions.getXP(submitter.address, dialect).call() + print(f"โ„น๏ธ XP after 1 approval (Expected 0): {mid_xp}") + + # Verify 2 + print(f"๐Ÿ” Oracle 2 ({oracle2.address}) verifying...") + tx = contract.functions.verifyEntry(entry_id, oracle2.address).build_transaction({ + 'from': account.address, + 'nonce': w3.eth.get_transaction_count(account.address), + 'gas': 3000000, + 'gasPrice': 0, + 'chainId': AppConfig.CHAIN_ID + }) + tx_hash = w3.eth.send_raw_transaction(w3.eth.account.sign_transaction(tx, private_key=relayer_key).raw_transaction) + w3.eth.wait_for_transaction_receipt(tx_hash) + + # Check final XP + final_xp = contract.functions.getXP(submitter.address, dialect).call() + print(f"โœ… Final XP after 2 approvals (Expected 50): {final_xp}") + + diff_dialect_xp = contract.functions.getXP(submitter.address, "Different Dialect").call() + print(f"โœ… XP in another dialect (Expected 0): {diff_dialect_xp}") + +if __name__ == "__main__": + run_test() diff --git a/update_hf_visibility.py b/update_hf_visibility.py new file mode 100644 index 0000000000000000000000000000000000000000..b0994e7e7151ca4b7a67d908748520af001335b3 --- /dev/null +++ b/update_hf_visibility.py @@ -0,0 +1,18 @@ +import os +from huggingface_hub import update_repo_settings + +def update_visibility(): + hf_token = os.environ.get("HF_TOKEN") + if not hf_token: + print("HF_TOKEN environment variable not set.") + return + + try: + # Make PureVersation space public + update_repo_settings(repo_id="toecm/PureVersation", private=False, repo_type="space", token=hf_token) + print("Successfully set toecm/PureVersation (Space) to PUBLIC.") + except Exception as e: + print(f"Failed to update toecm/PureVersation: {e}") + +if __name__ == "__main__": + update_visibility()