Phát tệp âm thanh với Python


38

Tôi đang tìm kiếm một thư viện Python được duy trì tốt với cho phép tôi phát các tệp âm thanh trên Raspberry Pi bằng cách sử dụng đầu ra âm thanh tiêu chuẩn.

Cho đến nay tôi đã thử một số, nhưng không ai trong số họ dường như làm việc. Mặc dù pyglet hoạt động tốt trên máy tính thông thường của tôi nhưng nó gây ra lỗi trên Raspberry Pi. Có thư viện Python nào được chứng minh là dễ sử dụng không?


Đã được chứng minh là dễ sử dụng là loại tương đối, nhưng tôi đã đăng một thay thế cho pygame cho câu hỏi tương tự trên StackOverflow ở đây . Về cơ bản, sự thay thế đó là vlc.py (mô-đun libVLC Python, được duy trì rất tốt).
Ben

Một câu hỏi tiếp theo nói rằng Pyglet hoạt động trên RPi. Bạn có thể cập nhật với lỗi của bạn?
Brian Bulkowski

Câu trả lời:


31

Tôi đề nghị Pygame phổ biến rộng rãi . Tôi có thể sai, nhưng tôi tin rằng nó được cài đặt sẵn trên Pi. Bạn có thể sử dụng Mô-đun Âm nhạc Trộn Pygame để phát tệp âm thanh. Tôi đã bao gồm một số mã ví dụ dưới đây.

Giả sử rằng chúng ta có một tệp âm thanh được gọi myFile.wav.

import pygame
pygame.mixer.init()
pygame.mixer.music.load("myFile.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue

LƯU Ý: Nếu điều này không thành công, vui lòng đến thiết bị đầu cuối và cập nhật hệ thống của bạn với

apt-get update
apt-get upgrade

và thử lại.


2
Nếu bạn có nhiều âm thanh để phát (có khả năng) thì tốt hơn là tạo một đối tượng pygame.mixer.Sound cho mỗi âm thanh, sau đó bạn có thể giữ các định nghĩa về tên tệp âm thanh ở một nơi.
francis

Đó là những gì tôi muốn, nhưng âm thanh bo mạch chủ của tôi không có trình điều khiển nên tôi sử dụng thẻ âm thanh USB. Nó chơi espeaktốt, nhưng không phải cái này.
SDsolar

10

Tôi cần một kịch bản để phát một bài hát từ ba mươi giây trong nền trong khi phản hồi với đầu vào của người dùng khác. Sau đó tôi muốn nó kết thúc bài hát trong một số sự kiện.

Tôi không cho rằng nó đặc biệt thanh lịch, nhưng tôi đã mở một đường ống cho quy trình MPlayer nền.

import subprocess
player = subprocess.Popen(["mplayer", "song.mp3", "-ss", "30"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Sau đó, khi tôi muốn chấm dứt quá trình MPlayer, tôi chỉ cần viết "q" để thoát khỏi đường ống.

player.stdin.write("q")

Xem tài liệu MPlayer cho tất cả các loại lệnh bạn có thể vượt qua theo cách này để kiểm soát phát lại.

Hy vọng rằng điều đó phần nào hữu ích!


1
Điều này thực sự gọn gàng thực sự. Hướng dẫn quảng cáo này nói về việc phát âm thanh nhưng không dừng lại.
gideon

6

Một tùy chọn khác là sử dụng mpg321và gọi nó từ dòng lệnh.

apt-get install mpg321

Sau đó, trong Python:

import os

os.system('mpg321 foo.mp3 &')

Pygame gần như chắc chắn mạnh mẽ hơn, nhưng nó phụ thuộc, tôi cho rằng, nhu cầu của bạn là gì.


1
Tôi đã nghĩ về điều này bản thân mình, nhưng tôi nghĩ nó không thanh lịch lắm, vì nó làm cho việc tạm dừng, điều khiển âm lượng, v.v. khó hơn rất nhiều.
Stein

Điều này là rất chậm.
Alex

3

Tôi muốn giới thiệu pyglet thay vì pygame nếu bạn không cần đồ họa. Theo quan điểm của tôi, nó đơn giản hơn, thanh lịch hơn và được duy trì tốt hơn. Sau đó, một lần nữa, tôi mong đợi nó có thể là một vấn đề của hương vị.


1
Vậy làm thế nào để bạn sử dụng nó?
SDsolar

pyglet dường như chỉ chạy khi có màn hình; chạy nó từ xa hoặc như một daemon chỉ với mục đích phát âm thanh không hoạt động.
oh7lzb

0

Pygame cung cấp cho bạn một cách hay và dễ dàng để tải và phát âm thanh, trên một loạt các kênh.


0

Bạn có thể sử dụng một số người chơi bên ngoài thông qua các đường ống. Tuy nhiên, bạn sẽ gần như luôn luôn bị mất tốc độ. Ngoài ra còn có một vấn đề với điều khiển phát lại.

Tôi khuyên bạn nên pyaudio, nó hoạt động tốt.

Nếu bạn cũng muốn phát các tệp nén, tôi sẽ thoải mái chỉ cho bạn đến mô-đun decoder.py của tôi. Bạn có thể tìm thấy nó trên PyPI.

Nó cũng sử dụng quy trình con, nhưng gọi bộ giải mã thay vì người chơi. Họ không sử dụng nhiều CPU và một số người trong số họ biết cách sử dụng khả năng tăng tốc phần cứng. Sau đó, bạn có thể sử dụng pyaudio hoặc một cái gì đó để xuất dữ liệu âm thanh thô. Nếu bạn muốn, bạn thậm chí có thể sử dụng pygame bằng cách sử dụng pygame.sndarray. Theo cách đó, bạn có thể chơi nhiều định dạng hơn hỗ trợ pygame.

Tôi đã thử decoder.py trong môi trường GUI PyQT, với pyaudio và cũng sử dụng aplay như một trình phát bên ngoài. Đó là trên Raspberry Pi B.

Kết quả khá hài lòng trong cả hai trường hợp.

Sự đơn giản có thể được đặt câu hỏi.

Bản thân decoder.py rất đơn giản, nhưng bạn phải kết hợp nó với các lib khác và điều đó làm tăng các dòng mã.

Có một ví dụ về cách phát các tệp có trong decoder.py.


0

Tôi đang chạy OSMC (Debian) và tôi có âm thanh để phát qua loa TV được kết nối bằng HDMI. https://youtu.be/p2ljmTE67ss

Phương pháp của tôi dựa trên giải pháp trên được đăng bởi @xxmbabanexx cũng như tại đây . Về cơ bản, tôi đã phải thêm dtparam=audio=onvào/boot/config.txt


Tôi nghĩ rằng TS có nghĩa là giắc cắm 3,5 mm khi đề cập đến "đầu ra âm thanh tiêu chuẩn". Điều này có làm việc cho jack 3,5 không?
Bex

Ồ tôi hiểu rồi. Hmm có lẽ nó sẽ không, mặc dù tôi đã không thử nó.
vui mừng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.