import pyttsx3
import datetime
import speech_recognition as sr
import wikipedia
import webbrowser as wb
import os
import random
import pyautogui
import sounddevice as sd
import numpy as np
# Initialize the speech engine
engine = pyttsx3.init()
# Advanced `speak` function
def speak(audio, voice_gender='female', rate=150, volume=1.0, block=True) -> None:
"""
Speaks the given audio text with additional customizations for voice gender,
speaking rate, volume, and blocking/non-blocking behavior.
Parameters:
audio (str): The text to be spoken.
voice_gender (str): Voice type; 'male' or 'female'. Default is 'female'.
rate (int): Speaking speed (words per minute). Default is 150.
volume (float): Volume level between 0.0 and 1.0. Default is 1.0.
block (bool): If True, waits until speaking is finished; if False, runs asynchronously.
"""
try:
# Set voice based on gender
voices = engine.getProperty('voices')
if voice_gender.lower() == 'male':
engine.setProperty('voice', voices[0].id) # Typically male voice
else:
engine.setProperty('voice', voices[1].id) # Typically female voice
# Set speaking rate (words per minute)
engine.setProperty('rate', rate)
# Set volume level
engine.setProperty('volume', volume)
# Queue the audio text to speak
engine.say(audio)
# Decide whether to block or not
if block:
engine.runAndWait()
else:
# Non-blocking execution
engine.iterate()
except Exception as e:
print("Error in TTS engine:", e)
# Example Usage
speak("Welcome back, Erick! ",
voice_gender='female',
rate=180,
volume=0.9,
block=True)
def time() -> None:
current_time = datetime.datetime.now().strftime("%I:%M:%S")
speak("The current time is " + current_time)
print("The current time is", current_time)
def date() -> None:
day = datetime.datetime.now().day
month = datetime.datetime.now().month
year = datetime.datetime.now().year
speak(f"The current date is {day}/{month}/{year}")
print(f"The current date is {day}/{month}/{year}")
def wishme() -> None:
hour = datetime.datetime.now().hour
if 4 <= hour < 12:
speak("Good Morning!")
elif 12 <= hour < 16:
speak("Good Afternoon!")
elif 16 <= hour < 24:
speak("Good Evening!")
else:
speak("Good Night!")
speak("Mint at your service. How may I help you sir!.")
def screenshot() -> None:
img = pyautogui.screenshot()
img_path = os.path.expanduser("~\\Pictures\\screenshot.png")
img.save(img_path)
speak("Screenshot taken. Please check your pictures folder.")
# Function to listen for the wake word
def listen_for_wake_word(wake_word="mint"):
recognizer = sr.Recognizer()
while True:
with sr.Microphone() as source:
print("Listening for wake word...")
audio = recognizer.listen(source, phrase_time_limit=3)
try:
query = recognizer.recognize_google(audio, language="en").lower()
print(f"Detected: {query}")
if wake_word in query:
speak("Yes, sir?")
return
except sr.UnknownValueError:
pass
except sr.RequestError:
speak("There seems to be an issue with the recognition service.")
break
# Function to capture a command after the wake word is detected
def takecommand(language="en-in", timeout=5, max_retries=3) -> str:
"""
Listens for a voice command and returns the recognized text.
Parameters:
language (str): Language for recognition (default is English).
timeout (int): Time in seconds to wait for user input.
max_retries (int): Maximum retries for recognition on failure.
Returns:
str: The recognized voice command, or None if not recognized.
"""
recognizer = sr.Recognizer()
retries = 0
# Adjust for ambient noise to improve accuracy
with sr.Microphone() as source:
recognizer.adjust_for_ambient_noise(source, duration=1)
print("Listening for command...")
while retries < max_retries:
try:
# Listen with a timeout to avoid indefinite wait
audio = recognizer.listen(source, timeout=timeout, phrase_time_limit=5)
# Recognize speech
query = recognizer.recognize_google(audio, language=language).lower()
print("User said:", query)
return query
except sr.UnknownValueError:
speak("I didn't catch that. Could you repeat?")
retries += 1
except sr.RequestError:
speak("There seems to be an issue with the speech service.")
break
except Exception as e:
print("Error:", e)
speak("Please say that again.")
retries += 1
# Final feedback if recognition fails repeatedly
if retries == max_retries:
speak("I'm having trouble understanding. Please try again later.")
print("Maximum retries reached.")
return None
# Main function to handle the assistant's actions
def main():
wishme()
while True:
# Wait for the wake word
listen_for_wake_word()
# Take the command and perform actions
query = takecommand()
if query:
if "time" in query:
time()
elif "date" in query:
date()
elif "who are you" in query:
speak("I'm Mint, your desktop voice assistant.")
elif "how are you" in query:
speak("I'm fine. What about you?")
elif "wikipedia" in query:
try:
speak("Searching Wikipedia...")
query = query.replace("wikipedia", "")
result = wikipedia.summary(query, sentences=2)
speak(result)
print(result)
except:
speak("I couldn't find that information.")
elif "open youtube" in query:
wb.open("youtube.com")
elif "open google" in query:
wb.open("google.com")
elif "play music" in query:
music_dir = os.path.expanduser("~\\Music")
songs = os.listdir(music_dir)
os.startfile(os.path.join(music_dir, random.choice(songs)))
elif "screenshot" in query:
screenshot()
elif "offline" in query:
speak("Going offline, sir.")
break
Edit your post to ensure the code is properly formatted.
Edit your post so that your code is prefixed and sufficed with the pre-formated text markup.
```
using the truple back tick
like I show here
```
You’re importing sounddevice
and numpy
, but you’re not using them.
speak
is catching exceptions but just printing an error message, thus hiding the traceback which would be much more informative.
You’re using the .strftime
method in time
, but not in date
. Why? Also, you’re making the same message twice, once for printing and again for speech.
Incidentally, the punctuation in “How may I help you sir!.” is strange. It should be “How may I help you sir?”.
thanks man