voice assisted musicplayer system

This commit is contained in:
SATABDA DAS 2022-10-14 12:40:43 +05:30
parent 528b0fb3b1
commit 72d6f9ed73
11 changed files with 451 additions and 0 deletions

View File

@ -0,0 +1,49 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
bin/
build/
develop-eggs/
dist/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# Rope
.ropeproject
# Django stuff:
*.log
*.pot
# Sphinx documentation
docs/_build/

View File

@ -0,0 +1,25 @@
This project contains Ai powered voice activated music player system
the system supports mp3,wav and mpeg audio files
To run the program execute the assistant.py file and say the desired song according to your mood
features of the music player:
-backward button
-forward button
-pause/play button
-progress bar
-volume button
-delete button
-load file button
Requirements:
pyttsx3
SpeechRecognition
os
datetime
pickle
tkinter
pygame
mutagen
time

View File

@ -0,0 +1,84 @@
import pyttsx3
import speech_recognition as sr
import datetime
import os
from player import run
engine = pyttsx3.init('sapi5')
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
playlist = []
def speak(audio):
engine.say(audio)
engine.runAndWait()
def bot_answer(answer):
print("assistant:", answer)
def greetings():
global playlist
hour = int(datetime.datetime.now().hour)
if(hour >= 0 and hour < 12):
speak("good morning")
elif hour >= 12 and hour < 18:
speak("good afternoon")
else:
speak("good evening")
speak("welcome to py-Musicplayer")
bot_answer('say playlist name to play')
playlist = os.listdir('Songs')
bot_answer(playlist)
def action_taker():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Listening...")
speak("listening")
r.adjust_for_ambient_noise(source, duration=5)
audio = r.listen(source)
try:
print("recognizing...")
speak("recognizing")
command = r.recognize_google(audio)
print(f'User:{command}\n"')
except Exception as e:
print(e)
bot_answer("Say that again please....")
return "None"
return command
greetings()
while True:
command = action_taker().lower()
song_playlist = list(map(str.lower, playlist))
if any(command in s for s in song_playlist):
get_ind = song_playlist.index(command)
playlist_name = playlist.index(command)
playlist_name = playlist[get_ind]
playlist_dir = os.path.abspath("./Songs/"+playlist_name)
bot_answer('Playing: '+playlist_name +
'playlist for you with Musicplayer')
speak('playing:'+playlist_name+'playlist for you with music player')
print(playlist_dir)
run(playlist_dir)
elif 'stop' in command:
speak('good bye,have a good day')
bot_answer('exit')
engine.stop()
break
else:
bot_answer('did not get the playlist...')
speak('did not get the playlist')
print(playlist)

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,293 @@
import time
import os
import pickle
import tkinter as tk
from tkinter import Label, filedialog
from tkinter import PhotoImage
from pygame import mixer
from mutagen.mp3 import MP3
import tkinter.ttk as ttk
from tkinter import messagebox
class Player(tk.Frame):
def __init__(self, song_path, master=None):
super().__init__(master)
self.master = master
self.song_path = song_path
self.pack()
mixer.init()
if os.path.exists('songs.pickle'):
with open('songs.pickle', 'rb') as f:
self.playlist = pickle.load(f)
else:
self.playlist = []
self.current = 0
self.paused = True
self.played = False
self.song_length = 0
self.page_layouts()
self.track_config()
self.control_widgets()
self.song_list()
self.retrieve_songs2()
def page_layouts(self):
self.track = tk.LabelFrame(self, text='Song Track',
font=("times new roman", 15, "bold"),
bg="black", fg="white", bd=5, relief=tk.GROOVE)
self.track.config(width=400, height=300)
self.track.grid(row=0, column=0, padx=1)
self.tracklist = tk.LabelFrame(self, text=f'PlayList - {str(len(self.playlist))}',
font=("times new roman", 12, "bold"),
bg="black", fg="white", bd=5, relief=tk.GROOVE)
self.tracklist.config(width=190, height=200)
self.tracklist.grid(row=0, column=1, pady=1)
self.controls = tk.LabelFrame(self,
font=("times new roman", 15, "bold"),
bg="black", fg="white", bd=2, relief=tk.GROOVE)
self.controls.config(width=410, height=80)
self.controls.grid(row=2, column=0, pady=1, padx=1)
self.music_slider = tk.LabelFrame(self,
font=("times new roman", 15, "bold"),
bg="black", fg="white", bd=5, relief=tk.GROOVE)
self.music_slider.config(width=410, height=80)
self.music_slider.grid(row=3, column=0, pady=1, padx=1)
self.func = tk.LabelFrame(self,
font=("times new roman", 12, "bold"),
bg="black", fg="white", bd=5, relief=tk.GROOVE)
self.func.config(width=250, height=210)
self.func.grid(row=3, column=1)
self.promo = tk.LabelFrame(self,
bg="black", fg="white", bd=5, relief=tk.GROOVE)
self.promo.config(width=50, height=50)
self.promo.grid(row=2, column=1)
def track_config(self):
self.views = tk.Label(self.track, image=img)
self.views.configure(width=400, height=240)
self.views.grid(row=0, column=0)
self.musictrack = tk.Label(self.track, font=("times new roman", 16, "bold"),
bg="white", fg="dark blue")
self.musictrack['text'] = 'MP3 Player'
self.musictrack.config(width=30, height=1)
self.musictrack.grid(row=1, column=0, padx=10)
def control_widgets(self):
self.loading = tk.Button(
self.controls, bg='green', fg='white', font=10)
self.loading['text'] = 'Load Songs'
self.loading['command'] = self.retrieve_songs
self.loading.grid(row=0, column=0, padx=10)
self.prev = tk.Button(self.controls, image=prev)
self.prev['command'] = self.prev_song
self.prev.grid(row=0, column=1)
self.pause = tk.Button(self.controls, image=pause)
self.pause['command'] = self.pause_song
self.pause.grid(row=0, column=2)
self.next = tk.Button(self.controls, image=next_)
self.next['command'] = self.next_song
self.next.grid(row=0, column=3)
self.volume = tk.DoubleVar(self)
self.slider = tk.Scale(self.controls, from_=0,
to=10, orient=tk.HORIZONTAL)
self.slider['variable'] = self.volume
self.slider.set(5)
mixer.music.set_volume(1)
self.slider['command'] = self.change_volume
self.slider.grid(row=0, column=4, padx=10, pady=4)
self.mu_slider = ttk.Scale(self.music_slider, from_=0, to=100,
orient=tk.HORIZONTAL, value=0, length=390)
self.mu_slider.grid(pady=20, padx=10)
self.status_bar = Label(self.music_slider, text="Time Elapsed: 0/0")
self.status_bar.grid(pady=1)
self.delet = tk.Button(self.func, text="Delete", bg='green', fg='white', font=15)
self.delet['command'] = self.delete_songs
self.delet.grid(row=0, column=1, padx=39, pady=29)
self.prom = tk.Label(self.promo, text="artgoblin's work", font=("times new roman", 10, "bold", "italic"),
bg="grey", fg="black")
self.prom.grid(row=0, column=2, padx=20, pady=12)
def song_list(self):
self.scrollbar = tk.Scrollbar(self.tracklist, orient=tk.VERTICAL)
self.scrollbar.grid(row=0, column=1, rowspan=5, sticky='ns')
self.list = tk.Listbox(self.tracklist, selectmode=tk.SINGLE,
yscrollcommand=self.scrollbar.set, selectbackground='sky blue')
self.enum_songs()
self.list.config(height=17)
self.list.bind('<Double-1>', self.play_song)
self.scrollbar.config(command=self.list.yview)
self.list.grid(row=0, column=0, rowspan=5)
def retrieve_songs2(self):
self.songlist2 = []
os.chdir(self.song_path)
for files in os.listdir(self.song_path):
try:
if files.endswith(".mp3"):
self.songlist2.append(files)
elif files.endswith(".wav"):
self.songlist2.append(files)
elif files.endswith(".mpeg"):
self.songlist2.append(files)
except:
pass
with open('songs2.pickle', 'wb') as f:
pickle.dump(self.songlist2, f)
self.playlist = self.songlist2
self.tracklist['text'] = f'PlayList - {str(len(self.playlist))}'
self.list.delete(0, tk.END)
self.enum_songs()
def retrieve_songs(self):
self.songlist = []
directory = filedialog.askdirectory()
for root_, dirs, files in os.walk(directory):
for file in files:
if os.path.splitext(file)[1] == '.mp3':
path = (root_ + '/' + file).replace('\\', '/')
self.songlist.append(path)
elif os.path.splitext(file)[1] == '.mpeg':
path = (root_ + '/' + file).replace('\\', '/')
self.songlist.append(path)
elif os.path.splitext(file)[1] == '.wav':
path = (root_ + '/' + file).replace('\\', '/')
self.songlist.append(path)
with open('songs.pickle', 'wb') as f:
pickle.dump(self.songlist, f)
self.playlist = self.songlist
self.tracklist['text'] = f'PlayList - {str(len(self.playlist))}'
self.list.delete(0, tk.END)
self.enum_songs()
def enum_songs(self):
for index, song in enumerate(self.playlist):
self.list.insert(index, os.path.basename(song))
def play_song(self, event=None):
if event is not None:
self.current = self.list.curselection()[0]
for i in range(len(self.playlist)):
self.list.itemconfigure(i, bg="white")
print(self.playlist[self.current])
mixer.music.load(self.playlist[self.current])
self.m = mixer.music.load(self.playlist[self.current])
self.musictrack['anchor'] = 'w'
self.musictrack['text'] = os.path.basename(self.playlist[self.current])
self.pause['image'] = play
self.paused = False
self.played = True
self.list.activate(self.current)
self.list.itemconfigure(self.current, bg='sky blue')
mixer.music.play()
self.update_progress()
def update_progress(self):
song_mut = MP3(self.playlist[self.current])
self.song_length = song_mut.info.length
slider_position = int(self.song_length)
self.mu_slider.config(to=slider_position)
pos_ms = mixer.music.get_pos() / 1000
self.mu_slider.config(value=pos_ms)
clock = time.strftime('%M:%S', time.gmtime(self.song_length))
clock2 = time.strftime('%M:%S', time.gmtime(pos_ms))
self.status_bar.config(text=f'Time Elapsed: {clock2} / {clock} ')
self.after(1000, self.update_progress)
def pause_song(self):
if not self.paused:
self.paused = True
mixer.music.pause()
self.pause['image'] = pause
else:
if self.played == False:
self.play_song()
self.paused = False
mixer.music.unpause()
self.pause['image'] = play
def prev_song(self):
if self.current > 0:
self.current -= 1
else:
self.current = 0
self.list.itemconfigure(self.current + 1, bg='white')
self.play_song()
def next_song(self):
if self.current < len(self.playlist) - 1:
self.current += 1
else:
self.current = 0
self.list.itemconfigure(self.current - 1, bg='white')
self.play_song()
def change_volume(self, event=None):
self.v = self.volume.get()
mixer.music.set_volume(self.v / 10)
def delete_songs(self, event=None):
items = map(int, self.list.curselection())
for item in items:
self.list.delete(item)
self.playlist.pop(item)
self.tracklist['text'] = 'Total Songs: ' + str(len( self.playlist))
def run(song_path):
global img, prev, play, next_, pause
root = tk.Tk()
root.title('MP3 Player')
root.geometry("572x458")
def on_closing():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
mixer.music.stop()
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing)
os.path.join(os.path.curdir, 'file.name')
img = PhotoImage(file=os.path.join(os.path.curdir, 'images/image2.gif'))
next_ = PhotoImage(file=os.path.join(os.path.curdir, 'images/next.gif'))
prev = PhotoImage(file=os.path.join(os.path.curdir, 'images/previous.gif'))
play = PhotoImage(file=os.path.join(os.path.curdir, 'images/play.gif'))
pause = PhotoImage(file=os.path.join(os.path.curdir, 'images/pause.gif'))
app = Player(song_path, master=root)
app.mainloop()