Генерация звука / синтез с питоном? - PullRequest
34 голосов
/ 19 марта 2012

Можно ли заставить Python генерировать простой звук, похожий на синусоидальную волну?

Есть ли модуль для этого?Если нет, то как бы вы пошли на создание своего собственного?

Кроме того, вам понадобится какая-то среда хоста для запуска Python для воспроизведения звука, или это можно сделать, просто совершая вызовытерминал?

Если ответ зависит от ОС, я использую Mac.

Ответы [ 7 ]

28 голосов
/ 23 ноября 2015

Я искал то же самое, В конце концов, я написал этот код, который работает нормально.

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()
11 голосов
/ 06 декабря 2013

Я знаю, что немного опоздала с игрой, но это довольно фантастический проект на Python для синтеза и аудио композиции: https://github.com/hecanjog/pippi

Он все еще активно разрабатывается, но это былоненадолго.

5 голосов
/ 17 декабря 2013

Потратив время на некоторые некомпилируемые или несуществующие проекты, я обнаружил модуль python wavebender , который предлагает генерацию одного или нескольких каналов синусоидальных, квадратных и комбинированных волн. Результаты могут быть записаны либо в волновой файл, либо в sys.stdout, откуда они могут быть интерпретированы непосредственно aplay в режиме реального времени. Некоторые полезные примеры объяснены здесь и включены в страницу проекта github .

5 голосов
/ 27 апреля 2013

Вики-страница Python In Music не очень хорошо поддерживается, но это хорошая отправная точка.http://wiki.python.org/moin/PythonInMusic

3 голосов
/ 28 июня 2017

Мне показалось, что эти два репозитория Python очень полезны, возможно, стоит взглянуть на них ...

питон https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

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

[РЕДАКТИРОВАТЬ] Как указывалось, вот пояснение двух ссылок

python Кажется, у кого-то есть ошибка, но многие люди смогли ее запустить, поэтому я не уверен. ipython работал как шарм, поэтому я надеюсь, что вы можете запустить его.

Обе ссылки должны принимать аудио в качестве входных данных, предпочтительно .wav файл. Настройте его (ИСПОЛЬЗУЙТЕ БПФ: 512, размер шага = 512/8), чтобы получить спектрограммы (вы даже можете визуализировать его), это 2D-матрица, а затем обучайте свои объекты машинного обучения или делайте все, что хотите, используя матрицу, которая представляет оригинал аудио. Если вы хотите в любой момент, что представляют эти векторы, вы можете также повторно синтезировать звук обратно.

3 голосов
/ 13 августа 2015

Я работаю над мощным синтезатором в Python. Я использовал пользовательские функции для записи непосредственно в WAV-файл. Есть встроенные функции, которые можно использовать для этой цели. Вам нужно будет изменить заголовок .wav, чтобы он отражал частоту дискретизации, биты на выборку, количество каналов и продолжительность синтеза.

Вот ранняя версия синусоидального генератора, который выводит список значений, которые после применения байтовой матрицы становятся пригодными для записи в параметр данных волнового файла. [править] Функция преобразования должна преобразовать список в шестнадцатеричные значения с прямым порядком байтов до применения байтового массива. Подробнее о спецификации WAVE см. Ссылку на формат звукового файла WAVE PCM ниже. [/ edit]

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

В более новой версии могут использоваться сигналы для модуляции частоты, амплитуды и фазы параметров сигнала. Формат данных позволяет легко объединять и объединять волны. Если это похоже на ваш переулок, проверьте WAVE PCM формат звукового файла .

3 голосов
/ 19 марта 2012

Мне нравится PyAudiere , который позволяет воспроизводить массивы как звуки ... Я думаю, это хорошо сочетается с моим фоном Matlab. Я считаю, что это кроссплатформенный. Я думаю, что scikits.audiolab делает то же самое и может быть более актуальным / лучше поддерживаемым ... мне кажется проще, чем пытаться сохранять вещи как wavfiles или записывать их в буферы и использовать встроенную звуковую библиотеку Python.

...