Lancement différé de deux fonctions

Bonjour,

je cherche à lire deux audios différents mais différés de 5 secondes. Donc finalement il faut que j'appelle la première fonction qui me permet de lire le 1er audio puis la 2ème fonction (pour le 2eme audio) se lance 5s après.
J'ai d'abord essayé avec un "time.sleep()" classique mais forcément la lecture du 1er audio est arretée aussi alors que je veux qu'elle continue...

J'ai tenté ensuite avec le programme ci-joint, les lignes concernant le delai de 5s sont aux dernières lignes. Pourtant en le lançant, mes deux audios sont joués simultanément et non en différé malgré le "Timer". Est-ce que quelqu'un aurait une idée de l'erreur ? (ou du pourquoi du comment !)

Merci d'avance

import sounddevice as sd
import soundfile as sf
import threading
import time

Son1= 'audio1.wav'
Son2= 'audio2.wav'

def audioFunc1():
    audio1 = 'audio1.wav'
    data1, fs1 = sf.read(audio1, dtype='float32')
    L1=[]
    for i in range(50):
        L1.append(data1[i])
    print(L1)
    sd.play(data1, fs1, device=5)   #enceinte 1 

def audioFunc2():
    audio2 = 'audio2.wav'
    data2, fs2 = sf.read(audio2, dtype='float32')
    L2=[]
    for i in range(50):
        L2.append(data2[i])
    print(L2)
    sd.play(data2, fs2, device=6)  #enceinte 2


#LECTURE AUDIOS

duration = len(sf.read(Son2)[0]) # duration of Son2

def start_audio1():
    threading.Thread(target = audioFunc1).start()

def start_audio2():
    while True: # infinite while-loop
        threading.Thread(target = audioFunc2).start()
        # pause while-loop for duration of Son2
        time.sleep(duration)

#LECTURE DES AUDIOS DIFFERES DE 5 SECONDES

start_audio1()
delay=threading.Timer(5, start_audio2())
delay.start()



Configuration: Windows / Chrome 100.0.4896.127

4 réponses

  1. Bonsoir

    je t'invite à lire cet article concernant la bonne utilisation des balises de codes
    https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    Je ne code pas en python (ou très peu) et je n'ai pas la réponse à ton problème.

    Cela dit, dès le départ tu fais une erreur importante.
    Le but premier d'une fonction c'est de ne pas écrire plusieurs fois un code qui sera utilisé plusieurs fois, pour
    • gagner du temps
    • dans une moindre mesure, gagner de la place (avec nos gigaoctet aujourd'hui bof...)
    • gagner en lisibilité
    • gagner en maintenance (y'a qu'un code à faire évoluer).


    Le principe est celui ci, si 2 codes sont "quasiment" identiques et que ce qui change peut être une variable (ou des variables), alors on écrit une seule fonction avec les variables en paramètre.

    Donc ça

    Son1= 'audio1.wav'
    Son2= 'audio2.wav'
    
    def audioFunc1():
        audio1 = 'audio1.wav'
        data1, fs1 = sf.read(audio1, dtype='float32')
        L1=[]
        for i in range(50):
            L1.append(data1[i])
        print(L1)
        sd.play(data1, fs1, device=5)   #enceinte 1 
    
    def audioFunc2():
        audio2 = 'audio2.wav'
        data2, fs2 = sf.read(audio2, dtype='float32')
        L2=[]
        for i in range(50):
            L2.append(data2[i])
        print(L2)
        sd.play(data2, fs2, device=6)  #enceinte 2
    
    #...
    audioFunc1()
    
    #...
    audioFunc2()
    
    

    (T'as vu c'est mieux avec les balises correctement utlisées)

    Doit être modifié pour ressembler à

    Son1= 'audio1.wav'
    Son2= 'audio2.wav'
    
    def audioFunc(audio, nDevice):
        data1, fs1 = sf.read(audio, dtype='float32')
        L1=[]
        for i in range(50):
            L1.append(data1[i])
        print(L1)
        sd.play(data1, fs1, device=nDevice)  
    
    #...
    audioFunc(Son1, 5)
     
    #...
    audioFunc(Son2, 6)
    
    1. D'accord merci, je n'ai pas encore le reflexe de synthétiser comme ca avec les fonctions, j'aime bien tout décomposer au début histoire de voir toutes les étapes et ensuite organiser le programme comme tu le propose, mais c'est surement une perte de temps et de clarté en effet !
      1. #version corrigée du sujet

        Bonjour,

        je cherche à lire deux audios différents mais différés de 5 secondes. Donc finalement il faut que j'appelle la première fonction qui me permet de lire le 1er audio puis la 2ème fonction (pour le 2eme audio) se lance 5s après.
        J'ai d'abord essayé avec un "time.sleep()" classique mais forcément la lecture du 1er audio est arretée aussi alors que je veux qu'elle continue...

        J'ai tenté ensuite avec le programme ci-joint, les lignes concernant le delai de 5s sont aux dernières lignes. Pourtant en le lançant, mes deux audios sont joués simultanément et non en différé malgré le "Timer". Est-ce que quelqu'un aurait une idée de l'erreur ? (ou du pourquoi du comment !)

        Merci d'avance

        import sounddevice as sd
        import soundfile as sf
        import threading
        import time
        
        
        Son1= 'audio1.wav'
        Son2= 'audio2.wav'
        
        def audioFunc(audio, nDevice):
            data1, fs1 = sf.read(audio, dtype='float32')
            L1=[]
            for i in range(50):
                L1.append(data1[i])
            print(L1)
            sd.play(data1, fs1, device=nDevice) 
        
        #LECTURE AUDIOS
        
        duration = len(sf.read(Son2)[0]) # duration of Son2
        
        def start_audio1():
            threading.Thread(target = audioFunc(Son1, 5)).start()
        
        
        def start_audio2():
            while True: # infinite while-loop
                threading.Thread(target = audioFunc(Son2, 6)).start()
                # pause while-loop for duration of Son2
                time.sleep(duration)
        
        #LECTURE DES AUDIOS DIFFERES DE 5 SECONDES
        start_audio1()
        delay=threading.Timer(5, start_audio2())
        delay.start()
        1. Contributeur
          bonjour,
          à la ligne 34, le second paramètre doit être le nom de la fonction.
      2. Y’a une différence entre décomposer et faire 2 fois la même chose.

        Décomposer c’est écrire sur plusieurs lignes simples, un code qui peut s’écrire sur une seule ligne (très) complexe.

        Par exemple
        L1=[]
            for i in range(50):
                L1.append(data1[i]) 

        A mon avis, il existe une fonction python qui permet d’écrire ça sur une ligne, mais soit tu ne la connais pas (et moi non plus pour le coup) soit ça te parait plus clair ainsi.
        Ça c’est de la décomposition