2012-03-19 29 views
22

¿Es posible hacer que python genere un sonido simple como una onda sinusoidal?Generación/síntesis de sonido con python?

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

Además, ¿necesitaría 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.

+3

@hochl Bueno, qué irónico es que este es el primer resultado de Google devuelto después de un día dedicado a buscar con diferentes palabras clave ... –

+0

Revisaría [Pyo] (http://ajaxsoundstudio.com/pyodoc/index .html). [Aquí está] (http://ajaxsoundstudio.com/pyodoc/examples/02-controls/04-building-lfo.html) un buen ejemplo de inicio. – mobeets

Respuesta

1

Me gusta PyAudiere, que te permite jugar en 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 memorias intermedias y usar la biblioteca de sonido integrada de Python.

+2

Por lo que puedo ver Audiere no se puede descargar de pypi y su sitio pyaudiere.org ahora es una página de anuncios aleatoria. –

+0

Sí, parece que todas estas bibliotecas de sonido se abandonan después de unos meses. Se está convirtiendo en un problema real. Quizás PyGame es el camino a seguir. Parece exagerado, pero al menos está bien respaldado. – rdchambers

6

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

Se sigue siendo activamente desarrollado, pero ha estado yendo por un momento.

3

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

+2

Hola, soy el autor de pippi. Ha sido prelanzamiento durante bastante tiempo, pero estoy trabajando para lograr una versión estable 1.0. Si tienes tiempo para enviar un informe de error con tus problemas en github, realmente lo agradecería. ¡Gracias! –

+0

Gracias, me encantaría investigarlo nuevamente y ver si puedo contribuir con algo. ¡Es bueno saber que está vivo! –

+0

Desafortunadamente, Wavebender todavía parece ser [no funcional y no mantenido.] (Https://github.com/zacharydenton/wavebender/issues/5) – Cerin

2

Estoy trabajando en un potente 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 anterior 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 de onda. [editar] 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 reciente puede utilizar 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 callejón, mira WAVE PCM soundfile format.

14

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

Esto funciona, pero genera un "pop" muy fuerte al final de la reproducción . – Cerin

+2

¿Por qué tenemos que convertir estos datos en caracteres ascii? –

+2

@Cerin Eso será porque la última muestra que emitió estaba lejos de cero, y luego sus altavoces repentinamente volvieron a cero en una sola muestra, lo que produce un ruido bastante significativo. Si proporcionas un par de muestras al final del desvanecimiento a cero, o asegúrate de que tu ola haya regresado a (cerca de) cero, obtendrás un final más limpio. –

3

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

pitónhttps://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

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

[EDIT] Como se ha señalado, aquí es un explanational de los dos enlaces

pitón parece tener un error, pero muchas personas pudieron hacerlo funcionar, así que no estoy seguro. ipython funcionaba como un amuleto, así que espero que pueda ejecutarlo.

Ambos enlaces se supone que toman un audio como entrada, preferiblemente .wav archivo. 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.

+0

Espero que esto ayude ... –

+0

buena respuesta @Priyank Pathak – Veltro

Cuestiones relacionadas