herolib_python/lib/clients/telegram/bot_audio.py
2025-08-05 15:15:36 +02:00

73 lines
2.8 KiB
Python

import os
from pydub import AudioSegment
import whisper
def audio_add(self):
self.model = whisper.load_model("base")
@self.bot.message_handler(content_types=['audio', 'voice']) #, 'document'
def handle_audio(message):
try:
chat_id = message.chat.id
file_info = None
audio_path = None
if message.content_type == 'audio':
file_info = self.bot.get_file(message.audio.file_id)
audio_path = f"/tmp/audio/{message.audio.file_id}.mp3"
elif message.content_type == 'voice':
file_info = self.bot.get_file(message.voice.file_id)
audio_path = f"/tmp/audio/{message.voice.file_id}.ogg"
if file_info:
downloaded_file = self.bot.download_file(file_info.file_path)
# Ensure the directory exists
os.makedirs(os.path.dirname(audio_path), exist_ok=True)
# Save the audio file
with open(audio_path, 'wb') as new_file:
new_file.write(downloaded_file)
#bot.send_message(chat_id, f"Audio received and saved successfully to {audio_path}.")
print(f"Audio received and saved to {audio_path}")
# Convert to WAV format if necessary
wav_path = audio_path.replace('.mp3', '.wav').replace('.ogg', '.wav')
if audio_path.endswith('.mp3') or audio_path.endswith('.ogg'):
audio = AudioSegment.from_file(audio_path)
audio.export(wav_path, format='wav')
else:
wav_path = audio_path
# Transcribe audio using Whisper
result = self.model.transcribe(wav_path)
transcription = result["text"]
self.bot.send_message(chat_id, transcription, parse_mode='Markdown')
print(f"Audio received and saved to {audio_path}")
print(f"Transcription: {transcription}")
text2 = self.text_process(self,transcription)
print(f"Processed text {chat_id}: {text2}")
if len(text2)>0:
self.bot.send_message(chat_id, text2)
except Exception as e:
error_message = {
'app': 'Telegram Bot',
'function': 'handle_audio',
'msg': 'Failed to process audio file',
'exception_type': type(e).__name__,
'exception_message': str(e)
}
self.send_error_to_telegram(chat_id, error_message)
print(f"Error processing audio file: {e}")