Hướng dẫn thư viện playsound python

answer

17

Bạn có thể tìm thông tin về âm thanh Python tại đây: //wiki.python.org/moin/Audio/

Có vẻ như nó không thể phát tệp .mp3 mà không có thư viện bên ngoài. Bạn có thể chuyển đổi tệp .mp3 của mình sang định dạng .wav hoặc định dạng khác hoặc sử dụng thư viện như PyMedia .

17 hữu ích 3 bình luận chia sẻ

answer

45

Đặt cược tốt nhất của bạn có lẽ là sử dụng pygame / SDL . Đó là một thư viện bên ngoài, nhưng nó có sự hỗ trợ tuyệt vời trên các nền tảng.

pygame.mixer.init[]
pygame.mixer.music.load["file.mp3"]
pygame.mixer.music.play[]

Bạn có thể tìm thêm tài liệu cụ thể về hỗ trợ bộ trộn âm thanh trong tài liệu pygame.mixer.music

45 hữu ích 5 bình luận chia sẻ

answer

27

Hãy thử playound là một mô-đun thuần túy Python, nền tảng đa chức năng, không có phụ thuộc để phát âm thanh.

Cài đặt qua pip:

$ pip install playsound

Sau khi cài đặt xong, bạn có thể sử dụng nó như sau:

from playsound import playsound
playsound['/path/to/a/sound/file/you/want/to/play.mp3']

27 hữu ích 4 bình luận chia sẻ

answer

19

Hãy xem Simpleaudio , đây là một thư viện tương đối gần đây và nhẹ cho mục đích này:

> pip install simpleaudio

Sau đó:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file["path/to/file.wav"]
play_obj = wave_obj.play[]
play_obj.wait_done[]

Đảm bảo sử dụng tệp PCM 16 bit không nén.

19 hữu ích 1 bình luận chia sẻ

answer

14

Trong pydub gần đây, chúng tôi đã chọn sử dụng ffplay [thông qua quy trình phụ] từ bộ công cụ ffmpeg, sử dụng nội bộ SDL.

Nó hoạt động cho các mục đích của chúng tôi - chủ yếu chỉ giúp kiểm tra kết quả của mã pydub ở chế độ tương tác dễ dàng hơn - nhưng nó có những mặt trái của nó, chẳng hạn như khiến một chương trình mới xuất hiện trong thanh dock trên mac.

Tôi đã liên kết việc triển khai ở trên, nhưng một phiên bản đơn giản sau:

import subprocess

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

Các -nodispcờ dừng ffplay hiển thị một cửa sổ mới, và các -autoexitlá cờ gây ffplay để thoát và trả về một mã trạng thái khi tập tin âm thanh được thực hiện chơi.

chỉnh sửa : pydub hiện sử dụng pyaudio để phát lại khi nó được cài đặt và quay trở lại ffplay để tránh những nhược điểm mà tôi đã đề cập. Liên kết ở trên cũng cho thấy việc triển khai đó.

14 hữu ích 2 bình luận chia sẻ

answer

14

Xin lỗi vì đã trả lời muộn, nhưng tôi nghĩ đây là một nơi tốt để quảng cáo thư viện của tôi ...

AFAIK, thư viện tiêu chuẩn chỉ có một mô-đun để phát âm thanh: ossaudiodev . Đáng buồn thay, điều này chỉ hoạt động trên Linux và FreeBSD.

CẬP NHẬT: Cũng có lợi thế , nhưng rõ ràng đây cũng là nền tảng cụ thể.

Đối với một cái gì đó độc lập với nền tảng hơn, bạn sẽ cần sử dụng một thư viện bên ngoài.

Đề xuất của tôi là mô-đun sounddevice [nhưng hãy cẩn thận, tôi là tác giả].

Gói này bao gồm thư viện PortAudio được biên dịch trước cho Mac OS X và Windows, và có thể dễ dàng cài đặt với:

pip install sounddevice --user

Nó có thể phát lại âm thanh từ các mảng NumPy, nhưng nó cũng có thể sử dụng bộ đệm Python thuần túy [nếu NumPy không có sẵn].

Để phát lại mảng NumPy, đó là tất cả những gì bạn cần [giả sử rằng dữ liệu âm thanh có tần số lấy mẫu là 44100 Hz]:

import sounddevice as sd
sd.play[myarray, 44100]

Để biết thêm chi tiết, hãy xem tài liệu .

Nó không thể đọc / ghi các tệp âm thanh, bạn sẽ cần một thư viện riêng cho việc đó.

14 hữu ích 1 bình luận chia sẻ

answer

5

Bạn có thể xem điều này: //www.speech.kth.se/snack/

s = Sound[] 
s.read['sound.wav'] 
s.play[]

5 hữu ích 1 bình luận chia sẻ

answer

4

Câu trả lời của Aaron dường như phức tạp hơn khoảng 10 lần so với mức cần thiết. Chỉ cần làm điều này nếu bạn chỉ cần câu trả lời hoạt động trên OS X:

from AppKit import NSSound

sound = NSSound.alloc[]
sound.initWithContentsOfFile_byReference_['/path/to/file.wav', True]
sound.play[]

Một điều ... điều này trở lại ngay lập tức. Vì vậy, bạn cũng có thể muốn làm điều này, nếu bạn muốn cuộc gọi bị chặn cho đến khi âm thanh phát xong.

from time import sleep

sleep[sound.duration[]]

Chỉnh sửa: Tôi đã lấy chức năng này và kết hợp nó với các biến thể dành cho Windows và Linux. Kết quả là một mô-đun nền tảng chéo, python thuần túy không có phụ thuộc nào được gọi là Playingound . Tôi đã tải nó lên pypi.

pip install playsound

Sau đó chạy nó như thế này:

from playsound import playsound
playsound['/path/to/file.wav', block = False]

Các tệp MP3 cũng hoạt động trên OS X. WAV sẽ hoạt động trên tất cả các nền tảng. Tôi không biết các kết hợp nền tảng / định dạng tệp khác hoạt động hoặc không hoạt động - tôi chưa thử chúng.

4 hữu ích 5 bình luận chia sẻ

answer

4

Đây là cách dễ nhất và tốt nhất mà chúng tôi tìm thấy. Nó hỗ trợ Linux / pulseaudio, Mac / coreaudio và 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]

Xem //github.com/bastibe/PySoundFile và //github.com/bastibe/SoundCard để biết rất nhiều tính năng siêu hữu ích khác.

4 hữu ích 5 bình luận chia sẻ

answer

3

Có thể phát âm thanh trong OS X mà không cần bất kỳ thư viện bên thứ 3 nào bằng cách sử dụng một mã tương tự của mã sau. Dữ liệu âm thanh thô có thể được nhập bằng wave_wave.writeframes. Mã này trích xuất 4 giây âm thanh từ tệp đầu vào.

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[]

3 hữu ích 1 bình luận chia sẻ

answer

2

Hãy thử PySoundCard sử dụng PortAudio để phát lại có sẵn trên nhiều nền tảng. Ngoài ra, nó còn nhận diện các thiết bị âm thanh "chuyên nghiệp" với rất nhiều kênh.

Dưới đây là một ví dụ nhỏ từ 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 hữu ích 1 bình luận chia sẻ

answer

2

Cũng trên OSX - từ SO , sử dụng lệnh afplay của OSX :

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

CẬP NHẬT: Tất cả điều này là chỉ định cách thực hiện những gì OP muốn tránh làm ngay từ đầu. Tôi đoán tôi đã đăng điều này ở đây vì những gì OP muốn tránh là thông tin tôi đang tìm kiếm. Rất tiếc.

2 hữu ích 5 bình luận chia sẻ

answer

2

Mac OS Tôi đã thử rất nhiều mã nhưng chỉ mã này hoạt động với tôi

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

Chủ Đề