Maven_super_30_LeseTolkeKode_5 - itnett/FTD02H-N GitHub Wiki
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 avpyttsx3
.
# 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:
- Bruk av miljøvariabler for konfigurasjon: Unngå hardkodet informasjon som e-postpassord.
- Mer robust feilbehandling: Spesielt når det gjelder å åpne filer eller sende e-post.
- Fjern duplisert kode: Gjør det enklere å vedlikeholde koden ved å bruke funksjoner der det er nødvendig.
- 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
- Sikkerhet: E-postbrukernavn og passord lagres som miljøvariabler, ikke hardkodet i koden.
- Feilhåndtering: Mer robust feilhåndtering og logging for å spore problemer.
- Modularisering: Koden er mer modulær med funksjoner for vanlige operasjoner som å åpne en nettside eller en IDE.
- Utvidet funksjonalitet: Flere detaljer for talekommandoer og forbedrede meldinger.