Spaces:
Sleeping
Sleeping
File size: 8,806 Bytes
22be9ef 182fb49 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
from typing import Any, Optional
from smolagents.tools import Tool
import os
import requests
class TranslatePhraseTool(Tool):
name = "translate_phrase"
description = "Translates common travel phrases to a local language."
inputs = {
'text': {'type': 'string', 'description': 'Text to translate (e.g., "Hello", "Thank you", "Where is the bathroom?")'},
'language': {'type': 'string', 'description': 'Target language (e.g., "Spanish", "Japanese", "French")'}
}
output_type = "string"
def __init__(self, api_key=None):
super().__init__()
# You can set an API key for a real translation API
self.api_key = api_key or os.environ.get("TRANSLATION_API_KEY")
# Common travel phrases in various languages (for demo/fallback purposes)
self.phrase_translations = {
"hello": {
"spanish": {"text": "Hola", "pronunciation": "oh-lah"},
"french": {"text": "Bonjour", "pronunciation": "bohn-zhoor"},
"italian": {"text": "Ciao", "pronunciation": "chow"},
"german": {"text": "Hallo", "pronunciation": "hah-loh"},
"japanese": {"text": "こんにちは (Konnichiwa)", "pronunciation": "kohn-nee-chee-wah"},
"mandarin": {"text": "你好 (Nǐ hǎo)", "pronunciation": "nee how"},
"arabic": {"text": "مرحبا (Marhaba)", "pronunciation": "mar-ha-ba"},
"russian": {"text": "Здравствуйте (Zdravstvuyte)", "pronunciation": "zdrah-stvooy-tye"},
"portuguese": {"text": "Olá", "pronunciation": "oh-lah"},
"thai": {"text": "สวัสดี (Sawatdee)", "pronunciation": "sa-wat-dee"}
},
"thank you": {
"spanish": {"text": "Gracias", "pronunciation": "grah-see-ahs"},
"french": {"text": "Merci", "pronunciation": "mair-see"},
"italian": {"text": "Grazie", "pronunciation": "graht-see-eh"},
"german": {"text": "Danke", "pronunciation": "dahn-kuh"},
"japanese": {"text": "ありがとう (Arigatou)", "pronunciation": "ah-ree-gah-toh"},
"mandarin": {"text": "谢谢 (Xièxiè)", "pronunciation": "shyeh-shyeh"},
"arabic": {"text": "شكرا (Shukran)", "pronunciation": "shoo-kran"},
"russian": {"text": "Спасибо (Spasibo)", "pronunciation": "spah-see-boh"},
"portuguese": {"text": "Obrigado/a", "pronunciation": "oh-bree-gah-doo/dah"},
"thai": {"text": "ขอบคุณ (Khop khun)", "pronunciation": "kop-koon"}
},
"excuse me": {
"spanish": {"text": "Disculpe", "pronunciation": "dees-kool-peh"},
"french": {"text": "Excusez-moi", "pronunciation": "ex-koo-zay mwah"},
"italian": {"text": "Scusi", "pronunciation": "skoo-zee"},
"german": {"text": "Entschuldigung", "pronunciation": "ent-shool-di-goong"},
"japanese": {"text": "すみません (Sumimasen)", "pronunciation": "soo-mee-mah-sen"},
"mandarin": {"text": "对不起 (Duìbùqǐ)", "pronunciation": "dway-boo-chee"},
"arabic": {"text": "عفوا (Afwan)", "pronunciation": "af-wan"},
"russian": {"text": "Извините (Izvinite)", "pronunciation": "eez-vee-nee-tye"},
"portuguese": {"text": "Com licença", "pronunciation": "com lee-sen-sah"},
"thai": {"text": "ขอโทษ (Kho thot)", "pronunciation": "kor-toht"}
},
"where is the bathroom": {
"spanish": {"text": "¿Dónde está el baño?", "pronunciation": "don-deh es-tah el ban-yo"},
"french": {"text": "Où sont les toilettes?", "pronunciation": "oo son lay twa-let"},
"italian": {"text": "Dov'è il bagno?", "pronunciation": "doh-veh eel ban-yo"},
"german": {"text": "Wo ist die Toilette?", "pronunciation": "vo ist dee twa-let-te"},
"japanese": {"text": "トイレはどこですか (Toire wa doko desu ka)", "pronunciation": "toy-reh wah doh-koh des-kah"},
"mandarin": {"text": "厕所在哪里 (Cèsuǒ zài nǎlǐ)", "pronunciation": "tsuh-swor dzeye nah-lee"},
"arabic": {"text": "أين الحمام (Ayna al-hammam)", "pronunciation": "eye-nah al-ham-mam"},
"russian": {"text": "Где туалет (Gde tualet)", "pronunciation": "g-dyeh too-ah-lyet"},
"portuguese": {"text": "Onde fica o banheiro?", "pronunciation": "on-jee fee-ka oo ban-yay-roo"},
"thai": {"text": "ห้องน้ำอยู่ที่ไหน (Hong nam yu tee nai)", "pronunciation": "hong nam yoo tee nai"}
},
"how much": {
"spanish": {"text": "¿Cuánto cuesta?", "pronunciation": "kwan-toh kwes-tah"},
"french": {"text": "Combien ça coûte?", "pronunciation": "kom-bee-en sa koot"},
"italian": {"text": "Quanto costa?", "pronunciation": "kwan-toh kos-tah"},
"german": {"text": "Wie viel kostet das?", "pronunciation": "vee feel kos-tet das"},
"japanese": {"text": "いくらですか (Ikura desu ka)", "pronunciation": "ee-koo-rah des-kah"},
"mandarin": {"text": "多少钱 (Duōshǎo qián)", "pronunciation": "dwor-shaow chyen"},
"arabic": {"text": "كم الثمن (Kam althaman)", "pronunciation": "kam al-tha-man"},
"russian": {"text": "Сколько это стоит (Skol'ko eto stoit)", "pronunciation": "skol-ka eh-ta stoh-eet"},
"portuguese": {"text": "Quanto custa?", "pronunciation": "kwan-too koos-tah"},
"thai": {"text": "ราคาเท่าไหร่ (Raka tao rai)", "pronunciation": "ra-ka tao-rai"}
}
}
def forward(self, text: str, language: str) -> str:
try:
# Try to use a real translation API if the API key is available
if self.api_key:
try:
url = "https://libretranslate.de/translate"
payload = {
"q": text,
"source": "auto",
"target": language.lower()[:2], # Use first 2 chars as language code
"format": "text"
}
response = requests.post(url, data=payload)
data = response.json()
if 'translatedText' in data:
return f"🗣️ '{text}' in {language.capitalize()}:\n\n{data['translatedText']}"
else:
# Fall back to stored phrases if API call fails
return self._translate_with_stored_phrases(text, language)
except Exception:
# Fall back to stored phrases if any error occurs
return self._translate_with_stored_phrases(text, language)
# If no API key is available, use the stored phrases
return self._translate_with_stored_phrases(text, language)
except Exception as e:
return f"Error translating text: {str(e)}"
def _translate_with_stored_phrases(self, text: str, language: str) -> str:
# Normalize inputs
text_lower = text.lower().strip()
language = language.lower().strip()
# Find the phrase key that most closely matches the input text
matched_phrase = None
for phrase in self.phrase_translations:
if phrase in text_lower or text_lower in phrase:
matched_phrase = phrase
break
if not matched_phrase:
return f"I don't have a translation for '{text}'. Try common travel phrases like 'hello', 'thank you', 'excuse me', etc."
# Find the language that most closely matches the input language
matched_language = None
for lang in self.phrase_translations[matched_phrase]:
if lang in language or language in lang:
matched_language = lang
break
if not matched_language:
return f"I don't have translations for {language}. Try languages like Spanish, French, Italian, German, Japanese, etc."
# Get the translation
translation = self.phrase_translations[matched_phrase][matched_language]
return f"🗣️ '{text}' in {matched_language.capitalize()}:\n\n{translation['text']}\n\nPronunciation: {translation['pronunciation']}" |