seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

savoir si le raspberry diffuse de l'audio?

Sun Dec 03, 2017 3:14 pm

Bonjour,
connaissez-vous une instruction en python permettant de savoir si le raspberry PI III sous Jessie diffuse de l'audio?


Je tente d'exploiter une carte raspberry 3 pour simplifier l'électronique d'un robot humanoïde imprimé 3D.
La programme principale est dans mon téléphone comme cela j'utilise le microphone, les fonctions de reconnaissance vocale
et la synthèse vocale du téléphone androïde.


Lorsque le robot doit parler, le bluetooth du téléphone envoie le son à une carte audio bluetooth TDA7492P CSR4.0 située dans le robot.
Toujours par bluetooth un ordre est envoyé à une carte arduino mega chargée de faire bouger la bouche du robot
en synchronisation avec sa voix.


la TDA7492P CSR4.0 émettant un énorme bruit "plop" dans la Haute pâleur "HP'" suite à 4 secondes d' inactivité.
J'ai donc rajouté un arduino nano qui a 2 fonctions:
fonction 1 : Anti Plop. couper le courant des HP pendant l'émission du 'plop' (débranche le fil rouge du HP ).
fonction 2 : informer l' arduino Mega lorsqu'un son est diffusé pour qu'ils synchronise le son aux mouvements de la bouche
Lorsque le voltage du fil rouge du HP dépasse un certain voltage.

j'ai ajouté depuis peu en liaison i2c un raspberry 3 + caméra qui informe l' arduino de la localisation d'un visage.
le robot regarde donc son interlocuteur dans les yeux.
c'est un montage assez compliqué, 1 arduino méga maître, une carte son bluetooth, un arduino anti-plop informateur de son, un raspberry 3 camera et je vous passe les détails concernant l'alimentation de l'ensemble.

Mon désir est donc de retitrer la carte son bluetooth et l' arduino anti-plop informateur de son diffusé sur les HP.
Pour cela , le raspberry doit recevoir les 2 fonctions des éléments retirés.
j'arrive à diffuser le son reçu en bluetooth vers la sortie jack 3.5 du raspberry sur lequel j'ai branché un HP pour la seconde étape j'ai besoin de vous..


connaissez-vous une instruction en python permettant de savoir si du son est en cours d'audition?
J'imagine que c'est en étudiant l'état du mixer ou en recherchant si du bluetooth est en cours de réception?
pour info je n'ai installé qu'un seul paquet pour que le bluetooth diffuse directement de l'audio :
"BT-Speaker" cela fonctionne sur raspbian Jessie mais pas sur le nouveau système d'exploitation de raspbian sur lequel je n'ai pas réussi à diffuser le son reçu en blutooth après avoir suivi tous les didacticiels que j'ai trouvé.
Voilà pourquoi je suis resté sur Jessie.
Attachments
Corps 6 petit.jpg
Corps 6 petit.jpg (30.16 KiB) Viewed 367 times
selfiecamera_2016-06-19-13-48-41-826-1-1 petit.jpg
selfiecamera_2016-06-19-13-48-41-826-1-1 petit.jpg (24.75 KiB) Viewed 367 times

jelopo
Posts: 1232
Joined: Wed Oct 17, 2012 7:53 pm

Re: savoir si le raspberry diffuse de l'audio?

Mon Dec 04, 2017 7:44 am

Bonjour,

Je ne sais pas si c'est simple de savoir sous Python s'il y a du son qui sort sur une sortie audio. As-tu regardé de ce coté ?
https://www.raspberrypi.org/blog/graphic-equaliser/

Par contre vu que tu joue déjà avec Arduino et des cartes externes, il est éventuellement possible coller une carte sur la sortie audio avec un filtre qui détecte du signal et qui commande un GPIO dans ce cas.

A+

F1TRN
Posts: 50
Joined: Thu Oct 19, 2017 7:15 am

Re: savoir si le raspberry diffuse de l'audio?

Mon Dec 04, 2017 6:10 pm

Je ne pourrais aider sur cette problématique, mais j'interviens pour dire:

Chapeau bas, super réalisation.
Pour le visage qu'utilise tu ? Du latex ?

seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

Re: savoir si le raspberry diffuse de l'audio?

Mon Dec 04, 2017 11:14 pm

merci pour votre réponse et le compliment...
c'est du Platsil Gel 10 il donne un aspect de chair très réaliste et très naturel . il est surtout très résistant j' utilise quotidiennement un de mes robots au travail depuis 1 an, et la peau n' a pas bougée.
voici une petite vidéo de présentation du produit. passe un bon moment.
https://www.youtube.com/watch?v=-h3LJM3p13o

merci également à jelopo concernant l' idée de brancher un arduino nano sur la sortie micro du raspberry pour indiquer s' il y a du son cela fonctionnait sur mon ancien dispositif et devrait fonctionner sur le raspberry . Mais le défi c' est de réussir simplement en utilisant les fonctions du RASPBERRY sans dispositif externe.

Le lien proposé me rapproche de la solution . cela fonctionne avec un fichier wave ou avec un microphone branché sur le raspberry si j' ai bien compris..
Demain je vais tester de diffuser un wave silencieux en boucle et en même temps de faire rentrer du son par mon téléphone en bluetooth pour tester. avec un petit peu de bol le mappage du son passe par les mêmes dispositifs ?
bonne nuit
.

totoharibo
Posts: 3392
Joined: Thu Jan 24, 2013 8:43 am

Re: savoir si le raspberry diffuse de l'audio?

Tue Dec 05, 2017 1:28 pm

je suis peut-être un peu HS ou pas bien compris

Tu fais causer ton robot. Il dit des phrases.
par exemple : "je suis beau"
et puis "j'ai faim".

donc si fais :
dis "je suis beau" ; j'ai fini de causer.
Tu as une indication de la fin du discours donc plus d'audio au cours.
Pour l'articulation des lèvres c'est autre chose.

seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

Re: savoir si le raspberry diffuse de l'audio?

Tue Dec 05, 2017 2:28 pm

ce n'est pas hors sujet, tu as deviné comment le robot fonctionne sur le dispositif sans raspberry.
il y a effectivement une information de fin de phrase "j'ai fini de causer".
1-le téléphone envoi en bluetooth un ordre à l' arduino mega "prépare-toi à bouger la bouche"
2-il envoie également à la carte son bluetooth du robot la phrase audio à prononcer" .
3-l' arduino nano capte le son du haut-parleur.
4-Il informe l' arduino mega qu'il peut commencer à bouger les lèvres.

pour cela il envoie des 1 (il y a du son) ou des 0 (il n'y a plus de son) pendant toute l'audition de la phrase.
pendant les micro-pauses entre Les Mots ou la ponctuation, la bouche ne bouge plus. La synchronisation est ainsi réaliste.

5- si pendant une seconde l' arduino mega ne reçoit que des 0 il considère que l'audition de la phrase est terminée "j'ai fini de causer".

seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

Re: savoir si le raspberry diffuse de l'audio?

Tue Dec 05, 2017 3:14 pm

réponse à "jelopo"
extra le lien.
J'ai pu extraire ce qui m' intéresse pour réaliser un programme qui permet d' analyser la hauteur du son lorsqu'un fichier wav est diffusé :
c'est exactement ce que je recherche comme analyse.

Code: Select all

import alsaaudio as aa #sudo apt-get install  python-alsaaudio
import audioop
import wave

# Set up audio
wavfile = wave.open('Accent_du_sud_ouest.wav','r')
sample_rate = wavfile.getframerate()
no_channels = wavfile.getnchannels()
chunk = 2048 # Use a multiple of 8 1024
output = aa.PCM(aa.PCM_PLAYBACK, aa.PCM_NORMAL)
output.setchannels(no_channels)
output.setrate(sample_rate)
output.setformat(aa.PCM_FORMAT_S16_LE)
output.setperiodsize(chunk)

data = wavfile.readframes(chunk)
while data!='':
	output.write(data)
	# Split channel data and find maximum volume	
	channel_l=audioop.tomono(data, 2, 1.0, 0.0)
	max_vol_factor =5000
	max_l = audioop.max(channel_l,2)/max_vol_factor
	print max_l
	data = wavfile.readframes(chunk)
Maintenant si vous avez une idée pour réaliser la même chose avec le son reçu en Bluetooth je suis preneur.

nikotinux
Posts: 570
Joined: Sat Feb 02, 2013 2:11 am

Re: savoir si le raspberry diffuse de l'audio?

Tue Dec 05, 2017 11:12 pm

peut etre chercher du coté des
/proc/asound/cardX/pcmYY/subZ/status ?

personnellement cela indique "closed" quand je ne joue pas de son sur la sortie correspondante, ou diverses info, dont le pid du programme qui utilise cette sortie ...

seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

Re: savoir si le raspberry diffuse de l'audio?

Wed Dec 06, 2017 10:43 pm

bonsoir,
Et bien je suis épaté .
Déjà par le cheminement qui t'a amené à connaitre cette fonction de Raspbian.
Mais surtout par la fonction en elle-même.
C'est tellement simple, les événements vécus par la carte sont écrits en direct dans un simple fichier texte.
Si Raspbian accepte sans planter que pendant l'écriture du rapport, un programme python ouvre le fichier toutes les 0.2 secondes afin de lire les diverses informations je devrais pouvoir écrire demain un programme d'extraction de données pour vérifier si elles sont exploitables.

seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

Re: savoir si le raspberry diffuse de l'audio?

Thu Dec 07, 2017 11:25 am

voila 2 programmes. Le premier joue un fichier wav tout en affichant des données extraites du ficher status.
le second affiche juste en temps réel des données du ficher status :

Code: Select all

import time
import pygame

pygame.mixer.init()
pygame.mixer.music.load(open("Accent_du_sud_ouest.wav","rb"))
print ""
pygame.mixer.music.play()

while pygame.mixer.music.get_busy():
    fichier = open("/proc/asound/ALSA/pcm0p/sub0/status", "r")
    strStatus = fichier.read()
    fichier.close()
    #print strStatus

    strStatus = strStatus[strStatus.find("tstamp"):]
    strTstamp = strStatus[:strStatus.find("\n")]

    strStatus = strStatus[strStatus.find("delay"):]
    strDelay = strStatus[:strStatus.find("\n")]
    
    strStatus = strStatus[strStatus.find("avail"):]
    strAvail = strStatus[:strStatus.find("\n")]
    
    strStatus = strStatus[strStatus.find("avail_max"):]
    strAvail_max = strStatus[:strStatus.find("\n")]
  
    strStatus = strStatus[strStatus.find("hw_ptr"):]
    strHw_ptr = strStatus[:strStatus.find("\n")]

    strStatus = strStatus[strStatus.find("appl_ptr"):]
    strHw_Appl = strStatus[:strStatus.find("\n")]
    
    print strTstamp
    print strDelay
    print strAvail
    print strAvail_max
    print strHw_ptr
    print strHw_Appl
    print("")
    time.sleep(0.1)

Code: Select all

import time
while 1:
    fichier = open("/proc/asound/ALSA/pcm0p/sub0/status", "r")
    strStatus = fichier.read()
    fichier.close()
    #print strStatus

    strStatus = strStatus[strStatus.find("tstamp"):]
    strTstamp = strStatus[:strStatus.find("\n")]

    strStatus = strStatus[strStatus.find("delay"):]
    strDelay = strStatus[:strStatus.find("\n")]
    
    strStatus = strStatus[strStatus.find("avail"):]
    strAvail = strStatus[:strStatus.find("\n")]
    
    strStatus = strStatus[strStatus.find("avail_max"):]
    strAvail_max = strStatus[:strStatus.find("\n")]
  
    strStatus = strStatus[strStatus.find("hw_ptr"):]
    strHw_ptr = strStatus[:strStatus.find("\n")]

    strStatus = strStatus[strStatus.find("appl_ptr"):]
    strHw_Appl = strStatus[:strStatus.find("\n")]
    
#    print strTstamp
    print strDelay
    print strAvail
    print strAvail_max
    print strHw_ptr
    print strHw_Appl
    print("")
    time.sleep(0.1)	
Dans mon cas lors des montées en intensité sonore ou lors des silences, je ne remarque pas de données pouvant être exploitées .
avez-vous une autre piste?

seg'hot
Posts: 10
Joined: Fri Nov 17, 2017 10:45 pm

Re: savoir si le raspberry diffuse de l'audio?

Sun Dec 10, 2017 2:20 pm

c' est bon cela fonctionne .
j' étais dans une impasse mais au moins Le petit programme en python permettant d' analyser un fichier wav fonctionnait parfaitement.
je l' ai donc utilisé comme base de travail .
L' idée était de suivre une nouvelle piste :


Comment analyser le volume audio du son entendu dans les Hauts-parleurs du Raspberry?

2 étapes :
1 creer un micro virtuel qui capte le son en sortie des hauts-parleurs .
2 créer un programme qui analyse le son capté.

ÉTAPE 1: créer un micro virtuel qui capte le son en sortie du Raspberry.
Pour disposer d'une nouvelle carte son virtuelle avec micro entrez dans la console :
sudo modprobe snd-aloop
Pour conserver la carte virtuelle au démarage ajouter cette ligne au fichier /etc/modules :
snd-aloop
Pour rendre disponible les sons entendus dans les haut-parleurs pour l'enregistrement ou la diffusion
créer dans le répertoire home un fichier nommé .asoundrc contenant les lignes suivantes:

Code: Select all

pcm.!default {
  type asym
  playback.pcm "LoopAndReal"
  capture.pcm "looprec"
}

pcm.looprec {
    type hw
    card "Loopback"
    device 1
    subdevice 0
}

pcm.LoopAndReal {
  type plug
  slave.pcm mdev
  route_policy "duplicate"
}

pcm.mdev {
  type multi
  slaves.a.pcm pcm.MixReale
  slaves.a.channels 2
  slaves.b.pcm pcm.MixLoopback
  slaves.b.channels 2
  bindings.0.slave a
  bindings.0.channel 0
  bindings.1.slave a
  bindings.1.channel 1
  bindings.2.slave b
  bindings.2.channel 0
  bindings.3.slave b
  bindings.3.channel 1
}

pcm.MixReale {
  type dmix
  ipc_key 1024
  slave {
    pcm "hw:0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

pcm.MixLoopback {
  type dmix
  ipc_key 1025
  slave {
    pcm "hw:Loopback,0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}
Vous pouvez ajuster les divers réglages en installant le panneau de contrôle du son. Entrez dans la console :
sudo apt-get install pavucontrol


ETAPE 2: créer un programme python 2.7 qui analyse le son du micro.
voila un premier jet :

Code: Select all

# programme qui annalyse la hauteur du son sortant du micro
#
import pyaudio #sudo apt-get install  python-pyaudio
import audioop


# Ajuster chunk pour syncroniser analyse/audition
# 880 960 1040 1200 1120 1200 1280 1360 1440
chunk = 1440


#
sample_rate = 44100
no_channels = 2 
device = 13 # l'adresse du micro
p = pyaudio.PyAudio()
stream = p.open(format = pyaudio.paInt16,
                channels = no_channels,
                rate = sample_rate,
                input = True,
                frames_per_buffer = chunk,
                input_device_index = device)
# annalyse du son
while 1:
           
    try:
        data = stream.read(chunk)
        channel_l=audioop.tomono(data, 2, 1.0, 0.0)
        max_vol_factor =5000
        max_l = audioop.max(channel_l,2)/max_vol_factor
        if max_l > 0 :
            print max_l
        else :
            print " "
    except Exception, e:
        print(e)
        print("ERROR Terminating...")
        stream.stop_stream()
        stream.close()
        p.terminate()
c' est important de maîtriser l' utilisation du panneau de contrôle du son , puis dans le programme python de régler la synchronisation entre le son et l' analyse.

jelopo
Posts: 1232
Joined: Wed Oct 17, 2012 7:53 pm

Re: savoir si le raspberry diffuse de l'audio?

Mon Dec 11, 2017 6:18 am

Bonjour,
@seg'hot,
Et bien je suis épaté .
moi aussi!
Bon courage pour le reste de ce beau projet.
A+

Return to “Français”

Who is online

Users browsing this forum: No registered users and 8 guests