2012-03-19 41 views
22

Có thể bắt python tạo ra âm thanh đơn giản như sóng sin không?Tạo/tổng hợp âm thanh bằng python?

Có sẵn mô-đun cho điều này không? Nếu không, làm thế nào bạn sẽ đi về việc tạo của riêng bạn?

Ngoài ra, bạn sẽ cần một số loại môi trường máy chủ để python chạy trong để phát âm thanh, hoặc nó có thể đạt được chỉ từ thực hiện cuộc gọi từ thiết bị đầu cuối?

Nếu câu trả lời phụ thuộc vào hệ điều hành, tôi đang sử dụng mac.

+3

@hochl Vâng, thật mỉa mai khi đây là kết quả đầu tiên của Google được trả về sau một ngày tìm kiếm với các từ khóa khác nhau ... –

+0

Tôi sẽ xem [Pyo] (http://ajaxsoundstudio.com/pyodoc/index .html). [Đây] (http://ajaxsoundstudio.com/pyodoc/examples/02-controls/04-building-lfo.html) một ví dụ điển hình tốt. – mobeets

Trả lời

1

Tôi thích PyAudiere, cho phép bạn phát các mảng có nhiều mảng như âm thanh ... Tôi đoán nó sẽ phát triển tốt với nền Matlab của tôi. Tôi tin rằng đó là đa nền tảng. Tôi nghĩ rằng scikits.audiolab làm điều tương tự, và có thể được hỗ trợ nhiều hơn/hiện tại hơn ... có vẻ dễ dàng hơn tôi so với việc lưu những thứ như wavfiles hoặc ghi chúng vào bộ đệm và sử dụng thư viện âm thanh dựng sẵn của Python.

+2

Theo tôi có thể thấy Audiere không thể tải xuống từ pypi và trang web pyaudiere.org của họ bây giờ là một số trang quảng cáo ngẫu nhiên. –

+0

Vâng, có vẻ như tất cả các thư viện âm thanh này đều bị bỏ sau vài tháng. Nó đang trở thành một vấn đề thực sự. Có lẽ PyGame là con đường để đi. Nó có vẻ như quá mức cần thiết, nhưng ít nhất nó được hỗ trợ tốt. – rdchambers

6

Tôi biết tôi là một chút muộn để các trò chơi trên thế này, nhưng đây là một dự án python khá tuyệt vời để tổng hợp và thành phần âm thanh: https://github.com/hecanjog/pippi

Nó vẫn đang tích cực được phát triển, nhưng nó đã diễn ra trong một thời gian.

3

Sau khi lãng phí thời gian cho một số dự án không có khả năng hoặc không tồn tại, tôi phát hiện ra mô-đun python wavebender, cung cấp thế hệ các kênh đơn hoặc nhiều sóng sin, vuông và kết hợp. Các kết quả có thể được ghi vào một tệp sóng hoặc tới sys.stdout, từ đó chúng có thể được diễn giải trực tiếp bởi aplay trong thời gian thực. Một số ví dụ hữu ích được giải thích here và được bao gồm tại dự án github page.

+2

Xin chào - Tôi là tác giả của pippi. Nó đã được phát hành trước trong một thời gian nhưng tôi đang hướng tới bản phát hành 1.0 ổn định. Nếu bạn có thời gian để gửi một báo cáo lỗi với các vấn đề của bạn trên github tôi thực sự sẽ đánh giá cao nó. Cảm ơn bạn! –

+0

Cảm ơn bạn, tôi rất muốn xem lại nó và xem tôi có thể đóng góp gì đó không. Thật tốt khi nghe nó còn sống! –

+0

Thật không may, wavebender vẫn có vẻ là [không hoạt động và unmaintained.] (Https://github.com/zacharydenton/wavebender/issues/5) – Cerin

2

Tôi đang làm việc trên bộ tổng hợp mạnh mẽ trong python. Tôi đã sử dụng các hàm tùy chỉnh để ghi trực tiếp vào tệp .wav. Có được xây dựng trong các chức năng có thể được sử dụng cho mục đích này. Bạn sẽ cần sửa đổi tiêu đề .wav để phản ánh tốc độ lấy mẫu, số bit trên mỗi mẫu, số kênh và thời lượng tổng hợp.

Đây là phiên bản đầu tiên của trình tạo sóng sin xuất ra danh sách các giá trị sau khi áp dụng dấu gạch chéo trở nên thích hợp để ghi vào tham số dữ liệu của tệp sóng. [edit] Một hàm chuyển đổi sẽ cần phải chuyển đổi danh sách thành các giá trị hex nhỏ cuối cùng trước khi áp dụng dấu ngắt. Xem liên kết định dạng tệp âm thanh WAVE PCM bên dưới để biết chi tiết về đặc tả .wav. [/ sửa]

def sin_basic(freq, time=1, amp=1, phase=0, samplerate=44100, bitspersample=16): 
    bytelist = [] 
    import math 
    TwoPiDivSamplerate = 2*math.pi/samplerate 
    increment = TwoPiDivSamplerate * freq 
    incadd = phase*increment 
    for i in range(int(samplerate*time)): 
     if incadd > (2**(bitspersample - 1) - 1): 
      incadd = (2**(bitspersample - 1) - 1) - (incadd - (2**(bitspersample - 1) - 1)) 
     elif incadd < -(2**(bitspersample - 1) - 1): 
      incadd = -(2**(bitspersample - 1) - 1) + (-(2**(bitspersample - 1) - 1) - incadd) 
     bytelist.append(int(round(amp*(2**(bitspersample - 1) - 1)*math.sin(incadd)))) 
     incadd += increment 
    return bytelist 

Một phiên bản mới hơn có thể sử dụng dạng sóng để điều chỉnh tần số, biên độ và pha của các thông số dạng sóng. Các định dạng dữ liệu làm cho nó tầm thường để pha trộn và nối các sóng với nhau. Nếu điều này có vẻ như hẻm của bạn, hãy xem WAVE PCM soundfile format.

14

Tôi đang tìm kiếm điều tương tự, Cuối cùng, tôi đã viết mã này hoạt động tốt.

import math  #import needed modules 
import pyaudio  #sudo apt-get install python-pyaudio 

PyAudio = pyaudio.PyAudio  #initialize pyaudio 

#See https://en.wikipedia.org/wiki/Bit_rate#Audio 
BITRATE = 16000  #number of frames per second/frameset.  

FREQUENCY = 500  #Hz, waves per second, 261.63=C4-note. 
LENGTH = 1  #seconds to play sound 

if FREQUENCY > BITRATE: 
    BITRATE = FREQUENCY+100 

NUMBEROFFRAMES = int(BITRATE * LENGTH) 
RESTFRAMES = NUMBEROFFRAMES % BITRATE 
WAVEDATA = ''  

#generating wawes 
for x in xrange(NUMBEROFFRAMES): 
WAVEDATA = WAVEDATA+chr(int(math.sin(x/((BITRATE/FREQUENCY)/math.pi))*127+128))  

for x in xrange(RESTFRAMES): 
WAVEDATA = WAVEDATA+chr(128) 

p = PyAudio() 
stream = p.open(format = p.get_format_from_width(1), 
       channels = 1, 
       rate = BITRATE, 
       output = True) 

stream.write(WAVEDATA) 
stream.stop_stream() 
stream.close() 
p.terminate() 
+2

Điều này hoạt động, nhưng tạo ra một "pop" rất lớn vào cuối phát lại . – Cerin

+2

Tại sao chúng ta cần truyền các int này sang các ký tự ascii? –

+2

@Cerin Đó sẽ là vì mẫu cuối cùng mà nó xuất ra từ 0, và sau đó loa của bạn đột nhiên trở về 0 trong một mẫu đơn, tạo ra một tiếng ồn đáng kể. Nếu bạn cung cấp một vài mẫu ở cuối thì mờ dần về 0 hoặc đảm bảo sóng của bạn đã quay lại (gần bằng 0), bạn sẽ nhận được kết thúc rõ ràng hơn. –

3

Tôi thấy hai kho chứa python này rất hữu ích, có thể muốn xem nó ...

pythonhttps://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

ipython: https://timsainb.github.io/spectrograms-mfccs-and-inversion-in-python.html

[EDIT] Như đã chỉ ra, đây là một explanational của hai liên kết

python ai dường như có một lỗi, nhưng nhiều người đã có thể làm cho nó chạy, vì vậy tôi không chắc chắn. ipython hoạt động như một sự quyến rũ, vì vậy tôi hy vọng bạn có thể chạy nó.

Cả hai liên kết đều được coi là âm thanh làm đầu vào, tốt nhất là .wav tệp. Điều chỉnh nó (USE FFT: 512, step size = 512/8) để thu được spectrograms (bạn thậm chí có thể hình dung nó), nó là một ma trận 2D, và sau đó đào tạo các đối tượng học máy của bạn hoặc làm bất cứ điều gì bạn muốn sử dụng một ma trận đại diện cho bản gốc âm thanh. Nếu bạn muốn, tại bất kỳ điểm nào, những gì các vector đại diện cho bạn có thể resynthesize âm thanh trở lại là tốt.

+0

Tôi hy vọng điều này sẽ giúp ... –

+0

câu trả lời hay @Priyank Pathak – Veltro

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