Kodlarımda yavaş çalışma sorunu

Merhaba arkadaşlar. Bir sanal asistan olması için aşağıdaki kodları yazdım. Sorun yok asistan çalışıyor tüm komutlar görevlerini yerine getiriyor ama asistan benden bir süre ses alamazsa program çok yavaşlıyor çok geç tepkiler vermeye başlıyor hatta bazen neredeyse hiç tepki vermiyor bile diyebilirim. Bunun nedeninin gereksiz bellek kullanımı olduğunu düşündüm. Bunu çözmek için clear_memory() isminde bellği temizleyen bir fonksiyon yazdım ama yinede sorun devam ediyor. Bu işlerde birazda acemi sayılırım. Kodlarıma bir göz atıp sorunun nereden kaynaklandığını ve nasıl çözebileceğimi söyleyebilirseniz çok mutlu olurum.

from cProfile import run
from playsound import playsound
from gtts import gTTS
import speech_recognition as sr
import os
import time
from datetime import date, datetime
import random
from random import choice
#from pydub import AudioSegment
import webbrowser
import gc
import sys

r = sr.Recognizer()

etkilesim = "activation.mp3"
mrb_options = ["merhaba", "selam bro", "merhaba canım", "sanada merhaba"]
nbr_options = ["iyilik. sende iyi görünüyorsun", "iş güç. kodlanıp duruyoruz", "sıfır ve birler işte. başka bişey yok"]
grs_options = ["ihtiyacın olduğunda ben buralardayım", "görüşürüz", "biraz dinleneyim", "eyvallah reis. pardon görüşürüz diyecektim"]
search_options = ["ne aramamı istersin", "neyi aratalım", "ayıp şeyler olmasın ama. ne arayalım", "of çok üşendim şimdi. ne aratacaksın", "hayır aramayacağım. şaka şaka neyi arayalım"]
app_options = {"steam": "D:\Program Files (x86)\Steam\steam.exe", "epic games": "D:\Program Files (x86)\Epic\Epic Games\Launcher\Portal\Binaries\Win32\EpicGamesLauncher.exe"}


def response(voice):
    etkilesim = "activation.mp3"
    if "merhaba" in voice:
        global mrb_options
        selection = random.choice(mrb_options)
        speak(selection)
    elif "ne haber" in voice or "nasıl gidiyor" in voice or "ne var ne yok" in voice:
        global nbr_options
        selection = random.choice(nbr_options)
        speak(selection)
    elif "görüşürüz" in voice or "kendine iyi bak" in voice or "güle güle" in voice:
        global grs_options
        selection = random.choice(grs_options)
        speak(selection)
    elif "saat kaç" in voice or "bana saati söyle" in voice or "saati söyler misin" in voice:
        selection = ["Saat şu an: ", "Hemen bakıyorum: ", "eti kemik geçiyor. şaka şaka saat:"]
        clock = datetime.now().strftime("%H:%M")
        selection = random.choice(selection)
        speak(selection + clock)
    elif "google'da ara" in voice or "internette ara" in voice:
        global search_options
        selection = random.choice(search_options)
        speak(selection)
        playsound("activation.mp3")
        search = record
        url = "https://www.google.com/search?client=opera-gx&q=" + search()              #arama yapacağımız url yi belirledik. 
        webbrowser.get().open(url)                                                       #belirlediğimiz url nin açılmasını sağladık
        speak("web'de bunu buldum")
    elif "uygulama aç" in voice or "uygulamayı çalıştır" in voice:
        speak("Hangi uygulamayı açmamı istiyorsun?")
        playsound(etkilesim)
        runApp = record()
        runApp = runApp.lower()
        if "steam" in runApp:
            os.startfile("D:\Program Files (x86)\Steam\steam.exe")
            speak("İstediğin uygulamayı çalıştırıyorum.")
        elif "epic games" in runApp:
            os.startfile("D:\Program Files (x86)\Epic\Epic Games\Launcher\Portal\Binaries\Win32\EpicGamesLauncher.exe")
            speak("oyun saatin gelmiş sanırım")
        else:
            speak("İstediğin uygulama çalıştırma listemde yok.")
    elif "bugün günlerden ne" in voice or "günlerden ne" in voice or "bana günü söyle" in voice or "gün" in voice or "hafatanın hangi günündeyiz" in voice:
        today = time.strftime("%A")                                   #BU KOD BİLGİSAYARIN SAATİNİ ALIYOR. BUNU KULLANMAK İÇİN "İMPORT TİME"
        today.capitalize()
        if today == "Monday":
             today = "Pazartesi"
        elif today == "Tuesday":
             today = "Salı"
        elif today == "Wednesday":
             today = "Çarşamba"
        elif today == "Thursday":
             today = "Perşembe"
        elif today == "Friday":
             today = "Cuma"
        elif today == "Saturday":
             today = "Cumartesi"
        elif today == "Sunday":
             today = "Pazar"
        speak("bugün günlerden" + (today))
    elif "bilgisayarı kapat" in voice:
        speak("görüşürüz")
        os.system("shutdown /s /t 0") #bilgisayarı kapatma komutu
    elif "bilgisayarı yeniden başlat" in voice:
        speak("hemen hallediyorum")
        os.system("shutdown /r /t 0") #bilgisayarı yeniden başlatma kodu.
    elif "dinlen" in voice or "izin verdim" in voice or "güle güle" in voice or "kendini kapat" in voice:
        byeSelection = ["makine olabilirim ama kaytarmayı severim. kaçtım", "sonra görüşürüz patron", "daha karpuz kesecektik. neyse birdahaki sefere artık", "güle güle", "kendine iyi bak"]
        byeSelection = random.choice(byeSelection)
        speak(byeSelection)
        exit()      
    else:
        speak("henüz bu konuda beni eğitmedin")
        return voice
    

def record(ask=False):
    with sr.Microphone() as source:
        if ask:
            print(ask)
        audio = r.listen(source)
        voice = ""
        try:
            voice = r.recognize_google(audio, language="tr-TR")
        except sr.UnknownValueError:
            print("Asistan: Anlayamadım")
            clear_memory()
        except sr.RequestError:
            print("Asistan: Sistem çalışmıyor")
        return voice
        
    
max_memory = 100 * 128 * 128

def clear_memory():
    gc.collect()
    mem_used = sum(sys.getsizeof(obj) for obj in gc.get_objects())
    if mem_used > max_memory:
        gc.get_objects().clear()
        
def speak(string):
    tts = gTTS(text=string, lang="tr", slow=False)
    file = "answer.mp3"
    tts.save(file)
    # speeding()
    playsound(file)
    os.remove(file)
    # os.remove("speed.mp3")
    

def test(wake):
    if "hey bilgisayar" in wake:
        playsound("activation.mp3")
        wake = record()
        if wake != '':
            voice = wake.lower()
            print(wake.capitalize())
            response(voice)


speak("patron hoşgeldin")
while True:
    wake = record()
    if wake != '':
        wake = wake.lower()
        print(wake.capitalize())
        test(wake)

Yavaslayan yerler kodda tam olarak nereleri?

Dusunmeye gerek yok, bellek kullanimi olculebilen bir sey. Task Manager veya Process Explorer ile baslayip, problem veya anormalite tespit edildikce derine inilebilir.

Bu fonksiyon GC tetikliyor. GC zaten periyodik olarak ve/veya hafiza azaldiginda tetiklenen bir sey. Eger bir problem varsa bu GC’nin tetiklenmesine degil, objeleri collect edememesinde. Burada hangi buyuk Python objelerini collect etmeyi umuyoruz?


Kodda profiling denemesi goruyorum. CPU profiling yavaslama sorunlari icin iyi bir baslangic! GC kurcalamadan once memory profiling yapmak da lazim. Ama hepsinden once problemi tespit etmek lazim. Isin cogunu bir kutuphane yaptigina gore sorun kodun disinda olma ihtimali yuksek.

Merhaba.

Şüphelerimi oluşturan kısım bu nedenini birazdan açıklarım.

Bazan yönlendirici yorumlar soruda bizi yanıltabiliyor. Dolaylı yoldan haklı olabiliriz. Ortada bir while döngüsü varsa ve bir fonksiyonu sürekli çağırıyorsa, o fonksiyona çok dikkat etmeliyiz. Diğer taraftan belleğe yüklenecek kadar da yetenekli bir fonksiyon gibi görünmüyor.

Şüphelim, while ın durmadan recod() u çağıran while döngüsü.

Record ne yapıyor, ha bire microfondan ses dinleyip google a bu ses nedir diye soruyor.

Bir kere mikorfon gürültüsünü göz önüne almak lazım. Bir gürültü nedeniyle uzunca bir ses kaydı alıp google soruyorsa yandı gülüm keten helva. Bitmesini beklemek gerekir.

Bu nedenle:

adjust_for_ambient_noise(source)

Bir ortam sesi ayarı yapmak gerekebilir.

Yine bir yerlerde sesi ne zaman kaydetmeye başlayacağına karar vermesi ve ne kadar sessizlik olursa kaydı kesmesi gerektiğini belirtmek gerekir yoksa bir fan sesi yüzünden bir saatlik bir kayıt alıp kaydı google a göndermesi işten bile değil.

 r.pause_threshold = 1

Bu eşik değeri farklı kaynaklarda 0.5 e kadar düşebiliyor.

dynamic_energy_threshold = True 

gibi bir çok ayara bakmanız gerekebilir.

speech_recognition/library-reference.rst at master · Uberi/speech_recognition (github.com)

Hatta şuradaki ayarların bir çoğunu incelemenizde bir fayda var.

Yani özetlersek dolaylı yoldan belleğin dolması gibi sorunlara da neden olabilmekle beraber asıl sorun mikrofon kaydınızın ne zaman başlayıp ne zaman duracağını iyi ayarlamamış olmanız.

Normalde kodu test etmeden tavsiye vermeyi sevmem, tüm kütüphaneleri yükleyip denemek gerekir.

Hatta google yerine offline bir kütüphane ile de denemek gerekir ki sorun bağlantı hatalarından mı kaynaklı, istek gönderdiğinizde bilgisayar enerji korumak için bağlantıyı durdurup istek gelince bağlantıyı yeniden kurmak dahi istiyor olabilir. Tabi bunların denenmesi görülmesi gerekir.

Şöyle göz ucuyla baktığımda while döngüsü çılgınlar gibi ses kaydı gönderiyor google a, ve ne büyüklükte göndereceği de düzgün ayarlanmamış.

Eşik değerleri, gürültü bastırma gibi bir çok ayarla asistanın neyi sesli komut kabul edeceğini ve google a soracağını ok iyi kontrol altında tutmalısınız.

Tabi fırsat bulursam kodu dener daha net bir şeyler söylemeye çalışırım.

Evet söylediğiniz gerçekten çok mantıklı. Zaten program çalışmaya başladığında ben “hey bilgisayar” dedikten sonra benden sesleri alıp akıcı bir şekilde yanıtlıyor ancak uzun bir süre sessiz kalırsam bir süre sonra yavaşlamaya başlıyor. Bu durumda söylediğinizi haklı çıkarır nitelikte. Mikrofon benden aldığı boş sesleri dinliyor ve google a gönderiyor. Aslında bellek kullanımından şüphelendim derken bende benzer bir şekilde bakmıştım konuya ancak ben o boş ses kayıtlarını cihaz belleğinde depoladığı için yavaşlıyor olabilir diye düşünmüştüm. Google a iletilen ses kaydının soruna neden olmuş olabileceği aklıma gelmemişti. Şimdi sizin bu söylediklerinizi koda dökmem lazım. :slight_smile: