Wiedergabe von Audio mit Python


Answers

Ihre beste Wette ist wahrscheinlich, pygame / SDL zu verwenden . Es ist eine externe Bibliothek, aber es hat große Unterstützung über Plattformen hinweg.

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

Eine genauere Dokumentation zur Unterstützung des Audiomixers finden Sie in der Dokumentation pygame.mixer.music

Question

Wie kann ich Audio (es wäre wie ein 1-Sekunden-Ton) von einem Python-Skript abspielen?

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

Ich weiß, dass ich einfach den Befehl afplay file.mp3 innerhalb von Python ausführen kann, aber ist es möglich, dies in raw Python zu tun? Ich wäre auch besser, wenn es nicht auf externe Bibliotheken angewiesen wäre.




Dies ist das einfachste und beste, 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)

Siehe https://github.com/bastibe/PySoundFile und https://github.com/bastibe/SoundCard für viele andere super nützliche Funktionen.




Sehen Sie sich Simpleaudio an , 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.




Aarons Antwort scheint etwa zehnmal 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()

Eins ... das kommt sofort zurück. Vielleicht möchten Sie dies auch tun, wenn der Anruf blockiert werden soll, bis der Sound beendet ist.

from time import sleep

sleep(sound.duration())

Edit: Ich habe diese Funktion übernommen und mit Varianten für Windows und Linux kombiniert. Das Ergebnis ist ein reines Python-, Cross-Plattform-Modul ohne Abhängigkeiten mit dem Namen playsound . 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.




VLC hat hier ein paar nette Python-Bindings, für mich funktioniert das besser als Pyglet, zumindest unter Mac OS:

https://wiki.videolan.org/Python_bindings

Aber es verlässt sich leider auf die VLC-Anwendung, leider




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

Hier ein kleines Beispiel aus der Readme:

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()



Einfach Sie können es mit Hilfe von cvlc machen - ich habe es so gemacht:

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

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




Wenn Sie eine tragbare Python- Audiobibliothek benötigen, probieren Sie PyAudio aus . Es hat sicherlich einen Mac-Port.

Was MP3-Dateien angeht: Es ist in "raw" Python sicherlich machbar, nur ich fürchte, Sie müssten alles selbst programmieren :). Wenn Sie sich eine externe Bibliothek leisten können, habe ich hier ein PyAudio - PyLame Beispiel gefunden.







Links