เล่นเสียงด้วย Python


108

ฉันจะเล่นเสียง (เหมือนเสียง 1 วินาที) จากสคริปต์ Python ได้อย่างไร

มันจะดีที่สุดถ้าเป็นแพลตฟอร์มที่ไม่ขึ้นกับใคร แต่อย่างแรกต้องทำงานบน Mac

ฉันรู้ว่าฉันสามารถรันafplay file.mp3คำสั่งจากภายใน Python ได้ แต่เป็นไปได้ไหมที่จะทำใน Python ดิบ ฉันจะดีกว่าถ้ามันไม่ได้อาศัยไลบรารีภายนอก


pygletมีความสามารถในการเล่นเสียงกลับผ่านห้องสมุดภายนอกเรียกว่าAVbin Pyglet เป็น ctypes wrapper รอบ ๆ การเรียกระบบเนทีฟบนแต่ละแพลตฟอร์มที่รองรับ น่าเสียดายที่ฉันไม่คิดว่าจะมีอะไรในไลบรารีมาตรฐานเล่นเสียงกลับมา
technomalogical

หากคุณจำเป็นต้องพกพางูหลามห้องสมุดเสียงลองPyAudio มันมีพอร์ต mac อย่างแน่นอน สำหรับไฟล์ mp3: สามารถทำได้ใน Python "raw" แต่ฉันกลัวว่าคุณจะต้องเขียนโค้ดทุกอย่างด้วยตัวเอง :) หากคุณสามารถซื้อไลบรารีภายนอกได้ฉันพบตัวอย่าง PyAudio - PyLameที่นี่
Grzegorz Gacek

คำตอบ:


17

คุณสามารถค้นหาข้อมูลเกี่ยวกับเสียง Python ได้ที่นี่: http://wiki.python.org/moin/Audio/

ดูเหมือนว่ามันจะเล่นไฟล์. mp3 โดยไม่มีไลบรารีภายนอกไม่ได้ คุณจะสามารถแปลงไฟล์ .mp3 ของคุณเพื่อ .wav หรืออื่น ๆ ที่เป็นรูปแบบหรือใช้ห้องสมุดเช่นPyMedia


13
แต่ฉันจะเล่น.wavไฟล์ได้อย่างไร?
theonlygusti

@theonlygusti ดูที่นี่ยกตัวอย่างเช่น
Anderson Green

42

ทางออกที่ดีที่สุดของคุณอาจจะใช้pygame / SDL เป็นไลบรารีภายนอก แต่มีการสนับสนุนที่ดีเยี่ยมในทุกแพลตฟอร์ม

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

คุณสามารถค้นหาเอกสารเฉพาะเพิ่มเติมเกี่ยวกับการสนับสนุนเครื่องผสมเสียงได้ในเอกสาร pygame.mixer.music


2
สำหรับฉันสิ่งนี้ไม่ได้ผล ฉันหมายความว่ามันกำลังเล่น แต่ไม่มีเสียง ฉันเพิ่มtime.sleep(5)ในตอนท้ายและได้ผล Python 3.6 บน Windows 8.1
Nagabhushan SN

แพ็คเกจไฟ! ขอบคุณ!
СергейЗеленчук

ใช้ไม่ได้กับ fedora ที่มีมาตรฐาน ".wav", ".mp3" และ ".ogg" (ไม่สามารถเปิดไฟล์ 'filename.format')
Calvin-Ruiz

1
@ Calvin-Ruiz ฉันเพิ่งยืนยันว่าฉันสามารถใช้รหัสด้านบนใน FC31 เพื่อเล่นไฟล์ MP3 และ Ogg ได้ ฉันคิดว่าคุณมีปัญหาใหญ่กว่าที่อาจต้องการความรู้โดยละเอียดเกี่ยวกับแพลตฟอร์มของคุณ
TML

20

ลองเล่นเสียงซึ่งเป็น Pure Python ข้ามแพลตฟอร์มโมดูลฟังก์ชันเดียวที่ไม่มีการอ้างอิงสำหรับการเล่นเสียง

ติดตั้งผ่าน pip:

$ pip install playsound

เมื่อคุณติดตั้งแล้วคุณสามารถใช้งานได้ดังนี้:

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

37
การอ่านสิ่งนี้ทำให้ฉันมีอารมณ์มาก ดวงตาของฉันฉีกขาดด้วยความสุขอย่างแท้จริง ไม่ได้คาดหวังปฏิกิริยาแบบนั้นจากตัวเอง (พวกเขาเชื่อมโยงกับโมดูลที่ฉันสร้างขึ้น)
ArtOfWarfare

+1 สำหรับplaysound. ฉันเพิ่งทดสอบวิธีแก้ปัญหาสองสามข้อที่นี่และวิธีนี้ใช้ได้ง่ายที่สุดสำหรับฉัน น่าเสียดายที่pygameวิธีแก้ปัญหาไม่ได้ผลสำหรับฉันในระหว่างการทดสอบสั้น ๆ
Trevor Sullivan

18

ดูSimpleaudioซึ่งเป็นไลบรารีที่ค่อนข้างใหม่ล่าสุดและมีน้ำหนักเบาสำหรับจุดประสงค์นี้:

> pip install simpleaudio

จากนั้น:

import simpleaudio as sa

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

อย่าลืมใช้ไฟล์ PCM 16 บิตที่ไม่มีการบีบอัด


ดีขอบคุณ - มีประโยชน์สำหรับเกมที่ต้องเล่นเอฟเฟกต์เสียงสั้น ๆ และรองรับ Python 3
Thomas Perl

14

ในpydubเราเพิ่งเลือกใช้ ffplay (ผ่านกระบวนการย่อย)จากชุดเครื่องมือ ffmpeg ซึ่งใช้ SDL ภายใน

มันใช้งานได้ตามวัตถุประสงค์ของเรา - ส่วนใหญ่ทำให้ง่ายต่อการทดสอบผลลัพธ์ของโค้ด pydub ในโหมดโต้ตอบ - แต่ก็มีข้อเสียเช่นทำให้โปรแกรมใหม่ปรากฏใน Dock บน mac

ฉันได้เชื่อมโยงการใช้งานข้างต้นแล้ว แต่เวอร์ชันที่เรียบง่ายมีดังนี้:

import subprocess

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

-nodispธงหยุด ffplay แสดงหน้าต่างใหม่และ-autoexitสาเหตุธง ffplay เพื่อออกและกลับรหัสสถานะเมื่อไฟล์เสียงเป็นเล่นเสร็จแล้ว

แก้ไข : ตอนนี้ pydub ใช้ pyaudio สำหรับการเล่นเมื่อติดตั้งและกลับไปที่ ffplay เพื่อหลีกเลี่ยงข้อเสียที่ฉันพูดถึง ลิงก์ด้านบนแสดงการใช้งานนั้นด้วย


1
Pydub ดูเหมือนว่ามันมีศักยภาพพอสมควรในฐานะ Wrapper Library - ฉันกำลังติดตั้งเดี๋ยวนี้
เงา

1
PyDub ประณามดูดีและยังคงใช้งานได้จริง
corysimmons

13

ขออภัยที่ตอบช้า แต่ฉันคิดว่านี่เป็นสถานที่ที่ดีในการโฆษณาห้องสมุดของฉัน ...

AFAIK, ห้องสมุดมาตรฐานมีเพียงหนึ่งโมดูลสำหรับเสียงเล่น: ossaudiodev น่าเศร้าที่สิ่งนี้ใช้ได้กับ Linux และ FreeBSD เท่านั้น

อัปเดต: นอกจากนี้ยังมีวินซาวนด์ แต่เห็นได้ชัดว่านี่เป็นเฉพาะแพลตฟอร์ม

สำหรับสิ่งที่ไม่ขึ้นอยู่กับแพลตฟอร์มคุณจะต้องใช้ไลบรารีภายนอก

คำแนะนำของฉันเป็นsounddeviceโมดูล ( แต่ระวังผมเขียน)

แพคเกจนี้รวมไลบรารีPortAudio ที่คอมไพล์ไว้ล่วงหน้าสำหรับ Mac OS X และ Windows และสามารถติดตั้งได้อย่างง่ายดายด้วย:

pip install sounddevice --user

สามารถเล่นเสียงจากอาร์เรย์ NumPy แต่ยังสามารถใช้บัฟเฟอร์ Python ธรรมดาได้ (หากไม่มี NumPy)

ในการเล่นอาร์เรย์ NumPy นั่นคือทั้งหมดที่คุณต้องการ (สมมติว่าข้อมูลเสียงมีความถี่ในการสุ่มตัวอย่าง 44100 Hz):

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

สำหรับรายละเอียดเพิ่มเติมดูได้ที่เป็นเอกสาร

ไม่สามารถอ่าน / เขียนไฟล์เสียงได้คุณจะต้องมีไลบรารีแยกต่างหากสำหรับสิ่งนั้น


เยี่ยมมาก! สิ่งที่ฉันต้องการในการสร้างโปรแกรมสาธิตคลาสเกี่ยวกับคลื่น
Bill N


4

คำตอบของแอรอนดูเหมือนจะซับซ้อนเกินความจำเป็นประมาณ 10 เท่า เพียงทำสิ่งนี้หากคุณต้องการคำตอบที่ใช้ได้กับ OS X เท่านั้น:

from AppKit import NSSound

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

สิ่งหนึ่ง ... สิ่งนี้กลับมาทันที ดังนั้นคุณอาจต้องการทำสิ่งนี้ด้วยเช่นกันหากคุณต้องการให้การโทรบล็อกจนกว่าเสียงจะเล่นจบ

from time import sleep

sleep(sound.duration())

แก้ไข: ฉันใช้ฟังก์ชันนี้และรวมเข้ากับตัวแปรสำหรับ Windows และ Linux ผลที่ได้คืองูหลามบริสุทธิ์โมดูลข้ามแพลตฟอร์มที่มีการอ้างอิงที่ไม่เรียกว่าPlaySound ฉันอัปโหลดไปยัง pypi แล้ว

pip install playsound

จากนั้นเรียกใช้ดังนี้:

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

ไฟล์ MP3 ยังใช้งานได้บน OS X อีกด้วย WAV ควรใช้ได้กับทุกแพลตฟอร์ม ฉันไม่รู้ว่าแพลตฟอร์ม / รูปแบบไฟล์ผสมกันอย่างไรหรือไม่ได้ผล - ฉันยังไม่ได้ลอง


ฉันได้รับข้อผิดพลาดต่อไปนี้: "ไม่สามารถแปลงวัตถุ" ไบต์ "เป็น str โดยปริยาย" บน Python 3.5 (Windows)
Erwin Mayer

@ErwinMayer - คุณกำลังพูดถึงplaysoundโมดูลที่ฉันเขียน? ฉันยังไม่ได้ทดสอบกับอะไรที่ใหม่กว่า Python 2.7.11 ... แน่นอนฉันสามารถตรวจสอบสิ่งนี้ได้ใน 3.5 ...
ArtOfWarfare

แน่นอน. ต้องเป็นเพราะความแตกต่างของ Python 3
Erwin Mayer

AppKit คือการพึ่งพา
Chris Larson

2
@ArtOfWarfare นั่นไม่เป็นความจริง มีการติดตั้งด้วย python ของระบบ แต่ไม่ใช่กับการแจกแจงส่วนใหญ่รวมถึงการแจกแจงอย่างเป็นทางการจาก python.org คนส่วนใหญ่ที่ฉันรู้จักที่ใช้ python ติดตั้งหนึ่งในการแจกแจงเพื่อให้พ้นข้อ จำกัด SIP ในการรับ AppKit สำหรับการแจกแจงส่วนใหญ่ผู้ใช้ต้อง pip ติดตั้ง pyobjc ซึ่งทำให้แน่นอนที่สุดคือการพึ่งพา
Chris Larson

3

นี่เป็นวิธีที่ง่ายที่สุดและดีที่สุดที่พบ รองรับ Linux / pulseaudio, Mac / coreaudio และ 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)

ดูhttps://github.com/bastibe/PySoundFileและhttps://github.com/bastibe/SoundCardสำหรับคุณสมบัติที่มีประโยชน์สุดยอดอื่น ๆ อีกมากมาย


เป็นเพียงการแจ้งเตือนสำหรับทุกคนที่ต้องการสิ่งนี้ (อย่างที่ฉันเป็น) libs และการอ้างอิงทั้งหมดใช้เวลาตลอดไปในการสร้าง Raspberry Pi 1B + - โดยเฉพาะอย่างยิ่ง numpy
pojda

PS: สิ่งนี้ใช้ไม่ได้กับ raspberry pi "NotImplementedError: SoundCard ยังไม่รองรับ linux2" และไม่สามารถหาวิธีแก้ไขได้ ฉันจะใช้ os.system ("mpg123 file.mp3")
pojda

อ๊ะนั่นมันห่วย ฉันเดาว่าราสเบอร์รี่ pi เป็นสภาพแวดล้อมที่ค่อนข้างพิเศษ บางทีหากคุณโพสต์ปัญหาบนเครื่องตรวจจับผู้ออกตราสารคุณสามารถแก้ไขหรือแก้ไขได้
n00p

ในความคิดต่อไปบางทีปัญหาก็คือคุณกำลังใช้เคอร์เนลเก่าหรือไพ ธ อนเวอร์ชันเก่า ด้วยเวอร์ชัน python ที่ใหม่กว่าข้อผิดพลาดไม่ควรเป็นอย่างนั้นฉันคิดว่า
n00p

มันใช้ Raspbian ซึ่งโดยพื้นฐานแล้วเป็น Debian Stretch fork ฉันยอมแพ้และไปที่ os.system ซึ่งใช้งานได้ดี atm ขอบคุณที่ช่วยฉัน!
pojda

2

เป็นไปได้ที่จะเล่นเสียงใน OS X โดยไม่มีไลบรารีของบุคคลที่สามโดยใช้อะนาล็อกของรหัสต่อไปนี้ ข้อมูลเสียงดิบสามารถป้อนด้วย wave_wave.writeframes รหัสนี้แยกเสียง 4 วินาทีจากไฟล์อินพุต

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

สิ่งนี้ซับซ้อนเกินความจำเป็น - พวกเขาถามว่าจะเล่นเสียงได้อย่างไรไม่ใช่วิธีจัดการแล้วจึงเล่น คำตอบของฉันตัดทอน 90% ที่ไม่จำเป็นจากคำตอบนี้และทิ้งสิ่งที่ผู้ถามต้องการ - เล่นเสียงจากไฟล์ใน OS X โดยใช้ Python stackoverflow.com/a/34984200/901641
ArtOfWarfare

2

ลองใช้PySoundCardซึ่งใช้ PortAudio สำหรับการเล่นซึ่งมีอยู่ในหลายแพลตฟอร์ม นอกจากนี้ยังจดจำอุปกรณ์เสียง "มืออาชีพ" ที่มีช่องสัญญาณมากมาย

นี่คือตัวอย่างเล็ก ๆ จาก 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()

แม้ว่าคำตอบที่น่าสนใจ แต่ไม่สนับสนุนคำตอบแบบลิงก์เท่านั้น อย่างน้อยที่สุดคุณควรใส่ตัวอย่างสั้น ๆ ในการใช้คำตอบของคุณ นอกจากนี้ยังช่วยปกป้องคำตอบของคุณจากการสูญเสียค่าทั้งหมดหากที่เก็บถูกเปลี่ยนชื่อและลิงก์จะห้อยลง
สเปกตรัม

2

บน OSX ด้วย - จากSOโดยใช้คำสั่งafplayของ OSX :

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

UPDATE: ทั้งหมดนี้ระบุวิธีการทำสิ่งที่ OP ต้องการหลีกเลี่ยงไม่ให้ทำตั้งแต่แรก ฉันเดาว่าฉันโพสต์ที่นี่เพราะสิ่งที่ OP ต้องการหลีกเลี่ยงคือข้อมูลที่ฉันกำลังมองหา อ๊ะ.


ใช้งานได้ดีแม้ว่าจะหยุดการดำเนินการชั่วคราวในขณะที่เล่น บางทีอาจมีวิธี async เพื่อเรียกสิ่งนี้?
Praxiteles

คำถามดีๆ @Praxiteles อาจมีเกลียว ดูที่นี่โปรดรายงานกลับหากคุณมีโอกาสทดลองใช้
MikeiLL

OP ขออย่างชัดเจนสำหรับทางเลือกนี้
whitey04

OP กำลัง / กำลังมองหาทางเลือกอื่นในการ "รันคำสั่ง afplay file.mp3 จากภายใน Python" และการประมวลผลย่อยยังคงเกิดขึ้นภายใน Python ไม่ใช่หรือ ฉันยืนแก้ไข แต่คงไม่เจ็บที่จะมีโพสต์เล็ก ๆ นี้ที่นี่เพราะอาจช่วยคนอื่นได้
MikeiLL

@ whitey04 ฉัน (ในที่สุด) ก็เห็นว่าคุณกำลังพูดอะไร
MikeiLL

2

ติดตั้งplaysoundแพ็คเกจโดยใช้:

pip install playsound

การใช้งาน:

from playsound import playsound
playsound("file location\audio.p3")

1

Pypiมีรายชื่อโมดูลสำหรับ python ในเพลง สิ่งที่ฉันชอบคือjythonเพราะมีทรัพยากรและไลบรารีเพลงมากกว่า เป็นตัวอย่างรหัสสำหรับเล่นโน้ตเดียวจากหนังสือเรียน :

# 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

Mac OS ฉันลองใช้รหัสมากมาย แต่มันใช้ได้กับฉัน

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
วางไว้ที่ด้านบนสุดของสคริปต์ python ที่คุณกำลังเขียน:
import subprocess
หากไฟล์ wav อยู่ในไดเร็กทอรีของสคริปต์ python:
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
หากไฟล์ wav ไม่อยู่ในไดเร็กทอรีของสคริปต์ python:
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ aplay:
man aplay

0

หากต้องการเล่นเสียงแจ้งเตือนโดยใช้ python ให้เรียกเครื่องเล่นเพลงเช่น vlc VLC แจ้งให้ฉันใช้เวอร์ชัน commandline cvlc แทน

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

ต้องติดตั้ง vlc ไว้ล่วงหน้าในอุปกรณ์ ทดสอบบน Linux (Ubuntu 16.04 LTS); กำลังรัน Python 3.5


0

ลองใช้อุปกรณ์เสียง

หากคุณไม่มีโมดูลป้อน pip install sounddeviceในเทอร์มินัลของคุณ

จากนั้นในสคริปต์ Python ที่คุณต้องการ (ฉันใช้ Juypter) ให้ป้อน

import sounddevice as sd

sd.play(audio, sr) จะเล่นสิ่งที่คุณต้องการผ่าน Python

วิธีที่ดีที่สุดในการรับเสียงและตัวอย่างที่คุณต้องการคือการใช้โมดูล librosa ป้อนสิ่งนี้ในเทอร์มินัลหากคุณไม่มีโมดูล librosa

pip install librosa

audio, sr = librosa.load('wave_file.wav')

ไม่ว่าคุณต้องการเล่นไฟล์ wav แบบใดเพียงตรวจสอบให้แน่ใจว่าอยู่ในไดเร็กทอรีเดียวกับสคริปต์ Python ของคุณ สิ่งนี้จะช่วยให้คุณเล่นไฟล์ wav ที่คุณต้องการผ่าน Python

ไชโยชาร์ลี

ปล

เมื่อเสียงเป็นออบเจ็กต์ข้อมูล "librosa" Python จะมองว่ามันเป็นอาร์เรย์ที่เป็นตัวเลข ในการทดลองลองเล่นสิ่งที่ยาว (ลอง 20,000 จุดข้อมูล) ของอาร์เรย์ตัวเลขแบบสุ่ม Python ควรเล่นเป็นเสียงสีขาว โมดูลอุปกรณ์เสียงจะเล่นอาร์เรย์และรายการที่เป็นตัวเลขด้วย


ทำสิ่งนี้ แต่มันไม่ได้เล่นอะไรเลย มันเป็นเพียงการข้ามการโทร sd.play
Tobias Kolb


0

ฉันเพิ่งทำให้เครื่องเล่นเพลงของฉันรองรับไฟล์เสียงทั้งหมดในเครื่อง ฉันทำสิ่งนี้โดยหาวิธีใช้โมดูล vlc python และไฟล์ VLC dll คุณสามารถตรวจสอบได้ที่: https://github.com/elibroftw/music-caster/blob/master/audio_player.py


-1

หากคุณใช้ OSX คุณสามารถใช้โมดูล "OS" หรือ "กระบวนการย่อย" เป็นต้นเพื่อเรียกคำสั่ง "เล่น" ของ OSX จาก OSX shell ดูเหมือนว่า

เล่น "bah.wav"

มันเริ่มเล่นในเครื่องของฉันประมาณครึ่งวินาที


1
ฉันสนใจที่จะดูไวยากรณ์ของทั้งสองวิธีนี้
MikeiLL

-1

เพียงแค่คุณสามารถทำได้ด้วยความช่วยเหลือของ cvlc - ฉันทำด้วยวิธีนี้:

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

/home/maulo/selfProject/task.mp3 นี่คือตำแหน่งของไฟล์ mp3 ของฉัน ด้วยความช่วยเหลือของ "- เล่นและออก" คุณจะสามารถเล่นเสียงได้อีกครั้งโดยไม่ต้องสิ้นสุดกระบวนการ vlc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.