2015-12-14 8 views
2
"""Play a fixed frequency sound.""" 
from __future__ import division 
import math 
from pyaudio import PyAudio 

def sine_tone(frequency, duration, volume=1, sample_rate=22050): 
    n_samples = int(sample_rate * duration) 
    restframes = n_samples % sample_rate 

    p = PyAudio() 
    stream = p.open(format=p.get_format_from_width(1), # 8bit 
        channels=1, # mono 
        rate=sample_rate, 
        output=True) 
    s = lambda t: volume * math.sin(2 * math.pi * frequency * t/sample_rate) 
    samples = (int(s(t) * 0x7f + 0x80) for t in range(n_samples)) 
    for buf in zip(*[samples]*sample_rate): # write several samples at a time 
     stream.write(bytes(bytearray(buf))) 

    # fill remainder of frameset with silence 
    stream.write(b'\x80' * restframes) 

    stream.stop_stream() 
    stream.close() 
    p.terminate() 


def playScale(scale): 
    for x in scale: 
     print(x) 
     sine_tone(frequency = x, 
        duration = 1, 
        volume=.5, 
        sample_rate = 50000) 

Функция playScale принимает набор частот и воспроизводит их с использованием функции sine_tone. Как сохранить эту серию звуков в файл .WAV или файл .MP3?Как сохранить звук, сгенерированный в этом потоке pyaudio, в WAV или MP3-файл?

ответ

0

Вы должны записать все аудиоданные в один поток, затем вы можете сохранить этот поток, используя библиотеку «wave» в python, которая способна манипулировать волновыми файлами.

Однако, с вашим текущим кодом я не уверен, как он будет работать, поскольку вы пишете отдельные потоки на звук/тон. Возможно, вы захотите передать поток в эту функцию, чтобы впоследствии вы могли добавить этот поток и сохранить его с помощью другой функции после того, как будет воспроизведен весь звук.

https://docs.python.org/2/library/wave.html