Maven_super_30_LeseTolkeKode_5 - itnett/FTD02H-N GitHub Wiki

https://[raw.githubusercontent.com/Madhav-MKNC/noob-scripts/main/mark1.py](https://raw.githubusercontent.com/Madhav-MKNC/noob-scripts/main/mark1.py)

Gjennomgang og Forbedring av Koden

Denne Python-koden implementerer en enkel talestyrt assistent ved hjelp av pyttsx3 for tekst-til-tale, speech_recognition for talegjenkjenning, og flere andre moduler for å utføre oppgaver som å sende e-poster, spille musikk, åpne nettsider, osv.

La oss gå gjennom koden linje for linje og forbedre den der det er nødvendig.

# Importerer nødvendige moduler
import pyttsx3  # Brukt for tekst-til-tale-funksjonalitet
import speech_recognition as sr  # Brukt for talegjenkjenning
import datetime  # Brukt for å få tilgang til dato og tid
import wikipedia  # Brukt for å søke i Wikipedia
import webbrowser  # Brukt for å åpne nettlesere
import os  # Brukt for å samhandle med operativsystemet
import smtplib  # Brukt for å sende e-poster
import random  # Brukt for å velge tilfeldige elementer, som sanger
  • Kommentarer: Hver modul blir beskrevet for å gjøre det klart hva den brukes til.
# Initialiserer tekst-til-tale-motoren
moon = pyttsx3.init('sapi5')  # Initialiserer pyttsx3 med SAPI5 som er en tale-API tilgjengelig i Windows
voices = moon.getProperty('voices')
moon.setProperty('voice', voices[0].id)  # Setter stemmen til den første (mannlig) i listen over tilgjengelige stemmer
  • Forbedring: Bruker kan kanskje velge stemme fra tilgjengelige alternativer. Dette kan gjøres mer dynamisk ved å tilby brukerens valg av stemme.
# Definerer en funksjon for å få assistenten til å snakke
def speak(audio):
    moon.say(audio)
    moon.runAndWait()
  • Kommentar: Funksjonen speak() tar en tekststreng som input og konverterer den til tale ved hjelp av pyttsx3.
# Definerer en funksjon for å lytte til brukerens kommandoer
def Command():
    r = sr.Recognizer()  # Initialiserer talegjenkjenningsmotoren
    with sr.Microphone() as source:  # Bruker mikrofonen som lydkilde
        print("Listening...")
        r.pause_threshold = 1  # Setter pause terskelen før gjenkjennelse starter
        audio = r.listen(source)  # Lytter til lyd og lagrer den som variabelen 'audio'
    try:
        print("Recognizing...")    
        query = r.recognize_google(audio, language='en-in')  # Bruker Google's talegjenkjenning for å konvertere lyd til tekst
        print(f"You said: {query}\n")  # Skriver ut hva brukeren sa
    except Exception:
        print("Say that again please...") 
        return None  # Returnerer None hvis det er en feil
    return query.lower()  # Returnerer brukerens kommando i små bokstaver
  • Forbedring: Det er en god praksis å legge til flere detaljer i unntakshåndtering og muligheten for å prøve igjen hvis gjenkjennelsen mislykkes.
  • Kommentar: query.lower() er flyttet til slutt for å sikre at hele kommandoen returneres i små bokstaver for enklere sammenligning.
# Definerer en funksjon for å ønske brukeren velkommen basert på tidspunktet på dagen
def wishMe():
    hour = int(datetime.datetime.now().hour)
    if hour>=0 and hour<12:
        speak("Good Morning sir!")
    elif hour>=12 and hour<18:
        speak("Good Afternoon sir!")   
    else:
        speak("Good Evening sir!")  
    speak("How can the Moon help you?") 
  • Kommentar: Funksjonen wishMe() sjekker gjeldende klokkeslett og gir en passende hilsen til brukeren.
# Definerer en funksjon for å sende e-post
def sendEmail(to, content):
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)  # Oppretter en forbindelse til Gmail SMTP-server
        server.ehlo()  # Initierer forbindelsen
        server.starttls()  # Krypterer forbindelsen ved hjelp av TLS
        server.login('[email protected]', '**********')  # Logger inn på senderens e-postkonto
        server.sendmail('[email protected]', to, content)  # Sender e-post
        server.close()  # Lukker forbindelsen
        speak("Email has been sent!")
    except Exception as e:
        speak("Mail not sent due to some error!")
        print(f"Error: {e}")
  • Forbedring: Unngå hardkodede brukernavn og passord direkte i koden av sikkerhetsgrunner. Bruk miljøvariabler eller en konfigurasjonsfil.
  • Kommentar: Funksjonen sendEmail() sender en e-post til en spesifisert adresse med gitt innhold.
# Hoveddel av koden
if __name__=="__main__" :
    wishMe()  # Ønsker brukeren velkommen

    while True:
        query = Command()  # Lytter etter brukerens kommando

        if query is None:
            continue

        # Bruker Wikipedia for å hente informasjon
        if 'wikipedia' in query or 'what is' in query or 'who is' in query or 'define' in query or 'definition' in query or 'meaning' in query:
            speak('Searching Wikipedia...')
            query = query.replace("wikipedia", "")
            results = wikipedia.summary(query, sentences=1)
            speak("According to Wikipedia")
            print(results)
            speak(results)
  • Forbedring: Implementer en mer effektiv søkemetode som ikke sjekker hver strenglengde for matchende substrings. Du kan bruke en enkel regex eller splitte query på mellomrom.
  • Kommentar: Søker etter informasjon på Wikipedia og leser den høyt for brukeren.
        elif 'open youtube' in query:
            webbrowser.open("youtube.com")

        elif 'open google' in query:
            webbrowser.open("google.com")

        elif 'open stackoverflow' in query:
            webbrowser.open("stackoverflow.com")
  • Kommentar: Åpner vanlige nettsteder basert på brukerens kommandoer.
        elif 'play music' in query:
            music_dir = 'D:\\Songs'
            songs = os.listdir(music_dir)
            song = random.choice(songs) 
            print(f"playing {song}...")
            os.startfile(os.path.join(music_dir, song))
  • Forbedring: Sjekk om music_dir eksisterer og håndter situasjonen hvis mappen er tom eller inneholder ikke-lydfiler.
  • Kommentar: Spiller en tilfeldig sang fra en spesifisert katalog.
        elif 'the time' in query:
            strTime = datetime.datetime.now().strftime("%H:%M:%S")  
            print(strTime)  
            speak(f"Sir, the time is {strTime}")
  • Kommentar: Informerer brukeren om gjeldende klokkeslett.
        elif 'coding' in query or 'code' in query:
            NetBeans = "C:\\Program Files\\NetBeans 8.2\\bin\\netbeans64.exe"
            Thonny = "C:\\Users\\Madhav\\AppData\\Local\\Programs\\Thonny\\thonny.exe"
            PyCharm = "C:\\Program Files\\JetBrains\\PyCharm Community Edition 2020.3.2\\bin\\pycharm64.exe"
            VSCode = "C:\\Users\\Madhav\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe"

            speak("Which IDE do you wanna use sir?")
            mknc = Command().lower()
            pycharm_list = {"pycharm", "picharm", "pi charm", "py charm"}
            VSCode_list = {"vscode", "vs code", "v s code"}

            if "netbeans" in mknc:
                print("Starting NetBeans...")
                os.startfile(NetBeans)
            elif mknc == "thonny" or mknc == "thony":
                print("Starting Thonny...")
                os.startfile(Thonny)
            elif mknc in pycharm_list:
                print("Starting Pycharm...")
                os.startfile(PyCharm)
            elif mknc in VSCode_list:
                print("Starting VS Code...")
                os.startfile(VSCode)
  • Forbedring: Bruk try-except for å håndtere situasjoner der en IDE ikke finnes på den angitte banen.
  • Kommentar: Åpner den IDE-en brukeren ber om, basert på tilgjengelige alternativer.
        elif 'email' in query:
            try:
                speak("What should I say?")
                content = Command()
                to =

 "[email protected]"    
                sendEmail(to, content)
                print("Sent!!!")
            except Exception:
                speak("Mail not sent due to some error!")
  • Forbedring: Håndter brukervennlig feilrapportering og gi tilbakemelding hvis en e-postadresse er ugyldig.
  • Kommentar: Sender en e-post med det innholdet brukeren spesifiserer.
        elif 'name' in query:
            speak('I am Moon')
  • Kommentar: Assistenten identifiserer seg selv når brukeren spør om navnet.
        else:
            speak("SORRY? How can I help you?")
  • Kommentar: Gir en standard respons hvis kommandoen ikke gjenkjennes.

Forbedret kodeforslag

Her er noen forbedringer og forbedret kode:

  1. Bruk av miljøvariabler for konfigurasjon: Unngå hardkodet informasjon som e-postpassord.
  2. Mer robust feilbehandling: Spesielt når det gjelder å åpne filer eller sende e-post.
  3. Fjern duplisert kode: Gjør det enklere å vedlikeholde koden ved å bruke funksjoner der det er nødvendig.
  4. Forbedre brukerinteraksjonen: Gi bedre feilmeldinger eller flere valg til brukeren.
#required modules
import pyttsx3
import speech_recognition as sr
import datetime
import wikipedia
import webbrowser
import os
import smtplib
import random
import sys
import logging
from dotenv import load_dotenv

# Load environment variables
load_dotenv()

# Logger setup
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Initialize text-to-speech engine
moon = pyttsx3.init('sapi5')
voices = moon.getProperty('voices')
moon.setProperty('voice', voices[0].id)

# Defining functions
def speak(audio):
    moon.say(audio)
    moon.runAndWait()

def Command():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        r.pause_threshold = 1
        audio = r.listen(source)
    try:
        print("Recognizing...")
        query = r.recognize_google(audio, language='en-in')
        print(f"You said: {query}\n")
        return query.lower()
    except sr.UnknownValueError:
        speak("I didn't catch that. Could you please repeat?")
    except sr.RequestError as e:
        speak("Sorry, I am having trouble connecting to the service.")
        logger.error(f"Error with speech recognition: {e}")
    return None

def wishMe():
    hour = int(datetime.datetime.now().hour)
    if 0 <= hour < 12:
        speak("Good Morning sir!")
    elif 12 <= hour < 18:
        speak("Good Afternoon sir!")
    else:
        speak("Good Evening sir!")
    speak("How can the Moon help you?")

def sendEmail(to, content):
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        server.login(os.getenv('EMAIL_USER'), os.getenv('EMAIL_PASS'))
        server.sendmail(os.getenv('EMAIL_USER'), to, content)
        server.close()
        speak("Email has been sent!")
    except Exception as e:
        speak("Mail not sent due to some error!")
        logger.error(f"Failed to send email: {e}")

def open_webpage(url, name):
    try:
        speak(f"Opening {name}")
        webbrowser.open(url)
    except Exception as e:
        speak(f"Sorry, I couldn't open {name}")
        logger.error(f"Failed to open {name}: {e}")

def play_music():
    music_dir = 'D:\\Songs'
    if os.path.exists(music_dir):
        songs = [f for f in os.listdir(music_dir) if f.endswith(('.mp3', '.wav'))]
        if songs:
            song = random.choice(songs)
            speak(f"Playing {song}")
            os.startfile(os.path.join(music_dir, song))
        else:
            speak("No songs found in the directory.")
    else:
        speak("Music directory does not exist.")

def open_ide(ide_name):
    ides = {
        "netbeans": "C:\\Program Files\\NetBeans 8.2\\bin\\netbeans64.exe",
        "thonny": "C:\\Users\\Madhav\\AppData\\Local\\Programs\\Thonny\\thonny.exe",
        "pycharm": "C:\\Program Files\\JetBrains\\PyCharm Community Edition 2020.3.2\\bin\\pycharm64.exe",
        "vscode": "C:\\Users\\Madhav\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe"
    }

    ide_name = ide_name.lower()
    for key, value in ides.items():
        if key in ide_name:
            if os.path.exists(value):
                speak(f"Starting {key.capitalize()}...")
                os.startfile(value)
            else:
                speak(f"{key.capitalize()} not found.")
            return
    speak("IDE not recognized. Please try again.")

# Main body of the code
if __name__ == "__main__":
    wishMe()

    while True:
        query = Command()

        if query is None:
            continue

        if 'wikipedia' in query or 'what is' in query or 'who is' in query or 'define' in query or 'definition' in query or 'meaning' in query:
            speak('Searching Wikipedia...')
            query = query.replace("wikipedia", "")
            results = wikipedia.summary(query, sentences=2)
            speak("According to Wikipedia")
            print(results)
            speak(results)

        elif 'open youtube' in query:
            open_webpage("https://www.youtube.com", "YouTube")

        elif 'open google' in query:
            open_webpage("https://www.google.com", "Google")

        elif 'open stackoverflow' in query:
            open_webpage("https://www.stackoverflow.com", "StackOverflow")

        elif 'play music' in query:
            play_music()

        elif 'the time' in query:
            strTime = datetime.datetime.now().strftime("%H:%M:%S")
            print(strTime)
            speak(f"Sir, the time is {strTime}")

        elif 'coding' in query or 'code' in query:
            speak("Which IDE do you want to use, sir?")
            ide_query = Command()
            if ide_query:
                open_ide(ide_query)

        elif 'email' in query:
            try:
                speak("What should I say?")
                content = Command()
                to = os.getenv('EMAIL_TO')
                sendEmail(to, content)
            except Exception as e:
                speak("Mail not sent due to some error!")
                logger.error(f"Error in email function: {e}")

        elif 'name' in query:
            speak('I am Moon')

        else:
            speak("SORRY? How can I help you?")

Forbedringer

  1. Sikkerhet: E-postbrukernavn og passord lagres som miljøvariabler, ikke hardkodet i koden.
  2. Feilhåndtering: Mer robust feilhåndtering og logging for å spore problemer.
  3. Modularisering: Koden er mer modulær med funksjoner for vanlige operasjoner som å åpne en nettside eller en IDE.
  4. Utvidet funksjonalitet: Flere detaljer for talekommandoer og forbedrede meldinger.