Jouer un son sur raspberry pi 3B en utilisant des haut-parleurs

@Nabla merci pour l’ami de suggestion est vraiment savoir.

Hello,

Tu pensais :

thanks for the suggestion friend ; it’s really knowladgeable.

En Français :
Merci pour la suggestion (ou proposition) ; c’est vraiment bien trouvé (bien renseigné)

you’re welcome :wink:

Bonjour,
je déterre le sujet qui m’interresse même si c’est pas tout à fait la même utilisation.
sur quelle base de système d’exploitation faut il partir?
merci

Bonjour,

l’OS le plus populaire est Raspbian. Plusieurs versions sont disponibles, mais certaines n’ont plus de mise à jour, de part leur ancienneté.
La version la plus récente est Raspbian Buster, sortie l’été dernier.

Plus orientée bureautique, vous pouvez vous tourner vers Ubuntu Mate. L’OS est une « base » du célèbre Debian. Bon apparement, il n’y a pas de portage de Mate sur la PI4 à ce jour…

@+

Bonjour
merci
j’aimerai lire un fichier mp3 aléatoire dans un dossier à l’appuie d’un bouton.
J’ai un raspi 3 B.
J’arrive à lire l’état de mon bouton sur le gpio.maispas à conditionner la lecture à cet appui.
le but est de mettre ça dans une boite sans écran.
(j’ai pas de niveau de codage ormis des restes de vba, juste savoir copier coller. plus simple sur python pour moi)
merci d’avance

Salut @SAM_DUM120

Mode facile :wink: :
Comme ça, à première vu, on peut faire un script python pour lire un fichier lors de l’appui sur un bouton.
Ensuite, on modifiera le script pour passer un « random » et voilà :slight_smile:

Mode moins facile :
Je te laisse chercher un peu :smiley: (en fait, là, je dois déjà repartir)

++

Salut,

Allez, juste une piste :grinning:

En Python, on peut écrire une petite boucle while suivi du programme qui se chargera de lire de façon aléatoire les fichiers mp3, avec la fonction random comme précisé par Nabla.

Ensuite, on peut envisager d’utiliser PyGame, avec son module de gestion de son, pygame.mixer. Il faudra juste preciser le chemin du répertoire des fichiers mp3. A noter que si vous avec une ancienne version de Python, PyGame gérera mieux les fichiers OGG que mp3.

@+

Yo,

J’ai mangé seul dans le bureau devant le PC …
Comme tu n’arrives pas à lancer un script, voilà un début = J’ai pondu un script de test (on verra pour le « random » plus tard)
Je ne suis pas fort en Python et je n’ai pas de Rpi sous la main = je te laisse tester

  • Tu mets un bouton sur le Rpi.
  • Tu dois créer un dossier MES_SONS
  • (avec mkdir /home/pi/MES_SONS par exemple
  • Tu télécharges un fichier son ; par exemple ce sifflet en .wav.
  • Tu copies le script ci-dessous où tu veux ; par exemple /home/pi/MES_SONS/lecture.py
  • Tu lances le script (par exemple python3 /home/pi/MES_SONS/lecture.py)
  • Tu appuies sur le bouton
    ça doit lire le fichier son

#!/usr/bin/python3
# -*- coding: utf-8 -*
import RPi.GPIO as GPIO
import pygame
from pygame.locals import *
import os

GPIO.setmode(GPIO.BCM) #Attention au choix du port ; référez-vous au site https://fr.pinout.xyz/
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pygame.mixer.init()
son = pygame.mixer.Sound(‹ /home/pi/MES_SONS/son.wav ›)
canal = son.play()

while True : #boucle jusqu’a interruption
try:
print (« \n attente boucle »)

    #on attend que le bouton soit pressé
    GPIO.wait_for_edge(24, GPIO.FALLING)
    # on a appuyé sur le bouton...

    #on joue un son
    pygame.mixer.init()
    son = pygame.mixer.Sound('/home/pi/MES_SONS/son.wav')
    canal = son.play()


    if (GPIO.input(24) == 0): #si bouton encore enfoncé ...
          break # ... alors on sort du while 

except KeyboardInterrupt:
print (‹ sortie du programme ! ›)
raise

GPIO.cleanup() # reinitialisation GPIO lors d’une sortie normale

Redis-moi

P.S. : je pourrai tester seulement ce soir chez moi

Super. Je suis au taf aussi je test ce soir. Merci

Re,

Attention,
Pas de son si pas d’écran HDMI
ou alors, faudra passer par un ampli ; le son du Rpi est juste inexistant avec un simple haut-parleur.

Script corrigé et testé :

#!/usr/bin/python3

-- coding: utf-8 -

import RPi.GPIO as GPIO
import pygame
from pygame.locals import *

GPIO.setmode(GPIO.BCM) #Attention ; voir le site https://fr.pinout.xyz/
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True : #boucle jusqu’à interruption
try:
print (« \n attente boucle »)

    #on attend que le bouton soit pressé
    GPIO.wait_for_edge(24, GPIO.FALLING)
    # on a appuyé sur le bouton...

    # ...alors on siffle
    pygame.mixer.init()
    son = pygame.mixer.Sound('/home/pi/MES_SONS/son.wav')
    canal = son.play()

except KeyboardInterrupt:
print (‹ sortie du programme! ›)
raise

GPIO.cleanup() # reinitialisation GPIO lors d’une sortie normale

Mais cela ne va pas forcément être facile avec les indentations qui ne passent pas forcément bien sur le forum.

++

Bonjour et merci en tout cas, effectivement il semble y avoir des erreurs de syntaxe que je n’arrive pas à corriger.
j’ai par exemple ligne :
File « lecteur.py », line 3
– coding: utf-8 -
^
peux tu me transmettre un imprime écran, je pourrai vérifier.
merci

Re,

Je t’envoie un MP pour te faire passer le fichier par courriel.
Mais là, le Rpi est arrêté.
Je bosse demain dès 08h donc sans doute que demain soir

Salut,

Pour la fonction random, essayez avec random.choice qui vous sélectionnera un fichier « au hasard »

import RPi.GPIO as GPIO
import pygame
import os, random 
from pygame.locals import *

GPIO.setmode(GPIO.BCM) #Attention ; voir le site https://fr.pinout.xyz/
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True : #boucle jusqu’à interruption
try:
print ("\n attente boucle")

    #on attend que le bouton soit pressé
    GPIO.wait_for_edge(24, GPIO.FALLING)
    # on a appuyé sur le bouton...

    # ...alors on siffle
    pygame.mixer.init()
    # c'est la roulettte russe :)
    son = pygame.mixer.Sound(random.choice(os.listdir("/home/pi/MES_SONS")))
    canal = son.play()

except KeyboardInterrupt:
print (‹ sortie du programme! ›)
raise

GPIO.cleanup() # reinitialisation GPIO lors d’une sortie normale

@+

Yo @stef-k

Je vais implémenter ton bout de code dans mon script ce soir (là, je mange « loin » de mon Rpi) et l’envoyer par courriel à @SAM_DUM120
J’espère que les gens normaux de ma famille me laisseront jouer avec mon Rpi ce soir :wink:

Dis donc, on lui a fait son cadeau de Noël avant l’heure :stuck_out_tongue_winking_eye:

++

c’est clair merci les gars (meme si je n’arrive pas à le faire tourner pour l’instant) et c’est pour un cadeau de noel mais qui se fera le 04/01

Le cadeau n’est pas fini, il y aura d’autre surprises après :grinning:

Joyeux Noel a tout le fofo :slightly_smiling_face:

Yo,
C’est bizarre, ça plante avec la fonction random :thinking:
Je ne comprends pas car ça lit le fichier si indiqué en dur.
Mais ça plante en random avec un joli
pygame.error: Unable to open file '/home/pi/Downloads/0452.wav'
Pareil avec tous les fichiers, en wav ou mp3

La suite un autre jour du coup.
Vais pas pouvoir coder ce soir :wink:

Et … Joyeux Noël !!!

Joyeux Noël !! :christmas_tree: :fireworks: :christmas_tree:

@Nabla, n’étant pas chez moi pour Noël, dépourvu d’une framboise, je ne peut pas tester de mon coté…
Tu as essayé de remplacer pygame.mixer.init() par pygame.init() ?
Peut être qu’en réinitialisant le module complet, ça marchera.

:shinto_shrine:

Yo @SAM_DUM120 (et Yo @stef-k)

Bon, je n’y connais rien en python, mais je suis complètement barré.
Donc, j’ai pondu un script qui tourne chez moi :slight_smile:

J’ai listé les fichiers et je leur attribue un numéro puis j’utilise randrange pour tirer un N° au hasard.
Script sans doute largement améliorable compte tenu de mon niveau … :sweat_smile:

import RPi.GPIO as GPIO
import time
import pygame
from pygame.locals import *
import os
import random
from random import randrange


GPIO.setmode(GPIO.BCM) #Attention au choix du port ; voir le site https://fr.pinout.xyz/
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)


son01 = "/home/pi/MES_SONS/0218.wav"
son02 = "/home/pi/MES_SONS/0477.wav"
son03 = "/home/pi/MES_SONS/1111.wav"
son04 = "/home/pi/MES_SONS/son.wav"


while True : #boucle jusqu'à interruption
  try:
        print ("\n attente boucle")
        
        #on attend que le bouton soit pressé
        GPIO.wait_for_edge(24, GPIO.FALLING)
        # on a appuyé sur le bouton...

        print ("\n On tire un son au hasard")

        #Initialisation du son
        pygame.mixer.init()
        Fichier_a_lire = randrange(1, 4)
        
        if Fichier_a_lire == 1:
          son = son01
        if Fichier_a_lire == 2:
          son = son02
        if Fichier_a_lire == 3:
          son = son03
        if Fichier_a_lire == 4:
          son = son04
 
        print ("\n On joue ce son")
 
        son = pygame.mixer.Sound(son)
        canal = son.play()
        time.sleep(5)

        print ("\n OK ; on est prêt pour une nouvelle aventure")

        if (GPIO.input(24) == 0): #si bouton encore enfoncé
              print ("Fermeture du programme")
              break # alors on casse la boucle 
 

  except KeyboardInterrupt:
    print ('sortie du programme!')
    raise

GPIO.cleanup()           # reinitialisation GPIO lors d'une sortie normale

Je t’envoie déjà ça par courriel.

++

Édit :
Test parmi d’autres ; mais test avec notes.
J’ai appuyé 20 fois sur le bouton lors de la même séquence.
Le son01 est sorti 8 fois soit 40%
Le son02 est sorti 4 fois soit 20%
Le son03 est sorti 8 fois soit 40%
Le son04 est sorti 0 fois soit 0%
La séquence réelle est :
1;1;1;3;2;1;3;3;1;1;3;2;1;3;2;2;3;3;1;3