python audio synthesis

Generación/síntesis de sonido con Python?



audio synthesis (7)

Después de perder el tiempo en algunos proyectos no disponibles o no disponibles, descubrí el módulo de python wavebender , que ofrece la generación de canales únicos o múltiples de ondas sinusoidales, cuadradas y combinadas. Los resultados se pueden escribir en un archivo wave o en sys.stdout , desde donde se pueden interpretar directamente por aplay en tiempo real. Algunos ejemplos útiles se explican here y se incluyen en la wavebender del proyecto.

¿Es posible hacer que python genere un sonido simple como una onda sinusoidal?

¿Hay un módulo disponible para esto? Si no, ¿cómo crearías la tuya?

Además, ¿necesitarías algún tipo de entorno de host para que python se ejecute para reproducir el sonido, o solo se puede lograr haciendo llamadas desde la terminal?

Si la respuesta depende del sistema operativo, estoy usando un mac.


Encontré estos dos repositorios de python muy útiles, podría echarle un vistazo ...

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

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

[EDITAR] Como se señaló, aquí hay una explicación de los dos enlaces

Python One parece tener un error, pero muchas personas pudieron hacerlo funcionar, así que no estoy seguro. ipython funcionaba como un hechizo, así que espero que puedas ejecutarlo.

Se supone que ambos enlaces toman un audio como entrada, preferiblemente un archivo .wav . Caracterícela (USE FFT: 512, paso tamaño = 512/8) para obtener espectrogramas (incluso puede visualizarlo), es una matriz 2D, y luego entrene a su Máquina aprendiendo objetos o haga lo que quiera usando una matriz que represente el original audio. Si quiere, en cualquier punto, lo que esos vectores representan, puede resintetizar el audio también.


Estaba buscando la misma cosa. Al final, escribí este código que funciona bien.

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()


Estoy trabajando en un poderoso sintetizador en Python. Utilicé funciones personalizadas para escribir directamente en un archivo .wav. Hay funciones integradas que se pueden usar para este propósito. Tendrá que modificar el encabezado .wav para reflejar la frecuencia de muestreo, los bits por muestra, el número de canales y la duración de la síntesis.

Aquí hay una versión inicial de un generador de ondas sinusoidales que genera una lista de valores que, después de aplicar bytearray, es adecuada para escribir en el parámetro de datos de un archivo wave. [edit] Una función de conversión tendrá que transformar la lista en pequeños valores hexadecimales endian antes de aplicar el bytearray. Consulte el enlace de formato de archivo de sonido WAVE PCM a continuación para obtener detalles sobre la especificación .wav. [/editar]

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

Una versión más nueva puede usar formas de onda para modular la frecuencia, amplitud y fase de los parámetros de forma de onda. El formato de datos hace que sea trivial combinar y concatenar ondas juntas. Si esto parece estar en tu calle, echa un vistazo al formato de archivo de sonido WAVE PCM .



Me gusta PyAudiere , que te permite jugar matrices numpy como sonidos ... Supongo que funciona bien con mi fondo de Matlab. Yo creo que es multiplataforma. Creo que scikits.audiolab hace lo mismo, y puede ser más actual / mejor soportado ... me parece más fácil que tratar de guardar cosas como archivos wav o escribirlas en buffers y usar la biblioteca de sonido integrada de Python.


Sé que llegué un poco tarde al juego en este caso, pero este es un proyecto de python bastante fantástico para síntesis y composición de audio: https://github.com/hecanjog/pippi

Todavía se está desarrollando activamente, pero ha estado funcionando por un tiempo.