Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions bot.py
Original file line number Diff line number Diff line change
@@ -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)
47 changes: 47 additions & 0 deletions spectr.py
Original file line number Diff line number Diff line change
@@ -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()