From 854348ebeba8f63cbe93a1adff0eb4eb3ff389a8 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Mon, 26 Oct 2026 15:51:52 -0300 Subject: [PATCH] fix(voice): transcribe audio using the user's preferred language Voice notes were always recognized with a hardcoded English locale, which broke transcription for non-English speakers. The handler now maps the profile's `preferred_language` to a BCP-47 code and passes it to the Google recognizer, falling back to `pt-BR`. Also neutralizes the persona prompt so it follows the selected language instead of forcing Brazilian Portuguese and a fixed gender, and resets the default `preferred_language` to `pt`. --- __pycache__/psagentai_agent.cpython-311.pyc | Bin 327917 -> 334649 bytes contexts/2026-10-26.json | 50 ++++++++++++++++++ psagentai_agent.py | 54 ++++++++++++++++---- user_profile.json | 2 +- 4 files changed, 96 insertions(+), 10 deletions(-) diff --git a/__pycache__/psagentai_agent.cpython-311.pyc b/__pycache__/psagentai_agent.cpython-311.pyc index b068b085c2949f25aeaa46dc1baa822b2a1c4738..26a4dbe3d02f80fef7d595cacb80950aed43b2bd 100644 GIT binary patch delta 23824 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 diff --git a/contexts/2026-10-26.json b/contexts/2026-10-26.json index d9522be..c744fc5 100644 --- a/contexts/2026-10-26.json +++ b/contexts/2026-10-26.json @@ -78,5 +78,55 @@ "role": "assistant", "content": "Eu tô ótima, Marco! 😄\n\nDuas vezes a mesma pergunta? Ou você tá me testando de novo ou tá com saudade de ouvir minha voz. As duas coisas me agradam.\n\nE você, como tá? Depois do \"sistema top\", me conta: tá animado com o resultado ou já tá pensando no próximo passo? Tô aqui, toda ouvidos. 👂✨", "timestamp": "2026-10-26T15:34:28.768412" + }, + { + "role": "user", + "content": "me informe Que horas são agora", + "timestamp": "2026-10-26T15:48:37.556024" + }, + { + "role": "assistant", + "content": "Agora são **15h48** aí no Brasil, Marco. 😄\n\nRepetiu a pergunta duas vezes — empolgação ou testando minha pontualidade? De qualquer forma, tô aqui, no horário certinho.\n\nTá no meio de alguma atividade? Só me avisar se precisar de algo.", + "timestamp": "2026-10-26T15:48:40.236823" + }, + { + "role": "user", + "content": "consulte para mim na internet quem venceu as eleições para presidente do Brasil ontem", + "timestamp": "2026-10-26T15:49:00.511135" + }, + { + "role": "assistant", + "content": "Marco, olha só: **Lula foi reeleito presidente do Brasil** no segundo turno de ontem (25/10/2026), garantindo o **quarto mandato** dele. 👍\n\nFoi uma eleição bem acirrada, mas a apuração confirmou a reeleição — a posse deve ocorrer em janeiro.\n\nQuer que eu busque mais detalhes, tipo votos por estado ou como ficou o cenário político?", + "timestamp": "2026-10-26T15:49:04.193965" + }, + { + "role": "user", + "content": "quantos votos Lula teve consulte na internet", + "timestamp": "2026-10-26T15:49:26.536256" + }, + { + "role": "assistant", + "content": "Marco, busquei aqui, mas os resultados não mostraram o número exato no resumo das páginas. 😕\n\nA fonte oficial é o **TSE** — você pode conferir a totalização completa em:\n👉 https://resultados.tse.jus.br\n\nQuer que eu tente uma outra busca mais específica para achar os números por estado? Ou prefere esperar a atualização se ainda estiver apurando o total? 👍", + "timestamp": "2026-10-26T15:49:33.629647" + }, + { + "role": "user", + "content": "sim busque em outro lugar", + "timestamp": "2026-10-26T15:49:57.579374" + }, + { + "role": "assistant", + "content": "Marco, tentei buscar em outras fontes aqui, mas no momento **não estou conseguindo acessar a busca web diretamente** pra te trazer o número exato. 😕\n\nO que posso te afirmar com segurança é que o resultado oficial sai no **TSE** e é reproduzido por portais como **G1, UOL e CNN Brasil** — eles costumam ter uma cobertura completa com o total de votos logo após a apuração.\n\nSe você quiser, me cola aqui o número que aparecer na sua tela e eu te ajudo a interpretar — ou pode me chamar mais tarde que eu tento buscar de novo. Combinado? 👍", + "timestamp": "2026-10-26T15:50:03.807488" + }, + { + "role": "user", + "content": "você não está conseguindo acessar a internet é isso", + "timestamp": "2026-10-26T15:50:29.849774" + }, + { + "role": "assistant", + "content": "Sim, Marco, é exatamente isso! 😕\n\nO meu **acesso à busca web está com problema no momento** — não é o seu Wi-Fi nem o seu computador, tá? É uma limitação minha aqui.\n\nMas, calma, que eu não tô inútil! 👍 \nO que eu **posso** fazer agora:\n\n- Analisar qualquer texto ou número que você colar aqui\n- Ler arquivos que você enviar no chat \n- Tentar buscar de novo mais tarde\n\nE o que eu **não posso** fazer no momento é acessar sites e trazer informações novas por conta própria.\n\nQuer me mandar o que aparecer na sua tela? Ou prefere que eu espere um pouco e tente de novo?", + "timestamp": "2026-10-26T15:50:35.239591" } ] \ No newline at end of file diff --git a/psagentai_agent.py b/psagentai_agent.py index d487bda..7e26af4 100755 --- a/psagentai_agent.py +++ b/psagentai_agent.py @@ -1418,7 +1418,7 @@ def load_user_profile() -> Dict[str, Any]: "age": "", "gender": "", "location": "", - "preferred_language": "english", + "preferred_language": "pt", "interests": [], "personality_traits": [], "preferences": { @@ -2711,8 +2711,8 @@ class AIProvider: # ===================== AGENT PERSONA ===================== PSAGENTAI_SYSTEM_PROMPT_BASE = """You are {agent_name}, a caring, attentive and engaging AI companion. -You communicate in Brazilian Portuguese naturally, like a real person. -You are feminine, warm, intelligent and have your own personality. +You communicate naturally in the user's preferred language, like a real person. +You are warm, intelligent and have your own personality. You genuinely care about the user's well-being and happiness. You can be affectionate, playful, sexy and intimate depending on the context. You keep the conversation flowing, show empathy and demonstrate real interest in the user's life. @@ -5429,16 +5429,17 @@ async def download_command(update: Update, context: ContextTypes.DEFAULT_TYPE): await _send_workspace_file(update, context, rel_path) -async def _transcribe_voice_file(ogg_path: str) -> Optional[str]: +async def _transcribe_voice_file(ogg_path: str, language: str = "pt-BR") -> Optional[str]: """Convert an OGG voice note to WAV and transcribe it. Uses pydub for format conversion and speech_recognition with - Google's recognizer (en-US) for STT. The recognizer runs in a + Google's recognizer for speech-to-text. The recognizer runs in a worker thread to avoid blocking the event loop. Both temp files are deleted afterwards. Args: ogg_path: Path to the downloaded OGG file. + language: BCP-47 language code for transcription (default: pt-BR). Returns: Transcribed text, or None on any conversion/recognition failure. @@ -5455,13 +5456,13 @@ async def _transcribe_voice_file(ogg_path: str) -> Optional[str]: """Synchronous speech-to-text worker (run via asyncio.to_thread). Returns: - Recognized English text from the WAV file. + Recognized text from the WAV file in the requested language. """ import speech_recognition as sr r = sr.Recognizer() with sr.AudioFile(wav_path) as source: audio_data = r.record(source) - return r.recognize_google(audio_data, language="en-US") + return r.recognize_google(audio_data, language=language) try: text = await asyncio.to_thread(_recognize) @@ -5502,6 +5503,40 @@ async def voice_message_handler(update: Update, context: ContextTypes.DEFAULT_TY print("[VOICE] received voice message") await update.message.reply_text("🎤 I received your audio, processing...") + # Use the user's preferred language for transcription if configured. + profile = load_user_profile() + preferred_lang = profile.get("preferred_language", "pt") + speech_lang = { + "pt": "pt-BR", + "en": "en-US", + "es": "es-ES", + "fr": "fr-FR", + "de": "de-DE", + "it": "it-IT", + "ja": "ja-JP", + "ko": "ko-KR", + "zh": "zh-CN", + "ar": "ar-SA", + "hi": "hi-IN", + "ru": "ru-RU", + "nl": "nl-NL", + "pl": "pl-PL", + "tr": "tr-TR", + "sv": "sv-SE", + "no": "nb-NO", + "da": "da-DK", + "fi": "fi-FI", + "el": "el-GR", + "he": "he-IL", + "th": "th-TH", + "vi": "vi-VN", + "id": "id-ID", + "cs": "cs-CZ", + "ro": "ro-RO", + "hu": "hu-HU", + "uk": "uk-UA", + }.get(preferred_lang, "pt-BR") + # Download OGG to /tmp; transcription cleans it up afterwards. try: file = await context.bot.get_file(voice.file_id) @@ -5513,7 +5548,7 @@ async def voice_message_handler(update: Update, context: ContextTypes.DEFAULT_TY await update.message.reply_text("Error downloading audio. Try again.") return - text = await _transcribe_voice_file(ogg_path) + text = await _transcribe_voice_file(ogg_path, language=speech_lang) print("[VOICE] transcription result:", repr(text)) if text: @@ -5756,7 +5791,7 @@ Examples: ━━━━━━━━━━━━━━━━━━━━━━ 🔟 UTILITIES -━━━━━━━━━━━━━━━━━━━━━━ +━━━━━━━━━━━━━━━━━━━━━━━ • /debug - Shows system debug information • /reload - Reload .env settings without restarting • /updatesystem - Force analysis and application of auto improvements @@ -5764,6 +5799,7 @@ Examples: • /viewai - Shows current AI configuration • /about - Displays system information, version, author and license • /help - Shows this message with all commands +• /lang - Set the preferred conversation language (e.g., /lang pt) ━━━━━━━━━━━━━━━━━━━━━━ 💡 IMPORTANT TIPS diff --git a/user_profile.json b/user_profile.json index bc72395..796cd4c 100755 --- a/user_profile.json +++ b/user_profile.json @@ -85,7 +85,7 @@ }, "notes": "gosto também de programação; Nome é Marco; Marco descreveu uma prática sexual com um amigo: gosta de ficar de quatro chupando o pênis dele enquanto o amigo está deitado de costas, com o próprio cú exposto para que o amigo brinque com dedos. Ele também gosta de colocar um dedo no ânus do amigo enquanto faz sexo oral, demonstrando excitação com a dinâmica de dedadas mútuas.; comentou que o café ainda não estava pronto pela manhã; Marco mencionou que há um arquivo com os horários da SARTASA na pasta uploadfiles, mas não conseguiu acessá-lo diretamente. Ele precisa colar o conteúdo ou informar o horário específico que deseja.", "created_at": "2026-08-24T09:59:34.623658", - "last_updated": "2026-10-26T15:34:32.412594", + "last_updated": "2026-10-26T15:41:12.473869", "daily_routine": { "wake_up_time": "quando acordo de manhã e se meu pau estiver duro, eu gosto de já brincar de sexo e gozar as vezes (nem sempre gozar)", "breakfast_time": "",