2008-11-20 14 views
83

Was ist der einfachste Weg, eine Sounddatei (.wav) in Python abzuspielen? Mit dem einfachsten meine ich sowohl die meisten plattformunabhängig als auch die geringsten Abhängigkeiten. Pygame ist sicherlich eine Option, aber es scheint Overkill für nur Sound.Einen Sound mit Python abspielen

+0

Sehr ähnliche Frage zu http://stackoverflow.com/questions/260738/play-audio-with-python. –

+0

Oder das: http://stackoverflow.com/questions/276266/whats-a-cross-platform-way-to-play-a-sound-file-in-python – lpfavreau

Antwort

29

The Snack Sound Toolkit kann wav, au und mp3-Dateien abspielen.

s = Sound() 
s.read('sound.wav') 
s.play() 
+0

Snack scheint nicht mit einigen eingebetteten Systemumgebung zu arbeiten –

+4

es ist auch nicht auf Pypi :-( – Danimal

+14

Snack scheint tot zu sein (letzte Aktualisierung 2005 - vor zehn Jahren). – Olli

4

Das Beispiel von pyMedia ist just that. Dies sollte alles sein, was Sie brauchen.

import time, wave, pymedia.audio.sound as sound 
f= wave.open('YOUR FILE NAME', 'rb') 
sampleRate= f.getframerate() 
channels= f.getnchannels() 
format= sound.AFMT_S16_LE 
snd= sound.Output(sampleRate, channels, format) 
s= f.readframes(300000) 
snd.play(s) 
+0

hehe, das funktioniert gut, aber das Snack-Beispiel benötigt viel weniger Codezeilen! Ich bin sicher, pymedia ist flexibler – Claudiu

14

Verwenden Sie unbedingt Pyglet dafür. Es ist eine Art großes Paket, aber es ist reines Python ohne Erweiterungsmodule. Das wird definitiv am einfachsten für den Einsatz sein. Es hat auch großartige Format- und Codec-Unterstützung.

import pyglet 

music = pyglet.resource.media('music.mp3') 
music.play() 

pyglet.app.run() 
+1

nur ein Problem mit diesem Beispiel: die Mediendatei muss auf dem Pfad (python) sein – Steen

+1

Das ist in Ordnung - solange Sie nichts dagegen haben, dass pyglet den Python-Prozess übernimmt – Tom

82

Für Windows können Sie winsound verwenden. Es ist in

import winsound 

winsound.PlaySound('sound.wav', winsound.SND_FILENAME) 

gebaut Sie sollten für Linux zu verwenden ossaudiodev Lage:

from wave import open as waveOpen 
from ossaudiodev import open as ossOpen 
s = waveOpen('tada.wav','rb') 
(nc,sw,fr,nf,comptype, compname) = s.getparams() 
dsp = ossOpen('/dev/dsp','w') 
try: 
    from ossaudiodev import AFMT_S16_NE 
except ImportError: 
    from sys import byteorder 
    if byteorder == "little": 
    AFMT_S16_NE = ossaudiodev.AFMT_S16_LE 
    else: 
    AFMT_S16_NE = ossaudiodev.AFMT_S16_BE 
dsp.setparameters(AFMT_S16_NE, nc, fr) 
data = s.readframes(nf) 
s.close() 
dsp.write(data) 
dsp.close() 

(Kredit für ossaudiodev: Bill Dandreta http://mail.python.org/pipermail/python-list/2004-October/288905.html)

+0

das ist gut - es scheint einfach zu sein baue einen Wrapper, der zumindest für diese beiden Plattformen funktionieren würde – Claudiu

+1

Vermeide Oss, es ist alt, ich glaube nicht, dass ich es überhaupt installiert habe –

+6

OSS ist nicht alt. Es ist nur so, dass die Linux-Leute es aus Gründen, die mehr mit Politik und Ego als mit Softwareentwicklung zu tun haben, entschieden haben, es durch ALSA zu ersetzen. Unabhängig davon bleibt OSS das einzige plattformübergreifende UNIX-Soundsystem und wird wahrscheinlich auch in absehbarer Zeit bestehen bleiben. – Carpetsmoker

2

I pygame mögen, und der folgende Befehl sollte funktionieren :

pygame.init() 
pygame.mixer.Sound('sound.wav').play() 

aber es ist nicht auf einer meiner Berechnungen rs, und es gibt nur begrenzte Hilfe zum Thema da draußen. edit: Ich habe herausgefunden, warum der Pygame-Sound bei mir nicht funktioniert, er lädt die meisten Sounds nicht richtig, das Attribut 'Länge' ist ~ 0,0002, wenn ich sie lade. vielleicht lädt man sie mit etwas anderem als mygame, um es allgemeiner zu machen.

mit pyglet Ich bekomme eine Ressource nicht gefunden Fehler Verwenden Sie das obige Beispiel, sowohl relative als auch vollständige Pfade zu den Dateien.

mit pyglet.media.load() anstelle von pyglet.resource.media() kann ich die Dateien laden.

aber sound.play() spielt nur die erste Bruchteil einer Sekunde der Datei, es sei denn, ich pyglet.app.run() laufen die Blöcke alles andere ...

+1

Aus dem Handbuch: "Das Mixer-Modul muss wie andere pygame-Module initialisiert werden, aber es hat einige zusätzliche Bedingungen. Die pygame.mixer.init - Initialisierung der Mixer-Modul-Funktion nimmt mehrere optionale Argumente, um die Wiedergabegeschwindigkeit und Stichprobengröße zu steuern. Pygame wird standardmäßig auf vernünftige Werte gesetzt, aber pygame kann kein Sound-Resampling durchführen, daher sollte der Mixer initialisiert werden, damit er mit den Werten der Audio-Ressourcen übereinstimmt. " - Das könnte der Grund sein, warum Ihre Ressourcen nicht korrekt geladen werden ... –

2

wxPython hat die Unterstützung für WAV-Dateien unter Windows und Unix spielen - Ich bin nicht sicher, ob Dazu gehören Macs. Allerdings unterstützt es nur Wav-Dateien, soweit ich das beurteilen kann - es unterstützt keine anderen gängigen Formate wie MP3 oder OGG.

6

Nach dem Spiel() Befehl eine Verzögerung hinzufügen von 10 Sekunden sagen, oder so, wird es

import pygame 

import time 

pygame.init() 

pygame.mixer.music.load("test.wav") 

pygame.mixer.music.play() 

time.sleep(10) 

Dies spielt auch MP3-Dateien arbeiten.

+0

pygame verwendet nicht die korrekte Abtastrate für die Wave-Dateien, die ich verwende – Octopus

2

Ich habe gerade einen einfachen Python-Wrapper um Sox veröffentlicht, der einen Sound mit Python spielen wird. Es ist sehr einfach zu installieren, da Sie Python 2.6 oder höher, sox (leicht zu Binärdateien für die meisten Architekturen) und den Wrapper (https://github.com/standarddeviant/sound4python) benötigen.Wenn Sie nicht Sox haben, hier gehen: http://sourceforge.net/projects/sox/files/sox/

Sie Audio spielen würde mit ihm durch:

from sound4python import sound 
import random 
a = [] 
for idx in xrange(1*16000): 
    a.append(random.randint(-16384,16384)) 
sound(a) 

Denken Sie daran, tatsächlich die einzigen Teile, in die Wiedergabe von Audio beteiligt sind gerade diese:

from sound4python import sound 
... 
sound(a)  
1

Für Linux Benutzer, wenn Low-Level-PCM Daten Manipulation benötigt wird, versuchen alsaaudio Modul. Es gibt auch ein playwav.py-Beispiel innerhalb des Pakets.

+0

Link http://larsimmisch.github.io/pyalsaaudio/libalsaaudio.html#playwav-py –

18

Das scheint lächerlich und weit hergeholt, aber Sie könnten immer Windows (oder welches Betriebssystem Sie bevorzugen) verwenden, um den Sound für Sie zu verwalten!

import os 
os.system("start C:/thepathyouwant/file") 

Einfach, keine Erweiterungen, etwas langsam und junky, aber funktioniert.

+0

Nett. Öffnen Sie eine ganze Menge von Möglichkeiten zu wissen, Python hatte diese Funktion – swdev

+9

Dies ist keine Funktion von Python, es ist ein Aufruf an einen Prozess im Betriebssystem. es ist nicht plattformübergreifend, und es ist furchtbar teuer – erjoalgo

+12

Cross-Plattform: 'Import sys'' aus Subprozess importieren Aufruf '' if sys.platform == 'linux2': '' call (["xdg-open", "Sound .mp3 "])' 'elif sys.platform == 'darwin':' 'call ([" afplay "," sound.mp3 "])' Was teuer ist, ist Zeitverschwendung bei all diesen fehlerhaften Sound-Bibliotheken tbh. Ersetzen von 'xdg- open 'für' mpg123' gibt 'afplay' Funktionalität unter Linux –