Spaces:
Sleeping
Sleeping
| """ | |
| Offline rule-based Tamil intent matcher — mirrors IntentParser.java from the Android app. | |
| Add more keyword variants as you test with real farmer speech. | |
| """ | |
| INTENT_KEYWORDS = { | |
| "SOIL_MOISTURE_QUERY": ["மண் ஈரப்பதம்", "மண்ணின் ஈரப்பதம்", "நிலத்தில் தண்ணீர்", "மண் எப்படி"], | |
| "TEMPERATURE_QUERY": ["வெப்பநிலை", "சூடு எவ்வளவு", "எவ்வளவு சூடு"], | |
| "HUMIDITY_QUERY": ["காற்றின் ஈரப்பதம்", "ஈரப்பதம் எவ்வளவு"], | |
| "PUMP_ON_COMMAND": ["பம்ப் ஆன்", "மோட்டார் ஆன்", "தண்ணீர் விடு", "பம்ப் இயக்கு"], | |
| "PUMP_OFF_COMMAND": ["பம்ப் ஆஃப்", "மோட்டார் ஆஃப்", "தண்ணீர் நிறுத்து", "பம்ப் நிறுத்து"], | |
| "PUMP_STATUS_QUERY": ["பம்ப் இயங்குகிறதா", "மோட்டார் நிலை", "பம்ப் நிலை"], | |
| "WEATHER_QUERY": ["வானிலை", "மழை பெய்யுமா", "இன்று வானிலை"], | |
| "MARKET_PRICE_QUERY": ["சந்தை விலை", "விலை என்ன", "இன்றைய விலை"], | |
| "DISEASE_DETECTION_REQUEST": ["நோய் பரிசோதனை", "தாவர நோய்", "இலை பார்"], | |
| "CROP_RECOMMENDATION_REQUEST": ["பயிர் பரிந்துரை", "என்ன பயிர் போடலாம்", "எந்த பயிர்"], | |
| "GREETING": ["வணக்கம்", "ஹலோ", "எப்படி இருக்க"], | |
| } | |
| def parse_intent(spoken_text: str) -> str: | |
| """Returns the matched intent name, or 'UNKNOWN' if nothing matches.""" | |
| if not spoken_text or not spoken_text.strip(): | |
| return "UNKNOWN" | |
| normalized = spoken_text.strip() | |
| for intent, keywords in INTENT_KEYWORDS.items(): | |
| for keyword in keywords: | |
| if keyword in normalized: | |
| return intent | |
| return "UNKNOWN" | |
| def generate_answer(intent: str, sensor_data: dict) -> str: | |
| """ | |
| Generates the Tamil spoken answer for a given intent. | |
| sensor_data is a dict like: | |
| {"soilMoisture": 45.0, "temperature": 29.5, "humidity": 60.0, "pumpStatus": False} | |
| """ | |
| if intent == "SOIL_MOISTURE_QUERY": | |
| val = sensor_data.get("soilMoisture") | |
| if val is None: | |
| return "மன்னிக்கவும், சென்சார் தகவல் இப்போது கிடைக்கவில்லை." | |
| return f"மண் ஈரப்பதம் தற்போது {round(val)} சதவீதம்." | |
| if intent == "TEMPERATURE_QUERY": | |
| val = sensor_data.get("temperature") | |
| if val is None: | |
| return "மன்னிக்கவும், சென்சார் தகவல் இப்போது கிடைக்கவில்லை." | |
| return f"வெப்பநிலை தற்போது {round(val)} டிகிரி செல்சியஸ்." | |
| if intent == "HUMIDITY_QUERY": | |
| val = sensor_data.get("humidity") | |
| if val is None: | |
| return "மன்னிக்கவும், சென்சார் தகவல் இப்போது கிடைக்கவில்லை." | |
| return f"காற்றின் ஈரப்பதம் தற்போது {round(val)} சதவீதம்." | |
| if intent == "PUMP_STATUS_QUERY": | |
| pump_on = sensor_data.get("pumpStatus", False) | |
| return "பம்ப் தற்போது இயங்குகிறது." if pump_on else "பம்ப் தற்போது நிறுத்தப்பட்டுள்ளது." | |
| if intent == "PUMP_ON_COMMAND": | |
| sensor_data["pumpStatus"] = True | |
| return "பம்ப் இயக்கப்படுகிறது." | |
| if intent == "PUMP_OFF_COMMAND": | |
| sensor_data["pumpStatus"] = False | |
| return "பம்ப் நிறுத்தப்படுகிறது." | |
| if intent == "WEATHER_QUERY": | |
| return "வானிலை தகவலை இப்போது பெறுகிறேன். (weather API integration pending)" | |
| if intent == "MARKET_PRICE_QUERY": | |
| return "சந்தை விலை தகவலை இப்போது பெறுகிறேன். (market API integration pending)" | |
| if intent == "DISEASE_DETECTION_REQUEST": | |
| return "தாவர நோய் கண்டறிதலுக்கு புகைப்படம் எடுக்கவும்." | |
| if intent == "CROP_RECOMMENDATION_REQUEST": | |
| return "பயிர் பரிந்துரைக்கு மண் தகவலை உள்ளிடவும்." | |
| if intent == "GREETING": | |
| return "வணக்கம்! நான் உங்கள் விவசாய உதவியாளர். எப்படி உதவ முடியும்?" | |
| return "மன்னிக்கவும், எனக்கு புரியவில்லை. மீண்டும் சொல்லுங்கள்." |