fixed ai workspace voice google issue

This commit is contained in:
ValueOn AG 2026-04-19 00:19:42 +02:00
parent 50107a91ba
commit 24ff6058d5
3 changed files with 48 additions and 21 deletions

View file

@ -562,16 +562,34 @@ class ConnectorGoogleSpeech:
"""Google TTS WaveNet cost: ~$0.000004/char.""" """Google TTS WaveNet cost: ~$0.000004/char."""
return round(characterCount * 0.000004, 8) return round(characterCount * 0.000004, 8)
@staticmethod
def _normalizeLanguageCode(code: Optional[str]) -> Optional[str]:
"""Normalize a user/LLM-supplied language hint to an ISO-639-1 code or None.
Google Cloud Translation v2 only accepts ISO codes (e.g. 'de', 'en') or
an omitted source for auto-detection. Strings like 'auto', '' or full
BCP-47 tags ('de-DE') would otherwise reach the API and trigger
'400 Invalid Value'. Centralising the mapping here keeps every caller
(tools, interface, internal pipelines) safe.
"""
if not code:
return None
normalized = code.strip().lower()
if not normalized or normalized in ("auto", "detect", "any", "*"):
return None
return normalized.split("-")[0]
async def translateText(self, text: str, targetLanguage: str = "en", async def translateText(self, text: str, targetLanguage: str = "en",
sourceLanguage: str = "de") -> Dict: sourceLanguage: Optional[str] = None) -> Dict:
""" """
Translate text using Google Cloud Translation API. Translate text using Google Cloud Translation API.
Args: Args:
text: Text to translate text: Text to translate
target_language: Target language code (e.g., 'en', 'de') targetLanguage: Target language code (e.g., 'en', 'de')
source_language: Source language code (e.g., 'de', 'en') sourceLanguage: Source language code (e.g., 'de', 'en'); pass None
or 'auto' for Google's auto-detection.
Returns: Returns:
Dict containing translated text and metadata Dict containing translated text and metadata
""" """
@ -583,14 +601,18 @@ class ConnectorGoogleSpeech:
"translated_text": "", "translated_text": "",
"error": "Empty text provided" "error": "Empty text provided"
} }
logger.info(f"🌐 Translating: '{text}' ({sourceLanguage} -> {targetLanguage})") normalizedSource = self._normalizeLanguageCode(sourceLanguage)
normalizedTarget = self._normalizeLanguageCode(targetLanguage) or "en"
# Perform translation logger.info(
f"🌐 Translating: '{text}' "
f"({normalizedSource or 'auto'} -> {normalizedTarget})"
)
result = self.translate_client.translate( result = self.translate_client.translate(
text, text,
source_language=sourceLanguage, source_language=normalizedSource,
target_language=targetLanguage target_language=normalizedTarget,
) )
translatedText = result['translatedText'] translatedText = result['translatedText']
@ -708,8 +730,8 @@ class ConnectorGoogleSpeech:
# Step 2: Translation # Step 2: Translation
translationResult = await self.translateText( translationResult = await self.translateText(
text=originalText, text=originalText,
sourceLanguage=fromLanguage.split('-')[0], # Convert 'de-DE' to 'de' sourceLanguage=fromLanguage,
targetLanguage=toLanguage.split('-')[0] # Convert 'en-US' to 'en' targetLanguage=toLanguage,
) )
if not translationResult["success"]: if not translationResult["success"]:

View file

@ -181,21 +181,26 @@ class VoiceObjects:
"error": str(e) "error": str(e)
} }
async def translateText(self, text: str, sourceLanguage: str = "de", async def translateText(self, text: str,
sourceLanguage: Optional[str] = None,
targetLanguage: str = "en") -> Dict[str, Any]: targetLanguage: str = "en") -> Dict[str, Any]:
""" """
Translate text using Google Cloud Translation API. Translate text using Google Cloud Translation API.
Args: Args:
text: Text to translate text: Text to translate
sourceLanguage: Source language code (e.g., 'de', 'en') sourceLanguage: Source language ISO code (e.g. 'de', 'en'); pass None
targetLanguage: Target language code (e.g., 'en', 'de') or 'auto' to let Google auto-detect.
targetLanguage: Target language ISO code (e.g. 'en', 'de')
Returns: Returns:
Dict containing translated text and metadata Dict containing translated text and metadata
""" """
try: try:
logger.info(f"🌐 Translation request: '{text}' ({sourceLanguage} -> {targetLanguage})") logger.info(
f"🌐 Translation request: '{text}' "
f"({sourceLanguage or 'auto'} -> {targetLanguage})"
)
if not text.strip(): if not text.strip():
return { return {

View file

@ -670,7 +670,7 @@ def _registerWorkspaceTools(registry: ToolRegistry, services):
from modules.interfaces.interfaceVoiceObjects import getVoiceInterface from modules.interfaces.interfaceVoiceObjects import getVoiceInterface
mandateId = context.get("mandateId", "") mandateId = context.get("mandateId", "")
voiceInterface = getVoiceInterface(currentUser=None, mandateId=mandateId) voiceInterface = getVoiceInterface(currentUser=None, mandateId=mandateId)
sourceLanguage = args.get("sourceLanguage", "auto") sourceLanguage = args.get("sourceLanguage") or None
result = await voiceInterface.translateText(text, sourceLanguage=sourceLanguage, targetLanguage=targetLanguage) result = await voiceInterface.translateText(text, sourceLanguage=sourceLanguage, targetLanguage=targetLanguage)
if result and result.get("success"): if result and result.get("success"):
translated = result.get("translated_text", "") translated = result.get("translated_text", "")
@ -735,7 +735,7 @@ def _registerWorkspaceTools(registry: ToolRegistry, services):
"properties": { "properties": {
"text": {"type": "string", "description": "Text to translate"}, "text": {"type": "string", "description": "Text to translate"},
"targetLanguage": {"type": "string", "description": "Target language ISO code (e.g. 'en', 'de', 'fr')"}, "targetLanguage": {"type": "string", "description": "Target language ISO code (e.g. 'en', 'de', 'fr')"},
"sourceLanguage": {"type": "string", "description": "Source language ISO code (default: auto-detect)"}, "sourceLanguage": {"type": "string", "description": "Source language ISO code (e.g. 'de', 'en'). Omit or leave empty for auto-detection."},
}, },
"required": ["text", "targetLanguage"] "required": ["text", "targetLanguage"]
}, },