Lecture de fichiers audio avec Python

39

Je cherche une bibliothèque Python bien entretenue qui me permette de lire des fichiers audio sur mon Raspberry Pi en utilisant la sortie audio standard.

Jusqu'à présent, j'en ai essayé plusieurs, mais aucun ne semble fonctionner. Bien que pyglet fonctionne sur mon ordinateur normal, il provoque une erreur sur le Raspberry Pi. Existe-t-il une bibliothèque Python qui s'est révélée facile à utiliser?

Stein
la source
Prouvé comme facile à utiliser est un peu relatif, mais j'ai posté une alternative à pygame à une question similaire sur StackOverflow ici . En gros, cette alternative est vlc.py (le module libVLC Python, qui est très bien entretenu).
Ben
Une question plus bas dit que Pyglet travaille sur le RPi. Pouvez-vous mettre à jour avec votre erreur?
Brian Bulkowski

Réponses:

32

Je recommande le très populaire Pygame. Je me trompe peut-être, mais je crois qu'il est pré-installé sur le Pi. Vous pouvez utiliser le module de musique du mixeur Pygame pour lire des fichiers audio. J'ai inclus un exemple de code ci-dessous.

En supposant que nous ayons un fichier audio appelé myFile.wav.

import pygame
pygame.mixer.init()
pygame.mixer.music.load("myFile.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue

REMARQUE: si cela échoue, accédez au terminal et mettez à jour votre système avec

apt-get update
apt-get upgrade

et essayez à nouveau.

xxmbabanexx
la source
2
Si vous avez plusieurs sons à jouer (ce qui est probablement le cas), il est préférable de créer un objet pygame.mixer.Sound pour chacun d'eux, vous pouvez alors conserver les définitions des noms de fichiers de sons au même endroit.
francis
C’est ce que je veux, mais le son de ma carte mère n’ayant pas de pilote, j’utilise une carte son USB. Il joue espeaktrès bien, mais pas ça.
SDsolar
11

J'avais besoin d'un script pour jouer une chanson de trente secondes en arrière-plan tout en répondant aux commentaires des autres utilisateurs. Je voulais alors que ça termine la chanson sur un événement.

Je ne suppose pas que ce soit particulièrement élégant, mais j’ai ouvert un tuyau vers un processus MPlayer en arrière-plan.

import subprocess
player = subprocess.Popen(["mplayer", "song.mp3", "-ss", "30"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Ensuite, lorsque j'ai voulu mettre fin au processus MPlayer, j'ai simplement écrit "q" pour quitter le canal.

player.stdin.write("q")

Consultez la documentation de MPlayer pour connaître toutes sortes de commandes que vous pouvez passer de cette manière pour contrôler la lecture.

J'espère que c'est un peu utile!

utilisateur1616681
la source
1
C'est vraiment chouette en fait. Ce tutoriel sur les adafruits explique comment jouer du son sans l'arrêter.
Gideon
6

Une autre option consiste à l’utiliser mpg321et à l’appeler à partir de la ligne de commande.

apt-get install mpg321

Puis en Python:

import os

os.system('mpg321 foo.mp3 &')

Pygame est certainement plus robuste, mais cela dépend, je suppose, de vos besoins.

Brandorf
la source
1
J'y ai pensé moi-même, mais je pensais que ce n'était pas très élégant, parce que cela rendait beaucoup plus difficile les pauses, le contrôle du volume, etc.
Stein
C'est terriblement lent.
Alex
3

Je recommanderais pyglet plutôt que pygame si vous n'avez pas besoin de graphisme. À mon avis, il est plus simple, plus élégant et mieux entretenu. Là encore, je suppose que cela pourrait être une question de goût.

Bex
la source
1
Alors, comment l'utilisez-vous?
SDsolar
pyglet ne semble fonctionner que lorsqu'un affichage est disponible; son exécution à distance ou en tant que démon uniquement pour jouer des sons ne fonctionne pas.
Oh7lzb
0

Pygame vous offre un moyen simple et agréable de charger et de lire des sons sur différents canaux.

mrpi64
la source
0

Vous pouvez utiliser plusieurs lecteurs externes via des pipes. Cependant, vous constaterez presque toujours une perte de vitesse. Il y a aussi un problème avec le contrôle de lecture.

Je vous recommande pyaudio, ça marche bien.

Si vous souhaitez également lire des fichiers compressés, je serai aussi libre de vous indiquer mon module decoder.py. Vous pouvez le trouver sur PyPI.

Il utilise également des sous-processus, mais appelle des décodeurs au lieu de joueurs. Ils n'utilisent pas beaucoup de temps processeur et certains savent comment utiliser l'accélération matérielle. Vous pouvez ensuite utiliser pyaudio ou quelque chose pour sortir les données audio brutes. Si vous le souhaitez, vous pouvez même utiliser pygame en utilisant pygame.sndarray. De cette façon, vous pouvez lire plus de formats que ce que pygame ne prend en charge.

J'ai essayé decoder.py dans un environnement d'interface graphique PyQT, avec pyaudio et également en utilisant aplay en tant que lecteur externe. C'était sur Raspberry Pi B.

Les résultats ont été assez satisfaisants dans les deux cas.

La simplicité peut être remise en question.

decoder.py lui-même est très simple, mais vous devez le combiner avec d'autres bibliothèques et cela augmente les lignes de code.

Il y a un exemple sur la façon de lire les fichiers inclus avec decoder.py.

Dalen
la source
0

J'utilise OSMC (Debian) et le son est diffusé via les haut-parleurs de mon téléviseur, connectés via HDMI. https://youtu.be/p2ljmTE67gs

Ma méthode était basée sur la solution ci-dessus publiée par @xxmbabanexx ainsi qu'ici . Fondamentalement, je devais ajouter dtparam=audio=onà/boot/config.txt

jinker
la source
Je pense que le TS voulait dire le jack 3,5 mm quand on parle de "sortie audio standard". Cela fonctionne-t-il également pour la prise jack 3.5?
Bex
Oh je vois. Hmm, ce ne sera probablement pas le cas, même si je ne l'ai pas essayé.
jjinking