2015-07-28 17 views
5

Hiện tại tôi đang sử dụng NumPy để tạo tệp WAV từ một mảng NumPy. Tôi tự hỏi nếu nó có thể chơi các mảng NumPy trong thời gian thực trước khi nó thực sự được ghi vào ổ đĩa cứng. Tất cả các ví dụ tôi tìm thấy bằng cách sử dụng PyAudio dựa vào viết mảng NumPy vào một tập tin WAV đầu tiên, nhưng tôi muốn có một chức năng xem trước mà chỉ cần phun ra mảng NumPy để đầu ra âm thanh.Python: phát trực tuyến âm thanh theo thời gian thực với PyAudio (hoặc cái gì khác)?

Cũng nên là nền tảng chéo. Tôi đang sử dụng Python 3 (Anaconda phân phối).

+0

Có thể. Python là Turing hoàn thành. – erip

+2

Bất kỳ con trỏ nào trong đó sẽ đạt được như thế nào? Tôi là một người mới làm quen với Python, nếu điều đó không rõ ràng. Hãy nhẹ nhàng, làm ơn. –

Trả lời

4

này đã làm việc! Cảm ơn vì sự giúp đỡ!

def generate_sample(self, ob, preview): 
    print("* Generating sample...") 
    tone_out = array(ob, dtype=int16) 

    if preview: 
     print("* Previewing audio file...") 

     bytestream = tone_out.tobytes() 
     pya = pyaudio.PyAudio() 
     stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True) 
     stream.write(bytestream) 
     stream.stop_stream() 
     stream.close() 

     pya.terminate() 
     print("* Preview completed!") 
    else: 
     write('sound.wav', SAMPLE_RATE, tone_out) 
     print("* Wrote audio file!") 

Có vẻ rất đơn giản, nhưng khi bạn không biết Python rất tốt, có vẻ như địa ngục.

1

Như bạn thấy trong examples, pyaudio chỉ đọc dữ liệu từ tệp WAV và ghi vào luồng đó.

Không cần phải ghi tệp WAV trước, bạn chỉ cần một luồng dữ liệu ở định dạng phù hợp.

tôi thêm ví dụ dưới đây trong trường hợp liên kết bao giờ đi chết (lưu ý rằng tôi đã không viết mã này):

"""PyAudio Example: Play a WAVE file.""" 

import pyaudio 
import wave 
import sys 

CHUNK = 1024 

if len(sys.argv) < 2: 
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0]) 
    sys.exit(-1) 

wf = wave.open(sys.argv[1], 'rb') 

p = pyaudio.PyAudio() 

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), 
       channels=wf.getnchannels(), 
       rate=wf.getframerate(), 
       output=True) 

data = wf.readframes(CHUNK) 

while data != '': 
    stream.write(data) 
    data = wf.readframes(CHUNK) 

stream.stop_stream() 
stream.close() 

p.terminate() 
+0

Sooo, về cơ bản tôi nên kiểm tra như thế nào là numpy làm việc chuyển đổi mảng numpy vào WAV sau đó làm điều tương tự ngoại trừ điểm nó ở dòng, như trái ngược với việc viết nó vào một tập tin? Cảm ơn btw, nhưng tôi nhìn chằm chằm vào ví dụ đó trong nhiều giờ trong tháng qua câu hỏi này không nhận được bất kỳ câu trả lời nào, và không có giải pháp nào cho tôi về cách tôi làm điều đó ... –

+1

@ MarioKrušelj Chỉ cần mở rộng và/hoặc chuyển đổi dữ liệu tới các số nguyên được ký 16 bit ('dtype' của' numpy.int16'). Sau đó, sử dụng phương thức mảng 'tobytes' để biến nó thành chuỗi byte ... –

+0

CẢM ƠN BẠN! Tôi sẽ cho bạn biết nếu nó hoạt động. –

Các vấn đề liên quan