web-dev-qa-db-de.com

Audio mit Python abspielen

Wie kann ich Audiodateien aus einem Python-Skript abspielen (es wäre wie eine Sekunde lang)?

Es wäre am besten, wenn es plattformunabhängig wäre, aber zunächst muss es auf einem Mac funktionieren.

Ich weiß, ich könnte den Befehl afplay file.mp3 einfach in Python ausführen, aber ist es auch möglich, dies in rohem Python auszuführen? Ich wäre auch besser, wenn es nicht auf externe Bibliotheken angewiesen wäre.

94
Josh Hunt

Informationen zu Python-Audio finden Sie hier: http://wiki.python.org/moin/Audio/

Es sieht nicht so aus, als ob sie MP3-Dateien ohne externe Bibliotheken abspielen kann. Sie können entweder Ihre MP3-Datei in ein WAV- oder anderes Format konvertieren oder eine Bibliothek wie PyMedia verwenden.

19
Jeremy Ruten

Ihre beste Wette ist wahrscheinlich pygame/SDL . Es ist eine externe Bibliothek, die aber plattformübergreifend unterstützt wird.

pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()

Weitere Informationen zur Unterstützung des Audiomixers finden Sie in der Dokumentation pygame.mixer.music.

38
TML

Werfen Sie einen Blick auf Simpleaudio , eine relativ neue und leichtgewichtige Bibliothek für diesen Zweck:

> pip install simpleaudio

Dann:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

Stellen Sie sicher, dass Sie unkomprimierte 16-Bit-PCM-Dateien verwenden.

14
Erwin Mayer

In pydub haben wir kürzlich die Verwendung von ffplay (über den Subprozess) } aus der ffmpeg-Suite von Tools ausgewählt, die intern SDL verwenden.

Es funktioniert für unsere Zwecke - hauptsächlich um das Testen der Ergebnisse von pydub-Code im interaktiven Modus zu vereinfachen -, aber es hat auch Nachteile, zum Beispiel, dass ein neues Programm im Dock auf dem Mac angezeigt wird.

Ich habe die Implementierung oben verlinkt, aber es folgt eine vereinfachte Version:

import subprocess

def play(audio_file_path):
    subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path])

Das -nodisp-Flag verhindert, dass ffplay ein neues Fenster anzeigt, und das -autoexit-Flag bewirkt, dass ffplay beendet wird und einen Statuscode zurückgibt, wenn die Audiodatei abgespielt ist.

edit: pydub verwendet jetzt pyaudio, wenn es installiert ist, und greift auf ffplay zurück, um die genannten Nachteile zu vermeiden. Der Link oben zeigt auch diese Implementierung.

13
Jiaaro

Entschuldigung für die späte Antwort, aber ich denke, das ist ein guter Ort, um meine Bibliothek zu bewerben ...

AFAIK, die Standardbibliothek hat nur ein Modul für die Audiowiedergabe: ossaudiodev . Leider funktioniert dies nur unter Linux und FreeBSD.

UPDATE: Es gibt auch winsound , aber das ist natürlich auch plattformspezifisch.

Um etwas plattformunabhängiger zu machen, müssen Sie eine externe Bibliothek verwenden.

Meine Empfehlung ist das sounddevice module (aber Vorsicht, ich bin der Autor).

Das Paket enthält die vorkompilierte PortAudio library für Mac OS X und Windows und kann einfach installiert werden mit:

pip install sounddevice --user

Es kann Ton von NumPy-Arrays wiedergeben, es können jedoch auch normale Python-Puffer verwendet werden (wenn NumPy nicht verfügbar ist).

Um ein NumPy-Array abzuspielen, reicht dies aus (vorausgesetzt, die Audiodaten haben eine Abtastfrequenz von 44100 Hz):

import sounddevice as sd
sd.play(myarray, 44100)

Weitere Informationen finden Sie in der Dokumentation .

Es kann keine Audiodateien lesen/schreiben, dafür benötigen Sie eine separate Bibliothek.

9
Matthias

Try playsound ist ein reines Python, plattformübergreifendes, einzelnes Funktionsmodul ohne Abhängigkeiten für das Spielen von Sounds.

Per pip installieren:

$ pip install playsound

Nach der Installation können Sie es wie folgt verwenden:

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
8
yehan jaya

Wenn Sie eine tragbare Python-Audio-Bibliothek benötigen, versuchen Sie PyAudio . Es hat sicherlich einen Mac-Port.

Was MP3-Dateien angeht, ist dies in "rohem" Python durchaus machbar, nur ich fürchte, Sie müssten alles selbst codieren :). Wenn Sie sich eine externe Bibliothek leisten können, habe ich hier PyAudio - PyLame sample gefunden.

6
Grzegorz Gacek

Sie können dies sehen: http://www.speech.kth.se/snack/

s = Sound() 
s.read('sound.wav') 
s.play()
5
user1926182

Pyglet kann Audio über eine externe Bibliothek namens AVbin wiedergeben. Pyglet ist ein ctypes-Wrapper für systemeigene Systemaufrufe auf jeder unterstützten Plattform. Leider glaube ich nicht, dass in der Standardbibliothek Audio wiedergegeben wird.

5
technomalogical

Aarons Antwort scheint etwa 10x komplizierter als nötig zu sein. Tun Sie dies einfach, wenn Sie nur eine Antwort benötigen, die unter OS X funktioniert:

from AppKit import NSSound

sound = NSSound.alloc()
sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True)
sound.play()

Eine Sache ... das kehrt sofort zurück. Möglicherweise möchten Sie dies auch tun, wenn der Anruf blockiert werden soll, bis der Sound zu Ende ist.

from time import sleep

sleep(sound.duration())

Edit: Ich habe diese Funktion mit Varianten für Windows und Linux kombiniert. Das Ergebnis ist ein reines plattformübergreifendes Python-Modul ohne Abhängigkeiten, das als playsound bezeichnet wird. Ich habe es auf pypi hochgeladen.

pip install playsound

Dann führe es so aus:

from playsound import playsound
playsound('/path/to/file.wav', block = False)

MP3-Dateien funktionieren auch unter OS X. WAV sollte auf allen Plattformen funktionieren. Ich weiß nicht, was andere Kombinationen von Plattform/Dateiformat tun oder nicht funktionieren - ich habe sie noch nicht ausprobiert.

3
ArtOfWarfare

Auch unter OSX - von SO , mit OSXs afplay Befehl:

import subprocess
subprocess.call(["afplay", "path/to/audio/file"])

UPDATE: Alles, was Sie tun müssen, ist , wie das tun soll, was das OP von vornherein vermeiden wollte. Ich schätze, ich habe dies hier veröffentlicht, weil OP die Informationen war, nach denen ich gesucht hatte. Hoppla.

2
MikeiLL

Es ist möglich, Audio unter OS X ohne Fremdbibliotheken mit einem Analogon des folgenden Codes wiederzugeben. Die rohen Audiodaten können mit wave_wave.writeframes eingegeben werden. Dieser Code extrahiert 4 Sekunden Audio aus der Eingabedatei.

import wave
import io
from AppKit import NSSound


wave_output = io.BytesIO()
wave_Shell = wave.open(wave_output, mode="wb")
file_path = 'SINE.WAV'
input_audio = wave.open(file_path)
input_audio_frames = input_audio.readframes(input_audio.getnframes())

wave_Shell.setnchannels(input_audio.getnchannels())
wave_Shell.setsampwidth(input_audio.getsampwidth())
wave_Shell.setframerate(input_audio.getframerate())

seconds_multiplier = input_audio.getnchannels() * input_audio.getsampwidth() * input_audio.getframerate()

wave_Shell.writeframes(input_audio_frames[second_multiplier:second_multiplier*5])

wave_Shell.close()

wave_output.seek(0)
wave_data = wave_output.read()
audio_stream = NSSound.alloc()
audio_stream.initWithData_(wave_data)
audio_stream.play()
2
Aaron

Sie können dies nicht ohne eine nicht standardmäßige Bibliothek tun.

für Windows-Benutzer, die in diesem Thread landen, versuchen Sie pythonwin . PyGame hat einige Soundunterstützung. Für Hardware-beschleunigtes Game-Audio müssen Sie wahrscheinlich OpenAL oder ähnliches über ctypes aufrufen.

1
Dustin Getz

VLC hat hier einige Nice-Python-Bindungen, die für mich besser funktionierten als Pyglet, zumindest unter Mac OS:

https://wiki.videolan.org/Python_bindings

Aber es ist leider auf die VLC-Anwendung angewiesen

1
alexvicegrab

Pypi hat eine Liste von Modulen für Python in Musik. Mein Favorit wäre jython , weil es mehr Ressourcen und Bibliotheken für Musik hat. Als Beispiel für Code, um eine einzelne Note aus dem Lehrbuch zu spielen :

# playNote.py 
# Demonstrates how to play a single note.

from music import *   # import music library
note = Note(C4, HN)   # create a middle C half note 
Play.midi(note)       # and play it!
1
Kardi Teknomo

Probieren Sie PySoundCard aus, das PortAudio für die Wiedergabe verwendet, das auf vielen Plattformen verfügbar ist . Außerdem erkennt es "professionelle" Soundgeräte mit vielen Kanälen.

Hier ein kleines Beispiel aus der Liesmich:

from pysoundcard import Stream

"""Loop back five seconds of audio data."""

fs = 44100
blocksize = 16
s = Stream(samplerate=fs, blocksize=blocksize)
s.start()
for n in range(int(fs*5/blocksize)):
    s.write(s.read(blocksize))
s.stop()
1
Stefan Balke
import subprocess
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
man aplay
0
Crawsome

Um einen Benachrichtigungston mit Python abzuspielen, rufen Sie einen Musikplayer wie z. B. vlc an. VLC forderte mich auf, stattdessen die Kommandozeilenversion cvlc zu verwenden.

from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])

Es muss vlc auf dem Gerät vorinstalliert sein. Getestet unter Linux (Ubuntu 16.04 LTS); Python laufen lassen 3.5.

0
amarVashishth

Mac OS Ich habe viele Codes ausprobiert, aber das funktioniert bei mir 

import pygame
import time
pygame.mixer.init()
pygame.init()
pygame.mixer.music.load('fire alarm sound.mp3') *On my project folder*
i = 0
while i<10:
    pygame.mixer.music.play(loops=10, start=0.0)
    time.sleep(10)*to protect from closing*
    pygame.mixer.music.set_volume(10)
    i = i + 1
0
Captain Django

Dies ist das einfachste und beste Ergebnis, das ich gefunden habe. Es unterstützt Linux/Pulseaudio, Mac/Coreaudio und Windows/WASAPI.

import soundfile as sf
import soundcard as sc

default_speaker = sc.default_speaker()
samples, samplerate = sf.read('bell.wav')

default_speaker.play(samples, samplerate=samplerate)

Unter https://github.com/bastibe/PySoundFile und https://github.com/bastibe/SoundCard finden Sie eine Vielzahl weiterer nützlicher Funktionen.

0
n00p

Sie können es einfach mit Hilfe von cvlc -.__ tun. Ich habe es so gemacht:

import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")

/home/maulo/selfProject/task.mp3. Dies ist der Ort meiner MP3-Datei . Mit Hilfe von "--play-and-exit" können Sie den Sound erneut abspielen, ohne den vlc-Vorgang zu beenden.

0
pyAddict

Wenn Sie mit OSX arbeiten, können Sie mit dem Modul "os" oder "subprozess" usw. den Befehl "play" von OSX aufrufen. In der OSX-Shell sieht es so aus 

spiele "bah.wav"

Es beginnt in etwa einer halben Sekunde auf meiner Maschine zu spielen.

0
Moondoggy