Генерация синусоидального звука в Python - PullRequest
24 голосов
/ 28 ноября 2011

Мне нужно генерировать синусоидальный звук в Python, и мне нужно иметь возможность контролировать частоту, продолжительность и относительную громкость.Под «генерировать» я подразумеваю, что я хочу, чтобы он воспроизводился через динамики сразу, а не в файл.

Какой самый простой способ сделать это?

Ответы [ 5 ]

36 голосов
/ 16 января 2015
import pyaudio
import numpy as np

p = pyaudio.PyAudio()

volume = 0.5     # range [0.0, 1.0]
fs = 44100       # sampling rate, Hz, must be integer
duration = 1.0   # in seconds, may be float
f = 440.0        # sine frequency, Hz, may be float

# generate samples, note conversion to float32 array
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)

# for paFloat32 sample values must be in range [-1.0, 1.0]
stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=fs,
                output=True)

# play. May repeat with different volume values (if done interactively) 
stream.write(volume*samples)

stream.stop_stream()
stream.close()

p.terminate()
6 голосов
/ 26 января 2018

ivan-onys дал отличный ответ, но есть небольшое дополнение к нему: этот скрипт будет производить звук в 4 раза короче, чем ожидалось, потому что метод записи Pyaudio требует строковых данных float32, но когда вы передаете массив numpy этому методу,он преобразует весь массив как сущность в строку, поэтому вы должны сами преобразовать данные в массиве numpy в последовательность байтов следующим образом:

samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()

, а также изменить эту строку:

stream.write(samples)
3 голосов
/ 28 ноября 2011

Одним из наиболее последовательных и простых способов установки звука в Python являются мультимедийные библиотеки Pygame.

Я бы рекомендовал использовать его - есть подмодуль pygame.sndarray, который позволяет вам манипулировать числами в векторе данных, которые становятся высокоуровневым звуковым объектом, который может быть воспроизведен в модуле pygame.mixer.

Документации на сайте pygame.org должно быть достаточно для использования модуля sndarray.

0 голосов
/ 27 сентября 2017

Сегодня для Python 3.5+ лучше всего установить пакеты, рекомендованные разработчиком.

http://people.csail.mit.edu/hubert/pyaudio/

Для Debian перед попыткой

sudo apt-get install python3-all-dev portaudio19-dev

установить pyaudio

0 голосов
/ 23 июля 2013

I bregman lab toolbox У вас есть набор функций, который делает именно то, что вы хотите.Этот модуль Python немного глючит, но вы можете адаптировать этот код, чтобы получить свои собственные функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...