feat: add language selection (ru and en)
This commit is contained in:
parent
c7f3e093b4
commit
f5c208ae2d
@ -80,24 +80,46 @@ class TelegramUserBot:
|
||||
response: str = self.gigachat_client.get_response(str(message.chat.id), command_arg)
|
||||
self.logger.debug(f"Received response for chat_id={message.chat.id}")
|
||||
|
||||
# Stop typing animation
|
||||
await client.send_chat_action(message.chat.id, ChatAction.CANCEL)
|
||||
|
||||
# Edit the processing message with the generated response
|
||||
await processing_message.edit_text(response)
|
||||
except Exception as e:
|
||||
# Log the exception details
|
||||
self.logger.error(f"Error processing /ai command for chat_id={message.chat.id}: {e}", exc_info=True)
|
||||
|
||||
# Stop typing animation in case of an error
|
||||
await processing_message.edit_text("An error occurred while processing your request.")
|
||||
finally:
|
||||
# Stop indicating typing action
|
||||
await client.send_chat_action(message.chat.id, ChatAction.CANCEL)
|
||||
|
||||
# Handle any errors and notify the user
|
||||
await processing_message.edit_text("An error occurred while processing your request.")
|
||||
def get_language(self, input_text: str) -> str:
|
||||
"""
|
||||
Determines the language for voice-to-text conversion based on the input parameter.
|
||||
|
||||
Args:
|
||||
input_text (str): The input parameter indicating the language.
|
||||
|
||||
Returns:
|
||||
str: The language code ('en' or 'ru').
|
||||
|
||||
Raises:
|
||||
ValueError: If an invalid language parameter is provided.
|
||||
"""
|
||||
language_params: dict[str, list[str]] = {
|
||||
'en': ['en', 'eng', 'english'],
|
||||
'ru': ['ru', 'rus', 'russian']
|
||||
}
|
||||
|
||||
input_lower: str = input_text.lower()
|
||||
for lang_code, aliases in language_params.items():
|
||||
if input_lower in aliases:
|
||||
return lang_code
|
||||
raise ValueError(
|
||||
"Invalid language parameter. Please use one of the following:\n" +
|
||||
"\n".join(f"{lang_code}: {', '.join(aliases)}" for lang_code, aliases in language_params.items())
|
||||
)
|
||||
|
||||
|
||||
async def handle_voice_command(self, client: Client, message: Message) -> None:
|
||||
"""
|
||||
Handle the /voice command to convert a voice message to text.
|
||||
Handle the /voice command to convert a voice message to text with optional language selection.
|
||||
|
||||
Args:
|
||||
client (Client): The Pyrogram Client instance.
|
||||
@ -105,6 +127,14 @@ class TelegramUserBot:
|
||||
"""
|
||||
self.logger.info(f"Received /voice command from chat_id={message.chat.id}.")
|
||||
|
||||
# Parse the language parameter (default to Russian)
|
||||
command_parts: list[str] = message.text.split()
|
||||
try:
|
||||
language: str = self.get_language(command_parts[1]) if len(command_parts) > 1 else 'ru'
|
||||
except ValueError as e:
|
||||
await message.reply(str(e), quote=True)
|
||||
return
|
||||
|
||||
# Check if the reply is to a voice message
|
||||
if not (message.reply_to_message and message.reply_to_message.voice):
|
||||
self.logger.warning("The /voice command was not used in reply to a voice message.")
|
||||
@ -119,14 +149,16 @@ class TelegramUserBot:
|
||||
self.logger.info(f"Voice message downloaded to {file_path}.")
|
||||
|
||||
try:
|
||||
# Attempt to convert voice to text
|
||||
text: str = speech_recognition.convert_voice_to_text(file_path) # type: ignore
|
||||
# Start typing animation
|
||||
await client.send_chat_action(message.chat.id, ChatAction.TYPING)
|
||||
|
||||
# Attempt to convert voice to text with the selected language
|
||||
text: str = speech_recognition.convert_voice_to_text(file_path, language=language) # type: ignore
|
||||
self.logger.info("Voice message successfully converted to text.")
|
||||
|
||||
# Format the text for sending
|
||||
formatted_text: str = (
|
||||
"<b>Conversion Result:</b>"
|
||||
"<pre>"
|
||||
f"<pre language=\"Conversion Result ({language})\">"
|
||||
f"{text}"
|
||||
"</pre>"
|
||||
)
|
||||
@ -142,6 +174,9 @@ class TelegramUserBot:
|
||||
except Exception:
|
||||
self.logger.error("An unexpected error occurred.", exc_info=True)
|
||||
await processing_message.edit_text("An error occurred while processing the voice message. Please try again later.")
|
||||
finally:
|
||||
# Stop indicating typing action
|
||||
await client.send_chat_action(message.chat.id, ChatAction.CANCEL)
|
||||
|
||||
def run(self) -> None:
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user