diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..13cd026 --- /dev/null +++ b/bot.py @@ -0,0 +1,80 @@ +import logging +from aiogram import Bot, Dispatcher, types, executor +from dotenv import load_dotenv +from pathlib import Path +from spectr import create_spectrogram +import os + +dotenv_path = Path('.env.txt') +load_dotenv(dotenv_path=dotenv_path) + +# logging so don't miss important messages +logging.basicConfig(level=logging.INFO) +bot_token = os.getenv("BOT_TOKEN") +# bot's object +bot = Bot(token=bot_token) +dp = Dispatcher(bot) + + +# handler for /start +@dp.message_handler(commands='start') +async def cmd_start(message: types.Message): + await message.answer('Hello!') + + +user_home_dir = os.path.expanduser('~') +user = os.path.split(user_home_dir)[-1] +disk = os.path.split(user_home_dir)[0] +common_path = os.path.join(disk, user, 'Desktop') + +try: + if not os.path.isdir('Downloaded audio'): + os.chdir(common_path) + os.mkdir('Downloaded audio"') +except: + print() + + +# handler for audio messages, voice messages and photos +@dp.message_handler(content_types=['audio', 'voice', 'photo']) +async def show_spectrogram(message: types.Message): + unique_id = path_to_file = format_file = file_info = '' + # getting a directory for saving a file + directory = os.path.join(disk, user, 'Desktop', 'Downloaded audio') + # checking a type of message + if message.audio is not None: + audio_id = message.audio.file_id + unique_id = message.audio.file_unique_id + file_info = await bot.get_file(audio_id) + path_to_file = os.path.join(directory, f'{unique_id}.mp3') + format_file = 'mp3' + elif message.voice is not None: + audio_id = message.voice.file_id + unique_id = message.voice.file_unique_id + file_info = await bot.get_file(audio_id) + path_to_file = os.path.join(directory, f'{unique_id}.ogg') + format_file = 'ogg' + + # downloading a file + try: + await bot.download_file(file_info.file_path, + destination=os.path.join(path_to_file)) + await message.answer("Your audio is successfully downloaded") + except: + await message.answer("Error downloading") + + create_spectrogram(path_to_file, unique_id) + + path_to_photo = os.path.join(disk, user, 'Desktop', 'Created spectrograms', f'{unique_id}.png') + # showing spectrogram + print(path_to_photo) + try: + with open(path_to_photo, 'rb') as photo: + await message.answer_photo(photo, caption='Your spectrogram') + photo.close() + except: + await message.answer("Error showing") + + +if __name__ == '__main__': + executor.start_polling(dp, skip_updates=True) diff --git a/spectr.py b/spectr.py new file mode 100644 index 0000000..9c75191 --- /dev/null +++ b/spectr.py @@ -0,0 +1,47 @@ +from pydub import AudioSegment +import matplotlib.pyplot as plt +from scipy.io import wavfile +from scipy.signal import spectrogram +import numpy as np +import os + +user_home_dir = os.path.expanduser('~') +user = os.path.split(user_home_dir)[-1] +disk = os.path.split(user_home_dir)[0] +common_path = os.path.join(disk, user, 'Desktop') + + +def create_spectrogram(path_to_file: str, unique_id: str): + input_file = f'{path_to_file}' + output_file = f'{path_to_file}.wav' + + if input_file[-3:] == 'mp3': + sound = AudioSegment.from_mp3(input_file) + sound.export(output_file, format='wav') + elif input_file[-3:] == 'ogg': + sound = AudioSegment.from_ogg(input_file) + sound.export(output_file, format='wav') + + output_file_mono = f'{output_file}_mono.wav' + + stereo_audio = AudioSegment.from_file(output_file, format='wav') + mono_audios = stereo_audio.split_to_mono() + mono_left = mono_audios[0].export(output_file_mono, format='wav') + + samplerate, data = wavfile.read(output_file_mono) + f, t, Sxx = spectrogram(data, samplerate) + + plt.pcolormesh(1000 * t, f / 1000, 10 * np.log10(Sxx / Sxx.max()), vmin=-120, vmax=0, cmap='inferno') + plt.ylabel('Frequency [kHz]') + plt.xlabel('Time [ms]') + plt.colorbar() + img = f'{unique_id}.png' + try: + if not os.path.isdir('Created spectrograms'): + os.chdir(common_path) + os.mkdir('Created spectrograms') + except: + print() + path = os.path.join(disk, user, 'Desktop', 'Created spectrograms', img) + plt.savefig(path) + plt.clf() \ No newline at end of file