2012-04-27 29 views

Trả lời

45

Bạn có thể sử dụng write function từ scipy.io.wavfile để tạo tệp wav mà sau đó bạn có thể phát theo ý muốn. Lưu ý rằng mảng phải là số nguyên, vì vậy nếu bạn có phao, bạn có thể muốn mở rộng quy mô chúng một cách thích hợp:

import numpy as np 
from scipy.io.wavfile import write 

data = np.random.uniform(-1,1,44100) # 44100 random samples between -1 and 1 
scaled = np.int16(data/np.max(np.abs(data)) * 32767) 
write('test.wav', 44100, scaled) 

Nếu bạn muốn Python thực sự chơi âm thanh, sau đó this page cung cấp một cái nhìn tổng quan của một số gói/modules .

+1

Câu hỏi - dữ liệu/np.max (np.abs (dữ liệu)) - Tôi có đúng là điều này là bình thường hóa với tỷ lệ 1/-1 trước khi mở rộng quy mô, chẳng hạn nếu giá trị tối đa là 0,8, nó sẽ được tăng tỷ lệ? –

+0

Có (mặc dù không bắt buộc). – huon

+0

Cảm ơn. Không nên là * 32768? Nó là một 16 bit đã ký. –

12

Ngoài ra, bạn có thể thử scikits.audiolab. Nó có tính năng IO tập tin và khả năng 'chơi' mảng. Mảng không phải là số nguyên. Để mimick dụ dbaupp của:

import numpy as np 
import scikits.audiolab 

data = np.random.uniform(-1,1,44100) 
# write array to file: 
scikits.audiolab.wavwrite(data, 'test.wav', fs=44100, enc='pcm16') 
# play the array: 
scikits.audiolab.play(data, fs=44100) 
+0

scikits.audiolab không có sẵn cho python (32) + Windows (64) + Cấu hình phần cứng (64) và do đó tôi đoán không hữu ích cho tôi – gisgyaan

+1

Nó không có sẵn trong Python 3, và nó đã được một thời gian dài kể từ lần cập nhật cuối cùng. – geekazoid

0

Không chắc chắn về các nội về cách bạn sẽ tạo ra những âm thanh từ mảng, nhưng tôi đã tìm thấy mpg321 là một máy nghe nhạc âm thanh dòng lệnh vĩ đại, và có khả năng có thể làm việc cho bạn.

Tôi sử dụng nó làm người chơi lựa chọn cho Anki, được viết bằng python và có thư viện có thể là nơi bắt đầu tuyệt vời để giao tiếp mã/mảng của bạn với âm thanh.

Check-out:

1

Pygame có module pygame.sndarray mà có thể chơi dữ liệu NumPy như âm thanh. Các câu trả lời khác có lẽ là tốt hơn, vì PyGame có thể khó khăn để có được và chạy. Sau đó, một lần nữa, scipy và gumpy đi kèm với những khó khăn riêng của họ, vì vậy có lẽ nó không phải là một bước tiến lớn để thêm PyGame vào hỗn hợp.

http://www.pygame.org/docs/ref/sndarray.html

18

Đối với những người đến đây vào năm 2016 scikits.audiolab không thực sự dường như có tác dụng nữa. Tôi đã có thể nhận được một giải pháp bằng cách sử dụng sounddevice.

import numpy as np 
import sounddevice as sd 

fs = 44100 
data = np.random.uniform(-1, 1, fs) 
sd.play(data, fs) 
+0

Tôi thực sự đã thử và scikits.audiolab làm việc trên Ubuntu 16.04 + python 2.7 của tôi (anaconda 4.1.1). Tôi chỉ cần 'sudo apt-get install libsndfile1-dev'. Và mặt khác, sounddevice không làm việc cho tôi: không có gì được chơi khi tôi thay thế scikits.audiolab bằng sd. – ftfish

+0

không có may mắn với python3, ngay cả với libsndfile1-dev được cài đặt, may mắn hơn với sounddevice – JulienFr

+3

Cảm ơn, hoạt động hoàn hảo! 'sd.play (dữ liệu, fs, chặn = True)' để làm cho chương trình chờ cho đến khi âm thanh được phát. –

3

Tôi gặp một số sự cố khi sử dụng scikit.audiolabs, vì vậy tôi đã tìm kiếm một tùy chọn khác cho tác vụ này. Tôi đã đưa ra sounddevice, có vẻ như cập nhật hơn rất nhiều. Tôi đã không kiểm tra nếu nó hoạt động với Python 3.

Một cách đơn giản để thực hiện những gì bạn muốn đây là:

import numpy as np 
import sounddevice as sd 

sd.default.samplerate = 44100 

time = 2.0 
frequency = 440 

# Generate time of samples between 0 and two seconds 
samples = np.arange(44100 * time)/44100.0 
# Recall that a sinusoidal wave of frequency f has formula w(t) = A*sin(2*pi*f*t) 
wave = 10000 * np.sin(2 * np.pi * frequency * samples) 
# Convert it to wav format (16 bits) 
wav_wave = np.array(wave, dtype=np.int16) 

sd.play(wav_wave, blocking=True) 
+1

Nó hoạt động tốt với Python 3. Nếu bạn sử dụng đoạn mã trên trong một tập lệnh, bạn nên đảm bảo sử dụng 'blocking = True', nếu không thì tập lệnh sẽ thoát mà không hoàn thành phát lại. – Matthias

+0

Tôi đã làm điều đó, trên thực tế. Đã cập nhật câu trả lời. Cảm ơn! – geekazoid

3

Nếu bạn đang sử dụng Jupyter, lựa chọn tốt nhất là:

from IPython.display import Audio 
Audio(numpy.sin(numpy.linspace(0, 3000, 20000)), rate=20000) 
Các vấn đề liên quan